diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
 # s3-uri
-[![master](https://circleci.com/gh/haskell-works/h3-uri/tree/master.svg?style=svg)](https://circleci.com/gh/haskell-works/h3-uri/tree/master)
+[![CircleCI](https://circleci.com/gh/haskell-works/hw-uri.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-uri)
diff --git a/hw-uri.cabal b/hw-uri.cabal
--- a/hw-uri.cabal
+++ b/hw-uri.cabal
@@ -1,7 +1,7 @@
 cabal-version:          2.2
 
 name:                   hw-uri
-version:                0.1.1.3
+version:                0.1.1.4
 synopsis:               Supports IO on URIs
 description:            Supports IO on URIs.
 homepage:               https://github.com/haskell-works/hw-uri
diff --git a/src/HaskellWorks/Data/Uri/IO/Lazy.hs b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
--- a/src/HaskellWorks/Data/Uri/IO/Lazy.hs
+++ b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
@@ -9,6 +9,7 @@
   , firstExistingResource
   , headS3Uri
   , writeResource
+  , writeResourceWithParent
   , writeResource'
   , createLocalDirectoryIfMissing
   , linkOrCopyResource
@@ -34,6 +35,7 @@
 import qualified Data.ByteString.Lazy             as LBS
 import qualified Data.Text                        as T
 import qualified HaskellWorks.Data.Uri.IO.Console as CIO
+import qualified HaskellWorks.Data.Uri.Location   as URI
 import qualified Network.AWS                      as AWS
 import qualified Network.AWS.S3.CopyObject        as AWS
 import qualified Network.AWS.S3.HeadObject        as AWS
@@ -56,7 +58,7 @@
     (AWS.ServiceError (AWS.ServiceError' _ s@(HTTP.Status 301 _) _ _ _ _)) -> return (Left (AwsUriError s))
     _                                                                      -> throwM e
 
-handleHttpError :: (MonadCatch m, MonadIO m) => m a -> m (Either UriError a)
+handleHttpError :: MonadCatch m => m a -> m (Either UriError a)
 handleHttpError f = catch (Right <$> f) $ \(e :: HTTP.HttpException) ->
   case e of
     (HTTP.HttpExceptionRequest _ e') -> case e' of
@@ -94,7 +96,7 @@
           then return False
           else return True
 
-resourceExists :: (MonadUnliftIO m, MonadCatch m, MonadIO m) => AWS.Env -> Location -> m Bool
+resourceExists :: (MonadUnliftIO m, MonadCatch m) => AWS.Env -> Location -> m Bool
 resourceExists envAws = \case
   S3 s3Uri        -> isRight <$> runResourceT (headS3Uri envAws s3Uri)
   HttpUri httpUri -> isRight <$> headHttpUri httpUri
@@ -110,7 +112,7 @@
             resourceExists envAws (Local target)
           else return False
 
-firstExistingResource :: (MonadUnliftIO m, MonadCatch m, MonadIO m) => AWS.Env -> [Location] -> m (Maybe Location)
+firstExistingResource :: (MonadUnliftIO m, MonadCatch m) => AWS.Env -> [Location] -> m (Maybe Location)
 firstExistingResource _ [] = return Nothing
 firstExistingResource envAws (a:as) = do
   exists <- resourceExists envAws a
@@ -131,11 +133,19 @@
 uploadToS3' envAws uri fn =
   handleAwsError $ runResAws envAws $ AWS.putFile' uri fn
 
+-- | Write a lazy bytestring to a location
 writeResource :: (MonadUnliftIO m, MonadCatch m) => AWS.Env -> Location -> LBS.ByteString -> ExceptT UriError m (Maybe AWS.ETag)
 writeResource envAws loc lbs = ExceptT $ case loc of
   S3 s3Uri   -> uploadToS3 envAws s3Uri lbs
   Local path -> liftIO (LBS.writeFile path lbs) >> return (Right Nothing)
   HttpUri _  -> return (Left (GenericUriError "HTTP PUT method not supported"))
+
+-- | Write a lazy bytestring to a location, creating the parent directory if necessary.
+writeResourceWithParent :: (MonadUnliftIO m, MonadCatch m) => AWS.Env -> Location -> LBS.ByteString -> ExceptT UriError m (Maybe AWS.ETag)
+writeResourceWithParent envAws location lbs = do
+  let parent = URI.dirname location
+  createLocalDirectoryIfMissing parent
+  writeResource envAws location lbs
 
 writeResource' :: (MonadUnliftIO m, MonadCatch m) => AWS.Env -> Location -> FilePath -> ExceptT UriError m (Maybe AWS.ETag)
 writeResource' envAws loc fn = ExceptT $ case loc of
diff --git a/src/HaskellWorks/Data/Uri/Internal/List.hs b/src/HaskellWorks/Data/Uri/Internal/List.hs
--- a/src/HaskellWorks/Data/Uri/Internal/List.hs
+++ b/src/HaskellWorks/Data/Uri/Internal/List.hs
@@ -9,6 +9,6 @@
 mapLast f (a:as) = a:mapLast f as
 
 dropSave1 :: [a] -> [a]
-dropSave1 (_:xs) = xs
 dropSave1 [x]    = [x]
+dropSave1 (_:xs) = xs
 dropSave1 []     = []
