diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,10 @@
 # Changelog
 
+## v0.4.0.0
+
+- Upgrade to Servant 0.6. When running the Giphy monad it is now possible
+  to provide a custom HTTP manager.
+
 ## v0.3.0.0
 
 - Upgrade to Servant 0.5. No changes in the API, but it's not in Stackage yet
diff --git a/giphy-api.cabal b/giphy-api.cabal
--- a/giphy-api.cabal
+++ b/giphy-api.cabal
@@ -1,9 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.11.0.
+-- This file has been generated from package.yaml by hpack version 0.11.2.
 --
 -- see: https://github.com/sol/hpack
 
 name:           giphy-api
-version:        0.3.0.0
+version:        0.4.0.0
 synopsis:       Giphy HTTP API wrapper and CLI search tool.
 description:    Please see README.md
 category:       Web
@@ -41,8 +41,9 @@
     , microlens
     , microlens-th
     , mtl
-    , servant >= 0.5
-    , servant-client >= 0.5
+    , servant >= 0.6
+    , servant-client >= 0.6
+    , transformers
     , http-api-data
     , http-client
     , http-client-tls
diff --git a/src/Web/Giphy.hs b/src/Web/Giphy.hs
--- a/src/Web/Giphy.hs
+++ b/src/Web/Giphy.hs
@@ -6,6 +6,8 @@
 {-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE TemplateHaskell            #-}
 {-# LANGUAGE TypeOperators              #-}
+{-# LANGUAGE RankNTypes                 #-}
+{-# LANGUAGE KindSignatures             #-}
 
 -- |
 -- Provides a Giphy monad that can be used to issue selected API calls under a
@@ -53,6 +55,7 @@
   , GiphyConfig(..)
   , Giphy()
   , runGiphy
+  , runGiphy'
   -- * Lenses
   -- $lenses
   , gifId
@@ -82,29 +85,30 @@
   , translate
   , gif
   , random
+  -- NO
+  , liftQuery
   ) where
 
-import           Control.Monad           (MonadPlus (), forM, join, mzero)
-import           Control.Monad.Except    (ExceptT, runExceptT)
-import qualified Control.Monad.Reader    as Reader
-import           Control.Monad.Trans     (MonadIO (), lift, liftIO)
-import           Data.Aeson              ((.:), (.:?))
-import qualified Data.Aeson.Types        as Aeson
-import qualified Data.Map.Strict         as Map
-import           Data.Monoid             ((<>))
-import qualified Data.Proxy              as Proxy
-import qualified Data.Text               as T
-import           GHC.Generics            (Generic ())
-import qualified Lens.Micro.TH           as Lens
-import qualified Network.HTTP.Client     as HTTP
-import           Network.HTTP.Client.TLS (tlsManagerSettings)
-import qualified Network.URI             as URI
-import           Servant.API             ((:<|>) (..), (:>))
-import qualified Servant.API             as Servant
-import qualified Servant.Client          as Servant
-import qualified System.IO.Unsafe        as Unsafe
-import qualified Text.Read               as Read
-import qualified Web.HttpApiData         as Data
+import           Control.Monad             (MonadPlus (), forM, join, mzero)
+import           Control.Monad.Except      (ExceptT, runExceptT)
+import qualified Control.Monad.Reader      as Reader
+import           Control.Monad.Trans       (MonadIO (), lift, liftIO)
+import           Data.Aeson                ((.:), (.:?))
+import qualified Data.Aeson.Types          as Aeson
+import qualified Data.Map.Strict           as Map
+import           Data.Monoid               ((<>))
+import qualified Data.Proxy                as Proxy
+import qualified Data.Text                 as T
+import           GHC.Generics              (Generic ())
+import qualified Lens.Micro.TH             as Lens
+import qualified Network.HTTP.Client       as HTTP
+import           Network.HTTP.Client.TLS   (tlsManagerSettings)
+import qualified Network.URI               as URI
+import           Servant.API               ((:<|>) (..), (:>))
+import qualified Servant.API               as Servant
+import qualified Servant.Client            as Servant
+import qualified Text.Read                 as Read
+import qualified Web.HttpApiData           as Data
 
 maybeParse :: (Monad m, MonadPlus m) => (a -> Maybe b) -> m a -> m b
 maybeParse f = (maybe mzero return . f =<<)
@@ -312,37 +316,39 @@
 api :: Proxy.Proxy GiphyAPI
 api = Proxy.Proxy
 
--- From the servant docs:
--- (Yes, the usage of unsafePerformIO is very ugly, we know.
---  Hopefully soon it’ll be possible to do without.)
-{-# NOINLINE __manager #-}
-__manager :: HTTP.Manager
-__manager = Unsafe.unsafePerformIO $ HTTP.newManager tlsManagerSettings
+baseUrl :: Servant.BaseUrl
+baseUrl = Servant.BaseUrl Servant.Https "api.giphy.com" 443 "v1/gifs/"
 
 search'
   :: Maybe Key
   -> Maybe PaginationOffset
   -> Maybe Query
+  -> HTTP.Manager
+  -> Servant.BaseUrl
   -> ExceptT Servant.ServantError IO SearchResponse
 
 translate'
   :: Maybe Key
   -> Maybe Phrase
+  -> HTTP.Manager
+  -> Servant.BaseUrl
   -> ExceptT Servant.ServantError IO TranslateResponse
 
 gif'
   :: GifId
   -> Maybe Key
+  -> HTTP.Manager
+  -> Servant.BaseUrl
   -> ExceptT Servant.ServantError IO SingleGifResponse
 
 random'
   :: Maybe Key
   -> Maybe Tag
+  -> HTTP.Manager
+  -> Servant.BaseUrl
   -> ExceptT Servant.ServantError IO RandomResponse
 
-search' :<|> translate' :<|> gif' :<|> random' = Servant.client api host __manager
-  where
-    host = Servant.BaseUrl Servant.Https "api.giphy.com" 443 "v1/gifs/"
+search' :<|> translate' :<|> gif' :<|> random' = Servant.client api
 
 -- $api
 --
@@ -350,25 +356,36 @@
 -- the 'Giphy' monad.
 --
 
+-- | Lift a partially applied request function into the Giphy monad.
+liftQuery
+  :: forall b (t :: (* -> *) -> * -> *) (m :: * -> *).
+     (Monad m, Reader.MonadTrans t, Reader.MonadReader GiphyContext (t m))
+  => (HTTP.Manager -> Servant.BaseUrl -> m b)
+  -> t m b
+liftQuery f = do
+  manager <- Reader.asks ctxManager
+  url <- Reader.asks ctxBaseUrl
+  lift $ f manager url
+
 -- | Issue a search request for the given query without specifying an offset.
 -- E.g. <https://api.giphy.com/v1/gifs/search?q=funny+cat&api_key=dc6zaTOxFJmzC>
 search
   :: Query
   -> Giphy SearchResponse
 search query = do
-  key <- Reader.asks configApiKey
-  lift $ search' (pure key) (pure $ PaginationOffset 0) (pure query)
+  key <- Reader.asks (configApiKey . ctxConfig)
+  liftQuery $ search' (pure key) (pure $ PaginationOffset 0) (pure query)
 
 -- | Issue a search request for the given query by specifying a
 -- pagination offset.
 -- E.g. <https://api.giphy.com/v1/gifs/search?q=funny+cat&api_key=dc6zaTOxFJmzC&offset=25>
 searchOffset
   :: Query
-  -> PaginationOffset
+  -> PaginationOffset -- ^ Offset as a number of items you want to skip.
   -> Giphy SearchResponse
 searchOffset query offset = do
-  key <- Reader.asks configApiKey
-  lift $ search' (pure key) (pure offset) (pure query)
+  key <- Reader.asks (configApiKey . ctxConfig)
+  liftQuery $ search' (pure key) (pure offset) (pure query)
 
 -- | Issue a request for a single GIF identified by its 'GifId'.
 -- E.g. <https://api.giphy.com/v1/gifs/feqkVgjJpYtjy?api_key=dc6zaTOxFJmzC>
@@ -376,8 +393,8 @@
   :: GifId
   -> Giphy SingleGifResponse
 gif gifid = do
-  key <- Reader.asks configApiKey
-  lift $ gif' gifid (pure key)
+  key <- Reader.asks (configApiKey . ctxConfig)
+  liftQuery $ gif' gifid (pure key)
 
 -- | Issue a translate request for a given phrase or term.
 -- E.g. <https://api.giphy.com/v1/gifs/translate?s=superman&api_key=dc6zaTOxFJmzC>
@@ -385,8 +402,8 @@
   :: Phrase
   -> Giphy TranslateResponse
 translate phrase = do
-  key <- Reader.asks configApiKey
-  lift $ translate' (pure key) (pure phrase)
+  key <- Reader.asks (configApiKey . ctxConfig)
+  liftQuery $ translate' (pure key) (pure phrase)
 
 -- | Issue a request for a random GIF for the given (optional) tag.
 -- E.g. <https://api.giphy.com/v1/gifs/random?api_key=dc6zaTOxFJmzC&tag=american+psycho>
@@ -394,8 +411,8 @@
   :: Maybe Tag
   -> Giphy RandomResponse
 random tag = do
-  key <- Reader.asks configApiKey
-  lift $ random' (pure key) tag
+  key <- Reader.asks (configApiKey . ctxConfig)
+  liftQuery $ random' (pure key) tag
 
 -- $giphy
 --
@@ -406,13 +423,30 @@
 data GiphyConfig = GiphyConfig { configApiKey :: Key }
   deriving (Show, Eq)
 
+-- | Internal data structure holding the base url, http manager and config.
+data GiphyContext = GiphyContext { ctxConfig  :: GiphyConfig
+                                 , ctxManager :: HTTP.Manager
+                                 , ctxBaseUrl :: Servant.BaseUrl }
+
 -- | The Giphy monad contains the execution context.
-type Giphy = Reader.ReaderT GiphyConfig (ExceptT Servant.ServantError IO)
+type Giphy = Reader.ReaderT GiphyContext (ExceptT Servant.ServantError IO)
 
 -- | You need to provide a 'GiphyConfig' to lift a 'Giphy' computation
 -- into 'MonadIO'.
 runGiphy :: MonadIO m => Giphy a -> GiphyConfig -> m (Either Servant.ServantError a)
-runGiphy = ((liftIO . runExceptT) .) . Reader.runReaderT
+runGiphy g conf = do
+  manager <- liftIO $ HTTP.newManager tlsManagerSettings
+  runGiphy' manager g conf
+
+-- | Same as 'runGiphy' but accepts an explicit 'HTTP.Manager' instead of
+-- implicitly creating one for you.
+runGiphy'
+  :: MonadIO m
+  => HTTP.Manager -- ^ This must be a TLS-enabled Manager
+  -> Giphy a
+  -> GiphyConfig
+  -> m (Either Servant.ServantError a)
+runGiphy' manager giphy conf = liftIO . runExceptT . Reader.runReaderT giphy $ GiphyContext conf manager baseUrl
 
 -- $lenses
 --
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,38 +1,8 @@
-# This file was automatically generated by stack init
-# For more information, see: http://docs.haskellstack.org/en/stable/yaml_configuration/
-
-# Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2)
-resolver: nightly-2016-03-25
-
-# Local packages, usually specified by relative directory name
+flags: {}
+extra-package-dbs: []
 packages:
 - '.'
-# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3)
 extra-deps:
-- servant-0.5
-- servant-client-0.5
-- http-api-data-0.2.2
-
-# Override default flag values for local packages and extra-deps
-flags: {}
-
-# Extra package databases containing global packages
-extra-package-dbs: []
-
-# Control whether we use the GHC we find on the path
-# system-ghc: true
-
-# Require a specific version of stack, using version ranges
-# require-stack-version: -any # Default
-# require-stack-version: >= 1.0.0
-
-# Override the architecture used by stack, especially useful on Windows
-# arch: i386
-# arch: x86_64
-
-# Extra directories used by stack for building
-# extra-include-dirs: [/path/to/dir]
-# extra-lib-dirs: [/path/to/dir]
-
-# Allow a newer minor version of GHC than the snapshot specifies
-# compiler-check: newer-minor
+- servant-0.6
+- servant-client-0.6
+resolver: nightly-2016-04-04
