diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,4 +0,0 @@
-#! /usr/bin/env nix-shell
-#! nix-shell ./shell.nix -i runghc
-import Distribution.Simple
-main = defaultMain
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,21 @@
+# Version 0.2
+
+* /COMPILER ASSISTED BREAKING CHANGE:/ `send` and `recv` now use
+  lazy `ByteString`s. 
+
+* /COMPILER ASSISTED BREAKING CHANGE:/ `recv`'s close semantics have 
+  improved. See its documentation for details.
+
+* Re-exported `close` and `clientConnectionFromStream` from 
+  `network-simple-ws`.
+
+* Depend on `network-simple-tls >=0.4`.
+
+* Depend on `network-simple-ws >=0.2`.
+
+* Depend on `websockets >=0.12.6`.
+
+
 # Version 0.1
 
 * First release.
diff --git a/network-simple-wss.cabal b/network-simple-wss.cabal
--- a/network-simple-wss.cabal
+++ b/network-simple-wss.cabal
@@ -1,32 +1,35 @@
+cabal-version: 2.4
 name: network-simple-wss
-version: 0.1
+version: 0.2
 synopsis: Simple interface to TLS secured WebSockets.
 description: Simple interface to TLS secured WebSockets.
-homepage: https://github.com/k0001/network-simple-wss
-bug-reports: https://github.com/k0001/network-simple-wss/issues
-license: BSD3
+homepage: https://hackage.haskell.org/package/network-simple-wss
+bug-reports: https://github.com/k0001/network-simple/issues
+license: BSD-3-Clause
 license-file: LICENSE
 author: Renzo Carbonara
 maintainer: renλren.zone
 copyright: Copyright (c) Renzo Carbonara 2018
 category: Network
 build-type: Simple
-cabal-version: >=1.8
 extra-source-files: README.md changelog.md
 
 source-repository head
     type: git
-    location: https://github.com/k0001/network-simple-wss
+    location: https://github.com/k0001/network-simple
+    subdir: network-simple-wss
 
 library
+  default-language:  Haskell2010
   hs-source-dirs: src
   exposed-modules: Network.Simple.WSS
   ghc-options: -Wall -O2
   build-depends:
+    async,
     base >=4.7 && <5.0,
     bytestring,
     safe-exceptions,
-    network-simple-tls >=0.3.2,
-    network-simple-ws,
-    websockets
+    network-simple-tls >=0.4,
+    network-simple-ws >=0.2,
+    websockets >=0.12.6
 
diff --git a/src/Network/Simple/WSS.hs b/src/Network/Simple/WSS.hs
--- a/src/Network/Simple/WSS.hs
+++ b/src/Network/Simple/WSS.hs
@@ -13,17 +13,21 @@
 -- intreresting from a client's point of view. Server side support will come
 -- later.
 module Network.Simple.WSS
- ( W.Connection
- , WS.send
+ ( -- * Sending and receiving
+   WS.Connection
  , WS.recv
+ , WS.send
+ , WS.close
    -- * Client side
  , connect
  , connectOverSOCKS5
    -- * Low level
+ , WS.clientConnectionFromStream
  , streamFromContext
  ) where
 
 
+import qualified Control.Concurrent.Async as Async
 import Control.Monad.IO.Class (MonadIO, liftIO)
 import qualified Control.Exception.Safe as Ex
 import qualified Data.ByteString as B
@@ -32,6 +36,7 @@
 import qualified Network.Simple.TCP.TLS as T
 import qualified Network.Simple.WS as WS
 import qualified Network.WebSockets as W
+import qualified Network.WebSockets.Connection as W (pingThread)
 import qualified Network.WebSockets.Stream as W (Stream, makeStream, close)
 
 --------------------------------------------------------------------------------
@@ -39,7 +44,7 @@
 -- | Connect to the specified Secure WebSockets server.
 connect
   :: (MonadIO m, Ex.MonadMask m)
-  => T.ClientSettings  -- ^ TLS settings.
+  => T.ClientParams  -- ^ TLS settings.
   -> T.HostName
   -- ^ Secure WebSockets server host name (e.g., @\"www.example.com\"@ or IP
   -- address).
@@ -60,8 +65,8 @@
   T.connect cs hn sn $ \(ctx, saddr) -> do
      Ex.bracket (streamFromContext ctx) (liftIO . W.close) $ \stream -> do
         conn <- WS.clientConnectionFromStream stream hn sn res hds
-        liftIO (W.forkPingThread conn 30)
-        act (conn, saddr)
+        withAsync (W.pingThread conn 30 (pure ())) $ \_ -> 
+          act (conn, saddr)
 
 -- | Like 'connect', but connects to the destination server through a SOCKS5
 -- proxy.
@@ -69,7 +74,7 @@
   :: (MonadIO m, Ex.MonadMask m)
   => T.HostName -- ^ SOCKS5 proxy server hostname or IP address.
   -> T.ServiceName -- ^ SOCKS5 proxy server service port name or number.
-  -> T.ClientSettings -- ^ TLS settings.
+  -> T.ClientParams -- ^ TLS settings.
   -> T.HostName
   -- ^ Destination Secure WebSockets server hostname or IP address. We connect
   -- to this host /through/ the SOCKS5 proxy specified in the previous
@@ -96,8 +101,8 @@
   T.connectOverSOCKS5 phn psn tcs dhn dsn $ \(ctx, pa, da) -> do
     Ex.bracket (streamFromContext ctx) (liftIO . W.close) $ \stream -> do
       conn <- WS.clientConnectionFromStream stream dhn dsn res hds
-      liftIO (W.forkPingThread conn 30)
-      act (conn, pa, da)
+      withAsync (W.pingThread conn 30 (pure ())) $ \_ -> 
+        act (conn, pa, da)
 
 -- | Obtain a 'W.Stream' implemented using the given TLS 'T.Context'. You can
 -- use the
@@ -106,4 +111,14 @@
 streamFromContext :: MonadIO m => T.Context -> m W.Stream
 streamFromContext ctx = liftIO $ do
   W.makeStream (T.recv ctx) (traverse_ (T.sendLazy ctx))
+
+-- | Like 'Async.async', but generalized to 'Ex.MonadMask' and 'MonadIO'.
+withAsync
+  :: (Ex.MonadMask m, MonadIO m) 
+  => IO a 
+  -> (Async.Async a -> m b) 
+  -> m b
+withAsync io = Ex.bracket
+  (liftIO $ Async.asyncWithUnmask (\u -> u io))
+  (liftIO . Async.uninterruptibleCancel)
 
