diff --git a/library/Solr/Args.hs b/library/Solr/Args.hs
new file mode 100644
--- /dev/null
+++ b/library/Solr/Args.hs
@@ -0,0 +1,45 @@
+{-|
+Command line arguments API.
+-}
+module Solr.Args
+(
+  managedResource,
+)
+where
+
+import Solr.Prelude
+import OptparseApplicative.Simple.Parser
+import qualified Attoparsec.Data.Explicit as A
+import qualified Data.Text.Encoding as B
+import qualified Control.Monad.Managed.Safe as C
+import qualified Solr.Managed as D
+import qualified Solr.Effect.Effect as E
+
+
+baseURL :: Maybe Text -> (Text -> Text) -> Parser ByteString
+baseURL collectionNameMaybe updateName =
+  argument (updateName "base-url") Nothing description def parser
+  where
+    description =
+      Just "Base URL of Solr REST API"
+    def =
+      case collectionNameMaybe of
+        Just collectionName ->
+          Just (value, text)
+          where
+            text =
+              "http://127.0.0.1:8983/solr/" <> collectionName
+            value =
+              B.encodeUtf8 text
+        Nothing ->
+          Nothing
+    parser =
+      A.utf8Bytes
+
+{-|
+Arguments parser, which produces the managed resource,
+which can then be used to execute sessions.
+-}
+managedResource :: Maybe Text {-^ Possible default collection name-} -> (Text -> Text) {-^ Updater of the argument names-} -> Parser (C.Managed E.Resource)
+managedResource collectionNameMaybe updateArgumentName =
+  D.resource <$> baseURL collectionNameMaybe updateArgumentName
diff --git a/library/Solr/Effect.hs b/library/Solr/Effect.hs
new file mode 100644
--- /dev/null
+++ b/library/Solr/Effect.hs
@@ -0,0 +1,8 @@
+module Solr.Effect
+(
+  module Solr.Effect.Effect,
+)
+where
+
+import Solr.Effect.Effect hiding (Effect(Effect), Resource(Resource))
+
diff --git a/library/Solr/Effect/Effect.hs b/library/Solr/Effect/Effect.hs
new file mode 100644
--- /dev/null
+++ b/library/Solr/Effect/Effect.hs
@@ -0,0 +1,43 @@
+module Solr.Effect.Effect
+where
+
+import Solr.Prelude
+import qualified Network.HTTP.Client
+import qualified Data.ByteString.Lazy
+import qualified Data.ByteString
+import qualified Solr.Request
+import qualified Solr.HTTPRequestEncoder
+import qualified HTTPResponseDecoder
+
+
+newtype Effect a =
+  Effect (ReaderT Resource (ExceptT Error IO) a)
+  deriving (Functor, Applicative, Monad, MonadIO)
+
+data Resource =
+  Resource ByteString Network.HTTP.Client.Manager
+
+data Error =
+  Error_Decoding !Text |
+  Error_Transport !Network.HTTP.Client.HttpException
+  deriving (Show)
+
+run :: Effect a -> Resource -> IO (Either Error a)
+run (Effect impl) resource =
+  runExceptT (runReaderT impl resource)
+
+request :: Solr.Request.Request a b -> a -> Effect b
+request (Solr.Request.Request encoderProducer decoder) input =
+  Effect $
+  ReaderT $
+  \(Resource baseURL httpManager) ->
+    ExceptT $
+    fmap (either (Left . Error_Transport) (either (Left . Error_Decoding) Right)) $
+    try $
+    Network.HTTP.Client.withResponse (request baseURL) httpManager $
+    responseDecoder
+  where
+    request baseURL =
+      Solr.HTTPRequestEncoder.encoder_request (encoderProducer baseURL) input
+    responseDecoder =
+      HTTPResponseDecoder.run decoder
diff --git a/library/Solr/Managed.hs b/library/Solr/Managed.hs
new file mode 100644
--- /dev/null
+++ b/library/Solr/Managed.hs
@@ -0,0 +1,25 @@
+module Solr.Managed
+(
+  resource,
+)
+where
+
+import Solr.Prelude
+import Control.Monad.Managed.Safe
+import qualified Network.HTTP.Client as A
+import qualified Network.HTTP.Client.TLS as B
+import qualified Solr.Effect.Effect as A
+
+
+tlsManager :: Managed A.Manager
+tlsManager =
+  managed (bracketOnError acquire release)
+  where
+    acquire =
+      A.newManager B.tlsManagerSettings
+    release _ =
+      return ()
+
+resource :: ByteString {-^ Base URL-} -> Managed A.Resource
+resource baseURL =
+  A.Resource <$> pure baseURL <*> tlsManager
diff --git a/library/Solr/Session.hs b/library/Solr/Session.hs
deleted file mode 100644
--- a/library/Solr/Session.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-module Solr.Session
-(
-  Session,
-  request,
-  -- * Execution
-  Error(..),
-  run,
-)
-where
-
-import Solr.Prelude
-import qualified Network.HTTP.Client
-import qualified Data.ByteString.Lazy
-import qualified Data.ByteString
-import qualified Solr.Request
-import qualified Solr.HTTPRequestEncoder
-import qualified HTTPResponseDecoder
-
-
-newtype Session a =
-  Session (ReaderT Env (ExceptT Error IO) a)
-  deriving (Functor, Applicative, Monad, MonadIO)
-
-type Env =
-  (ByteString, Network.HTTP.Client.Manager)
-
-data Error =
-  Error_Decoding !Text |
-  Error_Transport !Network.HTTP.Client.HttpException
-  deriving (Show)
-
-run :: Session a -> ByteString -> Network.HTTP.Client.Manager -> IO (Either Error a)
-run (Session impl) baseURL httpManager =
-  runExceptT (runReaderT impl (baseURL, httpManager))
-
-request :: Solr.Request.Request a b -> a -> Session b
-request (Solr.Request.Request encoderProducer decoder) input =
-  Session $
-  ReaderT $
-  \(baseURL, httpManager) ->
-    ExceptT $
-    fmap (either (Left . Error_Transport) (either (Left . Error_Decoding) Right)) $
-    try $
-    Network.HTTP.Client.withResponse (request baseURL) httpManager $
-    responseDecoder
-  where
-    request baseURL =
-      Solr.HTTPRequestEncoder.encoder_request (encoderProducer baseURL) input
-    responseDecoder =
-      HTTPResponseDecoder.run decoder
diff --git a/solr.cabal b/solr.cabal
--- a/solr.cabal
+++ b/solr.cabal
@@ -1,7 +1,7 @@
 name:
   solr
 version:
-  0.3.3
+  0.4
 synopsis:
   A minimal Solr client library
 homepage:
@@ -23,14 +23,12 @@
 cabal-version:
   >=1.10
 
-
 source-repository head
   type:
     git
   location:
     git://github.com/sannsyn/solr.git
 
-
 library
   hs-source-dirs:
     library
@@ -43,13 +41,21 @@
     Solr.HTTPResponseDecoder
     Solr.HTTPRequestEncoder
     Solr.Parameters
+    Solr.Effect.Effect
   exposed-modules:
-    Solr.Session
+    Solr.Managed
+    Solr.Effect
     Solr.Request
+    Solr.Args
   build-depends:
+    -- 
+    managed == 1.*,
+    optparse-applicative-simple >= 1 && < 1.1,
+    attoparsec-data == 0.1.*,
     -- networking:
+    http-client == 0.5.*,
+    http-client-tls == 0.3.*,
     http-response-decoder >= 0.2 && < 0.3,
-    http-client >= 0.4.27 && < 0.6,
     uri-encode >= 1.5 && < 2,
     -- json:
     json-encoder >= 0.1.5 && < 0.2,
@@ -67,4 +73,3 @@
     transformers >= 0.4 && < 0.6,
     base-prelude < 2,
     base < 5
-
