diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+0.1.2.0
+-------
+
+* Add OSX compatibility, still some unfixed bugs on OSX. 
+* Fix a bug that breaks UDP forwarding in local
+
 0.1.1.32
 --------
 * Add a runtime type
diff --git a/config.json b/config.json
--- a/config.json
+++ b/config.json
@@ -4,7 +4,7 @@
   "local":"localhost",
   "localPort":1090,
   "password":"birthday!",
-  "fastOpen":true,
+  "fastOpen":false,
   "method":"aes-256-cfb"
 }
 
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.1.32
+version:            0.1.2.0
 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
@@ -19,6 +19,7 @@
 import Network.MoeSocks.Config
 import Network.MoeSocks.Constant
 import Network.MoeSocks.Encrypt (initCipherBox, safeMethods, unsafeMethods)
+import Network.MoeSocks.Common
 import Network.MoeSocks.Helper
 import Network.MoeSocks.TCP
 import Network.MoeSocks.Type
@@ -37,6 +38,7 @@
 import qualified System.Log.Handler as LogHandler
 
 
+
 withGateOptions :: Options -> IO a -> IO ()
 withGateOptions aOption aIO = do
   if aOption ^. listMethods
@@ -75,6 +77,7 @@
                 ("server", "remoteAddress")
               , ("server_port", "remotePort")
               , ("local_address", "localAddress")
+              , ("local_port", "localPort")
               ]
 
         in
@@ -83,7 +86,7 @@
       toParsableConfig :: Value -> Value
       toParsableConfig = asList - each . _1 %~  (
                                                   T.cons '_' 
-                                                . toHaskellNamingConvention
+                                                {-. toHaskellNamingConvention-}
                                                 . fromShadowSocksConfig
                                                 )  
 
@@ -114,7 +117,8 @@
 
       optionalConfig = filterEssentialConfig - toJSON defaultConfig
       
-      _maybeConfig = _v
+      _maybeConfig = -- trace ("JSON: " <> show _v) 
+                      _v
                       >>= decode 
                           . encode 
                           . fallbackConfig optionalConfig
@@ -197,13 +201,15 @@
             TCP_Relay -> do
               info_ - "LT: " <> aID <> " nyaa!"
 
-              setSocket_TCP_FAST_OPEN _localSocket
+              when (_c ^. fastOpen) -
+                setSocket_TCP_FAST_OPEN _localSocket
+
               listen _localSocket maxListenQueue
 
               let handleLocal _socket = do
                     _s@(_newSocket, _newSockAddr) <- accept _socket
                     setSocketCloseOnExec _newSocket
-                    setSocketSendFast _socket
+                    setSocketConfig _c _socket
                     
                     forkIO - catchExceptAsyncLog "LT" - 
                               logSA "L TCP client socket" (pure _s) -
@@ -268,14 +274,15 @@
           setSocketOption _remoteSocket ReuseAddr 1
           bindSocket _remoteSocket _remoteAddr
 
-          setSocket_TCP_FAST_OPEN _remoteSocket
+          when (_c ^. fastOpen) -
+            setSocket_TCP_FAST_OPEN _remoteSocket
           
           listen _remoteSocket maxListenQueue
 
           let handleRemote _socket = do
                 (_newSocket, _) <- accept _socket
                 setSocketCloseOnExec _newSocket
-                setSocketSendFast _socket
+                setSocketConfig _c _socket
                 
                 forkIO - catchExceptAsyncLog "RT" - 
                             logSocket "R remote socket" (pure _newSocket) -
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
@@ -86,3 +86,11 @@
       _family     = _clientRequest ^. addressType . to addressType_To_Family
   
   getSocketWithHint _family _hostName _port _socketType
+
+
+setSocketConfig:: Config -> Socket -> IO ()
+setSocketConfig aConfig aSocket = do
+  setSocketOption aSocket NoDelay 1 
+  when (aConfig ^. socketOption_TCP_NOTSENT_LOWAT) - do
+    tryIO "setSocket_TCP_NOTSENT_LOWAT" - setSocket_TCP_NOTSENT_LOWAT aSocket
+    pure ()
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
@@ -20,6 +20,7 @@
   , _throttleSpeed = 8000 -- in Kilobytes
   , _obfuscationFlushBound = 4096
   , _fastOpen = False
+  , _socketOption_TCP_NOTSENT_LOWAT = True
   }
 
 
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
@@ -19,6 +19,7 @@
 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
@@ -31,9 +32,7 @@
 import qualified Data.ByteString.Builder as B
 import qualified Data.ByteString.Lazy as LB
 import qualified Data.Strict as S
-import qualified Data.Text as T
 
-
 -- BEGIN backports
 
 infixr 0 -
@@ -57,6 +56,9 @@
 boolToMaybe True = Just ()
 boolToMaybe False = Nothing
 
+trace' :: (Show a) => String -> a -> a
+trace' aID x = trace ("TRACE " <> aID <> ": " <> show x) x
+
 {-syncLock :: MVar ()-}
 {-syncLock = unsafePerformIO - newEmptyMVar-}
 
@@ -433,12 +435,7 @@
   in
   setSocketOption aSocket (CustomSockOpt (_TCP_Option, _TCP_NOTSENT_LOWAT)) 1 
 
-setSocketSendFast :: Socket -> IO ()
-setSocketSendFast aSocket = do
-  setSocketOption aSocket NoDelay 1 
-  setSocket_TCP_NOTSENT_LOWAT aSocket
 
-
 -- Copied and slightly modified from: 
 -- https://github.com/mzero/plush/blob/master/src/Plush/Server/Warp.hs
 setSocketCloseOnExec :: Socket -> IO ()
@@ -449,8 +446,8 @@
 tryIO :: String -> IO a -> IO (Either IOException a)
 tryIO _ = try -- . logException aID
 
-toHaskellNamingConvention :: Text -> Text
-toHaskellNamingConvention x = x 
-                                & T.split (`elem` ['_', '-'])
-                                & over (_tail . traversed) T.toTitle
-                                & T.concat
+{-toHaskellNamingConvention :: Text -> Text-}
+{-toHaskellNamingConvention x = x -}
+                                {-& T.split (`elem` ['_', '-'])-}
+                                {-& over (_tail . traversed) T.toTitle-}
+                                {-& T.concat-}
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
@@ -89,7 +89,7 @@
     
     logSA "L remote socket" _initSocket - 
       \(_remoteSocket, _remoteAddress) -> do
-      setSocketSendFast _remoteSocket
+      setSocketConfig _c _remoteSocket
 
       _remoteSocketName <- getSocketName _remoteSocket
       
@@ -221,7 +221,7 @@
 
     debug_ - "checking: " <> show _addr <> " ? " <> show _forbidden_IPs
     withCheckedForbidden_IP_List _addr _forbidden_IPs - do
-      setSocketSendFast _targetSocket
+      setSocketConfig _c _targetSocket
 
       _remotePeerAddr <- getPeerName aSocket
       let _msg = showRelay _remotePeerAddr _clientRequest
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
@@ -64,6 +64,7 @@
   , _throttleSpeed :: Double
   , _obfuscationFlushBound :: Int -- should be greater then MTU
   , _fastOpen :: Bool
+  , _socketOption_TCP_NOTSENT_LOWAT :: Bool
   }
   deriving (Show, Eq, Generic)
 
@@ -88,6 +89,12 @@
 
 
 makeLenses ''Forward
+
+{-data Profile =    Mac-}
+                {-| Linux-}
+  {-deriving (Show, Eq, Read)-}
+
+{-makePrisms ''Profile-}
 
 data Options = Options
   {
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
@@ -48,7 +48,7 @@
                                 (aSocket, aSockAddr) = do
 
   let _c = aEnv ^. config
-      _cipherBox = _cipherBox
+      _cipherBox = aEnv ^. cipherBox
 
   let _clientRequest = ClientRequest
                           UDP_Port
@@ -71,13 +71,14 @@
         connect _remoteSocket _remoteAddr
 
         _encodeIV <- _cipherBox ^. generate_IV 
+
         _encrypt <- _cipherBox ^. encryptBuilder - _encodeIV
 
         {-let (_encrypt, _decrypt) = (pure, pure)-}
 
         let _bytes = buildShadowSocksRequest _clientRequest aMessage
 
-        {-debug_ - "L UDP: " <> show _bytes-}
+        {-debug_ - "L UDP sending: " <> show _bytes-}
 
         let _msg = showRelay aSockAddr _clientRequest
         info_ - "LU: " <> _msg
