diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,20 @@
+# Amazonka
+
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+## Description
+
+Client library containing request and response primitives to be used alongside
+the types from all `amazonka-*` libraries.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+
+## Licence
+
+`amazonka` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
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/amazonka.cabal b/amazonka.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka.cabal
@@ -0,0 +1,49 @@
+name:                  amazonka
+version:               0.0.0
+synopsis:              Comprehensive Amazon Web Services SDK
+homepage:              https://github.com/brendanhay/amazonka
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2014 Brendan Hay
+category:              Network, AWS, Cloud
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    Client library containing request and response primitives to be used
+    alongside the types from all amazonka related service libraries.
+    .
+    /Warning:/ This is an experimental preview release which is still under
+    heavy development and not intended for public consumption, caveat emptor!
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/amazonka.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Control.Monad.Trans.AWS
+        , Network.AWS
+
+    build-depends:
+          amazonka-core     == 0.0.*
+        , base              >= 4.7     && < 5
+        , conduit           >= 1.1     && < 1.3
+        , exceptions        == 0.6.*
+        , http-conduit      >= 2.1.4   && < 2.2
+        , lens              >= 4.4     && < 5
+        , mmorph            >= 1       && < 2
+        , monad-control     >= 0.3.2   && < 4
+        , mtl               >= 2.2.1   && < 2.3
+        , resourcet         >= 1.1     && < 1.3
+        , text              >= 1.1
+        , time              >= 1.4
+        , transformers-base >= 0.4.2
diff --git a/src/Control/Monad/Trans/AWS.hs b/src/Control/Monad/Trans/AWS.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/AWS.hs
@@ -0,0 +1,334 @@
+{-# LANGUAGE ConstraintKinds            #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE RankNTypes                 #-}
+{-# LANGUAGE RecordWildCards            #-}
+{-# LANGUAGE TupleSections              #-}
+{-# LANGUAGE TypeFamilies               #-}
+{-# LANGUAGE UndecidableInstances       #-}
+
+-- Module      : Control.Monad.Trans.AWS
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+-- | A monad transformer built on top of functions from "Network.AWS" which
+-- encapsulates various common parameters, errors, and usage patterns.
+module Control.Monad.Trans.AWS
+    (
+    -- * Transformer
+      AWS
+    , AWST
+    , MonadAWS
+
+    -- * Running
+    , runAWST
+
+    -- * Environment
+    , Env
+    , envAuth
+    , envRegion
+    , envManager
+    , envLogger
+    , scoped
+    -- ** Creating the environment
+    , Credentials (..)
+    , AWS.newEnv
+    , AWS.getEnv
+
+    -- * Debugging
+    , debug
+    , whenDebug
+
+    -- * Regionalisation
+    , Region      (..)
+    , within
+
+    -- * Errors
+    , Error
+    , hoistEither
+    , throwAWSError
+    , verify
+    , verifyWith
+
+    -- * Requests
+    -- ** Synchronous
+    , send
+    , send_
+    , sendCatch
+    -- ** Paginated
+    , paginate
+    , paginateCatch
+    -- ** Pre-signing URLs
+    , presign
+
+    -- * Types
+    , module Network.AWS.Types
+    ) where
+
+import           Control.Applicative
+import           Control.Arrow                (first)
+import           Control.Lens
+import           Control.Monad.Base
+import           Control.Monad.Catch
+import           Control.Monad.Except
+import           Control.Monad.Morph
+import           Control.Monad.Reader
+import           Control.Monad.Trans.Control
+import           Control.Monad.Trans.Resource
+import           Data.Conduit
+import           Data.Text                    (Text)
+import           Data.Time
+import           Network.AWS                  (Env, envRegion, envLogger, envAuth, envManager)
+import qualified Network.AWS                  as AWS
+import           Network.AWS.Auth
+import qualified Network.AWS.Types            as Types
+import           Network.AWS.Types            hiding (debug)
+
+-- | The top-level error type.
+type Error = ServiceError String
+
+-- | A convenient alias for 'AWST' 'IO'.
+type AWS = AWST IO
+
+-- | Provides an alias for shortening type signatures if preferred.
+--
+-- /Note:/ requires the @ConstraintKinds@ extension.
+type MonadAWS m =
+    ( MonadBaseControl IO m
+    , MonadCatch m
+    , MonadResource m
+    , MonadError Error m
+    , MonadReader Env m
+    )
+
+-- | The transformer. This satisfies all of the constraints that the functions
+-- in this module require, such as providing 'MonadResource' instances,
+-- as well as keeping track of the internal 'Env' environment.
+--
+-- The 'MonadError' instance for this transformer internally uses 'ExceptT'
+-- to handle actions that result in an 'Error'. For more information see
+-- 'sendCatch' and 'paginateCatch'.
+newtype AWST m a = AWST
+    { unAWST :: ReaderT (Env, InternalState) (ExceptT Error m) a
+    } deriving
+        ( Functor
+        , Applicative
+        , Alternative
+        , Monad
+        , MonadIO
+        , MonadPlus
+        , MonadThrow
+        , MonadCatch
+        , MonadError Error
+        )
+
+instance Monad m => MonadReader Env (AWST m) where
+    ask = AWST (fst `liftM` ask)
+    {-# INLINE ask #-}
+
+    local f = AWST . local (first f) . unAWST
+    {-# INLINE local #-}
+
+instance MonadTrans AWST where
+    lift = AWST . lift . lift
+    {-# INLINE lift #-}
+
+instance MonadBase b m => MonadBase b (AWST m) where
+    liftBase = liftBaseDefault
+    {-# INLINE liftBase #-}
+
+instance MonadTransControl AWST where
+    newtype StT AWST a = StTAWS
+        { unStTAWS :: StT (ExceptT Error) (StT (ReaderT (Env, InternalState)) a)
+        }
+
+    liftWith f = AWST $
+        liftWith $ \g ->
+            liftWith $ \h ->
+                f (liftM StTAWS . h . g . unAWST)
+    {-# INLINE liftWith #-}
+
+    restoreT = AWST . restoreT . restoreT . liftM unStTAWS
+    {-# INLINE restoreT #-}
+
+instance MonadBaseControl b m => MonadBaseControl b (AWST m) where
+    newtype StM (AWST m) a = StMAWST { unStMAWST :: ComposeSt AWST m a }
+
+    liftBaseWith = defaultLiftBaseWith StMAWST
+    {-# INLINE liftBaseWith #-}
+
+    restoreM = defaultRestoreM unStMAWST
+    {-# INLINE restoreM #-}
+
+instance MFunctor AWST where
+    hoist nat m = AWST (ReaderT (ExceptT . nat . runAWST' m))
+    {-# INLINE hoist #-}
+
+instance MMonad AWST where
+    embed f m = liftM2 (,) ask resources
+            >>= f . runAWST' m
+            >>= either throwError return
+    {-# INLINE embed #-}
+
+instance (Applicative m, MonadIO m, MonadBase IO m, MonadThrow m)
+    => MonadResource (AWST m) where
+        liftResourceT f = resources >>= liftIO . runInternalState f
+        {-# INLINE liftResourceT #-}
+
+-- | Unwrap an 'AWST' transformer, calling all of the registered 'ResourceT'
+-- release actions.
+runAWST :: MonadBaseControl IO m => Env -> AWST m a -> m (Either Error a)
+runAWST e m = runResourceT (withInternalState (runAWST' m . (e,)))
+
+runAWST' :: AWST m a -> (Env, InternalState) -> m (Either Error a)
+runAWST' (AWST k) = runExceptT . runReaderT k
+
+resources :: Monad m => AWST m InternalState
+resources = AWST (ReaderT (return . snd))
+
+-- | Hoist an 'Either' throwing the 'Left' case, and returning the 'Right'.
+hoistEither :: (MonadError Error m, AWSError e) => Either e a -> m a
+hoistEither = either throwAWSError return
+
+throwAWSError :: (MonadError Error m, AWSError e) => e -> m a
+throwAWSError = throwError . awsError
+
+verify :: (AWSError e, MonadError Error m)
+       => Prism' e a
+       -> e
+       -> m ()
+verify p e
+    | isn't p e = throwAWSError e
+    | otherwise = return ()
+
+verifyWith :: (AWSError e, MonadError Error m)
+           => Prism' e a
+           -> (a -> Bool)
+           -> e
+           -> m ()
+verifyWith p f e = either (const err) g (matching p e)
+  where
+    g x | f x       = return ()
+        | otherwise = err
+
+    err = throwAWSError e
+
+-- | Pass the current environment to a function.
+scoped :: MonadReader Env m => (Env -> m a) -> m a
+scoped f = ask >>= f
+
+-- | Use the logger from 'envLogger' to log a debug message.
+debug :: (MonadIO m, MonadReader Env m) => Text -> m ()
+debug t = view envLogger >>= (`Types.debug` t)
+
+-- | Perform a monadic action if 'envLogger' is set to 'Debug'.
+--
+-- Analogous to 'when'.
+whenDebug :: MonadReader Env m => m () -> m ()
+whenDebug f = do
+    l <- view envLogger
+    case l of
+        Debug _ -> f
+        _       -> return ()
+
+-- | Scope a monadic action within the specific 'Region'.
+within :: MonadReader Env m => Region -> m a -> m a
+within r = local (envRegion .~ r)
+
+-- | Send a data type which is an instance of 'AWSRequest', returning it's
+-- associated 'Rs' response type.
+--
+-- This will throw any 'HTTPException' or 'AWSServiceError' returned by the
+-- service using the 'MonadError' instance. In the case of 'AWST' this will
+-- cause the internal 'ExceptT' to short-circuit and return an 'Error' in
+-- the 'Left' case as the result of the computation.
+send :: ( MonadCatch m
+        , MonadResource m
+        , MonadReader Env m
+        , MonadError Error m
+        , AWSRequest a
+        )
+     => a
+     -> m (Rs a)
+send = sendCatch >=> hoistEither
+
+-- | A variant of 'send' which discards any successful response.
+send_ :: ( MonadCatch m
+         , MonadResource m
+         , MonadReader Env m
+         , MonadError Error m
+         , AWSRequest a
+         )
+      => a
+      -> m ()
+send_ = void . send
+
+-- | Send a data type which is an instance of 'AWSRequest', returning either the
+-- associated 'Rs' response type in the success case, or the related service's
+-- 'Er' type in the error case.
+--
+-- This includes 'HTTPExceptions', serialisation errors, and any service
+-- errors returned as part of the 'Response'.
+sendCatch :: ( MonadCatch m
+             , MonadResource m
+             , MonadReader Env m
+             , AWSRequest a
+             )
+          => a
+          -> m (Response a)
+sendCatch rq = scoped (`AWS.send` rq)
+
+-- | Send a data type which is an instance of 'AWSPager' and paginate while
+-- there are more results as defined by the related service operation.
+--
+-- Errors will be handle identically to 'send'.
+--
+-- /Note:/ The 'ResumableSource' will close when there are no more results or the
+-- 'ResourceT' computation is unwrapped. See: 'runResourceT' for more information.
+paginate :: ( MonadCatch m
+            , MonadResource m
+            , MonadReader Env m
+            , MonadError Error m
+            , AWSPager a
+            )
+         => a
+         -> Source m (Rs a)
+paginate rq = paginateCatch rq $= awaitForever (hoistEither >=> yield)
+
+-- | Send a data type which is an instance of 'AWSPager' and paginate over
+-- the associated 'Rs' response type in the success case, or the related service's
+-- 'Er' type in the error case.
+--
+-- /Note:/ The 'ResumableSource' will close when there are no more results or the
+-- 'ResourceT' computation is unwrapped. See: 'runResourceT' for more information.
+paginateCatch :: ( MonadCatch m
+                 , MonadResource m
+                 , MonadReader Env m
+                 , AWSPager a
+                 )
+              => a
+              -> Source m (Response a)
+paginateCatch rq = scoped (`AWS.paginate` rq)
+
+-- | Presign a URL with expiry to be used at a later time.
+--
+-- /Note:/ Requires the service's signer to be an instance of 'AWSPresigner'.
+-- Not all signing process support this.
+presign :: ( MonadIO m
+           , MonadReader Env m
+           , AWSRequest a
+           , AWSPresigner (Sg (Sv a))
+           )
+        => a       -- ^ Request to presign.
+        -> UTCTime -- ^ Signing time.
+        -> Int     -- ^ Expiry time in seconds.
+        -> m (Signed a (Sg (Sv a)))
+presign rq t x = scoped (\e -> AWS.presign e rq t x)
diff --git a/src/Network/AWS.hs b/src/Network/AWS.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/AWS.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE ConstraintKinds   #-}
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE TemplateHaskell   #-}
+{-# LANGUAGE TypeFamilies      #-}
+{-# LANGUAGE ViewPatterns      #-}
+
+-- Module      : Network.AWS
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+-- | The core module for making requests to the various AWS services.
+module Network.AWS
+    (
+    -- * Environment
+      Env
+    , envAuth
+    , envRegion
+    , envManager
+    , envLogger
+    -- ** Creating the environment
+    , Credentials (..)
+    , newEnv
+    , getEnv
+
+    -- * Requests
+    -- ** Synchronous
+    , send
+    -- ** Paginated
+    , paginate
+    -- ** Pre-signing URLs
+    , presign
+
+    -- * Types
+    , module Network.AWS.Types
+    ) where
+
+import           Control.Lens
+import           Control.Monad.Catch
+import           Control.Monad.Except
+import           Control.Monad.Trans.Resource
+import           Data.Conduit
+import           Data.Monoid
+import           Data.Time
+import           Network.AWS.Auth
+import           Network.AWS.Data
+import qualified Network.AWS.Signing.Internal as Sign
+import           Network.AWS.Types
+import           Network.HTTP.Conduit         hiding (Response)
+
+-- | The environment containing the parameters required to make AWS requests.
+data Env = Env
+    { _envRegion  :: !Region
+    , _envLogger  :: Logger
+    , _envManager :: Manager
+    , _envAuth    :: Auth
+    }
+
+makeLenses ''Env
+
+-- | This creates a new environment without debug logging and uses 'getAuth'
+-- to expand/discover the supplied 'Credentials'.
+--
+-- Lenses such as 'envLogger' can be used to modify the 'Env' with a debug logger.
+newEnv :: (Functor m, MonadIO m)
+       => Region
+       -> Credentials
+       -> Manager
+       -> ExceptT String m Env
+newEnv r c m = Env r None m `liftM` getAuth m c
+
+-- | Create a new environment without debug logging, creating a new 'Manager'.
+--
+-- Any errors are thrown using 'error'.
+--
+-- /See:/ 'newEnv'
+getEnv :: Region -> Credentials -> IO Env
+getEnv r c = do
+    m <- newManager conduitManagerSettings
+    e <- runExceptT (newEnv r c m)
+    either error
+           return
+           e
+
+-- | Send a data type which is an instance of 'AWSRequest', returning either the
+-- associated 'Rs' response type in the success case, or the related service's
+-- 'Er' type in the error case.
+--
+-- This includes 'HTTPExceptions', serialisation errors, and any service
+-- errors returned as part of the 'Response'.
+send :: (MonadCatch m, MonadResource m, AWSRequest a)
+     => Env
+     -> a
+     -> m (Response a)
+send Env{..} x@(request -> rq) = go `catch` er >>= response x
+  where
+    go = do
+        debug _envLogger $
+            "[Raw Request]\n" <> toText rq
+        t  <- liftIO getCurrentTime
+        s  <- Sign.sign _envAuth _envRegion rq t
+        debug _envLogger $
+            "[Signed Request]\n" <> toText s
+        rs <- liftResourceT (http (s^.sgRequest) _envManager)
+        debug _envLogger $
+            "[Raw Response]\n" <> toText rs
+        return (Right rs)
+
+    er ex = return (Left (ex :: HttpException))
+
+-- | Send a data type which is an instance of 'AWSPager' and paginate over
+-- the associated 'Rs' response type in the success case, or the related service's
+-- 'Er' type in the error case.
+--
+-- /Note:/ The 'ResumableSource' will close when there are no more results or the
+-- 'ResourceT' computation is unwrapped. See: 'runResourceT' for more information.
+paginate :: (MonadCatch m, MonadResource m, AWSPager a)
+         => Env
+         -> a
+         -> Source m (Response a)
+paginate e = go
+  where
+    go rq = do
+        rs <- lift (send e rq)
+        yield rs
+        either (const (return ()))
+               (maybe (return ()) go . page rq)
+               rs
+
+-- | Presign a URL with expiry to be used at a later time.
+--
+-- /Note:/ Requires the service's signer to be an instance of 'AWSPresigner'.
+-- Not all signing process support this.
+presign :: (MonadIO m, AWSRequest a, AWSPresigner (Sg (Sv a)))
+        => Env
+        -> a       -- ^ Request to presign.
+        -> UTCTime -- ^ Signing time.
+        -> Int     -- ^ Expiry time in seconds.
+        -> m (Signed a (Sg (Sv a)))
+presign Env{..} (request -> rq) = Sign.presign _envAuth _envRegion rq
