diff --git a/http2-client-grpc.cabal b/http2-client-grpc.cabal
--- a/http2-client-grpc.cabal
+++ b/http2-client-grpc.cabal
@@ -1,5 +1,5 @@
 name:                http2-client-grpc
-version:             0.5.0.0
+version:             0.5.0.1
 synopsis:            Implement gRPC-over-HTTP2 clients.
 description:         Uses http2-client and proto-lens to generate client code.
 homepage:            https://github.com/lucasdicioccio/http2-client-grpc#readme
@@ -23,6 +23,7 @@
                      , bytestring
                      , case-insensitive
                      , data-default-class
+                     , lens
                      , http2
                      , http2-client
                      , http2-grpc-types >= 0.3
diff --git a/src/Network/GRPC/Client/Helpers.hs b/src/Network/GRPC/Client/Helpers.hs
--- a/src/Network/GRPC/Client/Helpers.hs
+++ b/src/Network/GRPC/Client/Helpers.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE DataKinds         #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE GADTs             #-}
+{-# LANGUAGE FlexibleContexts  #-}
 
 -- | Set of helpers helping with writing gRPC clients with not much exposure of
 -- the http2-client complexity.
@@ -13,7 +14,8 @@
 -- are not planned in this library and should be added at higher-levels.
 module Network.GRPC.Client.Helpers where
 
-import Control.Concurrent.Async (Async, async)
+import Control.Lens
+import Control.Concurrent.Async (Async, async, cancel)
 import Control.Concurrent (threadDelay)
 import Control.Exception (throwIO)
 import Control.Monad (forever)
@@ -122,34 +124,71 @@
   let tasks = BackgroundTasks wuAsync pingAsync
   return $ GrpcClient cli authority headers timeout compression tasks
 
+-- | Cancels background tasks and closes the underlying HTTP2 client.
+close :: GrpcClient -> IO ()
+close grpc = do
+    cancel $ backgroundPing $ _grpcClientBackground grpc
+    cancel $ backgroundWindowUpdate $ _grpcClientBackground grpc
+    _close $ _grpcClientHttp2Client grpc
+
+-- | Run an unary query.
 rawUnary
   :: (Service s, HasMethod s m)
   => RPC s m
+  -- ^ The RPC to call.
   -> GrpcClient
+  -- ^ An initialized client.
   -> MethodInput s m
+  -- ^ The input.
   -> IO (Either TooMuchConcurrency (RawReply (MethodOutput s m)))
 rawUnary rpc (GrpcClient client authority headers timeout compression _) input =
     let call = singleRequest rpc input
     in open client authority headers timeout (Encoding compression) (Decoding compression) call
 
+-- | Prism helper to unpack an unary gRPC call output.
+--
+-- @ out <- rawUnary rpc grpc method
+--   print $ out ^? unaryOutput . somefield
+-- @
+unaryOutput
+  :: (Applicative f, Field3 a1 b1 (Either c1 a2) (Either c1 b2)) =>
+     (a2 -> f b2)
+     -> Either c2 (Either c3 a1) -> f (Either c2 (Either c3 b1))
+unaryOutput = _Right . _Right . _3 . _Right
+
+-- | Calls for a server stream of requests.
 rawStreamServer 
   :: (Service s, HasMethod s m, MethodStreamingType s m ~ 'ServerStreaming)
   => RPC s m
+  -- ^ The RPC to call.
   -> GrpcClient
+  -- ^ An initialized client.
   -> a
+  -- ^ An initial state.
   -> MethodInput s m
+  -- ^ The input of the stream request.
   -> (a -> HeaderList -> MethodOutput s m -> IO a)
+  -- ^ A state-passing handler called for each server-sent output.
+  -- Headers are repeated for convenience but are the same for every iteration.
   -> IO (Either TooMuchConcurrency (a, HeaderList, HeaderList))
 rawStreamServer rpc (GrpcClient client authority headers timeout compression _) v0 input handler =
     let call = streamReply rpc v0 input handler
     in open client authority headers timeout (Encoding compression) (Decoding compression) call
 
+-- | Sends a streams of requests to the server.
+--
+-- Messages are submitted to the HTTP2 underlying client and hence this
+-- function can block until the HTTP2 client has some network credit.
 rawStreamClient
   :: (Service s, HasMethod s m, MethodStreamingType s m ~ 'ClientStreaming)
   => RPC s m
+  -- ^ The RPC to call.
   -> GrpcClient
+  -- ^ An initialized client.
   -> a
+  -- ^ An initial state.
   -> (a -> IO (a, Either StreamDone (CompressMode, MethodInput s m)))
+  -- ^ A state-passing step function to decide the next message.
   -> IO (Either TooMuchConcurrency (a, (RawReply (MethodOutput s m))))
 rawStreamClient rpc (GrpcClient client authority headers timeout compression _) v0 getNext =
     let call = streamRequest rpc v0 getNext
