diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+0.1.0.21
+--------
+* Add in README that `GHC 7.10.2` is a must!
+
 0.1.0.20
 --------
 * Rewrite Encrypt module, cache password hash
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,6 +10,24 @@
 
 type `moesocks --help` for help.
 
+Installation
+------------
+
+* Need `GHC 7.10.2` and `cabal-install`.
+      
+  Installing [haskell-platform](https://www.haskell.org/platform/) should be
+  sufficient. (Linux users should pick the *Generic* distribution, since
+  it's the most up to date)
+
+* Repeat, you need `GHC 7.10.2` exactly, not `7.10.1` or anything else, since
+  remote only runs well in `7.10.2`.
+* Update packages
+
+        cabal update
+* Install
+
+        cabal install moesocks
+
 Usage
 -----
 * Edit `config.json` to fit your setup (at least the `remote` and `password`
@@ -35,8 +53,6 @@
 
 Not working
 -----------
-* Remote is flaky, particularly when trying to send data through the Great
-  Firewall of China (GFW).
 * UDP over Socks5 is not implemented
 * More then 2 times slower then the original Python implementation (measured at
   20M/s vs 43M/s on an Intel P8800, using the AES-256-CFB method)
@@ -47,16 +63,6 @@
 
 Notes
 ------
-
-There's a bug that prevents remote from working correctly with GFW.
-Thanks, Prof Fang!
-
-You should use the original Python implementation of [shadowsocks] on the remote
-server if your primary goal is to bypass internet censorship in China.
-
-From the author's limited testing, [shadowsocks-go] also works reasonably
-well, though it might not run as fast as the Python's version.
-
 There is an earlier implementation of [shadowsocks-haskell] by rnons that
 makes MoeSocks possible. 
 
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.20
+version:            0.1.0.21
 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
@@ -183,9 +183,11 @@
                             <> _method ^. _Text
     Just (a, b, c, d) -> pure - CipherBox a b c d
 
-  let localAppBuilder :: AppType -> String -> 
-                          (ByteString -> (Socket, SockAddr) -> IO ()) -> 
-                          (Socket, SockAddr) -> IO ()
+  let localAppBuilder :: AppType 
+                      -> String 
+                      -> (ByteString -> (Socket, SockAddr) -> IO ()) 
+                      -> (Socket, SockAddr) 
+                      -> IO ()
       localAppBuilder aAppType aID aHandler s = 
         logSA "L loop" (pure s) - \(_localSocket, _localAddr) -> do
           _say - "L " <> aID <> ": nyaa!"
@@ -238,8 +240,7 @@
                       <> show _remotePort
                       <> "]"
 
-      forward_TCP_App :: Forward -> (Socket, SockAddr) 
-                                -> IO ()
+      forward_TCP_App :: Forward -> (Socket, SockAddr) -> IO ()
       forward_TCP_App _f _s = do
         let _m = showForwarding _f
         localAppBuilder TCP_App  ("TCP forwarding " <> _m)
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
@@ -11,10 +11,7 @@
 import Network.Socket hiding (send, recv, recvFrom, sendTo)
 import Prelude hiding ((-), take)
 import qualified Data.List as L
-import qualified Network.MoeSocks.Encrypt as E
 
-plainCipher :: Cipher
-plainCipher = E.plainCipher
 
 showAddressType :: AddressType -> Text
 showAddressType (IPv4_address xs) = view (from _Text) - 
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
@@ -39,7 +39,7 @@
 type CipherBuilder = ByteString -> IO Cipher
 type CipherBox = (Int, IO ByteString, CipherBuilder, CipherBuilder)
 
-type MaybeExceptT = ExceptT () IO
+type MaybeT_IO = ExceptT () IO
 
 methods :: Map Text (KeyLength, IV_Length)
 methods = fromList
@@ -80,44 +80,41 @@
 eitherToMaybe (Left _) = Nothing
 eitherToMaybe (Right x) = Just x
 
-getMaybe :: Maybe a -> MaybeExceptT a
+getMaybe :: Maybe a -> MaybeT_IO a
 getMaybe Nothing = throwError ()
 getMaybe (Just x) = pure x
 
-mio :: IO (Maybe a) -> MaybeExceptT a
-mio = (>>= getMaybe) . io
-
-io :: (MonadIO m) => IO a -> m a
-io = liftIO
+mio :: IO (Maybe a) -> MaybeT_IO a
+mio = (>>= getMaybe) . liftIO
 
-plainCipher :: Cipher
-plainCipher = pure . S.fromMaybe mempty
+identityCipher :: Cipher
+identityCipher = pure . S.fromMaybe mempty
 
 initBuilder :: Text -> Text -> IO (Maybe CipherBox)
 initBuilder aMethod aPassword 
-  | aMethod == "none" = let constCipher = const - pure plainCipher
+  | aMethod == "none" = let constCipher = const - pure identityCipher
                         in
                         pure - Just (0, pure mempty, constCipher, constCipher)
 
   | otherwise =
       fmap eitherToMaybe - runExceptT - initBuilder' aMethod aPassword
 
-initBuilder' :: Text -> Text -> MaybeExceptT CipherBox
+initBuilder' :: Text -> Text -> MaybeT_IO CipherBox
 initBuilder' aMethod aPassword = do
   _method <- mio - ssl - getCipherByName - aMethod ^. _Text
 
   (_keyLength, _IV_Length) <- getMaybe - methods ^? ix aMethod
 
   let _hashed = hashKey (review utf8 aPassword) _keyLength _IV_Length
-      _IV_Maker = io - ssl - randBytes _IV_Length
+      _IV_Maker = ssl - randBytes _IV_Length
 
       _encryptBuilder :: ByteString -> IO Cipher
       _encryptBuilder _iv = do
-          _ctx <- io - ssl - E.cipherInitBS _method _hashed _iv Encrypt
+          _ctx <- ssl - E.cipherInitBS _method _hashed _iv Encrypt
 
           let _encrypt :: Cipher
               _encrypt = \case
-                  S.Nothing -> E.cipherFinalBS _ctx
+                  S.Nothing -> ssl - E.cipherFinalBS _ctx
                   S.Just _bytes -> do
                     ssl - E.cipherUpdateBS _ctx _bytes
 
@@ -125,11 +122,11 @@
 
       _decryptBuilder :: ByteString -> IO Cipher
       _decryptBuilder _iv = do
-          _ctx <- io - ssl - E.cipherInitBS _method _hashed _iv Decrypt
+          _ctx <- ssl - E.cipherInitBS _method _hashed _iv Decrypt
 
           let _decrypt :: Cipher
               _decrypt = \case
-                  S.Nothing -> E.cipherFinalBS _ctx
+                  S.Nothing -> ssl - E.cipherFinalBS _ctx
                   S.Just _bytes -> do
                     ssl - E.cipherUpdateBS _ctx _bytes 
           
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
@@ -61,7 +61,7 @@
                                             & view (from _Text))
                                           ("The number of packets used as a "
                                             <> "buffer. A packet can hold "
-                                            <> "at most 4K of data.")
+                                            <> "at most 4K of data")
 
       _config = optional - textOption -
                       short 'c'
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
@@ -11,6 +11,7 @@
 import Network.MoeSocks.BuilderAndParser
 import Network.MoeSocks.Common
 import Network.MoeSocks.Constant
+import Network.MoeSocks.Encrypt (identityCipher)
 import Network.MoeSocks.Helper
 import Network.MoeSocks.Type
 import Network.Socket hiding (send, recv, recvFrom, sendTo)
@@ -25,7 +26,7 @@
                             -> IO ()
 local_Socks5_RequestHandler aCipherBox aConfig _ (aSocket,_) = do
   (_partialBytesAfterGreeting, _r) <- 
-      parseSocket "clientGreeting" mempty plainCipher
+      parseSocket "clientGreeting" mempty identityCipher
         greetingParser aSocket
 
   when (not - _No_authentication `elem` (_r ^. authenticationMethods)) - 
@@ -37,7 +38,7 @@
   _parsedRequest <- parseSocket 
                                 "clientRequest" 
                                 _partialBytesAfterGreeting
-                                plainCipher
+                                identityCipher
                                 connectionParser
                                 aSocket
 
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
@@ -112,6 +112,7 @@
 
 makeLenses '' CipherBox
 
+{-
 data Env = Env
   {
     _options :: MoeOptions
@@ -120,6 +121,7 @@
   }
 
 makeLenses ''Env
+-}
 
 
 
