diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Michael Snoyman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Network/HTTP/Client/TLS.hs b/Network/HTTP/Client/TLS.hs
new file mode 100644
--- /dev/null
+++ b/Network/HTTP/Client/TLS.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+-- | Support for making connections via the connection package and, in turn,
+-- the tls package suite.
+module Network.HTTP.Client.TLS
+    ( tlsManagerSettings
+    , mkManagerSettings
+    , getTlsConnection
+    ) where
+
+import Data.Default
+import Network.HTTP.Client
+import Network.HTTP.Client.Internal
+import Control.Exception
+import qualified Network.Connection as NC
+import Network.Socket (HostAddress)
+import qualified Network.TLS as TLS
+
+mkManagerSettings :: NC.TLSSettings
+                  -> Maybe NC.SockSettings
+                  -> ManagerSettings
+mkManagerSettings tls sock = defaultManagerSettings
+    { managerTlsConnection = getTlsConnection (Just tls) sock
+    , managerRawConnection =
+        case sock of
+            Nothing -> managerRawConnection defaultManagerSettings
+            Just _ -> getTlsConnection Nothing sock
+    , managerRetryableException = \e ->
+        case () of
+            ()
+                | ((fromException e)::(Maybe TLS.TLSError))==Just TLS.Error_EOF -> True
+                | otherwise -> case fromException e of
+                    Just (_ :: IOException) -> True
+                    _ ->
+                        case fromException e of
+                            -- Note: Some servers will timeout connections by accepting
+                            -- the incoming packets for the new request, but closing
+                            -- the connection as soon as we try to read. To make sure
+                            -- we open a new connection under these circumstances, we
+                            -- check for the NoResponseDataReceived exception.
+                            Just NoResponseDataReceived -> True
+                            _ -> False
+    , managerWrapIOException =
+        let wrapper se =
+                case fromException se of
+                    Just e -> toException $ InternalIOException e
+                    Nothing ->
+                        case fromException se of
+                            Just TLS.Terminated{} -> toException $ TlsException se
+                            Nothing ->
+                                case fromException se of
+                                    Just TLS.HandshakeFailed{} -> toException $ TlsException se
+                                    Nothing ->
+                                        case fromException se of
+                                            Just TLS.ConnectionNotEstablished -> toException $ TlsException se
+                                            Nothing -> se
+         in handle $ throwIO . wrapper
+    }
+
+tlsManagerSettings :: ManagerSettings
+tlsManagerSettings = mkManagerSettings def Nothing
+
+getTlsConnection :: Maybe NC.TLSSettings
+                 -> Maybe NC.SockSettings
+                 -> IO (Maybe HostAddress -> String -> Int -> IO Connection)
+getTlsConnection tls sock = do
+    context <- NC.initConnectionContext
+    return $ \_ha host port -> do
+        conn <- NC.connectTo context NC.ConnectionParams
+            { NC.connectionHostname = host
+            , NC.connectionPort = fromIntegral port
+            , NC.connectionUseSecure = tls
+            , NC.connectionUseSocks = sock
+            }
+        convertConnection conn
+  where
+    convertConnection conn = makeConnection
+        (NC.connectionGetChunk conn)
+        (NC.connectionPut conn)
+        (NC.connectionClose conn)
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/http-client-tls.cabal b/http-client-tls.cabal
new file mode 100644
--- /dev/null
+++ b/http-client-tls.cabal
@@ -0,0 +1,34 @@
+name:                http-client-tls
+version:             0.2.0.0
+synopsis:            http-client backend using the connection package and tls library
+description:         Intended for use by higher-level libraries, such as http-conduit.
+homepage:            https://github.com/snoyberg/http-client
+license:             MIT
+license-file:        LICENSE
+author:              Michael Snoyman
+maintainer:          michael@snoyman.com
+category:            Network
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Network.HTTP.Client.TLS
+  other-extensions:    ScopedTypeVariables
+  build-depends:       base >= 4 && < 5
+                     , data-default
+                     , http-client >= 0.2
+                     , connection >= 0.1.3
+                     , network
+                     , tls >=1.1
+  default-language:    Haskell2010
+
+test-suite spec
+  main-is:             Spec.hs
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  default-language:    Haskell2010
+  build-depends:       base
+                     , hspec
+                     , http-client
+                     , http-client-tls
+                     , http-types
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE OverloadedStrings #-}
+import Test.Hspec
+import Network.HTTP.Client
+import Network.HTTP.Client.TLS
+import Network.HTTP.Client.Internal
+import Network.HTTP.Types
+
+main :: IO ()
+main = hspec $ do
+    it "make a TLS connection" $ do
+        manager <- newManager tlsManagerSettings
+        withResponse "https://httpbin.org/status/418"
+            { checkStatus = \_ _ _ -> Nothing
+            } manager $ \res -> do
+            responseStatus res `shouldBe` status418
