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,34 @@
+# Amazon Glacier SDK
+
+> _Warning:_ This is an experimental preview release which is still under heavy development and not intended for public consumption, _caveat emptor_!
+
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+## Description
+
+Amazon Glacier is a secure, durable, and extremely low-cost storage service
+for data archiving and online backup. Customers can reliably store large or
+small amounts of data for as little as $0.01 per gigabyte per month, a
+significant savings compared to on-premises solutions. To keep costs low,
+Amazon Glacier is optimized for infrequently accessed data where a retrieval
+time of several hours is suitable.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-glacier)
+and the [AWS API Reference](http://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html).
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-glacier` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
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-glacier.cabal b/amazonka-glacier.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-glacier.cabal
@@ -0,0 +1,68 @@
+name:                  amazonka-glacier
+version:               0.3.0
+synopsis:              Amazon Glacier 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, Distributed Computing
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    Amazon Glacier is a secure, durable, and extremely low-cost storage service
+    for data archiving and online backup. Customers can reliably store large or
+    small amounts of data for as little as $0.01 per gigabyte per month, a
+    significant savings compared to on-premises solutions. To keep costs low,
+    Amazon Glacier is optimized for infrequently accessed data where a retrieval
+    time of several hours is suitable.
+
+    .
+    /See:/ <http://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html AWS API Reference>
+    .
+    /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 gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.AWS.Glacier
+        , Network.AWS.Glacier.AbortMultipartUpload
+        , Network.AWS.Glacier.CompleteMultipartUpload
+        , Network.AWS.Glacier.CreateVault
+        , Network.AWS.Glacier.DeleteArchive
+        , Network.AWS.Glacier.DeleteVault
+        , Network.AWS.Glacier.DeleteVaultNotifications
+        , Network.AWS.Glacier.DescribeJob
+        , Network.AWS.Glacier.DescribeVault
+        , Network.AWS.Glacier.GetDataRetrievalPolicy
+        , Network.AWS.Glacier.GetJobOutput
+        , Network.AWS.Glacier.GetVaultNotifications
+        , Network.AWS.Glacier.InitiateJob
+        , Network.AWS.Glacier.InitiateMultipartUpload
+        , Network.AWS.Glacier.ListJobs
+        , Network.AWS.Glacier.ListMultipartUploads
+        , Network.AWS.Glacier.ListParts
+        , Network.AWS.Glacier.ListVaults
+        , Network.AWS.Glacier.SetDataRetrievalPolicy
+        , Network.AWS.Glacier.SetVaultNotifications
+        , Network.AWS.Glacier.Types
+        , Network.AWS.Glacier.UploadArchive
+        , Network.AWS.Glacier.UploadMultipartPart
+
+    other-modules:
+
+    build-depends:
+          amazonka-core == 0.3.0.*
+        , base          >= 4.7     && < 5
diff --git a/gen/Network/AWS/Glacier.hs b/gen/Network/AWS/Glacier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier.hs
@@ -0,0 +1,65 @@
+-- Module      : Network.AWS.Glacier
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Amazon Glacier is a secure, durable, and extremely low-cost storage service
+-- for data archiving and online backup. Customers can reliably store large or
+-- small amounts of data for as little as $0.01 per gigabyte per month, a
+-- significant savings compared to on-premises solutions. To keep costs low,
+-- Amazon Glacier is optimized for infrequently accessed data where a retrieval
+-- time of several hours is suitable.
+module Network.AWS.Glacier
+    ( module Network.AWS.Glacier.AbortMultipartUpload
+    , module Network.AWS.Glacier.CompleteMultipartUpload
+    , module Network.AWS.Glacier.CreateVault
+    , module Network.AWS.Glacier.DeleteArchive
+    , module Network.AWS.Glacier.DeleteVault
+    , module Network.AWS.Glacier.DeleteVaultNotifications
+    , module Network.AWS.Glacier.DescribeJob
+    , module Network.AWS.Glacier.DescribeVault
+    , module Network.AWS.Glacier.GetDataRetrievalPolicy
+    , module Network.AWS.Glacier.GetJobOutput
+    , module Network.AWS.Glacier.GetVaultNotifications
+    , module Network.AWS.Glacier.InitiateJob
+    , module Network.AWS.Glacier.InitiateMultipartUpload
+    , module Network.AWS.Glacier.ListJobs
+    , module Network.AWS.Glacier.ListMultipartUploads
+    , module Network.AWS.Glacier.ListParts
+    , module Network.AWS.Glacier.ListVaults
+    , module Network.AWS.Glacier.SetDataRetrievalPolicy
+    , module Network.AWS.Glacier.SetVaultNotifications
+    , module Network.AWS.Glacier.Types
+    , module Network.AWS.Glacier.UploadArchive
+    , module Network.AWS.Glacier.UploadMultipartPart
+    ) where
+
+import Network.AWS.Glacier.AbortMultipartUpload
+import Network.AWS.Glacier.CompleteMultipartUpload
+import Network.AWS.Glacier.CreateVault
+import Network.AWS.Glacier.DeleteArchive
+import Network.AWS.Glacier.DeleteVault
+import Network.AWS.Glacier.DeleteVaultNotifications
+import Network.AWS.Glacier.DescribeJob
+import Network.AWS.Glacier.DescribeVault
+import Network.AWS.Glacier.GetDataRetrievalPolicy
+import Network.AWS.Glacier.GetJobOutput
+import Network.AWS.Glacier.GetVaultNotifications
+import Network.AWS.Glacier.InitiateJob
+import Network.AWS.Glacier.InitiateMultipartUpload
+import Network.AWS.Glacier.ListJobs
+import Network.AWS.Glacier.ListMultipartUploads
+import Network.AWS.Glacier.ListParts
+import Network.AWS.Glacier.ListVaults
+import Network.AWS.Glacier.SetDataRetrievalPolicy
+import Network.AWS.Glacier.SetVaultNotifications
+import Network.AWS.Glacier.Types
+import Network.AWS.Glacier.UploadArchive
+import Network.AWS.Glacier.UploadMultipartPart
diff --git a/gen/Network/AWS/Glacier/AbortMultipartUpload.hs b/gen/Network/AWS/Glacier/AbortMultipartUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/AbortMultipartUpload.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.AbortMultipartUpload
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation aborts a multipart upload identified by the upload ID.
+--
+-- After the Abort Multipart Upload request succeeds, you cannot upload any
+-- more parts to the multipart upload or complete the multipart upload. Aborting
+-- a completed upload fails. However, aborting an already-aborted upload will
+-- succeed, for a short time. For more information about uploading a part and
+-- completing a multipart upload, see 'UploadMultipartPart' and 'CompleteMultipartUpload'.
+--
+-- This operation is idempotent.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working withArchives in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-abort-upload.html Abort Multipart Upload> in the /Amazon GlacierDeveloper Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-AbortMultipartUpload.html>
+module Network.AWS.Glacier.AbortMultipartUpload
+    (
+    -- * Request
+      AbortMultipartUpload
+    -- ** Request constructor
+    , abortMultipartUpload
+    -- ** Request lenses
+    , amuAccountId
+    , amuUploadId
+    , amuVaultName
+
+    -- * Response
+    , AbortMultipartUploadResponse
+    -- ** Response constructor
+    , abortMultipartUploadResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data AbortMultipartUpload = AbortMultipartUpload
+    { _amuAccountId :: Text
+    , _amuUploadId  :: Text
+    , _amuVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'AbortMultipartUpload' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'amuAccountId' @::@ 'Text'
+--
+-- * 'amuUploadId' @::@ 'Text'
+--
+-- * 'amuVaultName' @::@ 'Text'
+--
+abortMultipartUpload :: Text -- ^ 'amuAccountId'
+                     -> Text -- ^ 'amuVaultName'
+                     -> Text -- ^ 'amuUploadId'
+                     -> AbortMultipartUpload
+abortMultipartUpload p1 p2 p3 = AbortMultipartUpload
+    { _amuAccountId = p1
+    , _amuVaultName = p2
+    , _amuUploadId  = p3
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+amuAccountId :: Lens' AbortMultipartUpload Text
+amuAccountId = lens _amuAccountId (\s a -> s { _amuAccountId = a })
+
+-- | The upload ID of the multipart upload to delete.
+amuUploadId :: Lens' AbortMultipartUpload Text
+amuUploadId = lens _amuUploadId (\s a -> s { _amuUploadId = a })
+
+-- | The name of the vault.
+amuVaultName :: Lens' AbortMultipartUpload Text
+amuVaultName = lens _amuVaultName (\s a -> s { _amuVaultName = a })
+
+data AbortMultipartUploadResponse = AbortMultipartUploadResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'AbortMultipartUploadResponse' constructor.
+abortMultipartUploadResponse :: AbortMultipartUploadResponse
+abortMultipartUploadResponse = AbortMultipartUploadResponse
+
+instance ToPath AbortMultipartUpload where
+    toPath AbortMultipartUpload{..} = mconcat
+        [ "/"
+        , toText _amuAccountId
+        , "/vaults/"
+        , toText _amuVaultName
+        , "/multipart-uploads/"
+        , toText _amuUploadId
+        ]
+
+instance ToQuery AbortMultipartUpload where
+    toQuery = const mempty
+
+instance ToHeaders AbortMultipartUpload
+
+instance ToJSON AbortMultipartUpload where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest AbortMultipartUpload where
+    type Sv AbortMultipartUpload = Glacier
+    type Rs AbortMultipartUpload = AbortMultipartUploadResponse
+
+    request  = delete
+    response = nullResponse AbortMultipartUploadResponse
diff --git a/gen/Network/AWS/Glacier/CompleteMultipartUpload.hs b/gen/Network/AWS/Glacier/CompleteMultipartUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/CompleteMultipartUpload.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.CompleteMultipartUpload
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | You call this operation to inform Amazon Glacier that all the archive parts
+-- have been uploaded and that Amazon Glacier can now assemble the archive from
+-- the uploaded parts. After assembling and saving the archive to the vault,
+-- Amazon Glacier returns the URI path of the newly created archive resource.
+-- Using the URI path, you can then access the archive. After you upload an
+-- archive, you should save the archive ID returned to retrieve the archive at a
+-- later point. You can also get the vault inventory to obtain a list of archive
+-- IDs in a vault. For more information, see 'InitiateJob'.
+--
+-- In the request, you must include the computed SHA256 tree hash of the entire
+-- archive you have uploaded. For information about computing a SHA256 tree
+-- hash, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html Computing Checksums>. On the server side, Amazon Glacier also
+-- constructs the SHA256 tree hash of the assembled archive. If the values
+-- match, Amazon Glacier saves the archive to the vault; otherwise, it returns
+-- an error, and the operation fails. The 'ListParts' operation returns a list of
+-- parts uploaded for a specific multipart upload. It includes checksum
+-- information for each uploaded part that can be used to debug a bad checksum
+-- issue.
+--
+-- Additionally, Amazon Glacier also checks for any missing content ranges when
+-- assembling the archive, if missing content ranges are found, Amazon Glacier
+-- returns an error and the operation fails.
+--
+-- Complete Multipart Upload is an idempotent operation. After your first
+-- successful complete multipart upload, if you call the operation again within
+-- a short period, the operation will succeed and return the same archive ID.
+-- This is useful in the event you experience a network issue that causes an
+-- aborted connection or receive a 500 server error, in which case you can
+-- repeat your Complete Multipart Upload request and get the same archive ID
+-- without creating duplicate archives. Note, however, that after the multipart
+-- upload completes, you cannot call the List Parts operation and the multipart
+-- upload will not appear in List Multipart Uploads response, even if idempotent
+-- complete is possible.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html Uploading LargeArchives in Parts (Multipart Upload)> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-complete-upload.html Complete Multipart Upload> in the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-CompleteMultipartUpload.html>
+module Network.AWS.Glacier.CompleteMultipartUpload
+    (
+    -- * Request
+      CompleteMultipartUpload
+    -- ** Request constructor
+    , completeMultipartUpload
+    -- ** Request lenses
+    , cmuAccountId
+    , cmuArchiveSize
+    , cmuChecksum
+    , cmuUploadId
+    , cmuVaultName
+
+    -- * Response
+    , CompleteMultipartUploadResponse
+    -- ** Response constructor
+    , completeMultipartUploadResponse
+    -- ** Response lenses
+    , cmurArchiveId
+    , cmurChecksum
+    , cmurLocation
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data CompleteMultipartUpload = CompleteMultipartUpload
+    { _cmuAccountId   :: Text
+    , _cmuArchiveSize :: Maybe Text
+    , _cmuChecksum    :: Maybe Text
+    , _cmuUploadId    :: Text
+    , _cmuVaultName   :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'CompleteMultipartUpload' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cmuAccountId' @::@ 'Text'
+--
+-- * 'cmuArchiveSize' @::@ 'Maybe' 'Text'
+--
+-- * 'cmuChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'cmuUploadId' @::@ 'Text'
+--
+-- * 'cmuVaultName' @::@ 'Text'
+--
+completeMultipartUpload :: Text -- ^ 'cmuAccountId'
+                        -> Text -- ^ 'cmuVaultName'
+                        -> Text -- ^ 'cmuUploadId'
+                        -> CompleteMultipartUpload
+completeMultipartUpload p1 p2 p3 = CompleteMultipartUpload
+    { _cmuAccountId   = p1
+    , _cmuVaultName   = p2
+    , _cmuUploadId    = p3
+    , _cmuArchiveSize = Nothing
+    , _cmuChecksum    = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+cmuAccountId :: Lens' CompleteMultipartUpload Text
+cmuAccountId = lens _cmuAccountId (\s a -> s { _cmuAccountId = a })
+
+-- | The total size, in bytes, of the entire archive. This value should be the sum
+-- of all the sizes of the individual parts that you uploaded.
+cmuArchiveSize :: Lens' CompleteMultipartUpload (Maybe Text)
+cmuArchiveSize = lens _cmuArchiveSize (\s a -> s { _cmuArchiveSize = a })
+
+-- | The SHA256 tree hash of the entire archive. It is the tree hash of SHA256
+-- tree hash of the individual parts. If the value you specify in the request
+-- does not match the SHA256 tree hash of the final assembled archive as
+-- computed by Amazon Glacier, Amazon Glacier returns an error and the request
+-- fails.
+cmuChecksum :: Lens' CompleteMultipartUpload (Maybe Text)
+cmuChecksum = lens _cmuChecksum (\s a -> s { _cmuChecksum = a })
+
+-- | The upload ID of the multipart upload.
+cmuUploadId :: Lens' CompleteMultipartUpload Text
+cmuUploadId = lens _cmuUploadId (\s a -> s { _cmuUploadId = a })
+
+-- | The name of the vault.
+cmuVaultName :: Lens' CompleteMultipartUpload Text
+cmuVaultName = lens _cmuVaultName (\s a -> s { _cmuVaultName = a })
+
+data CompleteMultipartUploadResponse = CompleteMultipartUploadResponse
+    { _cmurArchiveId :: Maybe Text
+    , _cmurChecksum  :: Maybe Text
+    , _cmurLocation  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'CompleteMultipartUploadResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cmurArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'cmurChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'cmurLocation' @::@ 'Maybe' 'Text'
+--
+completeMultipartUploadResponse :: CompleteMultipartUploadResponse
+completeMultipartUploadResponse = CompleteMultipartUploadResponse
+    { _cmurLocation  = Nothing
+    , _cmurChecksum  = Nothing
+    , _cmurArchiveId = Nothing
+    }
+
+-- | The ID of the archive. This value is also included as part of the location.
+cmurArchiveId :: Lens' CompleteMultipartUploadResponse (Maybe Text)
+cmurArchiveId = lens _cmurArchiveId (\s a -> s { _cmurArchiveId = a })
+
+-- | The checksum of the archive computed by Amazon Glacier.
+cmurChecksum :: Lens' CompleteMultipartUploadResponse (Maybe Text)
+cmurChecksum = lens _cmurChecksum (\s a -> s { _cmurChecksum = a })
+
+-- | The relative URI path of the newly added archive resource.
+cmurLocation :: Lens' CompleteMultipartUploadResponse (Maybe Text)
+cmurLocation = lens _cmurLocation (\s a -> s { _cmurLocation = a })
+
+instance ToPath CompleteMultipartUpload where
+    toPath CompleteMultipartUpload{..} = mconcat
+        [ "/"
+        , toText _cmuAccountId
+        , "/vaults/"
+        , toText _cmuVaultName
+        , "/multipart-uploads/"
+        , toText _cmuUploadId
+        ]
+
+instance ToQuery CompleteMultipartUpload where
+    toQuery = const mempty
+
+instance ToHeaders CompleteMultipartUpload where
+    toHeaders CompleteMultipartUpload{..} = mconcat
+        [ "x-amz-archive-size"     =: _cmuArchiveSize
+        , "x-amz-sha256-tree-hash" =: _cmuChecksum
+        ]
+
+instance ToJSON CompleteMultipartUpload where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest CompleteMultipartUpload where
+    type Sv CompleteMultipartUpload = Glacier
+    type Rs CompleteMultipartUpload = CompleteMultipartUploadResponse
+
+    request  = post
+    response = headerResponse $ \h -> CompleteMultipartUploadResponse
+        <$> h ~:? "x-amz-archive-id"
+        <*> h ~:? "x-amz-sha256-tree-hash"
+        <*> h ~:? "Location"
diff --git a/gen/Network/AWS/Glacier/CreateVault.hs b/gen/Network/AWS/Glacier/CreateVault.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/CreateVault.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.CreateVault
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation creates a new vault with the specified name. The name of the
+-- vault must be unique within a region for an AWS account. You can create up to
+-- 1,000 vaults per account. If you need to create more vaults, contact Amazon
+-- Glacier.
+--
+-- You must use the following guidelines when naming a vault.
+--
+-- Names can be between 1 and 255 characters long.
+--
+-- Allowed characters are a-z, A-Z, 0-9, '_' (underscore), '-' (hyphen), and
+-- '.' (period).
+--
+--
+--
+-- This operation is idempotent.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/creating-vaults.html Creating a Vaultin Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-put.html Create Vault > in the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-CreateVault.html>
+module Network.AWS.Glacier.CreateVault
+    (
+    -- * Request
+      CreateVault
+    -- ** Request constructor
+    , createVault
+    -- ** Request lenses
+    , cvAccountId
+    , cvVaultName
+
+    -- * Response
+    , CreateVaultResponse
+    -- ** Response constructor
+    , createVaultResponse
+    -- ** Response lenses
+    , cvrLocation
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data CreateVault = CreateVault
+    { _cvAccountId :: Text
+    , _cvVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'CreateVault' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cvAccountId' @::@ 'Text'
+--
+-- * 'cvVaultName' @::@ 'Text'
+--
+createVault :: Text -- ^ 'cvAccountId'
+            -> Text -- ^ 'cvVaultName'
+            -> CreateVault
+createVault p1 p2 = CreateVault
+    { _cvAccountId = p1
+    , _cvVaultName = p2
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+cvAccountId :: Lens' CreateVault Text
+cvAccountId = lens _cvAccountId (\s a -> s { _cvAccountId = a })
+
+-- | The name of the vault.
+cvVaultName :: Lens' CreateVault Text
+cvVaultName = lens _cvVaultName (\s a -> s { _cvVaultName = a })
+
+newtype CreateVaultResponse = CreateVaultResponse
+    { _cvrLocation :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'CreateVaultResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cvrLocation' @::@ 'Maybe' 'Text'
+--
+createVaultResponse :: CreateVaultResponse
+createVaultResponse = CreateVaultResponse
+    { _cvrLocation = Nothing
+    }
+
+-- | The URI of the vault that was created.
+cvrLocation :: Lens' CreateVaultResponse (Maybe Text)
+cvrLocation = lens _cvrLocation (\s a -> s { _cvrLocation = a })
+
+instance ToPath CreateVault where
+    toPath CreateVault{..} = mconcat
+        [ "/"
+        , toText _cvAccountId
+        , "/vaults/"
+        , toText _cvVaultName
+        ]
+
+instance ToQuery CreateVault where
+    toQuery = const mempty
+
+instance ToHeaders CreateVault
+
+instance ToJSON CreateVault where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest CreateVault where
+    type Sv CreateVault = Glacier
+    type Rs CreateVault = CreateVaultResponse
+
+    request  = put
+    response = headerResponse $ \h -> CreateVaultResponse
+        <$> h ~:? "Location"
diff --git a/gen/Network/AWS/Glacier/DeleteArchive.hs b/gen/Network/AWS/Glacier/DeleteArchive.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/DeleteArchive.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.DeleteArchive
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation deletes an archive from a vault. Subsequent requests to
+-- initiate a retrieval of this archive will fail. Archive retrievals that are
+-- in progress for this archive ID may or may not succeed according to the
+-- following scenarios:
+--
+-- If the archive retrieval job is actively preparing the data for download
+-- when Amazon Glacier receives the delete archive request, the archival
+-- retrieval operation might fail.  If the archive retrieval job has
+-- successfully prepared the archive for download when Amazon Glacier receives
+-- the delete archive request, you will be able to download the output.   This
+-- operation is idempotent. Attempting to delete an already-deleted archive does
+-- not result in an error.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/deleting-an-archive.html Deleting anArchive in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-delete.html Delete Archive> in the /Amazon Glacier DeveloperGuide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-DeleteArchive.html>
+module Network.AWS.Glacier.DeleteArchive
+    (
+    -- * Request
+      DeleteArchive
+    -- ** Request constructor
+    , deleteArchive
+    -- ** Request lenses
+    , daAccountId
+    , daArchiveId
+    , daVaultName
+
+    -- * Response
+    , DeleteArchiveResponse
+    -- ** Response constructor
+    , deleteArchiveResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data DeleteArchive = DeleteArchive
+    { _daAccountId :: Text
+    , _daArchiveId :: Text
+    , _daVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DeleteArchive' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'daAccountId' @::@ 'Text'
+--
+-- * 'daArchiveId' @::@ 'Text'
+--
+-- * 'daVaultName' @::@ 'Text'
+--
+deleteArchive :: Text -- ^ 'daAccountId'
+              -> Text -- ^ 'daVaultName'
+              -> Text -- ^ 'daArchiveId'
+              -> DeleteArchive
+deleteArchive p1 p2 p3 = DeleteArchive
+    { _daAccountId = p1
+    , _daVaultName = p2
+    , _daArchiveId = p3
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+daAccountId :: Lens' DeleteArchive Text
+daAccountId = lens _daAccountId (\s a -> s { _daAccountId = a })
+
+-- | The ID of the archive to delete.
+daArchiveId :: Lens' DeleteArchive Text
+daArchiveId = lens _daArchiveId (\s a -> s { _daArchiveId = a })
+
+-- | The name of the vault.
+daVaultName :: Lens' DeleteArchive Text
+daVaultName = lens _daVaultName (\s a -> s { _daVaultName = a })
+
+data DeleteArchiveResponse = DeleteArchiveResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'DeleteArchiveResponse' constructor.
+deleteArchiveResponse :: DeleteArchiveResponse
+deleteArchiveResponse = DeleteArchiveResponse
+
+instance ToPath DeleteArchive where
+    toPath DeleteArchive{..} = mconcat
+        [ "/"
+        , toText _daAccountId
+        , "/vaults/"
+        , toText _daVaultName
+        , "/archives/"
+        , toText _daArchiveId
+        ]
+
+instance ToQuery DeleteArchive where
+    toQuery = const mempty
+
+instance ToHeaders DeleteArchive
+
+instance ToJSON DeleteArchive where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest DeleteArchive where
+    type Sv DeleteArchive = Glacier
+    type Rs DeleteArchive = DeleteArchiveResponse
+
+    request  = delete
+    response = nullResponse DeleteArchiveResponse
diff --git a/gen/Network/AWS/Glacier/DeleteVault.hs b/gen/Network/AWS/Glacier/DeleteVault.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/DeleteVault.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.DeleteVault
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation deletes a vault. Amazon Glacier will delete a vault only if
+-- there are no archives in the vault as of the last inventory and there have
+-- been no writes to the vault since the last inventory. If either of these
+-- conditions is not satisfied, the vault deletion fails (that is, the vault is
+-- not removed) and Amazon Glacier returns an error. You can use 'DescribeVault'
+-- to return the number of archives in a vault, and you can use <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html Initiate a Job(POST jobs)> to initiate a new inventory retrieval for a vault. The inventory
+-- contains the archive IDs you use to delete archives using <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-delete.html Delete Archive(DELETE archive)>.
+--
+-- This operation is idempotent.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/deleting-vaults.html Deleting a Vaultin Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-delete.html Delete Vault > in the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-DeleteVault.html>
+module Network.AWS.Glacier.DeleteVault
+    (
+    -- * Request
+      DeleteVault
+    -- ** Request constructor
+    , deleteVault
+    -- ** Request lenses
+    , dv1AccountId
+    , dv1VaultName
+
+    -- * Response
+    , DeleteVaultResponse
+    -- ** Response constructor
+    , deleteVaultResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data DeleteVault = DeleteVault
+    { _dv1AccountId :: Text
+    , _dv1VaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DeleteVault' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dv1AccountId' @::@ 'Text'
+--
+-- * 'dv1VaultName' @::@ 'Text'
+--
+deleteVault :: Text -- ^ 'dv1AccountId'
+            -> Text -- ^ 'dv1VaultName'
+            -> DeleteVault
+deleteVault p1 p2 = DeleteVault
+    { _dv1AccountId = p1
+    , _dv1VaultName = p2
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+dv1AccountId :: Lens' DeleteVault Text
+dv1AccountId = lens _dv1AccountId (\s a -> s { _dv1AccountId = a })
+
+-- | The name of the vault.
+dv1VaultName :: Lens' DeleteVault Text
+dv1VaultName = lens _dv1VaultName (\s a -> s { _dv1VaultName = a })
+
+data DeleteVaultResponse = DeleteVaultResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'DeleteVaultResponse' constructor.
+deleteVaultResponse :: DeleteVaultResponse
+deleteVaultResponse = DeleteVaultResponse
+
+instance ToPath DeleteVault where
+    toPath DeleteVault{..} = mconcat
+        [ "/"
+        , toText _dv1AccountId
+        , "/vaults/"
+        , toText _dv1VaultName
+        ]
+
+instance ToQuery DeleteVault where
+    toQuery = const mempty
+
+instance ToHeaders DeleteVault
+
+instance ToJSON DeleteVault where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest DeleteVault where
+    type Sv DeleteVault = Glacier
+    type Rs DeleteVault = DeleteVaultResponse
+
+    request  = delete
+    response = nullResponse DeleteVaultResponse
diff --git a/gen/Network/AWS/Glacier/DeleteVaultNotifications.hs b/gen/Network/AWS/Glacier/DeleteVaultNotifications.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/DeleteVaultNotifications.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.DeleteVaultNotifications
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation deletes the notification configuration set for a vault. The
+-- operation is eventually consistent;that is, it might take some time for
+-- Amazon Glacier to completely disable the notifications and you might still
+-- receive some notifications for a short time after you send the delete
+-- request.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html Configuring VaultNotifications in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-delete.html Delete Vault Notification Configuration >
+-- in the Amazon Glacier Developer Guide.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-DeleteVaultNotifications.html>
+module Network.AWS.Glacier.DeleteVaultNotifications
+    (
+    -- * Request
+      DeleteVaultNotifications
+    -- ** Request constructor
+    , deleteVaultNotifications
+    -- ** Request lenses
+    , dvnAccountId
+    , dvnVaultName
+
+    -- * Response
+    , DeleteVaultNotificationsResponse
+    -- ** Response constructor
+    , deleteVaultNotificationsResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data DeleteVaultNotifications = DeleteVaultNotifications
+    { _dvnAccountId :: Text
+    , _dvnVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DeleteVaultNotifications' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvnAccountId' @::@ 'Text'
+--
+-- * 'dvnVaultName' @::@ 'Text'
+--
+deleteVaultNotifications :: Text -- ^ 'dvnAccountId'
+                         -> Text -- ^ 'dvnVaultName'
+                         -> DeleteVaultNotifications
+deleteVaultNotifications p1 p2 = DeleteVaultNotifications
+    { _dvnAccountId = p1
+    , _dvnVaultName = p2
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+dvnAccountId :: Lens' DeleteVaultNotifications Text
+dvnAccountId = lens _dvnAccountId (\s a -> s { _dvnAccountId = a })
+
+-- | The name of the vault.
+dvnVaultName :: Lens' DeleteVaultNotifications Text
+dvnVaultName = lens _dvnVaultName (\s a -> s { _dvnVaultName = a })
+
+data DeleteVaultNotificationsResponse = DeleteVaultNotificationsResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'DeleteVaultNotificationsResponse' constructor.
+deleteVaultNotificationsResponse :: DeleteVaultNotificationsResponse
+deleteVaultNotificationsResponse = DeleteVaultNotificationsResponse
+
+instance ToPath DeleteVaultNotifications where
+    toPath DeleteVaultNotifications{..} = mconcat
+        [ "/"
+        , toText _dvnAccountId
+        , "/vaults/"
+        , toText _dvnVaultName
+        , "/notification-configuration"
+        ]
+
+instance ToQuery DeleteVaultNotifications where
+    toQuery = const mempty
+
+instance ToHeaders DeleteVaultNotifications
+
+instance ToJSON DeleteVaultNotifications where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest DeleteVaultNotifications where
+    type Sv DeleteVaultNotifications = Glacier
+    type Rs DeleteVaultNotifications = DeleteVaultNotificationsResponse
+
+    request  = delete
+    response = nullResponse DeleteVaultNotificationsResponse
diff --git a/gen/Network/AWS/Glacier/DescribeJob.hs b/gen/Network/AWS/Glacier/DescribeJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/DescribeJob.hs
@@ -0,0 +1,357 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.DescribeJob
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation returns information about a job you previously initiated,
+-- including the job initiation date, the user who initiated the job, the job
+-- status code/message and the Amazon SNS topic to notify after Amazon Glacier
+-- completes the job. For more information about initiating a job, see 'InitiateJob'.
+--
+-- This operation enables you to check the status of your job. However, it is
+-- strongly recommended that you set up an Amazon SNS topic and specify it in
+-- your initiate job request so that Amazon Glacier can notify the topic after
+-- it completes the job.
+--
+-- A job ID will not expire for at least 24 hours after Amazon Glacier
+-- completes the job.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For information about the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-describe-job-get.html Working with Archivesin Amazon Glacier> in the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-DescribeJob.html>
+module Network.AWS.Glacier.DescribeJob
+    (
+    -- * Request
+      DescribeJob
+    -- ** Request constructor
+    , describeJob
+    -- ** Request lenses
+    , djAccountId
+    , djJobId
+    , djVaultName
+
+    -- * Response
+    , DescribeJobResponse
+    -- ** Response constructor
+    , describeJobResponse
+    -- ** Response lenses
+    , djrAction
+    , djrArchiveId
+    , djrArchiveSHA256TreeHash
+    , djrArchiveSizeInBytes
+    , djrCompleted
+    , djrCompletionDate
+    , djrCreationDate
+    , djrInventoryRetrievalParameters
+    , djrInventorySizeInBytes
+    , djrJobDescription
+    , djrJobId
+    , djrRetrievalByteRange
+    , djrSHA256TreeHash
+    , djrSNSTopic
+    , djrStatusCode
+    , djrStatusMessage
+    , djrVaultARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data DescribeJob = DescribeJob
+    { _djAccountId :: Text
+    , _djJobId     :: Text
+    , _djVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeJob' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'djAccountId' @::@ 'Text'
+--
+-- * 'djJobId' @::@ 'Text'
+--
+-- * 'djVaultName' @::@ 'Text'
+--
+describeJob :: Text -- ^ 'djAccountId'
+            -> Text -- ^ 'djVaultName'
+            -> Text -- ^ 'djJobId'
+            -> DescribeJob
+describeJob p1 p2 p3 = DescribeJob
+    { _djAccountId = p1
+    , _djVaultName = p2
+    , _djJobId     = p3
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+djAccountId :: Lens' DescribeJob Text
+djAccountId = lens _djAccountId (\s a -> s { _djAccountId = a })
+
+-- | The ID of the job to describe.
+djJobId :: Lens' DescribeJob Text
+djJobId = lens _djJobId (\s a -> s { _djJobId = a })
+
+-- | The name of the vault.
+djVaultName :: Lens' DescribeJob Text
+djVaultName = lens _djVaultName (\s a -> s { _djVaultName = a })
+
+data DescribeJobResponse = DescribeJobResponse
+    { _djrAction                       :: Maybe ActionCode
+    , _djrArchiveId                    :: Maybe Text
+    , _djrArchiveSHA256TreeHash        :: Maybe Text
+    , _djrArchiveSizeInBytes           :: Maybe Integer
+    , _djrCompleted                    :: Maybe Bool
+    , _djrCompletionDate               :: Maybe Text
+    , _djrCreationDate                 :: Maybe Text
+    , _djrInventoryRetrievalParameters :: Maybe InventoryRetrievalJobDescription
+    , _djrInventorySizeInBytes         :: Maybe Integer
+    , _djrJobDescription               :: Maybe Text
+    , _djrJobId                        :: Maybe Text
+    , _djrRetrievalByteRange           :: Maybe Text
+    , _djrSHA256TreeHash               :: Maybe Text
+    , _djrSNSTopic                     :: Maybe Text
+    , _djrStatusCode                   :: Maybe StatusCode
+    , _djrStatusMessage                :: Maybe Text
+    , _djrVaultARN                     :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'DescribeJobResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'djrAction' @::@ 'Maybe' 'ActionCode'
+--
+-- * 'djrArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'djrArchiveSHA256TreeHash' @::@ 'Maybe' 'Text'
+--
+-- * 'djrArchiveSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'djrCompleted' @::@ 'Maybe' 'Bool'
+--
+-- * 'djrCompletionDate' @::@ 'Maybe' 'Text'
+--
+-- * 'djrCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'djrInventoryRetrievalParameters' @::@ 'Maybe' 'InventoryRetrievalJobDescription'
+--
+-- * 'djrInventorySizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'djrJobDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'djrJobId' @::@ 'Maybe' 'Text'
+--
+-- * 'djrRetrievalByteRange' @::@ 'Maybe' 'Text'
+--
+-- * 'djrSHA256TreeHash' @::@ 'Maybe' 'Text'
+--
+-- * 'djrSNSTopic' @::@ 'Maybe' 'Text'
+--
+-- * 'djrStatusCode' @::@ 'Maybe' 'StatusCode'
+--
+-- * 'djrStatusMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'djrVaultARN' @::@ 'Maybe' 'Text'
+--
+describeJobResponse :: DescribeJobResponse
+describeJobResponse = DescribeJobResponse
+    { _djrJobId                        = Nothing
+    , _djrJobDescription               = Nothing
+    , _djrAction                       = Nothing
+    , _djrArchiveId                    = Nothing
+    , _djrVaultARN                     = Nothing
+    , _djrCreationDate                 = Nothing
+    , _djrCompleted                    = Nothing
+    , _djrStatusCode                   = Nothing
+    , _djrStatusMessage                = Nothing
+    , _djrArchiveSizeInBytes           = Nothing
+    , _djrInventorySizeInBytes         = Nothing
+    , _djrSNSTopic                     = Nothing
+    , _djrCompletionDate               = Nothing
+    , _djrSHA256TreeHash               = Nothing
+    , _djrArchiveSHA256TreeHash        = Nothing
+    , _djrRetrievalByteRange           = Nothing
+    , _djrInventoryRetrievalParameters = Nothing
+    }
+
+-- | The job type. It is either ArchiveRetrieval or InventoryRetrieval.
+djrAction :: Lens' DescribeJobResponse (Maybe ActionCode)
+djrAction = lens _djrAction (\s a -> s { _djrAction = a })
+
+-- | For an ArchiveRetrieval job, this is the archive ID requested for download.
+-- Otherwise, this field is null.
+djrArchiveId :: Lens' DescribeJobResponse (Maybe Text)
+djrArchiveId = lens _djrArchiveId (\s a -> s { _djrArchiveId = a })
+
+-- | The SHA256 tree hash of the entire archive for an archive retrieval. For
+-- inventory retrieval jobs, this field is null.
+djrArchiveSHA256TreeHash :: Lens' DescribeJobResponse (Maybe Text)
+djrArchiveSHA256TreeHash =
+    lens _djrArchiveSHA256TreeHash
+        (\s a -> s { _djrArchiveSHA256TreeHash = a })
+
+-- | For an ArchiveRetrieval job, this is the size in bytes of the archive being
+-- requested for download. For the InventoryRetrieval job, the value is null.
+djrArchiveSizeInBytes :: Lens' DescribeJobResponse (Maybe Integer)
+djrArchiveSizeInBytes =
+    lens _djrArchiveSizeInBytes (\s a -> s { _djrArchiveSizeInBytes = a })
+
+-- | The job status. When a job is completed, you get the job's output.
+djrCompleted :: Lens' DescribeJobResponse (Maybe Bool)
+djrCompleted = lens _djrCompleted (\s a -> s { _djrCompleted = a })
+
+-- | The UTC time that the archive retrieval request completed. While the job is
+-- in progress, the value will be null.
+djrCompletionDate :: Lens' DescribeJobResponse (Maybe Text)
+djrCompletionDate =
+    lens _djrCompletionDate (\s a -> s { _djrCompletionDate = a })
+
+-- | The UTC date when the job was created. A string representation of ISO 8601
+-- date format, for example, "2012-03-20T17:03:43.221Z".
+djrCreationDate :: Lens' DescribeJobResponse (Maybe Text)
+djrCreationDate = lens _djrCreationDate (\s a -> s { _djrCreationDate = a })
+
+-- | Parameters used for range inventory retrieval.
+djrInventoryRetrievalParameters :: Lens' DescribeJobResponse (Maybe InventoryRetrievalJobDescription)
+djrInventoryRetrievalParameters =
+    lens _djrInventoryRetrievalParameters
+        (\s a -> s { _djrInventoryRetrievalParameters = a })
+
+-- | For an InventoryRetrieval job, this is the size in bytes of the inventory
+-- requested for download. For the ArchiveRetrieval job, the value is null.
+djrInventorySizeInBytes :: Lens' DescribeJobResponse (Maybe Integer)
+djrInventorySizeInBytes =
+    lens _djrInventorySizeInBytes (\s a -> s { _djrInventorySizeInBytes = a })
+
+-- | The job description you provided when you initiated the job.
+djrJobDescription :: Lens' DescribeJobResponse (Maybe Text)
+djrJobDescription =
+    lens _djrJobDescription (\s a -> s { _djrJobDescription = a })
+
+-- | An opaque string that identifies an Amazon Glacier job.
+djrJobId :: Lens' DescribeJobResponse (Maybe Text)
+djrJobId = lens _djrJobId (\s a -> s { _djrJobId = a })
+
+-- | The retrieved byte range for archive retrieval jobs in the form "/StartByteValue/-/EndByteValue/" If no range was specified in the archive retrieval, then the
+-- whole archive is retrieved and /StartByteValue/ equals 0 and /EndByteValue/
+-- equals the size of the archive minus 1. For inventory retrieval jobs this
+-- field is null.
+djrRetrievalByteRange :: Lens' DescribeJobResponse (Maybe Text)
+djrRetrievalByteRange =
+    lens _djrRetrievalByteRange (\s a -> s { _djrRetrievalByteRange = a })
+
+-- | For an ArchiveRetrieval job, it is the checksum of the archive. Otherwise,
+-- the value is null.
+--
+-- The SHA256 tree hash value for the requested range of an archive. If the
+-- Initiate a Job request for an archive specified a tree-hash aligned range,
+-- then this field returns a value.
+--
+-- For the specific case when the whole archive is retrieved, this value is
+-- the same as the ArchiveSHA256TreeHash value.
+--
+-- This field is null in the following situations:  Archive retrieval jobs
+-- that specify a range that is not tree-hash aligned.
+--
+-- Archival jobs that specify a range that is equal to the whole archive and
+-- the job status is InProgress.
+--
+-- Inventory jobs.
+--
+--
+djrSHA256TreeHash :: Lens' DescribeJobResponse (Maybe Text)
+djrSHA256TreeHash =
+    lens _djrSHA256TreeHash (\s a -> s { _djrSHA256TreeHash = a })
+
+-- | An Amazon Simple Notification Service (Amazon SNS) topic that receives
+-- notification.
+djrSNSTopic :: Lens' DescribeJobResponse (Maybe Text)
+djrSNSTopic = lens _djrSNSTopic (\s a -> s { _djrSNSTopic = a })
+
+-- | The status code can be InProgress, Succeeded, or Failed, and indicates the
+-- status of the job.
+djrStatusCode :: Lens' DescribeJobResponse (Maybe StatusCode)
+djrStatusCode = lens _djrStatusCode (\s a -> s { _djrStatusCode = a })
+
+-- | A friendly message that describes the job status.
+djrStatusMessage :: Lens' DescribeJobResponse (Maybe Text)
+djrStatusMessage = lens _djrStatusMessage (\s a -> s { _djrStatusMessage = a })
+
+-- | The Amazon Resource Name (ARN) of the vault from which the archive retrieval
+-- was requested.
+djrVaultARN :: Lens' DescribeJobResponse (Maybe Text)
+djrVaultARN = lens _djrVaultARN (\s a -> s { _djrVaultARN = a })
+
+instance ToPath DescribeJob where
+    toPath DescribeJob{..} = mconcat
+        [ "/"
+        , toText _djAccountId
+        , "/vaults/"
+        , toText _djVaultName
+        , "/jobs/"
+        , toText _djJobId
+        ]
+
+instance ToQuery DescribeJob where
+    toQuery = const mempty
+
+instance ToHeaders DescribeJob
+
+instance ToJSON DescribeJob where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest DescribeJob where
+    type Sv DescribeJob = Glacier
+    type Rs DescribeJob = DescribeJobResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON DescribeJobResponse where
+    parseJSON = withObject "DescribeJobResponse" $ \o -> DescribeJobResponse
+        <$> o .:? "Action"
+        <*> o .:? "ArchiveId"
+        <*> o .:? "ArchiveSHA256TreeHash"
+        <*> o .:? "ArchiveSizeInBytes"
+        <*> o .:? "Completed"
+        <*> o .:? "CompletionDate"
+        <*> o .:? "CreationDate"
+        <*> o .:? "InventoryRetrievalParameters"
+        <*> o .:? "InventorySizeInBytes"
+        <*> o .:? "JobDescription"
+        <*> o .:? "JobId"
+        <*> o .:? "RetrievalByteRange"
+        <*> o .:? "SHA256TreeHash"
+        <*> o .:? "SNSTopic"
+        <*> o .:? "StatusCode"
+        <*> o .:? "StatusMessage"
+        <*> o .:? "VaultARN"
diff --git a/gen/Network/AWS/Glacier/DescribeVault.hs b/gen/Network/AWS/Glacier/DescribeVault.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/DescribeVault.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.DescribeVault
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation returns information about a vault, including the vault's
+-- Amazon Resource Name (ARN), the date the vault was created, the number of
+-- archives it contains, and the total size of all the archives in the vault.
+-- The number of archives and their total size are as of the last inventory
+-- generation. This means that if you add or remove an archive from a vault, and
+-- then immediately use Describe Vault, the change in contents will not be
+-- immediately reflected. If you want to retrieve the latest inventory of the
+-- vault, use 'InitiateJob'. Amazon Glacier generates vault inventories
+-- approximately daily. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/vault-inventory.html Downloading a Vault Inventoryin Amazon Glacier>.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/retrieving-vault-info.html Retrieving VaultMetadata in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-get.html Describe Vault > in the /Amazon GlacierDeveloper Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-DescribeVault.html>
+module Network.AWS.Glacier.DescribeVault
+    (
+    -- * Request
+      DescribeVault
+    -- ** Request constructor
+    , describeVault
+    -- ** Request lenses
+    , dvAccountId
+    , dvVaultName
+
+    -- * Response
+    , DescribeVaultResponse
+    -- ** Response constructor
+    , describeVaultResponse
+    -- ** Response lenses
+    , dvrCreationDate
+    , dvrLastInventoryDate
+    , dvrNumberOfArchives
+    , dvrSizeInBytes
+    , dvrVaultARN
+    , dvrVaultName
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data DescribeVault = DescribeVault
+    { _dvAccountId :: Text
+    , _dvVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeVault' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvAccountId' @::@ 'Text'
+--
+-- * 'dvVaultName' @::@ 'Text'
+--
+describeVault :: Text -- ^ 'dvAccountId'
+              -> Text -- ^ 'dvVaultName'
+              -> DescribeVault
+describeVault p1 p2 = DescribeVault
+    { _dvAccountId = p1
+    , _dvVaultName = p2
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+dvAccountId :: Lens' DescribeVault Text
+dvAccountId = lens _dvAccountId (\s a -> s { _dvAccountId = a })
+
+-- | The name of the vault.
+dvVaultName :: Lens' DescribeVault Text
+dvVaultName = lens _dvVaultName (\s a -> s { _dvVaultName = a })
+
+data DescribeVaultResponse = DescribeVaultResponse
+    { _dvrCreationDate      :: Maybe Text
+    , _dvrLastInventoryDate :: Maybe Text
+    , _dvrNumberOfArchives  :: Maybe Integer
+    , _dvrSizeInBytes       :: Maybe Integer
+    , _dvrVaultARN          :: Maybe Text
+    , _dvrVaultName         :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeVaultResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvrCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'dvrLastInventoryDate' @::@ 'Maybe' 'Text'
+--
+-- * 'dvrNumberOfArchives' @::@ 'Maybe' 'Integer'
+--
+-- * 'dvrSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'dvrVaultARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dvrVaultName' @::@ 'Maybe' 'Text'
+--
+describeVaultResponse :: DescribeVaultResponse
+describeVaultResponse = DescribeVaultResponse
+    { _dvrVaultARN          = Nothing
+    , _dvrVaultName         = Nothing
+    , _dvrCreationDate      = Nothing
+    , _dvrLastInventoryDate = Nothing
+    , _dvrNumberOfArchives  = Nothing
+    , _dvrSizeInBytes       = Nothing
+    }
+
+-- | The UTC date when the vault was created. A string representation of ISO 8601
+-- date format, for example, "2012-03-20T17:03:43.221Z".
+dvrCreationDate :: Lens' DescribeVaultResponse (Maybe Text)
+dvrCreationDate = lens _dvrCreationDate (\s a -> s { _dvrCreationDate = a })
+
+-- | The UTC date when Amazon Glacier completed the last vault inventory. A string
+-- representation of ISO 8601 date format, for example,
+-- "2012-03-20T17:03:43.221Z".
+dvrLastInventoryDate :: Lens' DescribeVaultResponse (Maybe Text)
+dvrLastInventoryDate =
+    lens _dvrLastInventoryDate (\s a -> s { _dvrLastInventoryDate = a })
+
+-- | The number of archives in the vault as of the last inventory date. This field
+-- will return 'null' if an inventory has not yet run on the vault, for example,
+-- if you just created the vault.
+dvrNumberOfArchives :: Lens' DescribeVaultResponse (Maybe Integer)
+dvrNumberOfArchives =
+    lens _dvrNumberOfArchives (\s a -> s { _dvrNumberOfArchives = a })
+
+-- | Total size, in bytes, of the archives in the vault as of the last inventory
+-- date. This field will return null if an inventory has not yet run on the
+-- vault, for example, if you just created the vault.
+dvrSizeInBytes :: Lens' DescribeVaultResponse (Maybe Integer)
+dvrSizeInBytes = lens _dvrSizeInBytes (\s a -> s { _dvrSizeInBytes = a })
+
+-- | The Amazon Resource Name (ARN) of the vault.
+dvrVaultARN :: Lens' DescribeVaultResponse (Maybe Text)
+dvrVaultARN = lens _dvrVaultARN (\s a -> s { _dvrVaultARN = a })
+
+-- | The name of the vault.
+dvrVaultName :: Lens' DescribeVaultResponse (Maybe Text)
+dvrVaultName = lens _dvrVaultName (\s a -> s { _dvrVaultName = a })
+
+instance ToPath DescribeVault where
+    toPath DescribeVault{..} = mconcat
+        [ "/"
+        , toText _dvAccountId
+        , "/vaults/"
+        , toText _dvVaultName
+        ]
+
+instance ToQuery DescribeVault where
+    toQuery = const mempty
+
+instance ToHeaders DescribeVault
+
+instance ToJSON DescribeVault where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest DescribeVault where
+    type Sv DescribeVault = Glacier
+    type Rs DescribeVault = DescribeVaultResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON DescribeVaultResponse where
+    parseJSON = withObject "DescribeVaultResponse" $ \o -> DescribeVaultResponse
+        <$> o .:? "CreationDate"
+        <*> o .:? "LastInventoryDate"
+        <*> o .:? "NumberOfArchives"
+        <*> o .:? "SizeInBytes"
+        <*> o .:? "VaultARN"
+        <*> o .:? "VaultName"
diff --git a/gen/Network/AWS/Glacier/GetDataRetrievalPolicy.hs b/gen/Network/AWS/Glacier/GetDataRetrievalPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/GetDataRetrievalPolicy.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.GetDataRetrievalPolicy
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-GetDataRetrievalPolicy.html>
+module Network.AWS.Glacier.GetDataRetrievalPolicy
+    (
+    -- * Request
+      GetDataRetrievalPolicy
+    -- ** Request constructor
+    , getDataRetrievalPolicy
+    -- ** Request lenses
+    , gdrpAccountId
+
+    -- * Response
+    , GetDataRetrievalPolicyResponse
+    -- ** Response constructor
+    , getDataRetrievalPolicyResponse
+    -- ** Response lenses
+    , gdrprPolicy
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+newtype GetDataRetrievalPolicy = GetDataRetrievalPolicy
+    { _gdrpAccountId :: Text
+    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+
+-- | 'GetDataRetrievalPolicy' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gdrpAccountId' @::@ 'Text'
+--
+getDataRetrievalPolicy :: Text -- ^ 'gdrpAccountId'
+                       -> GetDataRetrievalPolicy
+getDataRetrievalPolicy p1 = GetDataRetrievalPolicy
+    { _gdrpAccountId = p1
+    }
+
+gdrpAccountId :: Lens' GetDataRetrievalPolicy Text
+gdrpAccountId = lens _gdrpAccountId (\s a -> s { _gdrpAccountId = a })
+
+newtype GetDataRetrievalPolicyResponse = GetDataRetrievalPolicyResponse
+    { _gdrprPolicy :: Maybe DataRetrievalPolicy
+    } deriving (Eq, Read, Show)
+
+-- | 'GetDataRetrievalPolicyResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gdrprPolicy' @::@ 'Maybe' 'DataRetrievalPolicy'
+--
+getDataRetrievalPolicyResponse :: GetDataRetrievalPolicyResponse
+getDataRetrievalPolicyResponse = GetDataRetrievalPolicyResponse
+    { _gdrprPolicy = Nothing
+    }
+
+gdrprPolicy :: Lens' GetDataRetrievalPolicyResponse (Maybe DataRetrievalPolicy)
+gdrprPolicy = lens _gdrprPolicy (\s a -> s { _gdrprPolicy = a })
+
+instance ToPath GetDataRetrievalPolicy where
+    toPath GetDataRetrievalPolicy{..} = mconcat
+        [ "/"
+        , toText _gdrpAccountId
+        , "/policies/data-retrieval"
+        ]
+
+instance ToQuery GetDataRetrievalPolicy where
+    toQuery = const mempty
+
+instance ToHeaders GetDataRetrievalPolicy
+
+instance ToJSON GetDataRetrievalPolicy where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest GetDataRetrievalPolicy where
+    type Sv GetDataRetrievalPolicy = Glacier
+    type Rs GetDataRetrievalPolicy = GetDataRetrievalPolicyResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON GetDataRetrievalPolicyResponse where
+    parseJSON = withObject "GetDataRetrievalPolicyResponse" $ \o -> GetDataRetrievalPolicyResponse
+        <$> o .:? "Policy"
diff --git a/gen/Network/AWS/Glacier/GetJobOutput.hs b/gen/Network/AWS/Glacier/GetJobOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/GetJobOutput.hs
@@ -0,0 +1,269 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.GetJobOutput
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation downloads the output of the job you initiated using 'InitiateJob'
+-- . Depending on the job type you specified when you initiated the job, the
+-- output will be either the content of an archive or a vault inventory.
+--
+-- A job ID will not expire for at least 24 hours after Amazon Glacier
+-- completes the job. That is, you can download the job output within the 24
+-- hours period after Amazon Glacier completes the job.
+--
+-- If the job output is large, then you can use the 'Range' request header to
+-- retrieve a portion of the output. This allows you to download the entire
+-- output in smaller chunks of bytes. For example, suppose you have 1 GB of job
+-- output you want to download and you decide to download 128 MB chunks of data
+-- at a time, which is a total of eight Get Job Output requests. You use the
+-- following process to download the job output:
+--
+-- Download a 128 MB chunk of output by specifying the appropriate byte range
+-- using the 'Range' header.
+--
+-- Along with the data, the response includes a checksum of the payload. You
+-- compute the checksum of the payload on the client and compare it with the
+-- checksum you received in the response to ensure you received all the expected
+-- data.
+--
+-- Repeat steps 1 and 2 for all the eight 128 MB chunks of output data, each
+-- time specifying the appropriate byte range.
+--
+-- After downloading all the parts of the job output, you have a list of
+-- eight checksum values. Compute the tree hash of these values to find the
+-- checksum of the entire output. Using the 'DescribeJob' API, obtain job
+-- information of the job that provided you the output. The response includes
+-- the checksum of the entire archive stored in Amazon Glacier. You compare this
+-- value with the checksum you computed to ensure you have downloaded the entire
+-- archive content with no errors.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/vault-inventory.html Downloading aVault Inventory>, <http://docs.aws.amazon.com/amazonglacier/latest/dev/downloading-an-archive.html Downloading an Archive>, and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-job-output-get.html Get Job Output >
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-GetJobOutput.html>
+module Network.AWS.Glacier.GetJobOutput
+    (
+    -- * Request
+      GetJobOutput
+    -- ** Request constructor
+    , getJobOutput
+    -- ** Request lenses
+    , gjoAccountId
+    , gjoJobId
+    , gjoRange
+    , gjoVaultName
+
+    -- * Response
+    , GetJobOutputResponse
+    -- ** Response constructor
+    , getJobOutputResponse
+    -- ** Response lenses
+    , gjorAcceptRanges
+    , gjorArchiveDescription
+    , gjorBody
+    , gjorChecksum
+    , gjorContentRange
+    , gjorContentType
+    , gjorStatus
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data GetJobOutput = GetJobOutput
+    { _gjoAccountId :: Text
+    , _gjoJobId     :: Text
+    , _gjoRange     :: Maybe Text
+    , _gjoVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'GetJobOutput' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gjoAccountId' @::@ 'Text'
+--
+-- * 'gjoJobId' @::@ 'Text'
+--
+-- * 'gjoRange' @::@ 'Maybe' 'Text'
+--
+-- * 'gjoVaultName' @::@ 'Text'
+--
+getJobOutput :: Text -- ^ 'gjoAccountId'
+             -> Text -- ^ 'gjoVaultName'
+             -> Text -- ^ 'gjoJobId'
+             -> GetJobOutput
+getJobOutput p1 p2 p3 = GetJobOutput
+    { _gjoAccountId = p1
+    , _gjoVaultName = p2
+    , _gjoJobId     = p3
+    , _gjoRange     = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+gjoAccountId :: Lens' GetJobOutput Text
+gjoAccountId = lens _gjoAccountId (\s a -> s { _gjoAccountId = a })
+
+-- | The job ID whose data is downloaded.
+gjoJobId :: Lens' GetJobOutput Text
+gjoJobId = lens _gjoJobId (\s a -> s { _gjoJobId = a })
+
+-- | The range of bytes to retrieve from the output. For example, if you want to
+-- download the first 1,048,576 bytes, specify "Range: bytes=0-1048575". By
+-- default, this operation downloads the entire output.
+gjoRange :: Lens' GetJobOutput (Maybe Text)
+gjoRange = lens _gjoRange (\s a -> s { _gjoRange = a })
+
+-- | The name of the vault.
+gjoVaultName :: Lens' GetJobOutput Text
+gjoVaultName = lens _gjoVaultName (\s a -> s { _gjoVaultName = a })
+
+data GetJobOutputResponse = GetJobOutputResponse
+    { _gjorAcceptRanges       :: Maybe Text
+    , _gjorArchiveDescription :: Maybe Text
+    , _gjorBody               :: RsBody
+    , _gjorChecksum           :: Maybe Text
+    , _gjorContentRange       :: Maybe Text
+    , _gjorContentType        :: Maybe Text
+    , _gjorStatus             :: Maybe Int
+    } deriving (Show)
+
+-- | 'GetJobOutputResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gjorAcceptRanges' @::@ 'Maybe' 'Text'
+--
+-- * 'gjorArchiveDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'gjorBody' @::@ 'RsBody'
+--
+-- * 'gjorChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'gjorContentRange' @::@ 'Maybe' 'Text'
+--
+-- * 'gjorContentType' @::@ 'Maybe' 'Text'
+--
+-- * 'gjorStatus' @::@ 'Maybe' 'Int'
+--
+getJobOutputResponse :: RsBody -- ^ 'gjorBody'
+                     -> GetJobOutputResponse
+getJobOutputResponse p1 = GetJobOutputResponse
+    { _gjorBody               = p1
+    , _gjorChecksum           = Nothing
+    , _gjorStatus             = Nothing
+    , _gjorContentRange       = Nothing
+    , _gjorAcceptRanges       = Nothing
+    , _gjorContentType        = Nothing
+    , _gjorArchiveDescription = Nothing
+    }
+
+-- | Indicates the range units accepted. For more information, go to <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html RFC2616>.
+gjorAcceptRanges :: Lens' GetJobOutputResponse (Maybe Text)
+gjorAcceptRanges = lens _gjorAcceptRanges (\s a -> s { _gjorAcceptRanges = a })
+
+-- | The description of an archive.
+gjorArchiveDescription :: Lens' GetJobOutputResponse (Maybe Text)
+gjorArchiveDescription =
+    lens _gjorArchiveDescription (\s a -> s { _gjorArchiveDescription = a })
+
+-- | The job data, either archive data or inventory data.
+gjorBody :: Lens' GetJobOutputResponse RsBody
+gjorBody = lens _gjorBody (\s a -> s { _gjorBody = a })
+
+-- | The checksum of the data in the response. This header is returned only when
+-- retrieving the output for an archive retrieval job. Furthermore, this header
+-- appears only under the following conditions:  You get the entire range of the
+-- archive. You request a range to return of the archive that starts and ends on
+-- a multiple of 1 MB. For example, if you have an 3.1 MB archive and you
+-- specify a range to return that starts at 1 MB and ends at 2 MB, then the
+-- x-amz-sha256-tree-hash is returned as a response header. You request a range
+-- of the archive to return that starts on a multiple of 1 MB and goes to the
+-- end of the archive. For example, if you have a 3.1 MB archive and you specify
+-- a range that starts at 2 MB and ends at 3.1 MB (the end of the archive), then
+-- the x-amz-sha256-tree-hash is returned as a response header.
+gjorChecksum :: Lens' GetJobOutputResponse (Maybe Text)
+gjorChecksum = lens _gjorChecksum (\s a -> s { _gjorChecksum = a })
+
+-- | The range of bytes returned by Amazon Glacier. If only partial output is
+-- downloaded, the response provides the range of bytes Amazon Glacier returned.
+-- For example, bytes 0-1048575/8388608 returns the first 1 MB from 8 MB.
+gjorContentRange :: Lens' GetJobOutputResponse (Maybe Text)
+gjorContentRange = lens _gjorContentRange (\s a -> s { _gjorContentRange = a })
+
+-- | The Content-Type depends on whether the job output is an archive or a vault
+-- inventory. For archive data, the Content-Type is application/octet-stream.
+-- For vault inventory, if you requested CSV format when you initiated the job,
+-- the Content-Type is text/csv. Otherwise, by default, vault inventory is
+-- returned as JSON, and the Content-Type is application/json.
+gjorContentType :: Lens' GetJobOutputResponse (Maybe Text)
+gjorContentType = lens _gjorContentType (\s a -> s { _gjorContentType = a })
+
+-- | The HTTP response code for a job output request. The value depends on whether
+-- a range was specified in the request.
+gjorStatus :: Lens' GetJobOutputResponse (Maybe Int)
+gjorStatus = lens _gjorStatus (\s a -> s { _gjorStatus = a })
+
+instance ToPath GetJobOutput where
+    toPath GetJobOutput{..} = mconcat
+        [ "/"
+        , toText _gjoAccountId
+        , "/vaults/"
+        , toText _gjoVaultName
+        , "/jobs/"
+        , toText _gjoJobId
+        , "/output"
+        ]
+
+instance ToQuery GetJobOutput where
+    toQuery = const mempty
+
+instance ToHeaders GetJobOutput where
+    toHeaders GetJobOutput{..} = mconcat
+        [ "Range" =: _gjoRange
+        ]
+
+instance ToJSON GetJobOutput where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest GetJobOutput where
+    type Sv GetJobOutput = Glacier
+    type Rs GetJobOutput = GetJobOutputResponse
+
+    request  = get
+    response = bodyResponse $ \h s b -> GetJobOutputResponse
+        <$> h ~:? "Accept-Ranges"
+        <*> h ~:? "x-amz-archive-description"
+        <*> pure (RsBody b)
+        <*> h ~:? "x-amz-sha256-tree-hash"
+        <*> h ~:? "Content-Range"
+        <*> h ~:? "Content-Type"
+        <*> pure (Just s)
diff --git a/gen/Network/AWS/Glacier/GetVaultNotifications.hs b/gen/Network/AWS/Glacier/GetVaultNotifications.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/GetVaultNotifications.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.GetVaultNotifications
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation retrieves the 'notification-configuration' subresource of the
+-- specified vault.
+--
+-- For information about setting a notification configuration on a vault, see 'SetVaultNotifications'. If a notification configuration for a vault is not set, the operation
+-- returns a '404 Not Found' error. For more information about vault
+-- notifications, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html Configuring Vault Notifications in Amazon Glacier>.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html Configuring VaultNotifications in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-get.html Get Vault Notification Configuration > in
+-- the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-GetVaultNotifications.html>
+module Network.AWS.Glacier.GetVaultNotifications
+    (
+    -- * Request
+      GetVaultNotifications
+    -- ** Request constructor
+    , getVaultNotifications
+    -- ** Request lenses
+    , gvnAccountId
+    , gvnVaultName
+
+    -- * Response
+    , GetVaultNotificationsResponse
+    -- ** Response constructor
+    , getVaultNotificationsResponse
+    -- ** Response lenses
+    , gvnrVaultNotificationConfig
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data GetVaultNotifications = GetVaultNotifications
+    { _gvnAccountId :: Text
+    , _gvnVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'GetVaultNotifications' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gvnAccountId' @::@ 'Text'
+--
+-- * 'gvnVaultName' @::@ 'Text'
+--
+getVaultNotifications :: Text -- ^ 'gvnAccountId'
+                      -> Text -- ^ 'gvnVaultName'
+                      -> GetVaultNotifications
+getVaultNotifications p1 p2 = GetVaultNotifications
+    { _gvnAccountId = p1
+    , _gvnVaultName = p2
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+gvnAccountId :: Lens' GetVaultNotifications Text
+gvnAccountId = lens _gvnAccountId (\s a -> s { _gvnAccountId = a })
+
+-- | The name of the vault.
+gvnVaultName :: Lens' GetVaultNotifications Text
+gvnVaultName = lens _gvnVaultName (\s a -> s { _gvnVaultName = a })
+
+newtype GetVaultNotificationsResponse = GetVaultNotificationsResponse
+    { _gvnrVaultNotificationConfig :: Maybe VaultNotificationConfig
+    } deriving (Eq, Read, Show)
+
+-- | 'GetVaultNotificationsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gvnrVaultNotificationConfig' @::@ 'Maybe' 'VaultNotificationConfig'
+--
+getVaultNotificationsResponse :: GetVaultNotificationsResponse
+getVaultNotificationsResponse = GetVaultNotificationsResponse
+    { _gvnrVaultNotificationConfig = Nothing
+    }
+
+-- | Returns the notification configuration set on the vault.
+gvnrVaultNotificationConfig :: Lens' GetVaultNotificationsResponse (Maybe VaultNotificationConfig)
+gvnrVaultNotificationConfig =
+    lens _gvnrVaultNotificationConfig
+        (\s a -> s { _gvnrVaultNotificationConfig = a })
+
+instance ToPath GetVaultNotifications where
+    toPath GetVaultNotifications{..} = mconcat
+        [ "/"
+        , toText _gvnAccountId
+        , "/vaults/"
+        , toText _gvnVaultName
+        , "/notification-configuration"
+        ]
+
+instance ToQuery GetVaultNotifications where
+    toQuery = const mempty
+
+instance ToHeaders GetVaultNotifications
+
+instance ToJSON GetVaultNotifications where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest GetVaultNotifications where
+    type Sv GetVaultNotifications = Glacier
+    type Rs GetVaultNotifications = GetVaultNotificationsResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON GetVaultNotificationsResponse where
+    parseJSON = withObject "GetVaultNotificationsResponse" $ \o -> GetVaultNotificationsResponse
+        <$> o .:? "vaultNotificationConfig"
diff --git a/gen/Network/AWS/Glacier/InitiateJob.hs b/gen/Network/AWS/Glacier/InitiateJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/InitiateJob.hs
@@ -0,0 +1,249 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.InitiateJob
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation initiates a job of the specified type. In this release, you
+-- can initiate a job to retrieve either an archive or a vault inventory (a list
+-- of archives in a vault).
+--
+-- Retrieving data from Amazon Glacier is a two-step process:
+--
+-- Initiate a retrieval job.
+--
+-- After the job completes, download the bytes.
+--
+-- The retrieval request is executed asynchronously. When you initiate a
+-- retrieval job, Amazon Glacier creates a job and returns a job ID in the
+-- response. When Amazon Glacier completes the job, you can get the job output
+-- (archive or inventory data). For information about getting job output, see 'GetJobOutput' operation.
+--
+-- The job must complete before you can get its output. To determine when a job
+-- is complete, you have the following options:
+--
+-- Use Amazon SNS Notification You can specify an Amazon Simple Notification
+-- Service (Amazon SNS) topic to which Amazon Glacier can post a notification
+-- after the job is completed. You can specify an SNS topic per job request. The
+-- notification is sent only after Amazon Glacier completes the job. In addition
+-- to specifying an SNS topic per job request, you can configure vault
+-- notifications for a vault so that job notifications are always sent. For more
+-- information, see 'SetVaultNotifications'.
+--
+-- Get job details You can make a 'DescribeJob' request to obtain job status
+-- information while a job is in progress. However, it is more efficient to use
+-- an Amazon SNS notification to determine when a job is complete.
+--
+-- The information you get via notification is same that you get by calling 'DescribeJob'.
+--
+-- If for a specific event, you add both the notification configuration on the
+-- vault and also specify an SNS topic in your initiate job request, Amazon
+-- Glacier sends both notifications. For more information, see 'SetVaultNotifications'.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- About the Vault Inventory
+--
+-- Amazon Glacier prepares an inventory for each vault periodically, every 24
+-- hours. When you initiate a job for a vault inventory, Amazon Glacier returns
+-- the last inventory for the vault. The inventory data you get might be up to a
+-- day or two days old. Also, the initiate inventory job might take some time to
+-- complete before you can download the vault inventory. So you do not want to
+-- retrieve a vault inventory for each vault operation. However, in some
+-- scenarios, you might find the vault inventory useful. For example, when you
+-- upload an archive, you can provide an archive description but not an archive
+-- name. Amazon Glacier provides you a unique archive ID, an opaque string of
+-- characters. So, you might maintain your own database that maps archive names
+-- to their corresponding Amazon Glacier assigned archive IDs. You might find
+-- the vault inventory useful in the event you need to reconcile information in
+-- your database with the actual vault inventory.
+--
+-- Range Inventory Retrieval
+--
+-- You can limit the number of inventory items retrieved by filtering on the
+-- archive creation date or by setting a limit.
+--
+-- /Filtering by Archive Creation Date/
+--
+-- You can retrieve inventory items for archives created between 'StartDate' and 'EndDate' by specifying values for these parameters in the InitiateJob request.
+-- Archives created on or after the 'StartDate' and before the 'EndDate' will be
+-- returned. If you only provide the 'StartDate' without the 'EndDate', you will
+-- retrieve the inventory for all archives created on or after the 'StartDate'. If
+-- you only provide the 'EndDate' without the 'StartDate', you will get back the
+-- inventory for all archives created before the 'EndDate'.
+--
+-- /Limiting Inventory Items per Retrieval/
+--
+-- You can limit the number of inventory items returned by setting the 'Limit'
+-- parameter in the InitiateJob request. The inventory job output will contain
+-- inventory items up to the specified 'Limit'. If there are more inventory items
+-- available, the result is paginated. After a job is complete you can use the 'DescribeJob' operation to get a marker that you use in a subsequent InitiateJob request.
+-- The marker will indicate the starting point to retrieve the next set of
+-- inventory items. You can page through your entire inventory by repeatedly
+-- making InitiateJob requests with the marker from the previous DescribeJob
+-- output, until you get a marker from DescribeJob that returns null, indicating
+-- that there are no more inventory items available.
+--
+-- You can use the 'Limit' parameter together with the date range parameters.
+--
+-- About Ranged Archive Retrieval
+--
+-- You can initiate an archive retrieval for the whole archive or a range of
+-- the archive. In the case of ranged archive retrieval, you specify a byte
+-- range to return or the whole archive. The range specified must be megabyte
+-- (MB) aligned, that is the range start value must be divisible by 1 MB and
+-- range end value plus 1 must be divisible by 1 MB or equal the end of the
+-- archive. If the ranged archive retrieval is not megabyte aligned, this
+-- operation returns a 400 response. Furthermore, to ensure you get checksum
+-- values for data you download using Get Job Output API, the range must be tree
+-- hash aligned.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html Initiate a Job>
+-- and <http://docs.aws.amazon.com/amazonglacier/latest/dev/vault-inventory.html Downloading a Vault Inventory>
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-InitiateJob.html>
+module Network.AWS.Glacier.InitiateJob
+    (
+    -- * Request
+      InitiateJob
+    -- ** Request constructor
+    , initiateJob
+    -- ** Request lenses
+    , ijAccountId
+    , ijJobParameters
+    , ijVaultName
+
+    -- * Response
+    , InitiateJobResponse
+    -- ** Response constructor
+    , initiateJobResponse
+    -- ** Response lenses
+    , ijrJobId
+    , ijrLocation
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data InitiateJob = InitiateJob
+    { _ijAccountId     :: Text
+    , _ijJobParameters :: Maybe JobParameters
+    , _ijVaultName     :: Text
+    } deriving (Eq, Read, Show)
+
+-- | 'InitiateJob' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ijAccountId' @::@ 'Text'
+--
+-- * 'ijJobParameters' @::@ 'Maybe' 'JobParameters'
+--
+-- * 'ijVaultName' @::@ 'Text'
+--
+initiateJob :: Text -- ^ 'ijAccountId'
+            -> Text -- ^ 'ijVaultName'
+            -> InitiateJob
+initiateJob p1 p2 = InitiateJob
+    { _ijAccountId     = p1
+    , _ijVaultName     = p2
+    , _ijJobParameters = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+ijAccountId :: Lens' InitiateJob Text
+ijAccountId = lens _ijAccountId (\s a -> s { _ijAccountId = a })
+
+-- | Provides options for specifying job information.
+ijJobParameters :: Lens' InitiateJob (Maybe JobParameters)
+ijJobParameters = lens _ijJobParameters (\s a -> s { _ijJobParameters = a })
+
+-- | The name of the vault.
+ijVaultName :: Lens' InitiateJob Text
+ijVaultName = lens _ijVaultName (\s a -> s { _ijVaultName = a })
+
+data InitiateJobResponse = InitiateJobResponse
+    { _ijrJobId    :: Maybe Text
+    , _ijrLocation :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'InitiateJobResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ijrJobId' @::@ 'Maybe' 'Text'
+--
+-- * 'ijrLocation' @::@ 'Maybe' 'Text'
+--
+initiateJobResponse :: InitiateJobResponse
+initiateJobResponse = InitiateJobResponse
+    { _ijrLocation = Nothing
+    , _ijrJobId    = Nothing
+    }
+
+-- | The ID of the job.
+ijrJobId :: Lens' InitiateJobResponse (Maybe Text)
+ijrJobId = lens _ijrJobId (\s a -> s { _ijrJobId = a })
+
+-- | The relative URI path of the job.
+ijrLocation :: Lens' InitiateJobResponse (Maybe Text)
+ijrLocation = lens _ijrLocation (\s a -> s { _ijrLocation = a })
+
+instance ToPath InitiateJob where
+    toPath InitiateJob{..} = mconcat
+        [ "/"
+        , toText _ijAccountId
+        , "/vaults/"
+        , toText _ijVaultName
+        , "/jobs"
+        ]
+
+instance ToQuery InitiateJob where
+    toQuery = const mempty
+
+instance ToHeaders InitiateJob
+
+instance ToJSON InitiateJob where
+    toJSON InitiateJob{..} = object
+        [ "jobParameters" .= _ijJobParameters
+        ]
+
+instance AWSRequest InitiateJob where
+    type Sv InitiateJob = Glacier
+    type Rs InitiateJob = InitiateJobResponse
+
+    request  = post
+    response = headerResponse $ \h -> InitiateJobResponse
+        <$> h ~:? "x-amz-job-id"
+        <*> h ~:? "Location"
diff --git a/gen/Network/AWS/Glacier/InitiateMultipartUpload.hs b/gen/Network/AWS/Glacier/InitiateMultipartUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/InitiateMultipartUpload.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.InitiateMultipartUpload
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation initiates a multipart upload. Amazon Glacier creates a
+-- multipart upload resource and returns its ID in the response. The multipart
+-- upload ID is used in subsequent requests to upload parts of an archive (see 'UploadMultipartPart').
+--
+-- When you initiate a multipart upload, you specify the part size in number of
+-- bytes. The part size must be a megabyte (1024 KB) multiplied by a power of
+-- 2-for example, 1048576 (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8
+-- MB), and so on. The minimum allowable part size is 1 MB, and the maximum is 4
+-- GB.
+--
+-- Every part you upload to this resource (see 'UploadMultipartPart'), except the
+-- last one, must have the same size. The last one can be the same size or
+-- smaller. For example, suppose you want to upload a 16.2 MB file. If you
+-- initiate the multipart upload with a part size of 4 MB, you will upload four
+-- parts of 4 MB each and one part of 0.2 MB.
+--
+-- You don't need to know the size of the archive when you start a multipart
+-- upload because Amazon Glacier does not require you to specify the overall
+-- archive size.
+--
+-- After you complete the multipart upload, Amazon Glacier removes the
+-- multipart upload resource referenced by the ID. Amazon Glacier also removes
+-- the multipart upload resource if you cancel the multipart upload or it may be
+-- removed if there is no activity for a period of 24 hours.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html Uploading LargeArchives in Parts (Multipart Upload)> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-initiate-upload.html Initiate Multipart Upload> in the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-InitiateMultipartUpload.html>
+module Network.AWS.Glacier.InitiateMultipartUpload
+    (
+    -- * Request
+      InitiateMultipartUpload
+    -- ** Request constructor
+    , initiateMultipartUpload
+    -- ** Request lenses
+    , imuAccountId
+    , imuArchiveDescription
+    , imuPartSize
+    , imuVaultName
+
+    -- * Response
+    , InitiateMultipartUploadResponse
+    -- ** Response constructor
+    , initiateMultipartUploadResponse
+    -- ** Response lenses
+    , imurLocation
+    , imurUploadId
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data InitiateMultipartUpload = InitiateMultipartUpload
+    { _imuAccountId          :: Text
+    , _imuArchiveDescription :: Maybe Text
+    , _imuPartSize           :: Maybe Text
+    , _imuVaultName          :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'InitiateMultipartUpload' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'imuAccountId' @::@ 'Text'
+--
+-- * 'imuArchiveDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'imuPartSize' @::@ 'Maybe' 'Text'
+--
+-- * 'imuVaultName' @::@ 'Text'
+--
+initiateMultipartUpload :: Text -- ^ 'imuAccountId'
+                        -> Text -- ^ 'imuVaultName'
+                        -> InitiateMultipartUpload
+initiateMultipartUpload p1 p2 = InitiateMultipartUpload
+    { _imuAccountId          = p1
+    , _imuVaultName          = p2
+    , _imuArchiveDescription = Nothing
+    , _imuPartSize           = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+imuAccountId :: Lens' InitiateMultipartUpload Text
+imuAccountId = lens _imuAccountId (\s a -> s { _imuAccountId = a })
+
+-- | The archive description that you are uploading in parts.
+--
+-- The part size must be a megabyte (1024 KB) multiplied by a power of 2—for
+-- example, 1048576 (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8 MB), and
+-- so on. The minimum allowable part size is 1 MB, and the maximum is 4 GB (4096
+-- MB).
+imuArchiveDescription :: Lens' InitiateMultipartUpload (Maybe Text)
+imuArchiveDescription =
+    lens _imuArchiveDescription (\s a -> s { _imuArchiveDescription = a })
+
+-- | The size of each part except the last, in bytes. The last part can be smaller
+-- than this part size.
+imuPartSize :: Lens' InitiateMultipartUpload (Maybe Text)
+imuPartSize = lens _imuPartSize (\s a -> s { _imuPartSize = a })
+
+-- | The name of the vault.
+imuVaultName :: Lens' InitiateMultipartUpload Text
+imuVaultName = lens _imuVaultName (\s a -> s { _imuVaultName = a })
+
+data InitiateMultipartUploadResponse = InitiateMultipartUploadResponse
+    { _imurLocation :: Maybe Text
+    , _imurUploadId :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'InitiateMultipartUploadResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'imurLocation' @::@ 'Maybe' 'Text'
+--
+-- * 'imurUploadId' @::@ 'Maybe' 'Text'
+--
+initiateMultipartUploadResponse :: InitiateMultipartUploadResponse
+initiateMultipartUploadResponse = InitiateMultipartUploadResponse
+    { _imurLocation = Nothing
+    , _imurUploadId = Nothing
+    }
+
+-- | The relative URI path of the multipart upload ID Amazon Glacier created.
+imurLocation :: Lens' InitiateMultipartUploadResponse (Maybe Text)
+imurLocation = lens _imurLocation (\s a -> s { _imurLocation = a })
+
+-- | The ID of the multipart upload. This value is also included as part of the
+-- location.
+imurUploadId :: Lens' InitiateMultipartUploadResponse (Maybe Text)
+imurUploadId = lens _imurUploadId (\s a -> s { _imurUploadId = a })
+
+instance ToPath InitiateMultipartUpload where
+    toPath InitiateMultipartUpload{..} = mconcat
+        [ "/"
+        , toText _imuAccountId
+        , "/vaults/"
+        , toText _imuVaultName
+        , "/multipart-uploads"
+        ]
+
+instance ToQuery InitiateMultipartUpload where
+    toQuery = const mempty
+
+instance ToHeaders InitiateMultipartUpload where
+    toHeaders InitiateMultipartUpload{..} = mconcat
+        [ "x-amz-archive-description" =: _imuArchiveDescription
+        , "x-amz-part-size"           =: _imuPartSize
+        ]
+
+instance ToJSON InitiateMultipartUpload where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest InitiateMultipartUpload where
+    type Sv InitiateMultipartUpload = Glacier
+    type Rs InitiateMultipartUpload = InitiateMultipartUploadResponse
+
+    request  = post
+    response = headerResponse $ \h -> InitiateMultipartUploadResponse
+        <$> h ~:? "Location"
+        <*> h ~:? "x-amz-multipart-upload-id"
diff --git a/gen/Network/AWS/Glacier/ListJobs.hs b/gen/Network/AWS/Glacier/ListJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/ListJobs.hs
@@ -0,0 +1,224 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.ListJobs
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation lists jobs for a vault, including jobs that are in-progress
+-- and jobs that have recently finished.
+--
+-- Amazon Glacier retains recently completed jobs for a period before deleting
+-- them; however, it eventually removes completed jobs. The output of completed
+-- jobs can be retrieved. Retaining completed jobs for a period of time after
+-- they have completed enables you to get a job output in the event you miss the
+-- job completion notification or your first attempt to download it fails. For
+-- example, suppose you start an archive retrieval job to download an archive.
+-- After the job completes, you start to download the archive but encounter a
+-- network error. In this scenario, you can retry and download the archive while
+-- the job exists.
+--
+-- To retrieve an archive or retrieve a vault inventory from Amazon Glacier,
+-- you first initiate a job, and after the job completes, you download the data.
+-- For an archive retrieval, the output is the archive data, and for an
+-- inventory retrieval, it is the inventory list. The List Job operation returns
+-- a list of these jobs sorted by job initiation time.
+--
+-- This List Jobs operation supports pagination. By default, this operation
+-- returns up to 1,000 jobs in the response. You should always check the
+-- response for a 'marker' at which to continue the list; if there are no more
+-- items the 'marker' is 'null'. To return a list of jobs that begins at a specific
+-- job, set the 'marker' request parameter to the value you obtained from a
+-- previous List Jobs request. You can also limit the number of jobs returned in
+-- the response by specifying the 'limit' parameter in the request.
+--
+-- Additionally, you can filter the jobs list returned by specifying an
+-- optional 'statuscode' (InProgress, Succeeded, or Failed) and 'completed' (true,
+-- false) parameter. The 'statuscode' allows you to specify that only jobs that
+-- match a specified status are returned. The 'completed' parameter allows you to
+-- specify that only jobs in a specific completion state are returned.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-jobs-get.html List Jobs >
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-ListJobs.html>
+module Network.AWS.Glacier.ListJobs
+    (
+    -- * Request
+      ListJobs
+    -- ** Request constructor
+    , listJobs
+    -- ** Request lenses
+    , ljAccountId
+    , ljCompleted
+    , ljLimit
+    , ljMarker
+    , ljStatuscode
+    , ljVaultName
+
+    -- * Response
+    , ListJobsResponse
+    -- ** Response constructor
+    , listJobsResponse
+    -- ** Response lenses
+    , ljrJobList
+    , ljrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data ListJobs = ListJobs
+    { _ljAccountId  :: Text
+    , _ljCompleted  :: Maybe Text
+    , _ljLimit      :: Maybe Text
+    , _ljMarker     :: Maybe Text
+    , _ljStatuscode :: Maybe Text
+    , _ljVaultName  :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListJobs' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ljAccountId' @::@ 'Text'
+--
+-- * 'ljCompleted' @::@ 'Maybe' 'Text'
+--
+-- * 'ljLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'ljMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'ljStatuscode' @::@ 'Maybe' 'Text'
+--
+-- * 'ljVaultName' @::@ 'Text'
+--
+listJobs :: Text -- ^ 'ljAccountId'
+         -> Text -- ^ 'ljVaultName'
+         -> ListJobs
+listJobs p1 p2 = ListJobs
+    { _ljAccountId  = p1
+    , _ljVaultName  = p2
+    , _ljLimit      = Nothing
+    , _ljMarker     = Nothing
+    , _ljStatuscode = Nothing
+    , _ljCompleted  = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+ljAccountId :: Lens' ListJobs Text
+ljAccountId = lens _ljAccountId (\s a -> s { _ljAccountId = a })
+
+-- | Specifies the state of the jobs to return. You can specify 'true' or 'false'.
+ljCompleted :: Lens' ListJobs (Maybe Text)
+ljCompleted = lens _ljCompleted (\s a -> s { _ljCompleted = a })
+
+-- | Specifies that the response be limited to the specified number of items or
+-- fewer. If not specified, the List Jobs operation returns up to 1,000 jobs.
+ljLimit :: Lens' ListJobs (Maybe Text)
+ljLimit = lens _ljLimit (\s a -> s { _ljLimit = a })
+
+-- | An opaque string used for pagination. This value specifies the job at which
+-- the listing of jobs should begin. Get the marker value from a previous List
+-- Jobs response. You need only include the marker if you are continuing the
+-- pagination of results started in a previous List Jobs request.
+ljMarker :: Lens' ListJobs (Maybe Text)
+ljMarker = lens _ljMarker (\s a -> s { _ljMarker = a })
+
+-- | Specifies the type of job status to return. You can specify the following
+-- values: "InProgress", "Succeeded", or "Failed".
+ljStatuscode :: Lens' ListJobs (Maybe Text)
+ljStatuscode = lens _ljStatuscode (\s a -> s { _ljStatuscode = a })
+
+-- | The name of the vault.
+ljVaultName :: Lens' ListJobs Text
+ljVaultName = lens _ljVaultName (\s a -> s { _ljVaultName = a })
+
+data ListJobsResponse = ListJobsResponse
+    { _ljrJobList :: List "JobList" GlacierJobDescription
+    , _ljrMarker  :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'ListJobsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ljrJobList' @::@ ['GlacierJobDescription']
+--
+-- * 'ljrMarker' @::@ 'Maybe' 'Text'
+--
+listJobsResponse :: ListJobsResponse
+listJobsResponse = ListJobsResponse
+    { _ljrJobList = mempty
+    , _ljrMarker  = Nothing
+    }
+
+-- | A list of job objects. Each job object contains metadata describing the job.
+ljrJobList :: Lens' ListJobsResponse [GlacierJobDescription]
+ljrJobList = lens _ljrJobList (\s a -> s { _ljrJobList = a }) . _List
+
+-- | An opaque string that represents where to continue pagination of the results.
+-- You use this value in a new List Jobs request to obtain more jobs in the
+-- list. If there are no more jobs, this value is 'null'.
+ljrMarker :: Lens' ListJobsResponse (Maybe Text)
+ljrMarker = lens _ljrMarker (\s a -> s { _ljrMarker = a })
+
+instance ToPath ListJobs where
+    toPath ListJobs{..} = mconcat
+        [ "/"
+        , toText _ljAccountId
+        , "/vaults/"
+        , toText _ljVaultName
+        , "/jobs"
+        ]
+
+instance ToQuery ListJobs where
+    toQuery ListJobs{..} = mconcat
+        [ "limit"      =? _ljLimit
+        , "marker"     =? _ljMarker
+        , "statuscode" =? _ljStatuscode
+        , "completed"  =? _ljCompleted
+        ]
+
+instance ToHeaders ListJobs
+
+instance ToJSON ListJobs where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest ListJobs where
+    type Sv ListJobs = Glacier
+    type Rs ListJobs = ListJobsResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON ListJobsResponse where
+    parseJSON = withObject "ListJobsResponse" $ \o -> ListJobsResponse
+        <$> o .:? "JobList" .!= mempty
+        <*> o .:? "Marker"
diff --git a/gen/Network/AWS/Glacier/ListMultipartUploads.hs b/gen/Network/AWS/Glacier/ListMultipartUploads.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/ListMultipartUploads.hs
@@ -0,0 +1,191 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.ListMultipartUploads
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation lists in-progress multipart uploads for the specified vault.
+-- An in-progress multipart upload is a multipart upload that has been initiated
+-- by an 'InitiateMultipartUpload' request, but has not yet been completed or
+-- aborted. The list returned in the List Multipart Upload response has no
+-- guaranteed order.
+--
+-- The List Multipart Uploads operation supports pagination. By default, this
+-- operation returns up to 1,000 multipart uploads in the response. You should
+-- always check the response for a 'marker' at which to continue the list; if
+-- there are no more items the 'marker' is 'null'. To return a list of multipart
+-- uploads that begins at a specific upload, set the 'marker' request parameter to
+-- the value you obtained from a previous List Multipart Upload request. You can
+-- also limit the number of uploads returned in the response by specifying the 'limit' parameter in the request.
+--
+-- Note the difference between this operation and listing parts ('ListParts').
+-- The List Multipart Uploads operation lists all multipart uploads for a vault
+-- and does not require a multipart upload ID. The List Parts operation requires
+-- a multipart upload ID since parts are associated with a single upload.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working withArchives in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-list-uploads.html List Multipart Uploads > in the /Amazon GlacierDeveloper Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-ListMultipartUploads.html>
+module Network.AWS.Glacier.ListMultipartUploads
+    (
+    -- * Request
+      ListMultipartUploads
+    -- ** Request constructor
+    , listMultipartUploads
+    -- ** Request lenses
+    , lmuAccountId
+    , lmuLimit
+    , lmuMarker
+    , lmuVaultName
+
+    -- * Response
+    , ListMultipartUploadsResponse
+    -- ** Response constructor
+    , listMultipartUploadsResponse
+    -- ** Response lenses
+    , lmurMarker
+    , lmurUploadsList
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data ListMultipartUploads = ListMultipartUploads
+    { _lmuAccountId :: Text
+    , _lmuLimit     :: Maybe Text
+    , _lmuMarker    :: Maybe Text
+    , _lmuVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListMultipartUploads' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lmuAccountId' @::@ 'Text'
+--
+-- * 'lmuLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'lmuMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lmuVaultName' @::@ 'Text'
+--
+listMultipartUploads :: Text -- ^ 'lmuAccountId'
+                     -> Text -- ^ 'lmuVaultName'
+                     -> ListMultipartUploads
+listMultipartUploads p1 p2 = ListMultipartUploads
+    { _lmuAccountId = p1
+    , _lmuVaultName = p2
+    , _lmuMarker    = Nothing
+    , _lmuLimit     = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+lmuAccountId :: Lens' ListMultipartUploads Text
+lmuAccountId = lens _lmuAccountId (\s a -> s { _lmuAccountId = a })
+
+-- | Specifies the maximum number of uploads returned in the response body. If
+-- this value is not specified, the List Uploads operation returns up to 1,000
+-- uploads.
+lmuLimit :: Lens' ListMultipartUploads (Maybe Text)
+lmuLimit = lens _lmuLimit (\s a -> s { _lmuLimit = a })
+
+-- | An opaque string used for pagination. This value specifies the upload at
+-- which the listing of uploads should begin. Get the marker value from a
+-- previous List Uploads response. You need only include the marker if you are
+-- continuing the pagination of results started in a previous List Uploads
+-- request.
+lmuMarker :: Lens' ListMultipartUploads (Maybe Text)
+lmuMarker = lens _lmuMarker (\s a -> s { _lmuMarker = a })
+
+-- | The name of the vault.
+lmuVaultName :: Lens' ListMultipartUploads Text
+lmuVaultName = lens _lmuVaultName (\s a -> s { _lmuVaultName = a })
+
+data ListMultipartUploadsResponse = ListMultipartUploadsResponse
+    { _lmurMarker      :: Maybe Text
+    , _lmurUploadsList :: List "UploadsList" UploadListElement
+    } deriving (Eq, Read, Show)
+
+-- | 'ListMultipartUploadsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lmurMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lmurUploadsList' @::@ ['UploadListElement']
+--
+listMultipartUploadsResponse :: ListMultipartUploadsResponse
+listMultipartUploadsResponse = ListMultipartUploadsResponse
+    { _lmurUploadsList = mempty
+    , _lmurMarker      = Nothing
+    }
+
+-- | An opaque string that represents where to continue pagination of the results.
+-- You use the marker in a new List Multipart Uploads request to obtain more
+-- uploads in the list. If there are no more uploads, this value is 'null'.
+lmurMarker :: Lens' ListMultipartUploadsResponse (Maybe Text)
+lmurMarker = lens _lmurMarker (\s a -> s { _lmurMarker = a })
+
+-- | A list of in-progress multipart uploads.
+lmurUploadsList :: Lens' ListMultipartUploadsResponse [UploadListElement]
+lmurUploadsList = lens _lmurUploadsList (\s a -> s { _lmurUploadsList = a }) . _List
+
+instance ToPath ListMultipartUploads where
+    toPath ListMultipartUploads{..} = mconcat
+        [ "/"
+        , toText _lmuAccountId
+        , "/vaults/"
+        , toText _lmuVaultName
+        , "/multipart-uploads"
+        ]
+
+instance ToQuery ListMultipartUploads where
+    toQuery ListMultipartUploads{..} = mconcat
+        [ "marker" =? _lmuMarker
+        , "limit"  =? _lmuLimit
+        ]
+
+instance ToHeaders ListMultipartUploads
+
+instance ToJSON ListMultipartUploads where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest ListMultipartUploads where
+    type Sv ListMultipartUploads = Glacier
+    type Rs ListMultipartUploads = ListMultipartUploadsResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON ListMultipartUploadsResponse where
+    parseJSON = withObject "ListMultipartUploadsResponse" $ \o -> ListMultipartUploadsResponse
+        <$> o .:? "Marker"
+        <*> o .:? "UploadsList" .!= mempty
diff --git a/gen/Network/AWS/Glacier/ListParts.hs b/gen/Network/AWS/Glacier/ListParts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/ListParts.hs
@@ -0,0 +1,249 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.ListParts
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation lists the parts of an archive that have been uploaded in a
+-- specific multipart upload. You can make this request at any time during an
+-- in-progress multipart upload before you complete the upload (see 'CompleteMultipartUpload'. List Parts returns an error for completed uploads. The list returned in the
+-- List Parts response is sorted by part range.
+--
+-- The List Parts operation supports pagination. By default, this operation
+-- returns up to 1,000 uploaded parts in the response. You should always check
+-- the response for a 'marker' at which to continue the list; if there are no more
+-- items the 'marker' is 'null'. To return a list of parts that begins at a specific
+-- part, set the 'marker' request parameter to the value you obtained from a
+-- previous List Parts request. You can also limit the number of parts returned
+-- in the response by specifying the 'limit' parameter in the request.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and the underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html Working withArchives in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-list-parts.html List Parts> in the /Amazon Glacier DeveloperGuide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-ListParts.html>
+module Network.AWS.Glacier.ListParts
+    (
+    -- * Request
+      ListParts
+    -- ** Request constructor
+    , listParts
+    -- ** Request lenses
+    , lpAccountId
+    , lpLimit
+    , lpMarker
+    , lpUploadId
+    , lpVaultName
+
+    -- * Response
+    , ListPartsResponse
+    -- ** Response constructor
+    , listPartsResponse
+    -- ** Response lenses
+    , lprArchiveDescription
+    , lprCreationDate
+    , lprMarker
+    , lprMultipartUploadId
+    , lprPartSizeInBytes
+    , lprParts
+    , lprVaultARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data ListParts = ListParts
+    { _lpAccountId :: Text
+    , _lpLimit     :: Maybe Text
+    , _lpMarker    :: Maybe Text
+    , _lpUploadId  :: Text
+    , _lpVaultName :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListParts' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lpAccountId' @::@ 'Text'
+--
+-- * 'lpLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'lpMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lpUploadId' @::@ 'Text'
+--
+-- * 'lpVaultName' @::@ 'Text'
+--
+listParts :: Text -- ^ 'lpAccountId'
+          -> Text -- ^ 'lpVaultName'
+          -> Text -- ^ 'lpUploadId'
+          -> ListParts
+listParts p1 p2 p3 = ListParts
+    { _lpAccountId = p1
+    , _lpVaultName = p2
+    , _lpUploadId  = p3
+    , _lpMarker    = Nothing
+    , _lpLimit     = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+lpAccountId :: Lens' ListParts Text
+lpAccountId = lens _lpAccountId (\s a -> s { _lpAccountId = a })
+
+-- | Specifies the maximum number of parts returned in the response body. If this
+-- value is not specified, the List Parts operation returns up to 1,000 uploads.
+lpLimit :: Lens' ListParts (Maybe Text)
+lpLimit = lens _lpLimit (\s a -> s { _lpLimit = a })
+
+-- | An opaque string used for pagination. This value specifies the part at which
+-- the listing of parts should begin. Get the marker value from the response of
+-- a previous List Parts response. You need only include the marker if you are
+-- continuing the pagination of results started in a previous List Parts request.
+lpMarker :: Lens' ListParts (Maybe Text)
+lpMarker = lens _lpMarker (\s a -> s { _lpMarker = a })
+
+-- | The upload ID of the multipart upload.
+lpUploadId :: Lens' ListParts Text
+lpUploadId = lens _lpUploadId (\s a -> s { _lpUploadId = a })
+
+-- | The name of the vault.
+lpVaultName :: Lens' ListParts Text
+lpVaultName = lens _lpVaultName (\s a -> s { _lpVaultName = a })
+
+data ListPartsResponse = ListPartsResponse
+    { _lprArchiveDescription :: Maybe Text
+    , _lprCreationDate       :: Maybe Text
+    , _lprMarker             :: Maybe Text
+    , _lprMultipartUploadId  :: Maybe Text
+    , _lprPartSizeInBytes    :: Maybe Integer
+    , _lprParts              :: List "Parts" PartListElement
+    , _lprVaultARN           :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'ListPartsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lprArchiveDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'lprCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'lprMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lprMultipartUploadId' @::@ 'Maybe' 'Text'
+--
+-- * 'lprPartSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'lprParts' @::@ ['PartListElement']
+--
+-- * 'lprVaultARN' @::@ 'Maybe' 'Text'
+--
+listPartsResponse :: ListPartsResponse
+listPartsResponse = ListPartsResponse
+    { _lprMultipartUploadId  = Nothing
+    , _lprVaultARN           = Nothing
+    , _lprArchiveDescription = Nothing
+    , _lprPartSizeInBytes    = Nothing
+    , _lprCreationDate       = Nothing
+    , _lprParts              = mempty
+    , _lprMarker             = Nothing
+    }
+
+-- | The description of the archive that was specified in the Initiate Multipart
+-- Upload request.
+lprArchiveDescription :: Lens' ListPartsResponse (Maybe Text)
+lprArchiveDescription =
+    lens _lprArchiveDescription (\s a -> s { _lprArchiveDescription = a })
+
+-- | The UTC time at which the multipart upload was initiated.
+lprCreationDate :: Lens' ListPartsResponse (Maybe Text)
+lprCreationDate = lens _lprCreationDate (\s a -> s { _lprCreationDate = a })
+
+-- | An opaque string that represents where to continue pagination of the results.
+-- You use the marker in a new List Parts request to obtain more jobs in the
+-- list. If there are no more parts, this value is 'null'.
+lprMarker :: Lens' ListPartsResponse (Maybe Text)
+lprMarker = lens _lprMarker (\s a -> s { _lprMarker = a })
+
+-- | The ID of the upload to which the parts are associated.
+lprMultipartUploadId :: Lens' ListPartsResponse (Maybe Text)
+lprMultipartUploadId =
+    lens _lprMultipartUploadId (\s a -> s { _lprMultipartUploadId = a })
+
+-- | The part size in bytes.
+lprPartSizeInBytes :: Lens' ListPartsResponse (Maybe Integer)
+lprPartSizeInBytes =
+    lens _lprPartSizeInBytes (\s a -> s { _lprPartSizeInBytes = a })
+
+-- | A list of the part sizes of the multipart upload.
+lprParts :: Lens' ListPartsResponse [PartListElement]
+lprParts = lens _lprParts (\s a -> s { _lprParts = a }) . _List
+
+-- | The Amazon Resource Name (ARN) of the vault to which the multipart upload was
+-- initiated.
+lprVaultARN :: Lens' ListPartsResponse (Maybe Text)
+lprVaultARN = lens _lprVaultARN (\s a -> s { _lprVaultARN = a })
+
+instance ToPath ListParts where
+    toPath ListParts{..} = mconcat
+        [ "/"
+        , toText _lpAccountId
+        , "/vaults/"
+        , toText _lpVaultName
+        , "/multipart-uploads/"
+        , toText _lpUploadId
+        ]
+
+instance ToQuery ListParts where
+    toQuery ListParts{..} = mconcat
+        [ "marker" =? _lpMarker
+        , "limit"  =? _lpLimit
+        ]
+
+instance ToHeaders ListParts
+
+instance ToJSON ListParts where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest ListParts where
+    type Sv ListParts = Glacier
+    type Rs ListParts = ListPartsResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON ListPartsResponse where
+    parseJSON = withObject "ListPartsResponse" $ \o -> ListPartsResponse
+        <$> o .:? "ArchiveDescription"
+        <*> o .:? "CreationDate"
+        <*> o .:? "Marker"
+        <*> o .:? "MultipartUploadId"
+        <*> o .:? "PartSizeInBytes"
+        <*> o .:? "Parts" .!= mempty
+        <*> o .:? "VaultARN"
diff --git a/gen/Network/AWS/Glacier/ListVaults.hs b/gen/Network/AWS/Glacier/ListVaults.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/ListVaults.hs
@@ -0,0 +1,167 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.ListVaults
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation lists all vaults owned by the calling user's account. The list
+-- returned in the response is ASCII-sorted by vault name.
+--
+-- By default, this operation returns up to 1,000 items. If there are more
+-- vaults to list, the response 'marker' field contains the vault Amazon Resource
+-- Name (ARN) at which to continue the list with a new List Vaults request;
+-- otherwise, the 'marker' field is 'null'. To return a list of vaults that begins
+-- at a specific vault, set the 'marker' request parameter to the vault ARN you
+-- obtained from a previous List Vaults request. You can also limit the number
+-- of vaults returned in the response by specifying the 'limit' parameter in the
+-- request.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/retrieving-vault-info.html Retrieving VaultMetadata in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vaults-get.html List Vaults > in the /Amazon Glacier DeveloperGuide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-ListVaults.html>
+module Network.AWS.Glacier.ListVaults
+    (
+    -- * Request
+      ListVaults
+    -- ** Request constructor
+    , listVaults
+    -- ** Request lenses
+    , lvAccountId
+    , lvLimit
+    , lvMarker
+
+    -- * Response
+    , ListVaultsResponse
+    -- ** Response constructor
+    , listVaultsResponse
+    -- ** Response lenses
+    , lvrMarker
+    , lvrVaultList
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data ListVaults = ListVaults
+    { _lvAccountId :: Text
+    , _lvLimit     :: Maybe Text
+    , _lvMarker    :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListVaults' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvAccountId' @::@ 'Text'
+--
+-- * 'lvLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'lvMarker' @::@ 'Maybe' 'Text'
+--
+listVaults :: Text -- ^ 'lvAccountId'
+           -> ListVaults
+listVaults p1 = ListVaults
+    { _lvAccountId = p1
+    , _lvMarker    = Nothing
+    , _lvLimit     = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+lvAccountId :: Lens' ListVaults Text
+lvAccountId = lens _lvAccountId (\s a -> s { _lvAccountId = a })
+
+-- | The maximum number of items returned in the response. If you don't specify a
+-- value, the List Vaults operation returns up to 1,000 items.
+lvLimit :: Lens' ListVaults (Maybe Text)
+lvLimit = lens _lvLimit (\s a -> s { _lvLimit = a })
+
+-- | A string used for pagination. The marker specifies the vault ARN after which
+-- the listing of vaults should begin.
+lvMarker :: Lens' ListVaults (Maybe Text)
+lvMarker = lens _lvMarker (\s a -> s { _lvMarker = a })
+
+data ListVaultsResponse = ListVaultsResponse
+    { _lvrMarker    :: Maybe Text
+    , _lvrVaultList :: List "VaultList" DescribeVaultOutput
+    } deriving (Eq, Read, Show)
+
+-- | 'ListVaultsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lvrVaultList' @::@ ['DescribeVaultOutput']
+--
+listVaultsResponse :: ListVaultsResponse
+listVaultsResponse = ListVaultsResponse
+    { _lvrVaultList = mempty
+    , _lvrMarker    = Nothing
+    }
+
+-- | The vault ARN at which to continue pagination of the results. You use the
+-- marker in another List Vaults request to obtain more vaults in the list.
+lvrMarker :: Lens' ListVaultsResponse (Maybe Text)
+lvrMarker = lens _lvrMarker (\s a -> s { _lvrMarker = a })
+
+-- | List of vaults.
+lvrVaultList :: Lens' ListVaultsResponse [DescribeVaultOutput]
+lvrVaultList = lens _lvrVaultList (\s a -> s { _lvrVaultList = a }) . _List
+
+instance ToPath ListVaults where
+    toPath ListVaults{..} = mconcat
+        [ "/"
+        , toText _lvAccountId
+        , "/vaults"
+        ]
+
+instance ToQuery ListVaults where
+    toQuery ListVaults{..} = mconcat
+        [ "marker" =? _lvMarker
+        , "limit"  =? _lvLimit
+        ]
+
+instance ToHeaders ListVaults
+
+instance ToJSON ListVaults where
+    toJSON = const (toJSON Empty)
+
+instance AWSRequest ListVaults where
+    type Sv ListVaults = Glacier
+    type Rs ListVaults = ListVaultsResponse
+
+    request  = get
+    response = jsonResponse
+
+instance FromJSON ListVaultsResponse where
+    parseJSON = withObject "ListVaultsResponse" $ \o -> ListVaultsResponse
+        <$> o .:? "Marker"
+        <*> o .:? "VaultList" .!= mempty
diff --git a/gen/Network/AWS/Glacier/SetDataRetrievalPolicy.hs b/gen/Network/AWS/Glacier/SetDataRetrievalPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/SetDataRetrievalPolicy.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.SetDataRetrievalPolicy
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-SetDataRetrievalPolicy.html>
+module Network.AWS.Glacier.SetDataRetrievalPolicy
+    (
+    -- * Request
+      SetDataRetrievalPolicy
+    -- ** Request constructor
+    , setDataRetrievalPolicy
+    -- ** Request lenses
+    , sdrpAccountId
+    , sdrpPolicy
+
+    -- * Response
+    , SetDataRetrievalPolicyResponse
+    -- ** Response constructor
+    , setDataRetrievalPolicyResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data SetDataRetrievalPolicy = SetDataRetrievalPolicy
+    { _sdrpAccountId :: Text
+    , _sdrpPolicy    :: Maybe DataRetrievalPolicy
+    } deriving (Eq, Read, Show)
+
+-- | 'SetDataRetrievalPolicy' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sdrpAccountId' @::@ 'Text'
+--
+-- * 'sdrpPolicy' @::@ 'Maybe' 'DataRetrievalPolicy'
+--
+setDataRetrievalPolicy :: Text -- ^ 'sdrpAccountId'
+                       -> SetDataRetrievalPolicy
+setDataRetrievalPolicy p1 = SetDataRetrievalPolicy
+    { _sdrpAccountId = p1
+    , _sdrpPolicy    = Nothing
+    }
+
+sdrpAccountId :: Lens' SetDataRetrievalPolicy Text
+sdrpAccountId = lens _sdrpAccountId (\s a -> s { _sdrpAccountId = a })
+
+sdrpPolicy :: Lens' SetDataRetrievalPolicy (Maybe DataRetrievalPolicy)
+sdrpPolicy = lens _sdrpPolicy (\s a -> s { _sdrpPolicy = a })
+
+data SetDataRetrievalPolicyResponse = SetDataRetrievalPolicyResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'SetDataRetrievalPolicyResponse' constructor.
+setDataRetrievalPolicyResponse :: SetDataRetrievalPolicyResponse
+setDataRetrievalPolicyResponse = SetDataRetrievalPolicyResponse
+
+instance ToPath SetDataRetrievalPolicy where
+    toPath SetDataRetrievalPolicy{..} = mconcat
+        [ "/"
+        , toText _sdrpAccountId
+        , "/policies/data-retrieval"
+        ]
+
+instance ToQuery SetDataRetrievalPolicy where
+    toQuery = const mempty
+
+instance ToHeaders SetDataRetrievalPolicy
+
+instance ToJSON SetDataRetrievalPolicy where
+    toJSON SetDataRetrievalPolicy{..} = object
+        [ "Policy" .= _sdrpPolicy
+        ]
+
+instance AWSRequest SetDataRetrievalPolicy where
+    type Sv SetDataRetrievalPolicy = Glacier
+    type Rs SetDataRetrievalPolicy = SetDataRetrievalPolicyResponse
+
+    request  = put
+    response = nullResponse SetDataRetrievalPolicyResponse
diff --git a/gen/Network/AWS/Glacier/SetVaultNotifications.hs b/gen/Network/AWS/Glacier/SetVaultNotifications.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/SetVaultNotifications.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.SetVaultNotifications
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation configures notifications that will be sent when specific
+-- events happen to a vault. By default, you don't get any notifications.
+--
+-- To configure vault notifications, send a PUT request to the 'notification-configuration' subresource of the vault. The request should include a JSON document that
+-- provides an Amazon SNS topic and specific events for which you want Amazon
+-- Glacier to send notifications to the topic.
+--
+-- Amazon SNS topics must grant permission to the vault to be allowed to
+-- publish notifications to the topic. You can configure a vault to publish a
+-- notification for the following vault events:
+--
+-- ArchiveRetrievalCompleted This event occurs when a job that was initiated
+-- for an archive retrieval is completed ('InitiateJob'). The status of the
+-- completed job can be "Succeeded" or "Failed". The notification sent to the
+-- SNS topic is the same output as returned from 'DescribeJob'.   InventoryRetrievalCompleted
+-- This event occurs when a job that was initiated for an inventory retrieval
+-- is completed ('InitiateJob'). The status of the completed job can be
+-- "Succeeded" or "Failed". The notification sent to the SNS topic is the same
+-- output as returned from 'DescribeJob'.   An AWS account has full permission to
+-- perform all operations (actions). However, AWS Identity and Access Management
+-- (IAM) users don't have any permissions by default. You must grant them
+-- explicit permission to perform specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identity and Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html Configuring VaultNotifications in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-put.html Set Vault Notification Configuration > in
+-- the /Amazon Glacier Developer Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-SetVaultNotifications.html>
+module Network.AWS.Glacier.SetVaultNotifications
+    (
+    -- * Request
+      SetVaultNotifications
+    -- ** Request constructor
+    , setVaultNotifications
+    -- ** Request lenses
+    , svnAccountId
+    , svnVaultName
+    , svnVaultNotificationConfig
+
+    -- * Response
+    , SetVaultNotificationsResponse
+    -- ** Response constructor
+    , setVaultNotificationsResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data SetVaultNotifications = SetVaultNotifications
+    { _svnAccountId               :: Text
+    , _svnVaultName               :: Text
+    , _svnVaultNotificationConfig :: Maybe VaultNotificationConfig
+    } deriving (Eq, Read, Show)
+
+-- | 'SetVaultNotifications' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'svnAccountId' @::@ 'Text'
+--
+-- * 'svnVaultName' @::@ 'Text'
+--
+-- * 'svnVaultNotificationConfig' @::@ 'Maybe' 'VaultNotificationConfig'
+--
+setVaultNotifications :: Text -- ^ 'svnAccountId'
+                      -> Text -- ^ 'svnVaultName'
+                      -> SetVaultNotifications
+setVaultNotifications p1 p2 = SetVaultNotifications
+    { _svnAccountId               = p1
+    , _svnVaultName               = p2
+    , _svnVaultNotificationConfig = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+svnAccountId :: Lens' SetVaultNotifications Text
+svnAccountId = lens _svnAccountId (\s a -> s { _svnAccountId = a })
+
+-- | The name of the vault.
+svnVaultName :: Lens' SetVaultNotifications Text
+svnVaultName = lens _svnVaultName (\s a -> s { _svnVaultName = a })
+
+-- | Provides options for specifying notification configuration.
+svnVaultNotificationConfig :: Lens' SetVaultNotifications (Maybe VaultNotificationConfig)
+svnVaultNotificationConfig =
+    lens _svnVaultNotificationConfig
+        (\s a -> s { _svnVaultNotificationConfig = a })
+
+data SetVaultNotificationsResponse = SetVaultNotificationsResponse
+    deriving (Eq, Ord, Read, Show, Generic)
+
+-- | 'SetVaultNotificationsResponse' constructor.
+setVaultNotificationsResponse :: SetVaultNotificationsResponse
+setVaultNotificationsResponse = SetVaultNotificationsResponse
+
+instance ToPath SetVaultNotifications where
+    toPath SetVaultNotifications{..} = mconcat
+        [ "/"
+        , toText _svnAccountId
+        , "/vaults/"
+        , toText _svnVaultName
+        , "/notification-configuration"
+        ]
+
+instance ToQuery SetVaultNotifications where
+    toQuery = const mempty
+
+instance ToHeaders SetVaultNotifications
+
+instance ToJSON SetVaultNotifications where
+    toJSON SetVaultNotifications{..} = object
+        [ "vaultNotificationConfig" .= _svnVaultNotificationConfig
+        ]
+
+instance AWSRequest SetVaultNotifications where
+    type Sv SetVaultNotifications = Glacier
+    type Rs SetVaultNotifications = SetVaultNotificationsResponse
+
+    request  = put
+    response = nullResponse SetVaultNotificationsResponse
diff --git a/gen/Network/AWS/Glacier/Types.hs b/gen/Network/AWS/Glacier/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/Types.hs
@@ -0,0 +1,1082 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE ViewPatterns                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.Types
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+module Network.AWS.Glacier.Types
+    (
+    -- * Service
+      Glacier
+    -- ** Error
+    , JSONError
+
+    -- * ArchiveCreationOutput
+    , ArchiveCreationOutput
+    , archiveCreationOutput
+    , acoArchiveId
+    , acoChecksum
+    , acoLocation
+
+    -- * UploadListElement
+    , UploadListElement
+    , uploadListElement
+    , uleArchiveDescription
+    , uleCreationDate
+    , uleMultipartUploadId
+    , ulePartSizeInBytes
+    , uleVaultARN
+
+    -- * InventoryRetrievalJobDescription
+    , InventoryRetrievalJobDescription
+    , inventoryRetrievalJobDescription
+    , irjdEndDate
+    , irjdFormat
+    , irjdLimit
+    , irjdMarker
+    , irjdStartDate
+
+    -- * JobParameters
+    , JobParameters
+    , jobParameters
+    , jpArchiveId
+    , jpDescription
+    , jpFormat
+    , jpInventoryRetrievalParameters
+    , jpRetrievalByteRange
+    , jpSNSTopic
+    , jpType
+
+    -- * DescribeVaultOutput
+    , DescribeVaultOutput
+    , describeVaultOutput
+    , dvoCreationDate
+    , dvoLastInventoryDate
+    , dvoNumberOfArchives
+    , dvoSizeInBytes
+    , dvoVaultARN
+    , dvoVaultName
+
+    -- * DataRetrievalRule
+    , DataRetrievalRule
+    , dataRetrievalRule
+    , drrBytesPerHour
+    , drrStrategy
+
+    -- * ActionCode
+    , ActionCode (..)
+
+    -- * VaultNotificationConfig
+    , VaultNotificationConfig
+    , vaultNotificationConfig
+    , vncEvents
+    , vncSNSTopic
+
+    -- * InventoryRetrievalJobInput
+    , InventoryRetrievalJobInput
+    , inventoryRetrievalJobInput
+    , irjiEndDate
+    , irjiLimit
+    , irjiMarker
+    , irjiStartDate
+
+    -- * PartListElement
+    , PartListElement
+    , partListElement
+    , pleRangeInBytes
+    , pleSHA256TreeHash
+
+    -- * DataRetrievalPolicy
+    , DataRetrievalPolicy
+    , dataRetrievalPolicy
+    , drpRules
+
+    -- * GlacierJobDescription
+    , GlacierJobDescription
+    , glacierJobDescription
+    , gjdAction
+    , gjdArchiveId
+    , gjdArchiveSHA256TreeHash
+    , gjdArchiveSizeInBytes
+    , gjdCompleted
+    , gjdCompletionDate
+    , gjdCreationDate
+    , gjdInventoryRetrievalParameters
+    , gjdInventorySizeInBytes
+    , gjdJobDescription
+    , gjdJobId
+    , gjdRetrievalByteRange
+    , gjdSHA256TreeHash
+    , gjdSNSTopic
+    , gjdStatusCode
+    , gjdStatusMessage
+    , gjdVaultARN
+
+    -- * StatusCode
+    , StatusCode (..)
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Signing
+import qualified GHC.Exts
+
+-- | Version @2012-06-01@ of the Amazon Glacier service.
+data Glacier
+
+instance AWSService Glacier where
+    type Sg Glacier = V4
+    type Er Glacier = JSONError
+
+    service = service'
+      where
+        service' :: Service Glacier
+        service' = Service
+            { _svcAbbrev       = "Glacier"
+            , _svcPrefix       = "glacier"
+            , _svcVersion      = "2012-06-01"
+            , _svcTargetPrefix = Nothing
+            , _svcJSONVersion  = Nothing
+            , _svcHandle       = handle
+            , _svcRetry        = retry
+            }
+
+        handle :: Status
+               -> Maybe (LazyByteString -> ServiceError JSONError)
+        handle = jsonError statusSuccess service'
+
+        retry :: Retry Glacier
+        retry = Exponential
+            { _retryBase     = 0.05
+            , _retryGrowth   = 2
+            , _retryAttempts = 5
+            , _retryCheck    = check
+            }
+
+        check :: Status
+              -> JSONError
+              -> Bool
+        check (statusCode -> s) (awsErrorCode -> e)
+            | s == 400 && "ThrottlingException" == e = True -- Throttling
+            | s == 500  = True -- General Server Error
+            | s == 509  = True -- Limit Exceeded
+            | s == 503  = True -- Service Unavailable
+            | otherwise = False
+
+data ArchiveCreationOutput = ArchiveCreationOutput
+    { _acoArchiveId :: Maybe Text
+    , _acoChecksum  :: Maybe Text
+    , _acoLocation  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ArchiveCreationOutput' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'acoArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'acoChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'acoLocation' @::@ 'Maybe' 'Text'
+--
+archiveCreationOutput :: ArchiveCreationOutput
+archiveCreationOutput = ArchiveCreationOutput
+    { _acoLocation  = Nothing
+    , _acoChecksum  = Nothing
+    , _acoArchiveId = Nothing
+    }
+
+-- | The ID of the archive. This value is also included as part of the location.
+acoArchiveId :: Lens' ArchiveCreationOutput (Maybe Text)
+acoArchiveId = lens _acoArchiveId (\s a -> s { _acoArchiveId = a })
+
+-- | The checksum of the archive computed by Amazon Glacier.
+acoChecksum :: Lens' ArchiveCreationOutput (Maybe Text)
+acoChecksum = lens _acoChecksum (\s a -> s { _acoChecksum = a })
+
+-- | The relative URI path of the newly added archive resource.
+acoLocation :: Lens' ArchiveCreationOutput (Maybe Text)
+acoLocation = lens _acoLocation (\s a -> s { _acoLocation = a })
+
+instance FromJSON ArchiveCreationOutput where
+    parseJSON = withObject "ArchiveCreationOutput" $ \o -> ArchiveCreationOutput
+        <$> o .:? "x-amz-archive-id"
+        <*> o .:? "x-amz-sha256-tree-hash"
+        <*> o .:? "Location"
+
+instance ToJSON ArchiveCreationOutput where
+    toJSON = const (toJSON Empty)
+
+data UploadListElement = UploadListElement
+    { _uleArchiveDescription :: Maybe Text
+    , _uleCreationDate       :: Maybe Text
+    , _uleMultipartUploadId  :: Maybe Text
+    , _ulePartSizeInBytes    :: Maybe Integer
+    , _uleVaultARN           :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'UploadListElement' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'uleArchiveDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'uleCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'uleMultipartUploadId' @::@ 'Maybe' 'Text'
+--
+-- * 'ulePartSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'uleVaultARN' @::@ 'Maybe' 'Text'
+--
+uploadListElement :: UploadListElement
+uploadListElement = UploadListElement
+    { _uleMultipartUploadId  = Nothing
+    , _uleVaultARN           = Nothing
+    , _uleArchiveDescription = Nothing
+    , _ulePartSizeInBytes    = Nothing
+    , _uleCreationDate       = Nothing
+    }
+
+-- | The description of the archive that was specified in the Initiate Multipart
+-- Upload request.
+uleArchiveDescription :: Lens' UploadListElement (Maybe Text)
+uleArchiveDescription =
+    lens _uleArchiveDescription (\s a -> s { _uleArchiveDescription = a })
+
+-- | The UTC time at which the multipart upload was initiated.
+uleCreationDate :: Lens' UploadListElement (Maybe Text)
+uleCreationDate = lens _uleCreationDate (\s a -> s { _uleCreationDate = a })
+
+-- | The ID of a multipart upload.
+uleMultipartUploadId :: Lens' UploadListElement (Maybe Text)
+uleMultipartUploadId =
+    lens _uleMultipartUploadId (\s a -> s { _uleMultipartUploadId = a })
+
+-- | The part size, in bytes, specified in the Initiate Multipart Upload request.
+-- This is the size of all the parts in the upload except the last part, which
+-- may be smaller than this size.
+ulePartSizeInBytes :: Lens' UploadListElement (Maybe Integer)
+ulePartSizeInBytes =
+    lens _ulePartSizeInBytes (\s a -> s { _ulePartSizeInBytes = a })
+
+-- | The Amazon Resource Name (ARN) of the vault that contains the archive.
+uleVaultARN :: Lens' UploadListElement (Maybe Text)
+uleVaultARN = lens _uleVaultARN (\s a -> s { _uleVaultARN = a })
+
+instance FromJSON UploadListElement where
+    parseJSON = withObject "UploadListElement" $ \o -> UploadListElement
+        <$> o .:? "ArchiveDescription"
+        <*> o .:? "CreationDate"
+        <*> o .:? "MultipartUploadId"
+        <*> o .:? "PartSizeInBytes"
+        <*> o .:? "VaultARN"
+
+instance ToJSON UploadListElement where
+    toJSON UploadListElement{..} = object
+        [ "MultipartUploadId"  .= _uleMultipartUploadId
+        , "VaultARN"           .= _uleVaultARN
+        , "ArchiveDescription" .= _uleArchiveDescription
+        , "PartSizeInBytes"    .= _ulePartSizeInBytes
+        , "CreationDate"       .= _uleCreationDate
+        ]
+
+data InventoryRetrievalJobDescription = InventoryRetrievalJobDescription
+    { _irjdEndDate   :: Maybe Text
+    , _irjdFormat    :: Maybe Text
+    , _irjdLimit     :: Maybe Text
+    , _irjdMarker    :: Maybe Text
+    , _irjdStartDate :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'InventoryRetrievalJobDescription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'irjdEndDate' @::@ 'Maybe' 'Text'
+--
+-- * 'irjdFormat' @::@ 'Maybe' 'Text'
+--
+-- * 'irjdLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'irjdMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'irjdStartDate' @::@ 'Maybe' 'Text'
+--
+inventoryRetrievalJobDescription :: InventoryRetrievalJobDescription
+inventoryRetrievalJobDescription = InventoryRetrievalJobDescription
+    { _irjdFormat    = Nothing
+    , _irjdStartDate = Nothing
+    , _irjdEndDate   = Nothing
+    , _irjdLimit     = Nothing
+    , _irjdMarker    = Nothing
+    }
+
+-- | The end of the date range in UTC for vault inventory retrieval that includes
+-- archives created before this date. A string representation of ISO 8601 date
+-- format, for example, 2013-03-20T17:03:43Z.
+irjdEndDate :: Lens' InventoryRetrievalJobDescription (Maybe Text)
+irjdEndDate = lens _irjdEndDate (\s a -> s { _irjdEndDate = a })
+
+-- | The output format for the vault inventory list, which is set by the InitiateJob
+-- request when initiating a job to retrieve a vault inventory. Valid values
+-- are "CSV" and "JSON".
+irjdFormat :: Lens' InventoryRetrievalJobDescription (Maybe Text)
+irjdFormat = lens _irjdFormat (\s a -> s { _irjdFormat = a })
+
+-- | Specifies the maximum number of inventory items returned per vault inventory
+-- retrieval request. This limit is set when initiating the job with the a InitiateJob
+-- request.
+irjdLimit :: Lens' InventoryRetrievalJobDescription (Maybe Text)
+irjdLimit = lens _irjdLimit (\s a -> s { _irjdLimit = a })
+
+-- | An opaque string that represents where to continue pagination of the vault
+-- inventory retrieval results. You use the marker in a new InitiateJob request
+-- to obtain additional inventory items. If there are no more inventory items,
+-- this value is 'null'. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html#api-initiate-job-post-vault-inventory-list-filtering  Range Inventory Retrieval>.
+irjdMarker :: Lens' InventoryRetrievalJobDescription (Maybe Text)
+irjdMarker = lens _irjdMarker (\s a -> s { _irjdMarker = a })
+
+-- | The start of the date range in UTC for vault inventory retrieval that
+-- includes archives created on or after this date. A string representation of
+-- ISO 8601 date format, for example, 2013-03-20T17:03:43Z.
+irjdStartDate :: Lens' InventoryRetrievalJobDescription (Maybe Text)
+irjdStartDate = lens _irjdStartDate (\s a -> s { _irjdStartDate = a })
+
+instance FromJSON InventoryRetrievalJobDescription where
+    parseJSON = withObject "InventoryRetrievalJobDescription" $ \o -> InventoryRetrievalJobDescription
+        <$> o .:? "EndDate"
+        <*> o .:? "Format"
+        <*> o .:? "Limit"
+        <*> o .:? "Marker"
+        <*> o .:? "StartDate"
+
+instance ToJSON InventoryRetrievalJobDescription where
+    toJSON InventoryRetrievalJobDescription{..} = object
+        [ "Format"    .= _irjdFormat
+        , "StartDate" .= _irjdStartDate
+        , "EndDate"   .= _irjdEndDate
+        , "Limit"     .= _irjdLimit
+        , "Marker"    .= _irjdMarker
+        ]
+
+data JobParameters = JobParameters
+    { _jpArchiveId                    :: Maybe Text
+    , _jpDescription                  :: Maybe Text
+    , _jpFormat                       :: Maybe Text
+    , _jpInventoryRetrievalParameters :: Maybe InventoryRetrievalJobInput
+    , _jpRetrievalByteRange           :: Maybe Text
+    , _jpSNSTopic                     :: Maybe Text
+    , _jpType                         :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'JobParameters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'jpArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'jpDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'jpFormat' @::@ 'Maybe' 'Text'
+--
+-- * 'jpInventoryRetrievalParameters' @::@ 'Maybe' 'InventoryRetrievalJobInput'
+--
+-- * 'jpRetrievalByteRange' @::@ 'Maybe' 'Text'
+--
+-- * 'jpSNSTopic' @::@ 'Maybe' 'Text'
+--
+-- * 'jpType' @::@ 'Maybe' 'Text'
+--
+jobParameters :: JobParameters
+jobParameters = JobParameters
+    { _jpFormat                       = Nothing
+    , _jpType                         = Nothing
+    , _jpArchiveId                    = Nothing
+    , _jpDescription                  = Nothing
+    , _jpSNSTopic                     = Nothing
+    , _jpRetrievalByteRange           = Nothing
+    , _jpInventoryRetrievalParameters = Nothing
+    }
+
+-- | The ID of the archive that you want to retrieve. This field is required only
+-- if 'Type' is set to archive-retrieval. An error occurs if you specify this
+-- request parameter for an inventory retrieval job request.
+jpArchiveId :: Lens' JobParameters (Maybe Text)
+jpArchiveId = lens _jpArchiveId (\s a -> s { _jpArchiveId = a })
+
+-- | The optional description for the job. The description must be less than or
+-- equal to 1,024 bytes. The allowable characters are 7-bit ASCII without
+-- control codes-specifically, ASCII values 32-126 decimal or 0x20-0x7E
+-- hexadecimal.
+jpDescription :: Lens' JobParameters (Maybe Text)
+jpDescription = lens _jpDescription (\s a -> s { _jpDescription = a })
+
+-- | When initiating a job to retrieve a vault inventory, you can optionally add
+-- this parameter to your request to specify the output format. If you are
+-- initiating an inventory job and do not specify a Format field, JSON is the
+-- default format. Valid values are "CSV" and "JSON".
+jpFormat :: Lens' JobParameters (Maybe Text)
+jpFormat = lens _jpFormat (\s a -> s { _jpFormat = a })
+
+-- | Input parameters used for range inventory retrieval.
+jpInventoryRetrievalParameters :: Lens' JobParameters (Maybe InventoryRetrievalJobInput)
+jpInventoryRetrievalParameters =
+    lens _jpInventoryRetrievalParameters
+        (\s a -> s { _jpInventoryRetrievalParameters = a })
+
+-- | The byte range to retrieve for an archive retrieval. in the form "/StartByteValue/-/EndByteValue/" If not specified, the whole archive is retrieved. If
+-- specified, the byte range must be megabyte (1024*1024) aligned which means
+-- that /StartByteValue/ must be divisible by 1 MB and /EndByteValue/ plus 1 must be
+-- divisible by 1 MB or be the end of the archive specified as the archive byte
+-- size value minus 1. If RetrievalByteRange is not megabyte aligned, this
+-- operation returns a 400 response.
+--
+-- An error occurs if you specify this field for an inventory retrieval job
+-- request.
+jpRetrievalByteRange :: Lens' JobParameters (Maybe Text)
+jpRetrievalByteRange =
+    lens _jpRetrievalByteRange (\s a -> s { _jpRetrievalByteRange = a })
+
+-- | The Amazon SNS topic ARN to which Amazon Glacier sends a notification when
+-- the job is completed and the output is ready for you to download. The
+-- specified topic publishes the notification to its subscribers. The SNS topic
+-- must exist.
+jpSNSTopic :: Lens' JobParameters (Maybe Text)
+jpSNSTopic = lens _jpSNSTopic (\s a -> s { _jpSNSTopic = a })
+
+-- | The job type. You can initiate a job to retrieve an archive or get an
+-- inventory of a vault. Valid values are "archive-retrieval" and
+-- "inventory-retrieval".
+jpType :: Lens' JobParameters (Maybe Text)
+jpType = lens _jpType (\s a -> s { _jpType = a })
+
+instance FromJSON JobParameters where
+    parseJSON = withObject "JobParameters" $ \o -> JobParameters
+        <$> o .:? "ArchiveId"
+        <*> o .:? "Description"
+        <*> o .:? "Format"
+        <*> o .:? "InventoryRetrievalParameters"
+        <*> o .:? "RetrievalByteRange"
+        <*> o .:? "SNSTopic"
+        <*> o .:? "Type"
+
+instance ToJSON JobParameters where
+    toJSON JobParameters{..} = object
+        [ "Format"                       .= _jpFormat
+        , "Type"                         .= _jpType
+        , "ArchiveId"                    .= _jpArchiveId
+        , "Description"                  .= _jpDescription
+        , "SNSTopic"                     .= _jpSNSTopic
+        , "RetrievalByteRange"           .= _jpRetrievalByteRange
+        , "InventoryRetrievalParameters" .= _jpInventoryRetrievalParameters
+        ]
+
+data DescribeVaultOutput = DescribeVaultOutput
+    { _dvoCreationDate      :: Maybe Text
+    , _dvoLastInventoryDate :: Maybe Text
+    , _dvoNumberOfArchives  :: Maybe Integer
+    , _dvoSizeInBytes       :: Maybe Integer
+    , _dvoVaultARN          :: Maybe Text
+    , _dvoVaultName         :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeVaultOutput' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvoCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'dvoLastInventoryDate' @::@ 'Maybe' 'Text'
+--
+-- * 'dvoNumberOfArchives' @::@ 'Maybe' 'Integer'
+--
+-- * 'dvoSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'dvoVaultARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dvoVaultName' @::@ 'Maybe' 'Text'
+--
+describeVaultOutput :: DescribeVaultOutput
+describeVaultOutput = DescribeVaultOutput
+    { _dvoVaultARN          = Nothing
+    , _dvoVaultName         = Nothing
+    , _dvoCreationDate      = Nothing
+    , _dvoLastInventoryDate = Nothing
+    , _dvoNumberOfArchives  = Nothing
+    , _dvoSizeInBytes       = Nothing
+    }
+
+-- | The UTC date when the vault was created. A string representation of ISO 8601
+-- date format, for example, "2012-03-20T17:03:43.221Z".
+dvoCreationDate :: Lens' DescribeVaultOutput (Maybe Text)
+dvoCreationDate = lens _dvoCreationDate (\s a -> s { _dvoCreationDate = a })
+
+-- | The UTC date when Amazon Glacier completed the last vault inventory. A string
+-- representation of ISO 8601 date format, for example,
+-- "2012-03-20T17:03:43.221Z".
+dvoLastInventoryDate :: Lens' DescribeVaultOutput (Maybe Text)
+dvoLastInventoryDate =
+    lens _dvoLastInventoryDate (\s a -> s { _dvoLastInventoryDate = a })
+
+-- | The number of archives in the vault as of the last inventory date. This field
+-- will return 'null' if an inventory has not yet run on the vault, for example,
+-- if you just created the vault.
+dvoNumberOfArchives :: Lens' DescribeVaultOutput (Maybe Integer)
+dvoNumberOfArchives =
+    lens _dvoNumberOfArchives (\s a -> s { _dvoNumberOfArchives = a })
+
+-- | Total size, in bytes, of the archives in the vault as of the last inventory
+-- date. This field will return null if an inventory has not yet run on the
+-- vault, for example, if you just created the vault.
+dvoSizeInBytes :: Lens' DescribeVaultOutput (Maybe Integer)
+dvoSizeInBytes = lens _dvoSizeInBytes (\s a -> s { _dvoSizeInBytes = a })
+
+-- | The Amazon Resource Name (ARN) of the vault.
+dvoVaultARN :: Lens' DescribeVaultOutput (Maybe Text)
+dvoVaultARN = lens _dvoVaultARN (\s a -> s { _dvoVaultARN = a })
+
+-- | The name of the vault.
+dvoVaultName :: Lens' DescribeVaultOutput (Maybe Text)
+dvoVaultName = lens _dvoVaultName (\s a -> s { _dvoVaultName = a })
+
+instance FromJSON DescribeVaultOutput where
+    parseJSON = withObject "DescribeVaultOutput" $ \o -> DescribeVaultOutput
+        <$> o .:? "CreationDate"
+        <*> o .:? "LastInventoryDate"
+        <*> o .:? "NumberOfArchives"
+        <*> o .:? "SizeInBytes"
+        <*> o .:? "VaultARN"
+        <*> o .:? "VaultName"
+
+instance ToJSON DescribeVaultOutput where
+    toJSON DescribeVaultOutput{..} = object
+        [ "VaultARN"          .= _dvoVaultARN
+        , "VaultName"         .= _dvoVaultName
+        , "CreationDate"      .= _dvoCreationDate
+        , "LastInventoryDate" .= _dvoLastInventoryDate
+        , "NumberOfArchives"  .= _dvoNumberOfArchives
+        , "SizeInBytes"       .= _dvoSizeInBytes
+        ]
+
+data DataRetrievalRule = DataRetrievalRule
+    { _drrBytesPerHour :: Maybe Integer
+    , _drrStrategy     :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DataRetrievalRule' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drrBytesPerHour' @::@ 'Maybe' 'Integer'
+--
+-- * 'drrStrategy' @::@ 'Maybe' 'Text'
+--
+dataRetrievalRule :: DataRetrievalRule
+dataRetrievalRule = DataRetrievalRule
+    { _drrStrategy     = Nothing
+    , _drrBytesPerHour = Nothing
+    }
+
+drrBytesPerHour :: Lens' DataRetrievalRule (Maybe Integer)
+drrBytesPerHour = lens _drrBytesPerHour (\s a -> s { _drrBytesPerHour = a })
+
+drrStrategy :: Lens' DataRetrievalRule (Maybe Text)
+drrStrategy = lens _drrStrategy (\s a -> s { _drrStrategy = a })
+
+instance FromJSON DataRetrievalRule where
+    parseJSON = withObject "DataRetrievalRule" $ \o -> DataRetrievalRule
+        <$> o .:? "BytesPerHour"
+        <*> o .:? "Strategy"
+
+instance ToJSON DataRetrievalRule where
+    toJSON DataRetrievalRule{..} = object
+        [ "Strategy"     .= _drrStrategy
+        , "BytesPerHour" .= _drrBytesPerHour
+        ]
+
+data ActionCode
+    = ArchiveRetrieval   -- ^ ArchiveRetrieval
+    | InventoryRetrieval -- ^ InventoryRetrieval
+      deriving (Eq, Ord, Read, Show, Generic, Enum)
+
+instance Hashable ActionCode
+
+instance FromText ActionCode where
+    parser = takeLowerText >>= \case
+        "archiveretrieval"   -> pure ArchiveRetrieval
+        "inventoryretrieval" -> pure InventoryRetrieval
+        e                    -> fail $
+            "Failure parsing ActionCode from " ++ show e
+
+instance ToText ActionCode where
+    toText = \case
+        ArchiveRetrieval   -> "ArchiveRetrieval"
+        InventoryRetrieval -> "InventoryRetrieval"
+
+instance ToByteString ActionCode
+instance ToHeader     ActionCode
+instance ToQuery      ActionCode
+
+instance FromJSON ActionCode where
+    parseJSON = parseJSONText "ActionCode"
+
+instance ToJSON ActionCode where
+    toJSON = toJSONText
+
+data VaultNotificationConfig = VaultNotificationConfig
+    { _vncEvents   :: List "Events" Text
+    , _vncSNSTopic :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'VaultNotificationConfig' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vncEvents' @::@ ['Text']
+--
+-- * 'vncSNSTopic' @::@ 'Maybe' 'Text'
+--
+vaultNotificationConfig :: VaultNotificationConfig
+vaultNotificationConfig = VaultNotificationConfig
+    { _vncSNSTopic = Nothing
+    , _vncEvents   = mempty
+    }
+
+-- | A list of one or more events for which Amazon Glacier will send a
+-- notification to the specified Amazon SNS topic.
+vncEvents :: Lens' VaultNotificationConfig [Text]
+vncEvents = lens _vncEvents (\s a -> s { _vncEvents = a }) . _List
+
+-- | The Amazon Simple Notification Service (Amazon SNS) topic Amazon Resource
+-- Name (ARN).
+vncSNSTopic :: Lens' VaultNotificationConfig (Maybe Text)
+vncSNSTopic = lens _vncSNSTopic (\s a -> s { _vncSNSTopic = a })
+
+instance FromJSON VaultNotificationConfig where
+    parseJSON = withObject "VaultNotificationConfig" $ \o -> VaultNotificationConfig
+        <$> o .:? "Events" .!= mempty
+        <*> o .:? "SNSTopic"
+
+instance ToJSON VaultNotificationConfig where
+    toJSON VaultNotificationConfig{..} = object
+        [ "SNSTopic" .= _vncSNSTopic
+        , "Events"   .= _vncEvents
+        ]
+
+data InventoryRetrievalJobInput = InventoryRetrievalJobInput
+    { _irjiEndDate   :: Maybe Text
+    , _irjiLimit     :: Maybe Text
+    , _irjiMarker    :: Maybe Text
+    , _irjiStartDate :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'InventoryRetrievalJobInput' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'irjiEndDate' @::@ 'Maybe' 'Text'
+--
+-- * 'irjiLimit' @::@ 'Maybe' 'Text'
+--
+-- * 'irjiMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'irjiStartDate' @::@ 'Maybe' 'Text'
+--
+inventoryRetrievalJobInput :: InventoryRetrievalJobInput
+inventoryRetrievalJobInput = InventoryRetrievalJobInput
+    { _irjiStartDate = Nothing
+    , _irjiEndDate   = Nothing
+    , _irjiLimit     = Nothing
+    , _irjiMarker    = Nothing
+    }
+
+-- | The end of the date range in UTC for vault inventory retrieval that includes
+-- archives created before this date. A string representation of ISO 8601 date
+-- format, for example, 2013-03-20T17:03:43Z.
+irjiEndDate :: Lens' InventoryRetrievalJobInput (Maybe Text)
+irjiEndDate = lens _irjiEndDate (\s a -> s { _irjiEndDate = a })
+
+-- | Specifies the maximum number of inventory items returned per vault inventory
+-- retrieval request. Valid values are greater than or equal to 1.
+irjiLimit :: Lens' InventoryRetrievalJobInput (Maybe Text)
+irjiLimit = lens _irjiLimit (\s a -> s { _irjiLimit = a })
+
+-- | An opaque string that represents where to continue pagination of the vault
+-- inventory retrieval results. You use the marker in a new InitiateJob request
+-- to obtain additional inventory items. If there are no more inventory items,
+-- this value is 'null'.
+irjiMarker :: Lens' InventoryRetrievalJobInput (Maybe Text)
+irjiMarker = lens _irjiMarker (\s a -> s { _irjiMarker = a })
+
+-- | The start of the date range in UTC for vault inventory retrieval that
+-- includes archives created on or after this date. A string representation of
+-- ISO 8601 date format, for example, 2013-03-20T17:03:43Z.
+irjiStartDate :: Lens' InventoryRetrievalJobInput (Maybe Text)
+irjiStartDate = lens _irjiStartDate (\s a -> s { _irjiStartDate = a })
+
+instance FromJSON InventoryRetrievalJobInput where
+    parseJSON = withObject "InventoryRetrievalJobInput" $ \o -> InventoryRetrievalJobInput
+        <$> o .:? "EndDate"
+        <*> o .:? "Limit"
+        <*> o .:? "Marker"
+        <*> o .:? "StartDate"
+
+instance ToJSON InventoryRetrievalJobInput where
+    toJSON InventoryRetrievalJobInput{..} = object
+        [ "StartDate" .= _irjiStartDate
+        , "EndDate"   .= _irjiEndDate
+        , "Limit"     .= _irjiLimit
+        , "Marker"    .= _irjiMarker
+        ]
+
+data PartListElement = PartListElement
+    { _pleRangeInBytes   :: Maybe Text
+    , _pleSHA256TreeHash :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'PartListElement' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'pleRangeInBytes' @::@ 'Maybe' 'Text'
+--
+-- * 'pleSHA256TreeHash' @::@ 'Maybe' 'Text'
+--
+partListElement :: PartListElement
+partListElement = PartListElement
+    { _pleRangeInBytes   = Nothing
+    , _pleSHA256TreeHash = Nothing
+    }
+
+-- | The byte range of a part, inclusive of the upper value of the range.
+pleRangeInBytes :: Lens' PartListElement (Maybe Text)
+pleRangeInBytes = lens _pleRangeInBytes (\s a -> s { _pleRangeInBytes = a })
+
+-- | The SHA256 tree hash value that Amazon Glacier calculated for the part. This
+-- field is never 'null'.
+pleSHA256TreeHash :: Lens' PartListElement (Maybe Text)
+pleSHA256TreeHash =
+    lens _pleSHA256TreeHash (\s a -> s { _pleSHA256TreeHash = a })
+
+instance FromJSON PartListElement where
+    parseJSON = withObject "PartListElement" $ \o -> PartListElement
+        <$> o .:? "RangeInBytes"
+        <*> o .:? "SHA256TreeHash"
+
+instance ToJSON PartListElement where
+    toJSON PartListElement{..} = object
+        [ "RangeInBytes"   .= _pleRangeInBytes
+        , "SHA256TreeHash" .= _pleSHA256TreeHash
+        ]
+
+newtype DataRetrievalPolicy = DataRetrievalPolicy
+    { _drpRules :: List "Rules" DataRetrievalRule
+    } deriving (Eq, Read, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DataRetrievalPolicy where
+    type Item DataRetrievalPolicy = DataRetrievalRule
+
+    fromList = DataRetrievalPolicy . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _drpRules
+
+-- | 'DataRetrievalPolicy' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drpRules' @::@ ['DataRetrievalRule']
+--
+dataRetrievalPolicy :: DataRetrievalPolicy
+dataRetrievalPolicy = DataRetrievalPolicy
+    { _drpRules = mempty
+    }
+
+drpRules :: Lens' DataRetrievalPolicy [DataRetrievalRule]
+drpRules = lens _drpRules (\s a -> s { _drpRules = a }) . _List
+
+instance FromJSON DataRetrievalPolicy where
+    parseJSON = withObject "DataRetrievalPolicy" $ \o -> DataRetrievalPolicy
+        <$> o .:? "Rules" .!= mempty
+
+instance ToJSON DataRetrievalPolicy where
+    toJSON DataRetrievalPolicy{..} = object
+        [ "Rules" .= _drpRules
+        ]
+
+data GlacierJobDescription = GlacierJobDescription
+    { _gjdAction                       :: Maybe ActionCode
+    , _gjdArchiveId                    :: Maybe Text
+    , _gjdArchiveSHA256TreeHash        :: Maybe Text
+    , _gjdArchiveSizeInBytes           :: Maybe Integer
+    , _gjdCompleted                    :: Maybe Bool
+    , _gjdCompletionDate               :: Maybe Text
+    , _gjdCreationDate                 :: Maybe Text
+    , _gjdInventoryRetrievalParameters :: Maybe InventoryRetrievalJobDescription
+    , _gjdInventorySizeInBytes         :: Maybe Integer
+    , _gjdJobDescription               :: Maybe Text
+    , _gjdJobId                        :: Maybe Text
+    , _gjdRetrievalByteRange           :: Maybe Text
+    , _gjdSHA256TreeHash               :: Maybe Text
+    , _gjdSNSTopic                     :: Maybe Text
+    , _gjdStatusCode                   :: Maybe StatusCode
+    , _gjdStatusMessage                :: Maybe Text
+    , _gjdVaultARN                     :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'GlacierJobDescription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'gjdAction' @::@ 'Maybe' 'ActionCode'
+--
+-- * 'gjdArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdArchiveSHA256TreeHash' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdArchiveSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'gjdCompleted' @::@ 'Maybe' 'Bool'
+--
+-- * 'gjdCompletionDate' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdCreationDate' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdInventoryRetrievalParameters' @::@ 'Maybe' 'InventoryRetrievalJobDescription'
+--
+-- * 'gjdInventorySizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'gjdJobDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdJobId' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdRetrievalByteRange' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdSHA256TreeHash' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdSNSTopic' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdStatusCode' @::@ 'Maybe' 'StatusCode'
+--
+-- * 'gjdStatusMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'gjdVaultARN' @::@ 'Maybe' 'Text'
+--
+glacierJobDescription :: GlacierJobDescription
+glacierJobDescription = GlacierJobDescription
+    { _gjdJobId                        = Nothing
+    , _gjdJobDescription               = Nothing
+    , _gjdAction                       = Nothing
+    , _gjdArchiveId                    = Nothing
+    , _gjdVaultARN                     = Nothing
+    , _gjdCreationDate                 = Nothing
+    , _gjdCompleted                    = Nothing
+    , _gjdStatusCode                   = Nothing
+    , _gjdStatusMessage                = Nothing
+    , _gjdArchiveSizeInBytes           = Nothing
+    , _gjdInventorySizeInBytes         = Nothing
+    , _gjdSNSTopic                     = Nothing
+    , _gjdCompletionDate               = Nothing
+    , _gjdSHA256TreeHash               = Nothing
+    , _gjdArchiveSHA256TreeHash        = Nothing
+    , _gjdRetrievalByteRange           = Nothing
+    , _gjdInventoryRetrievalParameters = Nothing
+    }
+
+-- | The job type. It is either ArchiveRetrieval or InventoryRetrieval.
+gjdAction :: Lens' GlacierJobDescription (Maybe ActionCode)
+gjdAction = lens _gjdAction (\s a -> s { _gjdAction = a })
+
+-- | For an ArchiveRetrieval job, this is the archive ID requested for download.
+-- Otherwise, this field is null.
+gjdArchiveId :: Lens' GlacierJobDescription (Maybe Text)
+gjdArchiveId = lens _gjdArchiveId (\s a -> s { _gjdArchiveId = a })
+
+-- | The SHA256 tree hash of the entire archive for an archive retrieval. For
+-- inventory retrieval jobs, this field is null.
+gjdArchiveSHA256TreeHash :: Lens' GlacierJobDescription (Maybe Text)
+gjdArchiveSHA256TreeHash =
+    lens _gjdArchiveSHA256TreeHash
+        (\s a -> s { _gjdArchiveSHA256TreeHash = a })
+
+-- | For an ArchiveRetrieval job, this is the size in bytes of the archive being
+-- requested for download. For the InventoryRetrieval job, the value is null.
+gjdArchiveSizeInBytes :: Lens' GlacierJobDescription (Maybe Integer)
+gjdArchiveSizeInBytes =
+    lens _gjdArchiveSizeInBytes (\s a -> s { _gjdArchiveSizeInBytes = a })
+
+-- | The job status. When a job is completed, you get the job's output.
+gjdCompleted :: Lens' GlacierJobDescription (Maybe Bool)
+gjdCompleted = lens _gjdCompleted (\s a -> s { _gjdCompleted = a })
+
+-- | The UTC time that the archive retrieval request completed. While the job is
+-- in progress, the value will be null.
+gjdCompletionDate :: Lens' GlacierJobDescription (Maybe Text)
+gjdCompletionDate =
+    lens _gjdCompletionDate (\s a -> s { _gjdCompletionDate = a })
+
+-- | The UTC date when the job was created. A string representation of ISO 8601
+-- date format, for example, "2012-03-20T17:03:43.221Z".
+gjdCreationDate :: Lens' GlacierJobDescription (Maybe Text)
+gjdCreationDate = lens _gjdCreationDate (\s a -> s { _gjdCreationDate = a })
+
+-- | Parameters used for range inventory retrieval.
+gjdInventoryRetrievalParameters :: Lens' GlacierJobDescription (Maybe InventoryRetrievalJobDescription)
+gjdInventoryRetrievalParameters =
+    lens _gjdInventoryRetrievalParameters
+        (\s a -> s { _gjdInventoryRetrievalParameters = a })
+
+-- | For an InventoryRetrieval job, this is the size in bytes of the inventory
+-- requested for download. For the ArchiveRetrieval job, the value is null.
+gjdInventorySizeInBytes :: Lens' GlacierJobDescription (Maybe Integer)
+gjdInventorySizeInBytes =
+    lens _gjdInventorySizeInBytes (\s a -> s { _gjdInventorySizeInBytes = a })
+
+-- | The job description you provided when you initiated the job.
+gjdJobDescription :: Lens' GlacierJobDescription (Maybe Text)
+gjdJobDescription =
+    lens _gjdJobDescription (\s a -> s { _gjdJobDescription = a })
+
+-- | An opaque string that identifies an Amazon Glacier job.
+gjdJobId :: Lens' GlacierJobDescription (Maybe Text)
+gjdJobId = lens _gjdJobId (\s a -> s { _gjdJobId = a })
+
+-- | The retrieved byte range for archive retrieval jobs in the form "/StartByteValue/-/EndByteValue/" If no range was specified in the archive retrieval, then the
+-- whole archive is retrieved and /StartByteValue/ equals 0 and /EndByteValue/
+-- equals the size of the archive minus 1. For inventory retrieval jobs this
+-- field is null.
+gjdRetrievalByteRange :: Lens' GlacierJobDescription (Maybe Text)
+gjdRetrievalByteRange =
+    lens _gjdRetrievalByteRange (\s a -> s { _gjdRetrievalByteRange = a })
+
+-- | For an ArchiveRetrieval job, it is the checksum of the archive. Otherwise,
+-- the value is null.
+--
+-- The SHA256 tree hash value for the requested range of an archive. If the
+-- Initiate a Job request for an archive specified a tree-hash aligned range,
+-- then this field returns a value.
+--
+-- For the specific case when the whole archive is retrieved, this value is
+-- the same as the ArchiveSHA256TreeHash value.
+--
+-- This field is null in the following situations:  Archive retrieval jobs
+-- that specify a range that is not tree-hash aligned.
+--
+-- Archival jobs that specify a range that is equal to the whole archive and
+-- the job status is InProgress.
+--
+-- Inventory jobs.
+--
+--
+gjdSHA256TreeHash :: Lens' GlacierJobDescription (Maybe Text)
+gjdSHA256TreeHash =
+    lens _gjdSHA256TreeHash (\s a -> s { _gjdSHA256TreeHash = a })
+
+-- | An Amazon Simple Notification Service (Amazon SNS) topic that receives
+-- notification.
+gjdSNSTopic :: Lens' GlacierJobDescription (Maybe Text)
+gjdSNSTopic = lens _gjdSNSTopic (\s a -> s { _gjdSNSTopic = a })
+
+-- | The status code can be InProgress, Succeeded, or Failed, and indicates the
+-- status of the job.
+gjdStatusCode :: Lens' GlacierJobDescription (Maybe StatusCode)
+gjdStatusCode = lens _gjdStatusCode (\s a -> s { _gjdStatusCode = a })
+
+-- | A friendly message that describes the job status.
+gjdStatusMessage :: Lens' GlacierJobDescription (Maybe Text)
+gjdStatusMessage = lens _gjdStatusMessage (\s a -> s { _gjdStatusMessage = a })
+
+-- | The Amazon Resource Name (ARN) of the vault from which the archive retrieval
+-- was requested.
+gjdVaultARN :: Lens' GlacierJobDescription (Maybe Text)
+gjdVaultARN = lens _gjdVaultARN (\s a -> s { _gjdVaultARN = a })
+
+instance FromJSON GlacierJobDescription where
+    parseJSON = withObject "GlacierJobDescription" $ \o -> GlacierJobDescription
+        <$> o .:? "Action"
+        <*> o .:? "ArchiveId"
+        <*> o .:? "ArchiveSHA256TreeHash"
+        <*> o .:? "ArchiveSizeInBytes"
+        <*> o .:? "Completed"
+        <*> o .:? "CompletionDate"
+        <*> o .:? "CreationDate"
+        <*> o .:? "InventoryRetrievalParameters"
+        <*> o .:? "InventorySizeInBytes"
+        <*> o .:? "JobDescription"
+        <*> o .:? "JobId"
+        <*> o .:? "RetrievalByteRange"
+        <*> o .:? "SHA256TreeHash"
+        <*> o .:? "SNSTopic"
+        <*> o .:? "StatusCode"
+        <*> o .:? "StatusMessage"
+        <*> o .:? "VaultARN"
+
+instance ToJSON GlacierJobDescription where
+    toJSON GlacierJobDescription{..} = object
+        [ "JobId"                        .= _gjdJobId
+        , "JobDescription"               .= _gjdJobDescription
+        , "Action"                       .= _gjdAction
+        , "ArchiveId"                    .= _gjdArchiveId
+        , "VaultARN"                     .= _gjdVaultARN
+        , "CreationDate"                 .= _gjdCreationDate
+        , "Completed"                    .= _gjdCompleted
+        , "StatusCode"                   .= _gjdStatusCode
+        , "StatusMessage"                .= _gjdStatusMessage
+        , "ArchiveSizeInBytes"           .= _gjdArchiveSizeInBytes
+        , "InventorySizeInBytes"         .= _gjdInventorySizeInBytes
+        , "SNSTopic"                     .= _gjdSNSTopic
+        , "CompletionDate"               .= _gjdCompletionDate
+        , "SHA256TreeHash"               .= _gjdSHA256TreeHash
+        , "ArchiveSHA256TreeHash"        .= _gjdArchiveSHA256TreeHash
+        , "RetrievalByteRange"           .= _gjdRetrievalByteRange
+        , "InventoryRetrievalParameters" .= _gjdInventoryRetrievalParameters
+        ]
+
+data StatusCode
+    = Failed     -- ^ Failed
+    | InProgress -- ^ InProgress
+    | Succeeded  -- ^ Succeeded
+      deriving (Eq, Ord, Read, Show, Generic, Enum)
+
+instance Hashable StatusCode
+
+instance FromText StatusCode where
+    parser = takeLowerText >>= \case
+        "failed"     -> pure Failed
+        "inprogress" -> pure InProgress
+        "succeeded"  -> pure Succeeded
+        e            -> fail $
+            "Failure parsing StatusCode from " ++ show e
+
+instance ToText StatusCode where
+    toText = \case
+        Failed     -> "Failed"
+        InProgress -> "InProgress"
+        Succeeded  -> "Succeeded"
+
+instance ToByteString StatusCode
+instance ToHeader     StatusCode
+instance ToQuery      StatusCode
+
+instance FromJSON StatusCode where
+    parseJSON = parseJSONText "StatusCode"
+
+instance ToJSON StatusCode where
+    toJSON = toJSONText
diff --git a/gen/Network/AWS/Glacier/UploadArchive.hs b/gen/Network/AWS/Glacier/UploadArchive.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/UploadArchive.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.UploadArchive
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation adds an archive to a vault. This is a synchronous operation,
+-- and for a successful upload, your data is durably persisted. Amazon Glacier
+-- returns the archive ID in the 'x-amz-archive-id' header of the response.
+--
+-- You must use the archive ID to access your data in Amazon Glacier. After you
+-- upload an archive, you should save the archive ID returned so that you can
+-- retrieve or delete the archive later. Besides saving the archive ID, you can
+-- also index it and give it a friendly name to allow for better searching. You
+-- can also use the optional archive description field to specify how the
+-- archive is referred to in an external index of archives, such as you might
+-- create in Amazon DynamoDB. You can also get the vault inventory to obtain a
+-- list of archive IDs in a vault. For more information, see 'InitiateJob'.
+--
+-- You must provide a SHA256 tree hash of the data you are uploading. For
+-- information about computing a SHA256 tree hash, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html Computing Checksums>.
+--
+-- You can optionally specify an archive description of up to 1,024 printable
+-- ASCII characters. You can get the archive description when you either
+-- retrieve the archive or get the vault inventory. For more information, see 'InitiateJob'. Amazon Glacier does not interpret the description in any way. An archive
+-- description does not need to be unique. You cannot use the description to
+-- retrieve or sort the archive list.
+--
+-- Archives are immutable. After you upload an archive, you cannot edit the
+-- archive or its description.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-an-archive.html Uploading anArchive in Amazon Glacier> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-post.html Upload Archive> in the /Amazon Glacier DeveloperGuide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-UploadArchive.html>
+module Network.AWS.Glacier.UploadArchive
+    (
+    -- * Request
+      UploadArchive
+    -- ** Request constructor
+    , uploadArchive
+    -- ** Request lenses
+    , uaAccountId
+    , uaArchiveDescription
+    , uaBody
+    , uaChecksum
+    , uaVaultName
+
+    -- * Response
+    , UploadArchiveResponse
+    -- ** Response constructor
+    , uploadArchiveResponse
+    -- ** Response lenses
+    , uarArchiveId
+    , uarChecksum
+    , uarLocation
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data UploadArchive = UploadArchive
+    { _uaAccountId          :: Text
+    , _uaArchiveDescription :: Maybe Text
+    , _uaBody               :: RqBody
+    , _uaChecksum           :: Maybe Text
+    , _uaVaultName          :: Text
+    } deriving (Show)
+
+-- | 'UploadArchive' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'uaAccountId' @::@ 'Text'
+--
+-- * 'uaArchiveDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'uaBody' @::@ 'RqBody'
+--
+-- * 'uaChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'uaVaultName' @::@ 'Text'
+--
+uploadArchive :: Text -- ^ 'uaVaultName'
+              -> Text -- ^ 'uaAccountId'
+              -> RqBody -- ^ 'uaBody'
+              -> UploadArchive
+uploadArchive p1 p2 p3 = UploadArchive
+    { _uaVaultName          = p1
+    , _uaAccountId          = p2
+    , _uaBody               = p3
+    , _uaArchiveDescription = Nothing
+    , _uaChecksum           = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+uaAccountId :: Lens' UploadArchive Text
+uaAccountId = lens _uaAccountId (\s a -> s { _uaAccountId = a })
+
+-- | The optional description of the archive you are uploading.
+uaArchiveDescription :: Lens' UploadArchive (Maybe Text)
+uaArchiveDescription =
+    lens _uaArchiveDescription (\s a -> s { _uaArchiveDescription = a })
+
+-- | The data to upload.
+uaBody :: Lens' UploadArchive RqBody
+uaBody = lens _uaBody (\s a -> s { _uaBody = a })
+
+-- | The SHA256 checksum (a linear hash) of the payload.
+uaChecksum :: Lens' UploadArchive (Maybe Text)
+uaChecksum = lens _uaChecksum (\s a -> s { _uaChecksum = a })
+
+-- | The name of the vault.
+uaVaultName :: Lens' UploadArchive Text
+uaVaultName = lens _uaVaultName (\s a -> s { _uaVaultName = a })
+
+data UploadArchiveResponse = UploadArchiveResponse
+    { _uarArchiveId :: Maybe Text
+    , _uarChecksum  :: Maybe Text
+    , _uarLocation  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'UploadArchiveResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'uarArchiveId' @::@ 'Maybe' 'Text'
+--
+-- * 'uarChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'uarLocation' @::@ 'Maybe' 'Text'
+--
+uploadArchiveResponse :: UploadArchiveResponse
+uploadArchiveResponse = UploadArchiveResponse
+    { _uarLocation  = Nothing
+    , _uarChecksum  = Nothing
+    , _uarArchiveId = Nothing
+    }
+
+-- | The ID of the archive. This value is also included as part of the location.
+uarArchiveId :: Lens' UploadArchiveResponse (Maybe Text)
+uarArchiveId = lens _uarArchiveId (\s a -> s { _uarArchiveId = a })
+
+-- | The checksum of the archive computed by Amazon Glacier.
+uarChecksum :: Lens' UploadArchiveResponse (Maybe Text)
+uarChecksum = lens _uarChecksum (\s a -> s { _uarChecksum = a })
+
+-- | The relative URI path of the newly added archive resource.
+uarLocation :: Lens' UploadArchiveResponse (Maybe Text)
+uarLocation = lens _uarLocation (\s a -> s { _uarLocation = a })
+
+instance ToPath UploadArchive where
+    toPath UploadArchive{..} = mconcat
+        [ "/"
+        , toText _uaAccountId
+        , "/vaults/"
+        , toText _uaVaultName
+        , "/archives"
+        ]
+
+instance ToQuery UploadArchive where
+    toQuery = const mempty
+
+instance ToHeaders UploadArchive where
+    toHeaders UploadArchive{..} = mconcat
+        [ "x-amz-archive-description" =: _uaArchiveDescription
+        , "x-amz-sha256-tree-hash"    =: _uaChecksum
+        ]
+
+instance ToBody UploadArchive where
+    toBody = toBody . _uaBody
+
+instance AWSRequest UploadArchive where
+    type Sv UploadArchive = Glacier
+    type Rs UploadArchive = UploadArchiveResponse
+
+    request  = stream POST
+    response = headerResponse $ \h -> UploadArchiveResponse
+        <$> h ~:? "x-amz-archive-id"
+        <*> h ~:? "x-amz-sha256-tree-hash"
+        <*> h ~:? "Location"
diff --git a/gen/Network/AWS/Glacier/UploadMultipartPart.hs b/gen/Network/AWS/Glacier/UploadMultipartPart.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Glacier/UploadMultipartPart.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Glacier.UploadMultipartPart
+-- 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)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This operation uploads a part of an archive. You can upload archive parts in
+-- any order. You can also upload them in parallel. You can upload up to 10,000
+-- parts for a multipart upload.
+--
+-- Amazon Glacier rejects your upload part request if any of the following
+-- conditions is true:
+--
+-- SHA256 tree hash does not matchTo ensure that part data is not corrupted
+-- in transmission, you compute a SHA256 tree hash of the part and include it in
+-- your request. Upon receiving the part data, Amazon Glacier also computes a
+-- SHA256 tree hash. If these hash values don't match, the operation fails. For
+-- information about computing a SHA256 tree hash, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html Computing Checksums>.
+--
+-- Part size does not matchThe size of each part except the last must match
+-- the size specified in the corresponding 'InitiateMultipartUpload' request. The
+-- size of the last part must be the same size as, or smaller than, the
+-- specified size.
+--
+-- If you upload a part whose size is smaller than the part size you specified
+-- in your initiate multipart upload request and that part is not the last part,
+-- then the upload part request will succeed. However, the subsequent Complete
+-- Multipart Upload request will fail.
+--
+-- Range does not alignThe byte range value in the request does not align
+-- with the part size specified in the corresponding initiate request. For
+-- example, if you specify a part size of 4194304 bytes (4 MB), then 0 to
+-- 4194303 bytes (4 MB - 1) and 4194304 (4 MB) to 8388607 (8 MB - 1) are valid
+-- part ranges. However, if you set a range value of 2 MB to 6 MB, the range
+-- does not align with the part size and the upload will fail.   This operation
+-- is idempotent. If you upload the same part multiple times, the data included
+-- in the most recent request overwrites the previously uploaded data.
+--
+-- An AWS account has full permission to perform all operations (actions).
+-- However, AWS Identity and Access Management (IAM) users don't have any
+-- permissions by default. You must grant them explicit permission to perform
+-- specific actions. For more information, see <http://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html Access Control Using AWS Identityand Access Management (IAM)>.
+--
+-- For conceptual information and underlying REST API, go to <http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html Uploading LargeArchives in Parts (Multipart Upload)> and <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-upload-part.html Upload Part > in the /Amazon GlacierDeveloper Guide/.
+--
+-- <http://docs.aws.amazon.com/amazonglacier/latest/dev/api-UploadMultipartPart.html>
+module Network.AWS.Glacier.UploadMultipartPart
+    (
+    -- * Request
+      UploadMultipartPart
+    -- ** Request constructor
+    , uploadMultipartPart
+    -- ** Request lenses
+    , umpAccountId
+    , umpBody
+    , umpChecksum
+    , umpRange
+    , umpUploadId
+    , umpVaultName
+
+    -- * Response
+    , UploadMultipartPartResponse
+    -- ** Response constructor
+    , uploadMultipartPartResponse
+    -- ** Response lenses
+    , umprChecksum
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.RestJSON
+import Network.AWS.Glacier.Types
+import qualified GHC.Exts
+
+data UploadMultipartPart = UploadMultipartPart
+    { _umpAccountId :: Text
+    , _umpBody      :: RqBody
+    , _umpChecksum  :: Maybe Text
+    , _umpRange     :: Maybe Text
+    , _umpUploadId  :: Text
+    , _umpVaultName :: Text
+    } deriving (Show)
+
+-- | 'UploadMultipartPart' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'umpAccountId' @::@ 'Text'
+--
+-- * 'umpBody' @::@ 'RqBody'
+--
+-- * 'umpChecksum' @::@ 'Maybe' 'Text'
+--
+-- * 'umpRange' @::@ 'Maybe' 'Text'
+--
+-- * 'umpUploadId' @::@ 'Text'
+--
+-- * 'umpVaultName' @::@ 'Text'
+--
+uploadMultipartPart :: Text -- ^ 'umpAccountId'
+                    -> Text -- ^ 'umpVaultName'
+                    -> Text -- ^ 'umpUploadId'
+                    -> RqBody -- ^ 'umpBody'
+                    -> UploadMultipartPart
+uploadMultipartPart p1 p2 p3 p4 = UploadMultipartPart
+    { _umpAccountId = p1
+    , _umpVaultName = p2
+    , _umpUploadId  = p3
+    , _umpBody      = p4
+    , _umpChecksum  = Nothing
+    , _umpRange     = Nothing
+    }
+
+-- | The 'AccountId' is the AWS Account ID. You can specify either the AWS Account
+-- ID or optionally a '-', in which case Amazon Glacier uses the AWS Account ID
+-- associated with the credentials used to sign the request. If you specify your
+-- Account ID, do not include hyphens in it.
+umpAccountId :: Lens' UploadMultipartPart Text
+umpAccountId = lens _umpAccountId (\s a -> s { _umpAccountId = a })
+
+-- | The data to upload.
+umpBody :: Lens' UploadMultipartPart RqBody
+umpBody = lens _umpBody (\s a -> s { _umpBody = a })
+
+-- | The SHA256 tree hash of the data being uploaded.
+umpChecksum :: Lens' UploadMultipartPart (Maybe Text)
+umpChecksum = lens _umpChecksum (\s a -> s { _umpChecksum = a })
+
+-- | Identifies the range of bytes in the assembled archive that will be uploaded
+-- in this part. Amazon Glacier uses this information to assemble the archive in
+-- the proper sequence. The format of this header follows RFC 2616. An example
+-- header is Content-Range:bytes 0-4194303/*.
+umpRange :: Lens' UploadMultipartPart (Maybe Text)
+umpRange = lens _umpRange (\s a -> s { _umpRange = a })
+
+-- | The upload ID of the multipart upload.
+umpUploadId :: Lens' UploadMultipartPart Text
+umpUploadId = lens _umpUploadId (\s a -> s { _umpUploadId = a })
+
+-- | The name of the vault.
+umpVaultName :: Lens' UploadMultipartPart Text
+umpVaultName = lens _umpVaultName (\s a -> s { _umpVaultName = a })
+
+newtype UploadMultipartPartResponse = UploadMultipartPartResponse
+    { _umprChecksum :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'UploadMultipartPartResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'umprChecksum' @::@ 'Maybe' 'Text'
+--
+uploadMultipartPartResponse :: UploadMultipartPartResponse
+uploadMultipartPartResponse = UploadMultipartPartResponse
+    { _umprChecksum = Nothing
+    }
+
+-- | The SHA256 tree hash that Amazon Glacier computed for the uploaded part.
+umprChecksum :: Lens' UploadMultipartPartResponse (Maybe Text)
+umprChecksum = lens _umprChecksum (\s a -> s { _umprChecksum = a })
+
+instance ToPath UploadMultipartPart where
+    toPath UploadMultipartPart{..} = mconcat
+        [ "/"
+        , toText _umpAccountId
+        , "/vaults/"
+        , toText _umpVaultName
+        , "/multipart-uploads/"
+        , toText _umpUploadId
+        ]
+
+instance ToQuery UploadMultipartPart where
+    toQuery = const mempty
+
+instance ToHeaders UploadMultipartPart where
+    toHeaders UploadMultipartPart{..} = mconcat
+        [ "x-amz-sha256-tree-hash" =: _umpChecksum
+        , "Content-Range"          =: _umpRange
+        ]
+
+instance ToBody UploadMultipartPart where
+    toBody = toBody . _umpBody
+
+instance AWSRequest UploadMultipartPart where
+    type Sv UploadMultipartPart = Glacier
+    type Rs UploadMultipartPart = UploadMultipartPartResponse
+
+    request  = stream PUT
+    response = headerResponse $ \h -> UploadMultipartPartResponse
+        <$> h ~:? "x-amz-sha256-tree-hash"
