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,26 @@
+# Amazon Storage Gateway 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
+
+AWS Storage Gateway is a service that connects an on-premises software appliance with cloud-based storage to provide seamless and secure integration between your on-premises IT environment and AWS's storage infrastructure.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-storagegateway)
+and [AWS API Reference](http://docs.aws.amazon.com/storagegateway/latest/APIReference/Welcome.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-storagegateway` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/amazonka-storagegateway.cabal b/amazonka-storagegateway.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-storagegateway.cabal
@@ -0,0 +1,91 @@
+name:                  amazonka-storagegateway
+version:               0.0.0
+synopsis:              Amazon Storage Gateway SDK.
+homepage:              https://github.com/brendanhay/amazonka
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2014 Brendan Hay
+category:              Network, AWS, Cloud
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    AWS Storage Gateway is a service that connects an on-premises software
+    appliance with cloud-based storage to provide seamless and secure
+    integration between your on-premises IT environment and AWS's storage
+    infrastructure.
+    .
+    /See:/ <http://docs.aws.amazon.com/storagegateway/latest/APIReference/Welcome.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.StorageGateway
+        , Network.AWS.StorageGateway.ActivateGateway
+        , Network.AWS.StorageGateway.AddCache
+        , Network.AWS.StorageGateway.AddUploadBuffer
+        , Network.AWS.StorageGateway.AddWorkingStorage
+        , Network.AWS.StorageGateway.CancelArchival
+        , Network.AWS.StorageGateway.CancelRetrieval
+        , Network.AWS.StorageGateway.CreateCachediSCSIVolume
+        , Network.AWS.StorageGateway.CreateSnapshot
+        , Network.AWS.StorageGateway.CreateSnapshotFromVolumeRecoveryPoint
+        , Network.AWS.StorageGateway.CreateStorediSCSIVolume
+        , Network.AWS.StorageGateway.CreateTapes
+        , Network.AWS.StorageGateway.DeleteBandwidthRateLimit
+        , Network.AWS.StorageGateway.DeleteChapCredentials
+        , Network.AWS.StorageGateway.DeleteGateway
+        , Network.AWS.StorageGateway.DeleteSnapshotSchedule
+        , Network.AWS.StorageGateway.DeleteTape
+        , Network.AWS.StorageGateway.DeleteTapeArchive
+        , Network.AWS.StorageGateway.DeleteVolume
+        , Network.AWS.StorageGateway.DescribeBandwidthRateLimit
+        , Network.AWS.StorageGateway.DescribeCache
+        , Network.AWS.StorageGateway.DescribeCachediSCSIVolumes
+        , Network.AWS.StorageGateway.DescribeChapCredentials
+        , Network.AWS.StorageGateway.DescribeGatewayInformation
+        , Network.AWS.StorageGateway.DescribeMaintenanceStartTime
+        , Network.AWS.StorageGateway.DescribeSnapshotSchedule
+        , Network.AWS.StorageGateway.DescribeStorediSCSIVolumes
+        , Network.AWS.StorageGateway.DescribeTapeArchives
+        , Network.AWS.StorageGateway.DescribeTapeRecoveryPoints
+        , Network.AWS.StorageGateway.DescribeTapes
+        , Network.AWS.StorageGateway.DescribeUploadBuffer
+        , Network.AWS.StorageGateway.DescribeVTLDevices
+        , Network.AWS.StorageGateway.DescribeWorkingStorage
+        , Network.AWS.StorageGateway.DisableGateway
+        , Network.AWS.StorageGateway.ListGateways
+        , Network.AWS.StorageGateway.ListLocalDisks
+        , Network.AWS.StorageGateway.ListVolumeRecoveryPoints
+        , Network.AWS.StorageGateway.ListVolumes
+        , Network.AWS.StorageGateway.RetrieveTapeArchive
+        , Network.AWS.StorageGateway.RetrieveTapeRecoveryPoint
+        , Network.AWS.StorageGateway.ShutdownGateway
+        , Network.AWS.StorageGateway.StartGateway
+        , Network.AWS.StorageGateway.Types
+        , Network.AWS.StorageGateway.UpdateBandwidthRateLimit
+        , Network.AWS.StorageGateway.UpdateChapCredentials
+        , Network.AWS.StorageGateway.UpdateGatewayInformation
+        , Network.AWS.StorageGateway.UpdateGatewaySoftwareNow
+        , Network.AWS.StorageGateway.UpdateMaintenanceStartTime
+        , Network.AWS.StorageGateway.UpdateSnapshotSchedule
+
+    other-modules:
+
+    build-depends:
+          amazonka-core
+        , base          >= 4.7 && < 5
diff --git a/gen/Network/AWS/StorageGateway.hs b/gen/Network/AWS/StorageGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway.hs
@@ -0,0 +1,113 @@
+-- Module      : Network.AWS.StorageGateway
+-- 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)
+
+-- | AWS Storage Gateway is a service that connects an on-premises software
+-- appliance with cloud-based storage to provide seamless and secure
+-- integration between your on-premises IT environment and AWS's storage
+-- infrastructure.
+module Network.AWS.StorageGateway
+    ( module Network.AWS.StorageGateway.ActivateGateway
+    , module Network.AWS.StorageGateway.AddCache
+    , module Network.AWS.StorageGateway.AddUploadBuffer
+    , module Network.AWS.StorageGateway.AddWorkingStorage
+    , module Network.AWS.StorageGateway.CancelArchival
+    , module Network.AWS.StorageGateway.CancelRetrieval
+    , module Network.AWS.StorageGateway.CreateCachediSCSIVolume
+    , module Network.AWS.StorageGateway.CreateSnapshot
+    , module Network.AWS.StorageGateway.CreateSnapshotFromVolumeRecoveryPoint
+    , module Network.AWS.StorageGateway.CreateStorediSCSIVolume
+    , module Network.AWS.StorageGateway.CreateTapes
+    , module Network.AWS.StorageGateway.DeleteBandwidthRateLimit
+    , module Network.AWS.StorageGateway.DeleteChapCredentials
+    , module Network.AWS.StorageGateway.DeleteGateway
+    , module Network.AWS.StorageGateway.DeleteSnapshotSchedule
+    , module Network.AWS.StorageGateway.DeleteTape
+    , module Network.AWS.StorageGateway.DeleteTapeArchive
+    , module Network.AWS.StorageGateway.DeleteVolume
+    , module Network.AWS.StorageGateway.DescribeBandwidthRateLimit
+    , module Network.AWS.StorageGateway.DescribeCache
+    , module Network.AWS.StorageGateway.DescribeCachediSCSIVolumes
+    , module Network.AWS.StorageGateway.DescribeChapCredentials
+    , module Network.AWS.StorageGateway.DescribeGatewayInformation
+    , module Network.AWS.StorageGateway.DescribeMaintenanceStartTime
+    , module Network.AWS.StorageGateway.DescribeSnapshotSchedule
+    , module Network.AWS.StorageGateway.DescribeStorediSCSIVolumes
+    , module Network.AWS.StorageGateway.DescribeTapeArchives
+    , module Network.AWS.StorageGateway.DescribeTapeRecoveryPoints
+    , module Network.AWS.StorageGateway.DescribeTapes
+    , module Network.AWS.StorageGateway.DescribeUploadBuffer
+    , module Network.AWS.StorageGateway.DescribeVTLDevices
+    , module Network.AWS.StorageGateway.DescribeWorkingStorage
+    , module Network.AWS.StorageGateway.DisableGateway
+    , module Network.AWS.StorageGateway.ListGateways
+    , module Network.AWS.StorageGateway.ListLocalDisks
+    , module Network.AWS.StorageGateway.ListVolumeRecoveryPoints
+    , module Network.AWS.StorageGateway.ListVolumes
+    , module Network.AWS.StorageGateway.RetrieveTapeArchive
+    , module Network.AWS.StorageGateway.RetrieveTapeRecoveryPoint
+    , module Network.AWS.StorageGateway.ShutdownGateway
+    , module Network.AWS.StorageGateway.StartGateway
+    , module Network.AWS.StorageGateway.Types
+    , module Network.AWS.StorageGateway.UpdateBandwidthRateLimit
+    , module Network.AWS.StorageGateway.UpdateChapCredentials
+    , module Network.AWS.StorageGateway.UpdateGatewayInformation
+    , module Network.AWS.StorageGateway.UpdateGatewaySoftwareNow
+    , module Network.AWS.StorageGateway.UpdateMaintenanceStartTime
+    , module Network.AWS.StorageGateway.UpdateSnapshotSchedule
+    ) where
+
+import Network.AWS.StorageGateway.ActivateGateway
+import Network.AWS.StorageGateway.AddCache
+import Network.AWS.StorageGateway.AddUploadBuffer
+import Network.AWS.StorageGateway.AddWorkingStorage
+import Network.AWS.StorageGateway.CancelArchival
+import Network.AWS.StorageGateway.CancelRetrieval
+import Network.AWS.StorageGateway.CreateCachediSCSIVolume
+import Network.AWS.StorageGateway.CreateSnapshot
+import Network.AWS.StorageGateway.CreateSnapshotFromVolumeRecoveryPoint
+import Network.AWS.StorageGateway.CreateStorediSCSIVolume
+import Network.AWS.StorageGateway.CreateTapes
+import Network.AWS.StorageGateway.DeleteBandwidthRateLimit
+import Network.AWS.StorageGateway.DeleteChapCredentials
+import Network.AWS.StorageGateway.DeleteGateway
+import Network.AWS.StorageGateway.DeleteSnapshotSchedule
+import Network.AWS.StorageGateway.DeleteTape
+import Network.AWS.StorageGateway.DeleteTapeArchive
+import Network.AWS.StorageGateway.DeleteVolume
+import Network.AWS.StorageGateway.DescribeBandwidthRateLimit
+import Network.AWS.StorageGateway.DescribeCache
+import Network.AWS.StorageGateway.DescribeCachediSCSIVolumes
+import Network.AWS.StorageGateway.DescribeChapCredentials
+import Network.AWS.StorageGateway.DescribeGatewayInformation
+import Network.AWS.StorageGateway.DescribeMaintenanceStartTime
+import Network.AWS.StorageGateway.DescribeSnapshotSchedule
+import Network.AWS.StorageGateway.DescribeStorediSCSIVolumes
+import Network.AWS.StorageGateway.DescribeTapeArchives
+import Network.AWS.StorageGateway.DescribeTapeRecoveryPoints
+import Network.AWS.StorageGateway.DescribeTapes
+import Network.AWS.StorageGateway.DescribeUploadBuffer
+import Network.AWS.StorageGateway.DescribeVTLDevices
+import Network.AWS.StorageGateway.DescribeWorkingStorage
+import Network.AWS.StorageGateway.DisableGateway
+import Network.AWS.StorageGateway.ListGateways
+import Network.AWS.StorageGateway.ListLocalDisks
+import Network.AWS.StorageGateway.ListVolumeRecoveryPoints
+import Network.AWS.StorageGateway.ListVolumes
+import Network.AWS.StorageGateway.RetrieveTapeArchive
+import Network.AWS.StorageGateway.RetrieveTapeRecoveryPoint
+import Network.AWS.StorageGateway.ShutdownGateway
+import Network.AWS.StorageGateway.StartGateway
+import Network.AWS.StorageGateway.Types
+import Network.AWS.StorageGateway.UpdateBandwidthRateLimit
+import Network.AWS.StorageGateway.UpdateChapCredentials
+import Network.AWS.StorageGateway.UpdateGatewayInformation
+import Network.AWS.StorageGateway.UpdateGatewaySoftwareNow
+import Network.AWS.StorageGateway.UpdateMaintenanceStartTime
+import Network.AWS.StorageGateway.UpdateSnapshotSchedule
diff --git a/gen/Network/AWS/StorageGateway/ActivateGateway.hs b/gen/Network/AWS/StorageGateway/ActivateGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ActivateGateway.hs
@@ -0,0 +1,197 @@
+{-# 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.StorageGateway.ActivateGateway
+-- 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)
+
+-- | This operation activates the gateway you previously deployed on your host.
+-- For more information, see Activate the AWS Storage Gateway. In the
+-- activation process, you specify information such as the region you want to
+-- use for storing snapshots, the time zone for scheduled snapshots the
+-- gateway snapshot schedule window, an activation key, and a name for your
+-- gateway. The activation process also associates your gateway with your
+-- account; for more information, see UpdateGatewayInformation.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ActivateGateway.html>
+module Network.AWS.StorageGateway.ActivateGateway
+    (
+    -- * Request
+      ActivateGateway
+    -- ** Request constructor
+    , activateGateway
+    -- ** Request lenses
+    , agActivationKey
+    , agGatewayName
+    , agGatewayRegion
+    , agGatewayTimezone
+    , agGatewayType
+    , agMediumChangerType
+    , agTapeDriveType
+
+    -- * Response
+    , ActivateGatewayResponse
+    -- ** Response constructor
+    , activateGatewayResponse
+    -- ** Response lenses
+    , agrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data ActivateGateway = ActivateGateway
+    { _agActivationKey     :: Text
+    , _agGatewayName       :: Text
+    , _agGatewayRegion     :: Text
+    , _agGatewayTimezone   :: Text
+    , _agGatewayType       :: Maybe Text
+    , _agMediumChangerType :: Maybe Text
+    , _agTapeDriveType     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ActivateGateway' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'agActivationKey' @::@ 'Text'
+--
+-- * 'agGatewayName' @::@ 'Text'
+--
+-- * 'agGatewayRegion' @::@ 'Text'
+--
+-- * 'agGatewayTimezone' @::@ 'Text'
+--
+-- * 'agGatewayType' @::@ 'Maybe' 'Text'
+--
+-- * 'agMediumChangerType' @::@ 'Maybe' 'Text'
+--
+-- * 'agTapeDriveType' @::@ 'Maybe' 'Text'
+--
+activateGateway :: Text -- ^ 'agActivationKey'
+                -> Text -- ^ 'agGatewayName'
+                -> Text -- ^ 'agGatewayTimezone'
+                -> Text -- ^ 'agGatewayRegion'
+                -> ActivateGateway
+activateGateway p1 p2 p3 p4 = ActivateGateway
+    { _agActivationKey     = p1
+    , _agGatewayName       = p2
+    , _agGatewayTimezone   = p3
+    , _agGatewayRegion     = p4
+    , _agGatewayType       = Nothing
+    , _agTapeDriveType     = Nothing
+    , _agMediumChangerType = Nothing
+    }
+
+-- | Your gateway activation key. You can obtain the activation key by sending
+-- an HTTP GET request with redirects enabled to the gateway IP address
+-- (port 80). The redirect URL returned in the response provides you the
+-- activation key for your gateway in the query string parameter
+-- activationKey. It may also include other activation-related parameters,
+-- however, these are merely defaults -- the arguments you pass to the
+-- ActivateGateway API call determine the actual configuration of your
+-- gateway.
+agActivationKey :: Lens' ActivateGateway Text
+agActivationKey = lens _agActivationKey (\s a -> s { _agActivationKey = a })
+
+agGatewayName :: Lens' ActivateGateway Text
+agGatewayName = lens _agGatewayName (\s a -> s { _agGatewayName = a })
+
+-- | One of the values that indicates the region where you want to store the
+-- snapshot backups. The gateway region specified must be the same region as
+-- the region in your Host header in the request. For more information about
+-- available regions and endpoints for AWS Storage Gateway, see Regions and
+-- Endpoints in the Amazon Web Services Glossary. Valid Values: "us-east-1",
+-- "us-west-1", "us-west-2", "eu-west-1", "eu-central-1", "ap-northeast-1",
+-- "ap-southeast-1", "ap-southeast-2", "sa-east-1".
+agGatewayRegion :: Lens' ActivateGateway Text
+agGatewayRegion = lens _agGatewayRegion (\s a -> s { _agGatewayRegion = a })
+
+-- | One of the values that indicates the time zone you want to set for the
+-- gateway. The time zone is used, for example, for scheduling snapshots and
+-- your gateway's maintenance schedule.
+agGatewayTimezone :: Lens' ActivateGateway Text
+agGatewayTimezone =
+    lens _agGatewayTimezone (\s a -> s { _agGatewayTimezone = a })
+
+-- | One of the values that defines the type of gateway to activate. The type
+-- specified is critical to all later functions of the gateway and cannot be
+-- changed after activation. The default value is STORED.
+agGatewayType :: Lens' ActivateGateway (Maybe Text)
+agGatewayType = lens _agGatewayType (\s a -> s { _agGatewayType = a })
+
+-- | The value that indicates the type of medium changer to use for
+-- gateway-VTL. This field is optional. Valid Values: "STK-L700".
+agMediumChangerType :: Lens' ActivateGateway (Maybe Text)
+agMediumChangerType =
+    lens _agMediumChangerType (\s a -> s { _agMediumChangerType = a })
+
+-- | The value that indicates the type of tape drive to use for gateway-VTL.
+-- This field is optional. Valid Values: "IBM-ULT3580-TD5".
+agTapeDriveType :: Lens' ActivateGateway (Maybe Text)
+agTapeDriveType = lens _agTapeDriveType (\s a -> s { _agTapeDriveType = a })
+
+newtype ActivateGatewayResponse = ActivateGatewayResponse
+    { _agrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'ActivateGatewayResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'agrGatewayARN' @::@ 'Maybe' 'Text'
+--
+activateGatewayResponse :: ActivateGatewayResponse
+activateGatewayResponse = ActivateGatewayResponse
+    { _agrGatewayARN = Nothing
+    }
+
+agrGatewayARN :: Lens' ActivateGatewayResponse (Maybe Text)
+agrGatewayARN = lens _agrGatewayARN (\s a -> s { _agrGatewayARN = a })
+
+instance ToPath ActivateGateway where
+    toPath = const "/"
+
+instance ToQuery ActivateGateway where
+    toQuery = const mempty
+
+instance ToHeaders ActivateGateway
+
+instance ToJSON ActivateGateway where
+    toJSON ActivateGateway{..} = object
+        [ "ActivationKey"     .= _agActivationKey
+        , "GatewayName"       .= _agGatewayName
+        , "GatewayTimezone"   .= _agGatewayTimezone
+        , "GatewayRegion"     .= _agGatewayRegion
+        , "GatewayType"       .= _agGatewayType
+        , "TapeDriveType"     .= _agTapeDriveType
+        , "MediumChangerType" .= _agMediumChangerType
+        ]
+
+instance AWSRequest ActivateGateway where
+    type Sv ActivateGateway = StorageGateway
+    type Rs ActivateGateway = ActivateGatewayResponse
+
+    request  = post "ActivateGateway"
+    response = jsonResponse
+
+instance FromJSON ActivateGatewayResponse where
+    parseJSON = withObject "ActivateGatewayResponse" $ \o -> ActivateGatewayResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/AddCache.hs b/gen/Network/AWS/StorageGateway/AddCache.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/AddCache.hs
@@ -0,0 +1,121 @@
+{-# 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.StorageGateway.AddCache
+-- 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)
+
+-- | This operation configures one or more gateway local disks as cache for a
+-- cached-volume gateway. This operation is supported only for the
+-- gateway-cached volume architecture (see Storage Gateway Concepts). In the
+-- request, you specify the gateway Amazon Resource Name (ARN) to which you
+-- want to add cache, and one or more disk IDs that you want to configure as
+-- cache.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_AddCache.html>
+module Network.AWS.StorageGateway.AddCache
+    (
+    -- * Request
+      AddCache
+    -- ** Request constructor
+    , addCache
+    -- ** Request lenses
+    , acDiskIds
+    , acGatewayARN
+
+    -- * Response
+    , AddCacheResponse
+    -- ** Response constructor
+    , addCacheResponse
+    -- ** Response lenses
+    , acrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data AddCache = AddCache
+    { _acDiskIds    :: List "DiskIds" Text
+    , _acGatewayARN :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'AddCache' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'acDiskIds' @::@ ['Text']
+--
+-- * 'acGatewayARN' @::@ 'Text'
+--
+addCache :: Text -- ^ 'acGatewayARN'
+         -> AddCache
+addCache p1 = AddCache
+    { _acGatewayARN = p1
+    , _acDiskIds    = mempty
+    }
+
+acDiskIds :: Lens' AddCache [Text]
+acDiskIds = lens _acDiskIds (\s a -> s { _acDiskIds = a }) . _List
+
+acGatewayARN :: Lens' AddCache Text
+acGatewayARN = lens _acGatewayARN (\s a -> s { _acGatewayARN = a })
+
+newtype AddCacheResponse = AddCacheResponse
+    { _acrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'AddCacheResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'acrGatewayARN' @::@ 'Maybe' 'Text'
+--
+addCacheResponse :: AddCacheResponse
+addCacheResponse = AddCacheResponse
+    { _acrGatewayARN = Nothing
+    }
+
+acrGatewayARN :: Lens' AddCacheResponse (Maybe Text)
+acrGatewayARN = lens _acrGatewayARN (\s a -> s { _acrGatewayARN = a })
+
+instance ToPath AddCache where
+    toPath = const "/"
+
+instance ToQuery AddCache where
+    toQuery = const mempty
+
+instance ToHeaders AddCache
+
+instance ToJSON AddCache where
+    toJSON AddCache{..} = object
+        [ "GatewayARN" .= _acGatewayARN
+        , "DiskIds"    .= _acDiskIds
+        ]
+
+instance AWSRequest AddCache where
+    type Sv AddCache = StorageGateway
+    type Rs AddCache = AddCacheResponse
+
+    request  = post "AddCache"
+    response = jsonResponse
+
+instance FromJSON AddCacheResponse where
+    parseJSON = withObject "AddCacheResponse" $ \o -> AddCacheResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/AddUploadBuffer.hs b/gen/Network/AWS/StorageGateway/AddUploadBuffer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/AddUploadBuffer.hs
@@ -0,0 +1,121 @@
+{-# 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.StorageGateway.AddUploadBuffer
+-- 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)
+
+-- | This operation configures one or more gateway local disks as upload buffer
+-- for a specified gateway. This operation is supported for both the
+-- gateway-stored and gateway-cached volume architectures. In the request, you
+-- specify the gateway Amazon Resource Name (ARN) to which you want to add
+-- upload buffer, and one or more disk IDs that you want to configure as
+-- upload buffer.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_AddUploadBuffer.html>
+module Network.AWS.StorageGateway.AddUploadBuffer
+    (
+    -- * Request
+      AddUploadBuffer
+    -- ** Request constructor
+    , addUploadBuffer
+    -- ** Request lenses
+    , aubDiskIds
+    , aubGatewayARN
+
+    -- * Response
+    , AddUploadBufferResponse
+    -- ** Response constructor
+    , addUploadBufferResponse
+    -- ** Response lenses
+    , aubrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data AddUploadBuffer = AddUploadBuffer
+    { _aubDiskIds    :: List "DiskIds" Text
+    , _aubGatewayARN :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'AddUploadBuffer' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'aubDiskIds' @::@ ['Text']
+--
+-- * 'aubGatewayARN' @::@ 'Text'
+--
+addUploadBuffer :: Text -- ^ 'aubGatewayARN'
+                -> AddUploadBuffer
+addUploadBuffer p1 = AddUploadBuffer
+    { _aubGatewayARN = p1
+    , _aubDiskIds    = mempty
+    }
+
+aubDiskIds :: Lens' AddUploadBuffer [Text]
+aubDiskIds = lens _aubDiskIds (\s a -> s { _aubDiskIds = a }) . _List
+
+aubGatewayARN :: Lens' AddUploadBuffer Text
+aubGatewayARN = lens _aubGatewayARN (\s a -> s { _aubGatewayARN = a })
+
+newtype AddUploadBufferResponse = AddUploadBufferResponse
+    { _aubrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'AddUploadBufferResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'aubrGatewayARN' @::@ 'Maybe' 'Text'
+--
+addUploadBufferResponse :: AddUploadBufferResponse
+addUploadBufferResponse = AddUploadBufferResponse
+    { _aubrGatewayARN = Nothing
+    }
+
+aubrGatewayARN :: Lens' AddUploadBufferResponse (Maybe Text)
+aubrGatewayARN = lens _aubrGatewayARN (\s a -> s { _aubrGatewayARN = a })
+
+instance ToPath AddUploadBuffer where
+    toPath = const "/"
+
+instance ToQuery AddUploadBuffer where
+    toQuery = const mempty
+
+instance ToHeaders AddUploadBuffer
+
+instance ToJSON AddUploadBuffer where
+    toJSON AddUploadBuffer{..} = object
+        [ "GatewayARN" .= _aubGatewayARN
+        , "DiskIds"    .= _aubDiskIds
+        ]
+
+instance AWSRequest AddUploadBuffer where
+    type Sv AddUploadBuffer = StorageGateway
+    type Rs AddUploadBuffer = AddUploadBufferResponse
+
+    request  = post "AddUploadBuffer"
+    response = jsonResponse
+
+instance FromJSON AddUploadBufferResponse where
+    parseJSON = withObject "AddUploadBufferResponse" $ \o -> AddUploadBufferResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/AddWorkingStorage.hs b/gen/Network/AWS/StorageGateway/AddWorkingStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/AddWorkingStorage.hs
@@ -0,0 +1,125 @@
+{-# 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.StorageGateway.AddWorkingStorage
+-- 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)
+
+-- | This operation configures one or more gateway local disks as working
+-- storage for a gateway. This operation is supported only for the
+-- gateway-stored volume architecture. This operation is deprecated method in
+-- cached-volumes API version (20120630). Use AddUploadBuffer instead. In the
+-- request, you specify the gateway Amazon Resource Name (ARN) to which you
+-- want to add working storage, and one or more disk IDs that you want to
+-- configure as working storage.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_AddWorkingStorage.html>
+module Network.AWS.StorageGateway.AddWorkingStorage
+    (
+    -- * Request
+      AddWorkingStorage
+    -- ** Request constructor
+    , addWorkingStorage
+    -- ** Request lenses
+    , awsDiskIds
+    , awsGatewayARN
+
+    -- * Response
+    , AddWorkingStorageResponse
+    -- ** Response constructor
+    , addWorkingStorageResponse
+    -- ** Response lenses
+    , awsrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data AddWorkingStorage = AddWorkingStorage
+    { _awsDiskIds    :: List "DiskIds" Text
+    , _awsGatewayARN :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'AddWorkingStorage' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'awsDiskIds' @::@ ['Text']
+--
+-- * 'awsGatewayARN' @::@ 'Text'
+--
+addWorkingStorage :: Text -- ^ 'awsGatewayARN'
+                  -> AddWorkingStorage
+addWorkingStorage p1 = AddWorkingStorage
+    { _awsGatewayARN = p1
+    , _awsDiskIds    = mempty
+    }
+
+-- | An array of strings that identify disks that are to be configured as
+-- working storage. Each string have a minimum length of 1 and maximum
+-- length of 300. You can get the disk IDs from the ListLocalDisks API.
+awsDiskIds :: Lens' AddWorkingStorage [Text]
+awsDiskIds = lens _awsDiskIds (\s a -> s { _awsDiskIds = a }) . _List
+
+awsGatewayARN :: Lens' AddWorkingStorage Text
+awsGatewayARN = lens _awsGatewayARN (\s a -> s { _awsGatewayARN = a })
+
+newtype AddWorkingStorageResponse = AddWorkingStorageResponse
+    { _awsrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'AddWorkingStorageResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'awsrGatewayARN' @::@ 'Maybe' 'Text'
+--
+addWorkingStorageResponse :: AddWorkingStorageResponse
+addWorkingStorageResponse = AddWorkingStorageResponse
+    { _awsrGatewayARN = Nothing
+    }
+
+awsrGatewayARN :: Lens' AddWorkingStorageResponse (Maybe Text)
+awsrGatewayARN = lens _awsrGatewayARN (\s a -> s { _awsrGatewayARN = a })
+
+instance ToPath AddWorkingStorage where
+    toPath = const "/"
+
+instance ToQuery AddWorkingStorage where
+    toQuery = const mempty
+
+instance ToHeaders AddWorkingStorage
+
+instance ToJSON AddWorkingStorage where
+    toJSON AddWorkingStorage{..} = object
+        [ "GatewayARN" .= _awsGatewayARN
+        , "DiskIds"    .= _awsDiskIds
+        ]
+
+instance AWSRequest AddWorkingStorage where
+    type Sv AddWorkingStorage = StorageGateway
+    type Rs AddWorkingStorage = AddWorkingStorageResponse
+
+    request  = post "AddWorkingStorage"
+    response = jsonResponse
+
+instance FromJSON AddWorkingStorageResponse where
+    parseJSON = withObject "AddWorkingStorageResponse" $ \o -> AddWorkingStorageResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/CancelArchival.hs b/gen/Network/AWS/StorageGateway/CancelArchival.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CancelArchival.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.StorageGateway.CancelArchival
+-- 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)
+
+-- | Cancels archiving of a virtual tape to the virtual tape shelf (VTS) after
+-- the archiving process is initiated.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CancelArchival.html>
+module Network.AWS.StorageGateway.CancelArchival
+    (
+    -- * Request
+      CancelArchival
+    -- ** Request constructor
+    , cancelArchival
+    -- ** Request lenses
+    , caGatewayARN
+    , caTapeARN
+
+    -- * Response
+    , CancelArchivalResponse
+    -- ** Response constructor
+    , cancelArchivalResponse
+    -- ** Response lenses
+    , carTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CancelArchival = CancelArchival
+    { _caGatewayARN :: Text
+    , _caTapeARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CancelArchival' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'caGatewayARN' @::@ 'Text'
+--
+-- * 'caTapeARN' @::@ 'Text'
+--
+cancelArchival :: Text -- ^ 'caGatewayARN'
+               -> Text -- ^ 'caTapeARN'
+               -> CancelArchival
+cancelArchival p1 p2 = CancelArchival
+    { _caGatewayARN = p1
+    , _caTapeARN    = p2
+    }
+
+caGatewayARN :: Lens' CancelArchival Text
+caGatewayARN = lens _caGatewayARN (\s a -> s { _caGatewayARN = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape you want to cancel
+-- archiving for.
+caTapeARN :: Lens' CancelArchival Text
+caTapeARN = lens _caTapeARN (\s a -> s { _caTapeARN = a })
+
+newtype CancelArchivalResponse = CancelArchivalResponse
+    { _carTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'CancelArchivalResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'carTapeARN' @::@ 'Maybe' 'Text'
+--
+cancelArchivalResponse :: CancelArchivalResponse
+cancelArchivalResponse = CancelArchivalResponse
+    { _carTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape for which archiving
+-- was canceled.
+carTapeARN :: Lens' CancelArchivalResponse (Maybe Text)
+carTapeARN = lens _carTapeARN (\s a -> s { _carTapeARN = a })
+
+instance ToPath CancelArchival where
+    toPath = const "/"
+
+instance ToQuery CancelArchival where
+    toQuery = const mempty
+
+instance ToHeaders CancelArchival
+
+instance ToJSON CancelArchival where
+    toJSON CancelArchival{..} = object
+        [ "GatewayARN" .= _caGatewayARN
+        , "TapeARN"    .= _caTapeARN
+        ]
+
+instance AWSRequest CancelArchival where
+    type Sv CancelArchival = StorageGateway
+    type Rs CancelArchival = CancelArchivalResponse
+
+    request  = post "CancelArchival"
+    response = jsonResponse
+
+instance FromJSON CancelArchivalResponse where
+    parseJSON = withObject "CancelArchivalResponse" $ \o -> CancelArchivalResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/CancelRetrieval.hs b/gen/Network/AWS/StorageGateway/CancelRetrieval.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CancelRetrieval.hs
@@ -0,0 +1,123 @@
+{-# 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.StorageGateway.CancelRetrieval
+-- 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)
+
+-- | Cancels retrieval of a virtual tape from the virtual tape shelf (VTS) to a
+-- gateway after the retrieval process is initiated. The virtual tape is
+-- returned to the VTS.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CancelRetrieval.html>
+module Network.AWS.StorageGateway.CancelRetrieval
+    (
+    -- * Request
+      CancelRetrieval
+    -- ** Request constructor
+    , cancelRetrieval
+    -- ** Request lenses
+    , crGatewayARN
+    , crTapeARN
+
+    -- * Response
+    , CancelRetrievalResponse
+    -- ** Response constructor
+    , cancelRetrievalResponse
+    -- ** Response lenses
+    , crrTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CancelRetrieval = CancelRetrieval
+    { _crGatewayARN :: Text
+    , _crTapeARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CancelRetrieval' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'crGatewayARN' @::@ 'Text'
+--
+-- * 'crTapeARN' @::@ 'Text'
+--
+cancelRetrieval :: Text -- ^ 'crGatewayARN'
+                -> Text -- ^ 'crTapeARN'
+                -> CancelRetrieval
+cancelRetrieval p1 p2 = CancelRetrieval
+    { _crGatewayARN = p1
+    , _crTapeARN    = p2
+    }
+
+crGatewayARN :: Lens' CancelRetrieval Text
+crGatewayARN = lens _crGatewayARN (\s a -> s { _crGatewayARN = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape you want to cancel
+-- retrieval for.
+crTapeARN :: Lens' CancelRetrieval Text
+crTapeARN = lens _crTapeARN (\s a -> s { _crTapeARN = a })
+
+newtype CancelRetrievalResponse = CancelRetrievalResponse
+    { _crrTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'CancelRetrievalResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'crrTapeARN' @::@ 'Maybe' 'Text'
+--
+cancelRetrievalResponse :: CancelRetrievalResponse
+cancelRetrievalResponse = CancelRetrievalResponse
+    { _crrTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape for which retrieval
+-- was canceled.
+crrTapeARN :: Lens' CancelRetrievalResponse (Maybe Text)
+crrTapeARN = lens _crrTapeARN (\s a -> s { _crrTapeARN = a })
+
+instance ToPath CancelRetrieval where
+    toPath = const "/"
+
+instance ToQuery CancelRetrieval where
+    toQuery = const mempty
+
+instance ToHeaders CancelRetrieval
+
+instance ToJSON CancelRetrieval where
+    toJSON CancelRetrieval{..} = object
+        [ "GatewayARN" .= _crGatewayARN
+        , "TapeARN"    .= _crTapeARN
+        ]
+
+instance AWSRequest CancelRetrieval where
+    type Sv CancelRetrieval = StorageGateway
+    type Rs CancelRetrieval = CancelRetrievalResponse
+
+    request  = post "CancelRetrieval"
+    response = jsonResponse
+
+instance FromJSON CancelRetrievalResponse where
+    parseJSON = withObject "CancelRetrievalResponse" $ \o -> CancelRetrievalResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/CreateCachediSCSIVolume.hs b/gen/Network/AWS/StorageGateway/CreateCachediSCSIVolume.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CreateCachediSCSIVolume.hs
@@ -0,0 +1,182 @@
+{-# 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.StorageGateway.CreateCachediSCSIVolume
+-- 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)
+
+-- | This operation creates a cached volume on a specified cached gateway. This
+-- operation is supported only for the gateway-cached volume architecture. In
+-- the request, you must specify the gateway, size of the volume in bytes, the
+-- iSCSI target name, an IP address on which to expose the target, and a
+-- unique client token. In response, AWS Storage Gateway creates the volume
+-- and returns information about it such as the volume Amazon Resource Name
+-- (ARN), its size, and the iSCSI target ARN that initiators can use to
+-- connect to the volume target.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CreateCachediSCSIVolume.html>
+module Network.AWS.StorageGateway.CreateCachediSCSIVolume
+    (
+    -- * Request
+      CreateCachediSCSIVolume
+    -- ** Request constructor
+    , createCachediSCSIVolume
+    -- ** Request lenses
+    , ccscsivClientToken
+    , ccscsivGatewayARN
+    , ccscsivNetworkInterfaceId
+    , ccscsivSnapshotId
+    , ccscsivTargetName
+    , ccscsivVolumeSizeInBytes
+
+    -- * Response
+    , CreateCachediSCSIVolumeResponse
+    -- ** Response constructor
+    , createCachediSCSIVolumeResponse
+    -- ** Response lenses
+    , ccscsivrTargetARN
+    , ccscsivrVolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CreateCachediSCSIVolume = CreateCachediSCSIVolume
+    { _ccscsivClientToken        :: Text
+    , _ccscsivGatewayARN         :: Text
+    , _ccscsivNetworkInterfaceId :: Text
+    , _ccscsivSnapshotId         :: Maybe Text
+    , _ccscsivTargetName         :: Text
+    , _ccscsivVolumeSizeInBytes  :: Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateCachediSCSIVolume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccscsivClientToken' @::@ 'Text'
+--
+-- * 'ccscsivGatewayARN' @::@ 'Text'
+--
+-- * 'ccscsivNetworkInterfaceId' @::@ 'Text'
+--
+-- * 'ccscsivSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'ccscsivTargetName' @::@ 'Text'
+--
+-- * 'ccscsivVolumeSizeInBytes' @::@ 'Integer'
+--
+createCachediSCSIVolume :: Text -- ^ 'ccscsivGatewayARN'
+                        -> Integer -- ^ 'ccscsivVolumeSizeInBytes'
+                        -> Text -- ^ 'ccscsivTargetName'
+                        -> Text -- ^ 'ccscsivNetworkInterfaceId'
+                        -> Text -- ^ 'ccscsivClientToken'
+                        -> CreateCachediSCSIVolume
+createCachediSCSIVolume p1 p2 p3 p4 p5 = CreateCachediSCSIVolume
+    { _ccscsivGatewayARN         = p1
+    , _ccscsivVolumeSizeInBytes  = p2
+    , _ccscsivTargetName         = p3
+    , _ccscsivNetworkInterfaceId = p4
+    , _ccscsivClientToken        = p5
+    , _ccscsivSnapshotId         = Nothing
+    }
+
+ccscsivClientToken :: Lens' CreateCachediSCSIVolume Text
+ccscsivClientToken =
+    lens _ccscsivClientToken (\s a -> s { _ccscsivClientToken = a })
+
+ccscsivGatewayARN :: Lens' CreateCachediSCSIVolume Text
+ccscsivGatewayARN =
+    lens _ccscsivGatewayARN (\s a -> s { _ccscsivGatewayARN = a })
+
+ccscsivNetworkInterfaceId :: Lens' CreateCachediSCSIVolume Text
+ccscsivNetworkInterfaceId =
+    lens _ccscsivNetworkInterfaceId
+        (\s a -> s { _ccscsivNetworkInterfaceId = a })
+
+ccscsivSnapshotId :: Lens' CreateCachediSCSIVolume (Maybe Text)
+ccscsivSnapshotId =
+    lens _ccscsivSnapshotId (\s a -> s { _ccscsivSnapshotId = a })
+
+ccscsivTargetName :: Lens' CreateCachediSCSIVolume Text
+ccscsivTargetName =
+    lens _ccscsivTargetName (\s a -> s { _ccscsivTargetName = a })
+
+ccscsivVolumeSizeInBytes :: Lens' CreateCachediSCSIVolume Integer
+ccscsivVolumeSizeInBytes =
+    lens _ccscsivVolumeSizeInBytes
+        (\s a -> s { _ccscsivVolumeSizeInBytes = a })
+
+data CreateCachediSCSIVolumeResponse = CreateCachediSCSIVolumeResponse
+    { _ccscsivrTargetARN :: Maybe Text
+    , _ccscsivrVolumeARN :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateCachediSCSIVolumeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccscsivrTargetARN' @::@ 'Maybe' 'Text'
+--
+-- * 'ccscsivrVolumeARN' @::@ 'Maybe' 'Text'
+--
+createCachediSCSIVolumeResponse :: CreateCachediSCSIVolumeResponse
+createCachediSCSIVolumeResponse = CreateCachediSCSIVolumeResponse
+    { _ccscsivrVolumeARN = Nothing
+    , _ccscsivrTargetARN = Nothing
+    }
+
+ccscsivrTargetARN :: Lens' CreateCachediSCSIVolumeResponse (Maybe Text)
+ccscsivrTargetARN =
+    lens _ccscsivrTargetARN (\s a -> s { _ccscsivrTargetARN = a })
+
+ccscsivrVolumeARN :: Lens' CreateCachediSCSIVolumeResponse (Maybe Text)
+ccscsivrVolumeARN =
+    lens _ccscsivrVolumeARN (\s a -> s { _ccscsivrVolumeARN = a })
+
+instance ToPath CreateCachediSCSIVolume where
+    toPath = const "/"
+
+instance ToQuery CreateCachediSCSIVolume where
+    toQuery = const mempty
+
+instance ToHeaders CreateCachediSCSIVolume
+
+instance ToJSON CreateCachediSCSIVolume where
+    toJSON CreateCachediSCSIVolume{..} = object
+        [ "GatewayARN"         .= _ccscsivGatewayARN
+        , "VolumeSizeInBytes"  .= _ccscsivVolumeSizeInBytes
+        , "SnapshotId"         .= _ccscsivSnapshotId
+        , "TargetName"         .= _ccscsivTargetName
+        , "NetworkInterfaceId" .= _ccscsivNetworkInterfaceId
+        , "ClientToken"        .= _ccscsivClientToken
+        ]
+
+instance AWSRequest CreateCachediSCSIVolume where
+    type Sv CreateCachediSCSIVolume = StorageGateway
+    type Rs CreateCachediSCSIVolume = CreateCachediSCSIVolumeResponse
+
+    request  = post "CreateCachediSCSIVolume"
+    response = jsonResponse
+
+instance FromJSON CreateCachediSCSIVolumeResponse where
+    parseJSON = withObject "CreateCachediSCSIVolumeResponse" $ \o -> CreateCachediSCSIVolumeResponse
+        <$> o .:? "TargetARN"
+        <*> o .:? "VolumeARN"
diff --git a/gen/Network/AWS/StorageGateway/CreateSnapshot.hs b/gen/Network/AWS/StorageGateway/CreateSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CreateSnapshot.hs
@@ -0,0 +1,151 @@
+{-# 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.StorageGateway.CreateSnapshot
+-- 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)
+
+-- | This operation initiates a snapshot of a volume. AWS Storage Gateway
+-- provides the ability to back up point-in-time snapshots of your data to
+-- Amazon Simple Storage (S3) for durable off-site recovery, as well as import
+-- the data to an Amazon Elastic Block Store (EBS) volume in Amazon Elastic
+-- Compute Cloud (EC2). You can take snapshots of your gateway volume on a
+-- scheduled or ad-hoc basis. This API enables you to take ad-hoc snapshot.
+-- For more information, see Working With Snapshots in the AWS Storage Gateway
+-- Console. In the CreateSnapshot request you identify the volume by providing
+-- its Amazon Resource Name (ARN). You must also provide description for the
+-- snapshot. When AWS Storage Gateway takes the snapshot of specified volume,
+-- the snapshot and description appears in the AWS Storage Gateway Console. In
+-- response, AWS Storage Gateway returns you a snapshot ID. You can use this
+-- snapshot ID to check the snapshot progress or later use it when you want to
+-- create a volume from a snapshot.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CreateSnapshot.html>
+module Network.AWS.StorageGateway.CreateSnapshot
+    (
+    -- * Request
+      CreateSnapshot
+    -- ** Request constructor
+    , createSnapshot
+    -- ** Request lenses
+    , csSnapshotDescription
+    , csVolumeARN
+
+    -- * Response
+    , CreateSnapshotResponse
+    -- ** Response constructor
+    , createSnapshotResponse
+    -- ** Response lenses
+    , csrSnapshotId
+    , csrVolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CreateSnapshot = CreateSnapshot
+    { _csSnapshotDescription :: Text
+    , _csVolumeARN           :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateSnapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csSnapshotDescription' @::@ 'Text'
+--
+-- * 'csVolumeARN' @::@ 'Text'
+--
+createSnapshot :: Text -- ^ 'csVolumeARN'
+               -> Text -- ^ 'csSnapshotDescription'
+               -> CreateSnapshot
+createSnapshot p1 p2 = CreateSnapshot
+    { _csVolumeARN           = p1
+    , _csSnapshotDescription = p2
+    }
+
+-- | Textual description of the snapshot that appears in the Amazon EC2
+-- console, Elastic Block Store snapshots panel in the Description field,
+-- and in the AWS Storage Gateway snapshot Details pane, Description field.
+csSnapshotDescription :: Lens' CreateSnapshot Text
+csSnapshotDescription =
+    lens _csSnapshotDescription (\s a -> s { _csSnapshotDescription = a })
+
+-- | The Amazon Resource Name (ARN) of the volume. Use the ListVolumes
+-- operation to return a list of gateway volumes.
+csVolumeARN :: Lens' CreateSnapshot Text
+csVolumeARN = lens _csVolumeARN (\s a -> s { _csVolumeARN = a })
+
+data CreateSnapshotResponse = CreateSnapshotResponse
+    { _csrSnapshotId :: Maybe Text
+    , _csrVolumeARN  :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateSnapshotResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csrSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'csrVolumeARN' @::@ 'Maybe' 'Text'
+--
+createSnapshotResponse :: CreateSnapshotResponse
+createSnapshotResponse = CreateSnapshotResponse
+    { _csrVolumeARN  = Nothing
+    , _csrSnapshotId = Nothing
+    }
+
+-- | The snapshot ID that is used to refer to the snapshot in future
+-- operations such as describing snapshots (Amazon Elastic Compute Cloud API
+-- DescribeSnapshots) or creating a volume from a snapshot
+-- (CreateStorediSCSIVolume).
+csrSnapshotId :: Lens' CreateSnapshotResponse (Maybe Text)
+csrSnapshotId = lens _csrSnapshotId (\s a -> s { _csrSnapshotId = a })
+
+-- | The Amazon Resource Name (ARN) of the volume of which the snapshot was
+-- taken.
+csrVolumeARN :: Lens' CreateSnapshotResponse (Maybe Text)
+csrVolumeARN = lens _csrVolumeARN (\s a -> s { _csrVolumeARN = a })
+
+instance ToPath CreateSnapshot where
+    toPath = const "/"
+
+instance ToQuery CreateSnapshot where
+    toQuery = const mempty
+
+instance ToHeaders CreateSnapshot
+
+instance ToJSON CreateSnapshot where
+    toJSON CreateSnapshot{..} = object
+        [ "VolumeARN"           .= _csVolumeARN
+        , "SnapshotDescription" .= _csSnapshotDescription
+        ]
+
+instance AWSRequest CreateSnapshot where
+    type Sv CreateSnapshot = StorageGateway
+    type Rs CreateSnapshot = CreateSnapshotResponse
+
+    request  = post "CreateSnapshot"
+    response = jsonResponse
+
+instance FromJSON CreateSnapshotResponse where
+    parseJSON = withObject "CreateSnapshotResponse" $ \o -> CreateSnapshotResponse
+        <$> o .:? "SnapshotId"
+        <*> o .:? "VolumeARN"
diff --git a/gen/Network/AWS/StorageGateway/CreateSnapshotFromVolumeRecoveryPoint.hs b/gen/Network/AWS/StorageGateway/CreateSnapshotFromVolumeRecoveryPoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CreateSnapshotFromVolumeRecoveryPoint.hs
@@ -0,0 +1,152 @@
+{-# 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.StorageGateway.CreateSnapshotFromVolumeRecoveryPoint
+-- 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)
+
+-- | This operation initiates a snapshot of a gateway from a volume recovery
+-- point. This operation is supported only for the gateway-cached volume
+-- architecture (see ). A volume recovery point is a point in time at which
+-- all data of the volume is consistent and from which you can create a
+-- snapshot. To get a list of volume recovery point for gateway-cached
+-- volumes, use ListVolumeRecoveryPoints. In the
+-- CreateSnapshotFromVolumeRecoveryPoint request, you identify the volume by
+-- providing its Amazon Resource Name (ARN). You must also provide a
+-- description for the snapshot. When AWS Storage Gateway takes a snapshot of
+-- the specified volume, the snapshot and its description appear in the AWS
+-- Storage Gateway console. In response, AWS Storage Gateway returns you a
+-- snapshot ID. You can use this snapshot ID to check the snapshot progress or
+-- later use it when you want to create a volume from a snapshot.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CreateSnapshotFromVolumeRecoveryPoint.html>
+module Network.AWS.StorageGateway.CreateSnapshotFromVolumeRecoveryPoint
+    (
+    -- * Request
+      CreateSnapshotFromVolumeRecoveryPoint
+    -- ** Request constructor
+    , createSnapshotFromVolumeRecoveryPoint
+    -- ** Request lenses
+    , csfvrpSnapshotDescription
+    , csfvrpVolumeARN
+
+    -- * Response
+    , CreateSnapshotFromVolumeRecoveryPointResponse
+    -- ** Response constructor
+    , createSnapshotFromVolumeRecoveryPointResponse
+    -- ** Response lenses
+    , csfvrprSnapshotId
+    , csfvrprVolumeARN
+    , csfvrprVolumeRecoveryPointTime
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CreateSnapshotFromVolumeRecoveryPoint = CreateSnapshotFromVolumeRecoveryPoint
+    { _csfvrpSnapshotDescription :: Text
+    , _csfvrpVolumeARN           :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateSnapshotFromVolumeRecoveryPoint' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csfvrpSnapshotDescription' @::@ 'Text'
+--
+-- * 'csfvrpVolumeARN' @::@ 'Text'
+--
+createSnapshotFromVolumeRecoveryPoint :: Text -- ^ 'csfvrpVolumeARN'
+                                      -> Text -- ^ 'csfvrpSnapshotDescription'
+                                      -> CreateSnapshotFromVolumeRecoveryPoint
+createSnapshotFromVolumeRecoveryPoint p1 p2 = CreateSnapshotFromVolumeRecoveryPoint
+    { _csfvrpVolumeARN           = p1
+    , _csfvrpSnapshotDescription = p2
+    }
+
+csfvrpSnapshotDescription :: Lens' CreateSnapshotFromVolumeRecoveryPoint Text
+csfvrpSnapshotDescription =
+    lens _csfvrpSnapshotDescription
+        (\s a -> s { _csfvrpSnapshotDescription = a })
+
+csfvrpVolumeARN :: Lens' CreateSnapshotFromVolumeRecoveryPoint Text
+csfvrpVolumeARN = lens _csfvrpVolumeARN (\s a -> s { _csfvrpVolumeARN = a })
+
+data CreateSnapshotFromVolumeRecoveryPointResponse = CreateSnapshotFromVolumeRecoveryPointResponse
+    { _csfvrprSnapshotId              :: Maybe Text
+    , _csfvrprVolumeARN               :: Maybe Text
+    , _csfvrprVolumeRecoveryPointTime :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateSnapshotFromVolumeRecoveryPointResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csfvrprSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'csfvrprVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'csfvrprVolumeRecoveryPointTime' @::@ 'Maybe' 'Text'
+--
+createSnapshotFromVolumeRecoveryPointResponse :: CreateSnapshotFromVolumeRecoveryPointResponse
+createSnapshotFromVolumeRecoveryPointResponse = CreateSnapshotFromVolumeRecoveryPointResponse
+    { _csfvrprSnapshotId              = Nothing
+    , _csfvrprVolumeARN               = Nothing
+    , _csfvrprVolumeRecoveryPointTime = Nothing
+    }
+
+csfvrprSnapshotId :: Lens' CreateSnapshotFromVolumeRecoveryPointResponse (Maybe Text)
+csfvrprSnapshotId =
+    lens _csfvrprSnapshotId (\s a -> s { _csfvrprSnapshotId = a })
+
+csfvrprVolumeARN :: Lens' CreateSnapshotFromVolumeRecoveryPointResponse (Maybe Text)
+csfvrprVolumeARN = lens _csfvrprVolumeARN (\s a -> s { _csfvrprVolumeARN = a })
+
+csfvrprVolumeRecoveryPointTime :: Lens' CreateSnapshotFromVolumeRecoveryPointResponse (Maybe Text)
+csfvrprVolumeRecoveryPointTime =
+    lens _csfvrprVolumeRecoveryPointTime
+        (\s a -> s { _csfvrprVolumeRecoveryPointTime = a })
+
+instance ToPath CreateSnapshotFromVolumeRecoveryPoint where
+    toPath = const "/"
+
+instance ToQuery CreateSnapshotFromVolumeRecoveryPoint where
+    toQuery = const mempty
+
+instance ToHeaders CreateSnapshotFromVolumeRecoveryPoint
+
+instance ToJSON CreateSnapshotFromVolumeRecoveryPoint where
+    toJSON CreateSnapshotFromVolumeRecoveryPoint{..} = object
+        [ "VolumeARN"           .= _csfvrpVolumeARN
+        , "SnapshotDescription" .= _csfvrpSnapshotDescription
+        ]
+
+instance AWSRequest CreateSnapshotFromVolumeRecoveryPoint where
+    type Sv CreateSnapshotFromVolumeRecoveryPoint = StorageGateway
+    type Rs CreateSnapshotFromVolumeRecoveryPoint = CreateSnapshotFromVolumeRecoveryPointResponse
+
+    request  = post "CreateSnapshotFromVolumeRecoveryPoint"
+    response = jsonResponse
+
+instance FromJSON CreateSnapshotFromVolumeRecoveryPointResponse where
+    parseJSON = withObject "CreateSnapshotFromVolumeRecoveryPointResponse" $ \o -> CreateSnapshotFromVolumeRecoveryPointResponse
+        <$> o .:? "SnapshotId"
+        <*> o .:? "VolumeARN"
+        <*> o .:? "VolumeRecoveryPointTime"
diff --git a/gen/Network/AWS/StorageGateway/CreateStorediSCSIVolume.hs b/gen/Network/AWS/StorageGateway/CreateStorediSCSIVolume.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CreateStorediSCSIVolume.hs
@@ -0,0 +1,218 @@
+{-# 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.StorageGateway.CreateStorediSCSIVolume
+-- 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)
+
+-- | This operation creates a volume on a specified gateway. This operation is
+-- supported only for the gateway-stored volume architecture. The size of the
+-- volume to create is inferred from the disk size. You can choose to preserve
+-- existing data on the disk, create volume from an existing snapshot, or
+-- create an empty volume. If you choose to create an empty gateway volume,
+-- then any existing data on the disk is erased. In the request you must
+-- specify the gateway and the disk information on which you are creating the
+-- volume. In response, AWS Storage Gateway creates the volume and returns
+-- volume information such as the volume Amazon Resource Name (ARN), its size,
+-- and the iSCSI target ARN that initiators can use to connect to the volume
+-- target.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CreateStorediSCSIVolume.html>
+module Network.AWS.StorageGateway.CreateStorediSCSIVolume
+    (
+    -- * Request
+      CreateStorediSCSIVolume
+    -- ** Request constructor
+    , createStorediSCSIVolume
+    -- ** Request lenses
+    , csscsivDiskId
+    , csscsivGatewayARN
+    , csscsivNetworkInterfaceId
+    , csscsivPreserveExistingData
+    , csscsivSnapshotId
+    , csscsivTargetName
+
+    -- * Response
+    , CreateStorediSCSIVolumeResponse
+    -- ** Response constructor
+    , createStorediSCSIVolumeResponse
+    -- ** Response lenses
+    , csscsivrTargetARN
+    , csscsivrVolumeARN
+    , csscsivrVolumeSizeInBytes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CreateStorediSCSIVolume = CreateStorediSCSIVolume
+    { _csscsivDiskId               :: Text
+    , _csscsivGatewayARN           :: Text
+    , _csscsivNetworkInterfaceId   :: Text
+    , _csscsivPreserveExistingData :: Bool
+    , _csscsivSnapshotId           :: Maybe Text
+    , _csscsivTargetName           :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateStorediSCSIVolume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csscsivDiskId' @::@ 'Text'
+--
+-- * 'csscsivGatewayARN' @::@ 'Text'
+--
+-- * 'csscsivNetworkInterfaceId' @::@ 'Text'
+--
+-- * 'csscsivPreserveExistingData' @::@ 'Bool'
+--
+-- * 'csscsivSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'csscsivTargetName' @::@ 'Text'
+--
+createStorediSCSIVolume :: Text -- ^ 'csscsivGatewayARN'
+                        -> Text -- ^ 'csscsivDiskId'
+                        -> Bool -- ^ 'csscsivPreserveExistingData'
+                        -> Text -- ^ 'csscsivTargetName'
+                        -> Text -- ^ 'csscsivNetworkInterfaceId'
+                        -> CreateStorediSCSIVolume
+createStorediSCSIVolume p1 p2 p3 p4 p5 = CreateStorediSCSIVolume
+    { _csscsivGatewayARN           = p1
+    , _csscsivDiskId               = p2
+    , _csscsivPreserveExistingData = p3
+    , _csscsivTargetName           = p4
+    , _csscsivNetworkInterfaceId   = p5
+    , _csscsivSnapshotId           = Nothing
+    }
+
+-- | The unique identifier for the gateway local disk that is configured as a
+-- stored volume. Use ListLocalDisks to list disk IDs for a gateway.
+csscsivDiskId :: Lens' CreateStorediSCSIVolume Text
+csscsivDiskId = lens _csscsivDiskId (\s a -> s { _csscsivDiskId = a })
+
+csscsivGatewayARN :: Lens' CreateStorediSCSIVolume Text
+csscsivGatewayARN =
+    lens _csscsivGatewayARN (\s a -> s { _csscsivGatewayARN = a })
+
+-- | The network interface of the gateway on which to expose the iSCSI target.
+-- Only IPv4 addresses are accepted. Use DescribeGatewayInformation to get a
+-- list of the network interfaces available on a gateway. Valid Values: A
+-- valid IP address.
+csscsivNetworkInterfaceId :: Lens' CreateStorediSCSIVolume Text
+csscsivNetworkInterfaceId =
+    lens _csscsivNetworkInterfaceId
+        (\s a -> s { _csscsivNetworkInterfaceId = a })
+
+-- | Specify this field as true if you want to preserve the data on the local
+-- disk. Otherwise, specifying this field as false creates an empty volume.
+-- Valid Values: true, false.
+csscsivPreserveExistingData :: Lens' CreateStorediSCSIVolume Bool
+csscsivPreserveExistingData =
+    lens _csscsivPreserveExistingData
+        (\s a -> s { _csscsivPreserveExistingData = a })
+
+-- | The snapshot ID (e.g. "snap-1122aabb") of the snapshot to restore as the
+-- new stored volume. Specify this field if you want to create the iSCSI
+-- storage volume from a snapshot otherwise do not include this field. To
+-- list snapshots for your account use DescribeSnapshots in the Amazon
+-- Elastic Compute Cloud API Reference.
+csscsivSnapshotId :: Lens' CreateStorediSCSIVolume (Maybe Text)
+csscsivSnapshotId =
+    lens _csscsivSnapshotId (\s a -> s { _csscsivSnapshotId = a })
+
+-- | The name of the iSCSI target used by initiators to connect to the target
+-- and as a suffix for the target ARN. For example, specifying TargetName as
+-- myvolume results in the target ARN of
+-- arn:aws:storagegateway:us-east-1:111122223333:gateway/mygateway/target/iqn.1997-05.com.amazon:myvolume.
+-- The target name must be unique across all volumes of a gateway.
+csscsivTargetName :: Lens' CreateStorediSCSIVolume Text
+csscsivTargetName =
+    lens _csscsivTargetName (\s a -> s { _csscsivTargetName = a })
+
+data CreateStorediSCSIVolumeResponse = CreateStorediSCSIVolumeResponse
+    { _csscsivrTargetARN         :: Maybe Text
+    , _csscsivrVolumeARN         :: Maybe Text
+    , _csscsivrVolumeSizeInBytes :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateStorediSCSIVolumeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csscsivrTargetARN' @::@ 'Maybe' 'Text'
+--
+-- * 'csscsivrVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'csscsivrVolumeSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+createStorediSCSIVolumeResponse :: CreateStorediSCSIVolumeResponse
+createStorediSCSIVolumeResponse = CreateStorediSCSIVolumeResponse
+    { _csscsivrVolumeARN         = Nothing
+    , _csscsivrVolumeSizeInBytes = Nothing
+    , _csscsivrTargetARN         = Nothing
+    }
+
+-- | he Amazon Resource Name (ARN) of the volume target that includes the
+-- iSCSI name that initiators can use to connect to the target.
+csscsivrTargetARN :: Lens' CreateStorediSCSIVolumeResponse (Maybe Text)
+csscsivrTargetARN =
+    lens _csscsivrTargetARN (\s a -> s { _csscsivrTargetARN = a })
+
+-- | The Amazon Resource Name (ARN) of the configured volume.
+csscsivrVolumeARN :: Lens' CreateStorediSCSIVolumeResponse (Maybe Text)
+csscsivrVolumeARN =
+    lens _csscsivrVolumeARN (\s a -> s { _csscsivrVolumeARN = a })
+
+-- | The size of the volume in bytes.
+csscsivrVolumeSizeInBytes :: Lens' CreateStorediSCSIVolumeResponse (Maybe Integer)
+csscsivrVolumeSizeInBytes =
+    lens _csscsivrVolumeSizeInBytes
+        (\s a -> s { _csscsivrVolumeSizeInBytes = a })
+
+instance ToPath CreateStorediSCSIVolume where
+    toPath = const "/"
+
+instance ToQuery CreateStorediSCSIVolume where
+    toQuery = const mempty
+
+instance ToHeaders CreateStorediSCSIVolume
+
+instance ToJSON CreateStorediSCSIVolume where
+    toJSON CreateStorediSCSIVolume{..} = object
+        [ "GatewayARN"           .= _csscsivGatewayARN
+        , "DiskId"               .= _csscsivDiskId
+        , "SnapshotId"           .= _csscsivSnapshotId
+        , "PreserveExistingData" .= _csscsivPreserveExistingData
+        , "TargetName"           .= _csscsivTargetName
+        , "NetworkInterfaceId"   .= _csscsivNetworkInterfaceId
+        ]
+
+instance AWSRequest CreateStorediSCSIVolume where
+    type Sv CreateStorediSCSIVolume = StorageGateway
+    type Rs CreateStorediSCSIVolume = CreateStorediSCSIVolumeResponse
+
+    request  = post "CreateStorediSCSIVolume"
+    response = jsonResponse
+
+instance FromJSON CreateStorediSCSIVolumeResponse where
+    parseJSON = withObject "CreateStorediSCSIVolumeResponse" $ \o -> CreateStorediSCSIVolumeResponse
+        <$> o .:? "TargetARN"
+        <*> o .:? "VolumeARN"
+        <*> o .:? "VolumeSizeInBytes"
diff --git a/gen/Network/AWS/StorageGateway/CreateTapes.hs b/gen/Network/AWS/StorageGateway/CreateTapes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/CreateTapes.hs
@@ -0,0 +1,170 @@
+{-# 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.StorageGateway.CreateTapes
+-- 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)
+
+-- | Creates one or more virtual tapes. You write data to the virtual tapes and
+-- then archive the tapes.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_CreateTapes.html>
+module Network.AWS.StorageGateway.CreateTapes
+    (
+    -- * Request
+      CreateTapes
+    -- ** Request constructor
+    , createTapes
+    -- ** Request lenses
+    , ctClientToken
+    , ctGatewayARN
+    , ctNumTapesToCreate
+    , ctTapeBarcodePrefix
+    , ctTapeSizeInBytes
+
+    -- * Response
+    , CreateTapesResponse
+    -- ** Response constructor
+    , createTapesResponse
+    -- ** Response lenses
+    , ctrTapeARNs
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data CreateTapes = CreateTapes
+    { _ctClientToken       :: Text
+    , _ctGatewayARN        :: Text
+    , _ctNumTapesToCreate  :: Nat
+    , _ctTapeBarcodePrefix :: Text
+    , _ctTapeSizeInBytes   :: Nat
+    } deriving (Eq, Ord, Show)
+
+-- | 'CreateTapes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ctClientToken' @::@ 'Text'
+--
+-- * 'ctGatewayARN' @::@ 'Text'
+--
+-- * 'ctNumTapesToCreate' @::@ 'Natural'
+--
+-- * 'ctTapeBarcodePrefix' @::@ 'Text'
+--
+-- * 'ctTapeSizeInBytes' @::@ 'Natural'
+--
+createTapes :: Text -- ^ 'ctGatewayARN'
+            -> Natural -- ^ 'ctTapeSizeInBytes'
+            -> Text -- ^ 'ctClientToken'
+            -> Natural -- ^ 'ctNumTapesToCreate'
+            -> Text -- ^ 'ctTapeBarcodePrefix'
+            -> CreateTapes
+createTapes p1 p2 p3 p4 p5 = CreateTapes
+    { _ctGatewayARN        = p1
+    , _ctTapeSizeInBytes   = withIso _Nat (const id) p2
+    , _ctClientToken       = p3
+    , _ctNumTapesToCreate  = withIso _Nat (const id) p4
+    , _ctTapeBarcodePrefix = p5
+    }
+
+-- | A unique identifier that you use to retry a request. If you retry a
+-- request, use the same ClientToken you specified in the initial request.
+ctClientToken :: Lens' CreateTapes Text
+ctClientToken = lens _ctClientToken (\s a -> s { _ctClientToken = a })
+
+-- | The unique Amazon Resource Name(ARN) that represents the gateway to
+-- associate the virtual tapes with. Use the ListGateways operation to
+-- return a list of gateways for your account and region.
+ctGatewayARN :: Lens' CreateTapes Text
+ctGatewayARN = lens _ctGatewayARN (\s a -> s { _ctGatewayARN = a })
+
+-- | The number of virtual tapes you want to create.
+ctNumTapesToCreate :: Lens' CreateTapes Natural
+ctNumTapesToCreate =
+    lens _ctNumTapesToCreate (\s a -> s { _ctNumTapesToCreate = a })
+        . _Nat
+
+-- | A prefix you append to the barcode of the virtual tape you are creating.
+-- This makes a barcode unique.
+ctTapeBarcodePrefix :: Lens' CreateTapes Text
+ctTapeBarcodePrefix =
+    lens _ctTapeBarcodePrefix (\s a -> s { _ctTapeBarcodePrefix = a })
+
+-- | The size, in bytes, of the virtual tapes you want to create.
+ctTapeSizeInBytes :: Lens' CreateTapes Natural
+ctTapeSizeInBytes =
+    lens _ctTapeSizeInBytes (\s a -> s { _ctTapeSizeInBytes = a })
+        . _Nat
+
+newtype CreateTapesResponse = CreateTapesResponse
+    { _ctrTapeARNs :: List "TapeARNs" Text
+    } deriving (Eq, Ord, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList CreateTapesResponse where
+    type Item CreateTapesResponse = Text
+
+    fromList = CreateTapesResponse . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _ctrTapeARNs
+
+-- | 'CreateTapesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ctrTapeARNs' @::@ ['Text']
+--
+createTapesResponse :: CreateTapesResponse
+createTapesResponse = CreateTapesResponse
+    { _ctrTapeARNs = mempty
+    }
+
+-- | A list of unique Amazon Resource Named (ARN) the represents the virtual
+-- tapes that were created.
+ctrTapeARNs :: Lens' CreateTapesResponse [Text]
+ctrTapeARNs = lens _ctrTapeARNs (\s a -> s { _ctrTapeARNs = a }) . _List
+
+instance ToPath CreateTapes where
+    toPath = const "/"
+
+instance ToQuery CreateTapes where
+    toQuery = const mempty
+
+instance ToHeaders CreateTapes
+
+instance ToJSON CreateTapes where
+    toJSON CreateTapes{..} = object
+        [ "GatewayARN"        .= _ctGatewayARN
+        , "TapeSizeInBytes"   .= _ctTapeSizeInBytes
+        , "ClientToken"       .= _ctClientToken
+        , "NumTapesToCreate"  .= _ctNumTapesToCreate
+        , "TapeBarcodePrefix" .= _ctTapeBarcodePrefix
+        ]
+
+instance AWSRequest CreateTapes where
+    type Sv CreateTapes = StorageGateway
+    type Rs CreateTapes = CreateTapesResponse
+
+    request  = post "CreateTapes"
+    response = jsonResponse
+
+instance FromJSON CreateTapesResponse where
+    parseJSON = withObject "CreateTapesResponse" $ \o -> CreateTapesResponse
+        <$> o .:  "TapeARNs"
diff --git a/gen/Network/AWS/StorageGateway/DeleteBandwidthRateLimit.hs b/gen/Network/AWS/StorageGateway/DeleteBandwidthRateLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteBandwidthRateLimit.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.StorageGateway.DeleteBandwidthRateLimit
+-- 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)
+
+-- | This operation deletes the bandwidth rate limits of a gateway. You can
+-- delete either the upload and download bandwidth rate limit, or you can
+-- delete both. If you delete only one of the limits, the other limit remains
+-- unchanged. To specify which gateway to work with, use the Amazon Resource
+-- Name (ARN) of the gateway in your request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteBandwidthRateLimit.html>
+module Network.AWS.StorageGateway.DeleteBandwidthRateLimit
+    (
+    -- * Request
+      DeleteBandwidthRateLimit
+    -- ** Request constructor
+    , deleteBandwidthRateLimit
+    -- ** Request lenses
+    , dbrl1BandwidthType
+    , dbrl1GatewayARN
+
+    -- * Response
+    , DeleteBandwidthRateLimitResponse
+    -- ** Response constructor
+    , deleteBandwidthRateLimitResponse
+    -- ** Response lenses
+    , dbrlr1GatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DeleteBandwidthRateLimit = DeleteBandwidthRateLimit
+    { _dbrl1BandwidthType :: Text
+    , _dbrl1GatewayARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteBandwidthRateLimit' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dbrl1BandwidthType' @::@ 'Text'
+--
+-- * 'dbrl1GatewayARN' @::@ 'Text'
+--
+deleteBandwidthRateLimit :: Text -- ^ 'dbrl1GatewayARN'
+                         -> Text -- ^ 'dbrl1BandwidthType'
+                         -> DeleteBandwidthRateLimit
+deleteBandwidthRateLimit p1 p2 = DeleteBandwidthRateLimit
+    { _dbrl1GatewayARN    = p1
+    , _dbrl1BandwidthType = p2
+    }
+
+dbrl1BandwidthType :: Lens' DeleteBandwidthRateLimit Text
+dbrl1BandwidthType =
+    lens _dbrl1BandwidthType (\s a -> s { _dbrl1BandwidthType = a })
+
+dbrl1GatewayARN :: Lens' DeleteBandwidthRateLimit Text
+dbrl1GatewayARN = lens _dbrl1GatewayARN (\s a -> s { _dbrl1GatewayARN = a })
+
+newtype DeleteBandwidthRateLimitResponse = DeleteBandwidthRateLimitResponse
+    { _dbrlr1GatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteBandwidthRateLimitResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dbrlr1GatewayARN' @::@ 'Maybe' 'Text'
+--
+deleteBandwidthRateLimitResponse :: DeleteBandwidthRateLimitResponse
+deleteBandwidthRateLimitResponse = DeleteBandwidthRateLimitResponse
+    { _dbrlr1GatewayARN = Nothing
+    }
+
+dbrlr1GatewayARN :: Lens' DeleteBandwidthRateLimitResponse (Maybe Text)
+dbrlr1GatewayARN = lens _dbrlr1GatewayARN (\s a -> s { _dbrlr1GatewayARN = a })
+
+instance ToPath DeleteBandwidthRateLimit where
+    toPath = const "/"
+
+instance ToQuery DeleteBandwidthRateLimit where
+    toQuery = const mempty
+
+instance ToHeaders DeleteBandwidthRateLimit
+
+instance ToJSON DeleteBandwidthRateLimit where
+    toJSON DeleteBandwidthRateLimit{..} = object
+        [ "GatewayARN"    .= _dbrl1GatewayARN
+        , "BandwidthType" .= _dbrl1BandwidthType
+        ]
+
+instance AWSRequest DeleteBandwidthRateLimit where
+    type Sv DeleteBandwidthRateLimit = StorageGateway
+    type Rs DeleteBandwidthRateLimit = DeleteBandwidthRateLimitResponse
+
+    request  = post "DeleteBandwidthRateLimit"
+    response = jsonResponse
+
+instance FromJSON DeleteBandwidthRateLimitResponse where
+    parseJSON = withObject "DeleteBandwidthRateLimitResponse" $ \o -> DeleteBandwidthRateLimitResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteChapCredentials.hs b/gen/Network/AWS/StorageGateway/DeleteChapCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteChapCredentials.hs
@@ -0,0 +1,135 @@
+{-# 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.StorageGateway.DeleteChapCredentials
+-- 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)
+
+-- | This operation deletes Challenge-Handshake Authentication Protocol (CHAP)
+-- credentials for a specified iSCSI target and initiator pair.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteChapCredentials.html>
+module Network.AWS.StorageGateway.DeleteChapCredentials
+    (
+    -- * Request
+      DeleteChapCredentials
+    -- ** Request constructor
+    , deleteChapCredentials
+    -- ** Request lenses
+    , dcc1InitiatorName
+    , dcc1TargetARN
+
+    -- * Response
+    , DeleteChapCredentialsResponse
+    -- ** Response constructor
+    , deleteChapCredentialsResponse
+    -- ** Response lenses
+    , dccrInitiatorName
+    , dccrTargetARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DeleteChapCredentials = DeleteChapCredentials
+    { _dcc1InitiatorName :: Text
+    , _dcc1TargetARN     :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteChapCredentials' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcc1InitiatorName' @::@ 'Text'
+--
+-- * 'dcc1TargetARN' @::@ 'Text'
+--
+deleteChapCredentials :: Text -- ^ 'dcc1TargetARN'
+                      -> Text -- ^ 'dcc1InitiatorName'
+                      -> DeleteChapCredentials
+deleteChapCredentials p1 p2 = DeleteChapCredentials
+    { _dcc1TargetARN     = p1
+    , _dcc1InitiatorName = p2
+    }
+
+-- | The iSCSI initiator that connects to the target.
+dcc1InitiatorName :: Lens' DeleteChapCredentials Text
+dcc1InitiatorName =
+    lens _dcc1InitiatorName (\s a -> s { _dcc1InitiatorName = a })
+
+-- | The Amazon Resource Name (ARN) of the iSCSI volume target. Use the
+-- DescribeStorediSCSIVolumes operation to return to retrieve the TargetARN
+-- for specified VolumeARN.
+dcc1TargetARN :: Lens' DeleteChapCredentials Text
+dcc1TargetARN = lens _dcc1TargetARN (\s a -> s { _dcc1TargetARN = a })
+
+data DeleteChapCredentialsResponse = DeleteChapCredentialsResponse
+    { _dccrInitiatorName :: Maybe Text
+    , _dccrTargetARN     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteChapCredentialsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dccrInitiatorName' @::@ 'Maybe' 'Text'
+--
+-- * 'dccrTargetARN' @::@ 'Maybe' 'Text'
+--
+deleteChapCredentialsResponse :: DeleteChapCredentialsResponse
+deleteChapCredentialsResponse = DeleteChapCredentialsResponse
+    { _dccrTargetARN     = Nothing
+    , _dccrInitiatorName = Nothing
+    }
+
+-- | The iSCSI initiator that connects to the target.
+dccrInitiatorName :: Lens' DeleteChapCredentialsResponse (Maybe Text)
+dccrInitiatorName =
+    lens _dccrInitiatorName (\s a -> s { _dccrInitiatorName = a })
+
+-- | The Amazon Resource Name (ARN) of the target.
+dccrTargetARN :: Lens' DeleteChapCredentialsResponse (Maybe Text)
+dccrTargetARN = lens _dccrTargetARN (\s a -> s { _dccrTargetARN = a })
+
+instance ToPath DeleteChapCredentials where
+    toPath = const "/"
+
+instance ToQuery DeleteChapCredentials where
+    toQuery = const mempty
+
+instance ToHeaders DeleteChapCredentials
+
+instance ToJSON DeleteChapCredentials where
+    toJSON DeleteChapCredentials{..} = object
+        [ "TargetARN"     .= _dcc1TargetARN
+        , "InitiatorName" .= _dcc1InitiatorName
+        ]
+
+instance AWSRequest DeleteChapCredentials where
+    type Sv DeleteChapCredentials = StorageGateway
+    type Rs DeleteChapCredentials = DeleteChapCredentialsResponse
+
+    request  = post "DeleteChapCredentials"
+    response = jsonResponse
+
+instance FromJSON DeleteChapCredentialsResponse where
+    parseJSON = withObject "DeleteChapCredentialsResponse" $ \o -> DeleteChapCredentialsResponse
+        <$> o .:? "InitiatorName"
+        <*> o .:? "TargetARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteGateway.hs b/gen/Network/AWS/StorageGateway/DeleteGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteGateway.hs
@@ -0,0 +1,120 @@
+{-# 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.StorageGateway.DeleteGateway
+-- 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)
+
+-- | This operation deletes a gateway. To specify which gateway to delete, use
+-- the Amazon Resource Name (ARN) of the gateway in your request. The
+-- operation deletes the gateway; however, it does not delete the gateway
+-- virtual machine (VM) from your host computer. After you delete a gateway,
+-- you cannot reactivate it. Completed snapshots of the gateway volumes are
+-- not deleted upon deleting the gateway, however, pending snapshots will not
+-- complete. After you delete a gateway, your next step is to remove it from
+-- your environment. You no longer pay software charges after the gateway is
+-- deleted; however, your existing Amazon EBS snapshots persist and you will
+-- continue to be billed for these snapshots. You can choose to remove all
+-- remaining Amazon EBS snapshots by canceling your Amazon EC2 subscription.
+-- If you prefer not to cancel your Amazon EC2 subscription, you can delete
+-- your snapshots using the Amazon EC2 console. For more information, see the
+-- AWS Storage Gateway Detail Page.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteGateway.html>
+module Network.AWS.StorageGateway.DeleteGateway
+    (
+    -- * Request
+      DeleteGateway
+    -- ** Request constructor
+    , deleteGateway
+    -- ** Request lenses
+    , dgGatewayARN
+
+    -- * Response
+    , DeleteGatewayResponse
+    -- ** Response constructor
+    , deleteGatewayResponse
+    -- ** Response lenses
+    , dgrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DeleteGateway = DeleteGateway
+    { _dgGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteGateway' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dgGatewayARN' @::@ 'Text'
+--
+deleteGateway :: Text -- ^ 'dgGatewayARN'
+              -> DeleteGateway
+deleteGateway p1 = DeleteGateway
+    { _dgGatewayARN = p1
+    }
+
+dgGatewayARN :: Lens' DeleteGateway Text
+dgGatewayARN = lens _dgGatewayARN (\s a -> s { _dgGatewayARN = a })
+
+newtype DeleteGatewayResponse = DeleteGatewayResponse
+    { _dgrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteGatewayResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dgrGatewayARN' @::@ 'Maybe' 'Text'
+--
+deleteGatewayResponse :: DeleteGatewayResponse
+deleteGatewayResponse = DeleteGatewayResponse
+    { _dgrGatewayARN = Nothing
+    }
+
+dgrGatewayARN :: Lens' DeleteGatewayResponse (Maybe Text)
+dgrGatewayARN = lens _dgrGatewayARN (\s a -> s { _dgrGatewayARN = a })
+
+instance ToPath DeleteGateway where
+    toPath = const "/"
+
+instance ToQuery DeleteGateway where
+    toQuery = const mempty
+
+instance ToHeaders DeleteGateway
+
+instance ToJSON DeleteGateway where
+    toJSON DeleteGateway{..} = object
+        [ "GatewayARN" .= _dgGatewayARN
+        ]
+
+instance AWSRequest DeleteGateway where
+    type Sv DeleteGateway = StorageGateway
+    type Rs DeleteGateway = DeleteGatewayResponse
+
+    request  = post "DeleteGateway"
+    response = jsonResponse
+
+instance FromJSON DeleteGatewayResponse where
+    parseJSON = withObject "DeleteGatewayResponse" $ \o -> DeleteGatewayResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteSnapshotSchedule.hs b/gen/Network/AWS/StorageGateway/DeleteSnapshotSchedule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteSnapshotSchedule.hs
@@ -0,0 +1,111 @@
+{-# 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.StorageGateway.DeleteSnapshotSchedule
+-- 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)
+
+-- | This operation deletes a snapshot of a volume. You can take snapshots of
+-- your gateway volumes on a scheduled or ad-hoc basis. This API enables you
+-- to delete a snapshot schedule for a volume. For more information, see
+-- Working with Snapshots. In the DeleteSnapshotSchedule request, you identify
+-- the volume by providing its Amazon Resource Name (ARN).
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteSnapshotSchedule.html>
+module Network.AWS.StorageGateway.DeleteSnapshotSchedule
+    (
+    -- * Request
+      DeleteSnapshotSchedule
+    -- ** Request constructor
+    , deleteSnapshotSchedule
+    -- ** Request lenses
+    , dss1VolumeARN
+
+    -- * Response
+    , DeleteSnapshotScheduleResponse
+    -- ** Response constructor
+    , deleteSnapshotScheduleResponse
+    -- ** Response lenses
+    , dssr1VolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DeleteSnapshotSchedule = DeleteSnapshotSchedule
+    { _dss1VolumeARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteSnapshotSchedule' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dss1VolumeARN' @::@ 'Text'
+--
+deleteSnapshotSchedule :: Text -- ^ 'dss1VolumeARN'
+                       -> DeleteSnapshotSchedule
+deleteSnapshotSchedule p1 = DeleteSnapshotSchedule
+    { _dss1VolumeARN = p1
+    }
+
+dss1VolumeARN :: Lens' DeleteSnapshotSchedule Text
+dss1VolumeARN = lens _dss1VolumeARN (\s a -> s { _dss1VolumeARN = a })
+
+newtype DeleteSnapshotScheduleResponse = DeleteSnapshotScheduleResponse
+    { _dssr1VolumeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteSnapshotScheduleResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dssr1VolumeARN' @::@ 'Maybe' 'Text'
+--
+deleteSnapshotScheduleResponse :: DeleteSnapshotScheduleResponse
+deleteSnapshotScheduleResponse = DeleteSnapshotScheduleResponse
+    { _dssr1VolumeARN = Nothing
+    }
+
+dssr1VolumeARN :: Lens' DeleteSnapshotScheduleResponse (Maybe Text)
+dssr1VolumeARN = lens _dssr1VolumeARN (\s a -> s { _dssr1VolumeARN = a })
+
+instance ToPath DeleteSnapshotSchedule where
+    toPath = const "/"
+
+instance ToQuery DeleteSnapshotSchedule where
+    toQuery = const mempty
+
+instance ToHeaders DeleteSnapshotSchedule
+
+instance ToJSON DeleteSnapshotSchedule where
+    toJSON DeleteSnapshotSchedule{..} = object
+        [ "VolumeARN" .= _dss1VolumeARN
+        ]
+
+instance AWSRequest DeleteSnapshotSchedule where
+    type Sv DeleteSnapshotSchedule = StorageGateway
+    type Rs DeleteSnapshotSchedule = DeleteSnapshotScheduleResponse
+
+    request  = post "DeleteSnapshotSchedule"
+    response = jsonResponse
+
+instance FromJSON DeleteSnapshotScheduleResponse where
+    parseJSON = withObject "DeleteSnapshotScheduleResponse" $ \o -> DeleteSnapshotScheduleResponse
+        <$> o .:? "VolumeARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteTape.hs b/gen/Network/AWS/StorageGateway/DeleteTape.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteTape.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.StorageGateway.DeleteTape
+-- 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)
+
+-- | Deletes the specified virtual tape.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteTape.html>
+module Network.AWS.StorageGateway.DeleteTape
+    (
+    -- * Request
+      DeleteTape
+    -- ** Request constructor
+    , deleteTape
+    -- ** Request lenses
+    , dt1GatewayARN
+    , dt1TapeARN
+
+    -- * Response
+    , DeleteTapeResponse
+    -- ** Response constructor
+    , deleteTapeResponse
+    -- ** Response lenses
+    , dtrTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DeleteTape = DeleteTape
+    { _dt1GatewayARN :: Text
+    , _dt1TapeARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteTape' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dt1GatewayARN' @::@ 'Text'
+--
+-- * 'dt1TapeARN' @::@ 'Text'
+--
+deleteTape :: Text -- ^ 'dt1GatewayARN'
+           -> Text -- ^ 'dt1TapeARN'
+           -> DeleteTape
+deleteTape p1 p2 = DeleteTape
+    { _dt1GatewayARN = p1
+    , _dt1TapeARN    = p2
+    }
+
+-- | The unique Amazon Resource Name (ARN) of the gateway that the virtual
+-- tape to delete is associated with. Use the ListGateways operation to
+-- return a list of gateways for your account and region.
+dt1GatewayARN :: Lens' DeleteTape Text
+dt1GatewayARN = lens _dt1GatewayARN (\s a -> s { _dt1GatewayARN = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape to delete.
+dt1TapeARN :: Lens' DeleteTape Text
+dt1TapeARN = lens _dt1TapeARN (\s a -> s { _dt1TapeARN = a })
+
+newtype DeleteTapeResponse = DeleteTapeResponse
+    { _dtrTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteTapeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrTapeARN' @::@ 'Maybe' 'Text'
+--
+deleteTapeResponse :: DeleteTapeResponse
+deleteTapeResponse = DeleteTapeResponse
+    { _dtrTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the deleted virtual tape.
+dtrTapeARN :: Lens' DeleteTapeResponse (Maybe Text)
+dtrTapeARN = lens _dtrTapeARN (\s a -> s { _dtrTapeARN = a })
+
+instance ToPath DeleteTape where
+    toPath = const "/"
+
+instance ToQuery DeleteTape where
+    toQuery = const mempty
+
+instance ToHeaders DeleteTape
+
+instance ToJSON DeleteTape where
+    toJSON DeleteTape{..} = object
+        [ "GatewayARN" .= _dt1GatewayARN
+        , "TapeARN"    .= _dt1TapeARN
+        ]
+
+instance AWSRequest DeleteTape where
+    type Sv DeleteTape = StorageGateway
+    type Rs DeleteTape = DeleteTapeResponse
+
+    request  = post "DeleteTape"
+    response = jsonResponse
+
+instance FromJSON DeleteTapeResponse where
+    parseJSON = withObject "DeleteTapeResponse" $ \o -> DeleteTapeResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteTapeArchive.hs b/gen/Network/AWS/StorageGateway/DeleteTapeArchive.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteTapeArchive.hs
@@ -0,0 +1,111 @@
+{-# 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.StorageGateway.DeleteTapeArchive
+-- 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)
+
+-- | Deletes the specified virtual tape from the virtual tape shelf (VTS).
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteTapeArchive.html>
+module Network.AWS.StorageGateway.DeleteTapeArchive
+    (
+    -- * Request
+      DeleteTapeArchive
+    -- ** Request constructor
+    , deleteTapeArchive
+    -- ** Request lenses
+    , dtaTapeARN
+
+    -- * Response
+    , DeleteTapeArchiveResponse
+    -- ** Response constructor
+    , deleteTapeArchiveResponse
+    -- ** Response lenses
+    , dtarTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DeleteTapeArchive = DeleteTapeArchive
+    { _dtaTapeARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteTapeArchive' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtaTapeARN' @::@ 'Text'
+--
+deleteTapeArchive :: Text -- ^ 'dtaTapeARN'
+                  -> DeleteTapeArchive
+deleteTapeArchive p1 = DeleteTapeArchive
+    { _dtaTapeARN = p1
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape to delete from the
+-- virtual tape shelf (VTS).
+dtaTapeARN :: Lens' DeleteTapeArchive Text
+dtaTapeARN = lens _dtaTapeARN (\s a -> s { _dtaTapeARN = a })
+
+newtype DeleteTapeArchiveResponse = DeleteTapeArchiveResponse
+    { _dtarTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteTapeArchiveResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtarTapeARN' @::@ 'Maybe' 'Text'
+--
+deleteTapeArchiveResponse :: DeleteTapeArchiveResponse
+deleteTapeArchiveResponse = DeleteTapeArchiveResponse
+    { _dtarTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape that was deleted from
+-- the virtual tape shelf (VTS).
+dtarTapeARN :: Lens' DeleteTapeArchiveResponse (Maybe Text)
+dtarTapeARN = lens _dtarTapeARN (\s a -> s { _dtarTapeARN = a })
+
+instance ToPath DeleteTapeArchive where
+    toPath = const "/"
+
+instance ToQuery DeleteTapeArchive where
+    toQuery = const mempty
+
+instance ToHeaders DeleteTapeArchive
+
+instance ToJSON DeleteTapeArchive where
+    toJSON DeleteTapeArchive{..} = object
+        [ "TapeARN" .= _dtaTapeARN
+        ]
+
+instance AWSRequest DeleteTapeArchive where
+    type Sv DeleteTapeArchive = StorageGateway
+    type Rs DeleteTapeArchive = DeleteTapeArchiveResponse
+
+    request  = post "DeleteTapeArchive"
+    response = jsonResponse
+
+instance FromJSON DeleteTapeArchiveResponse where
+    parseJSON = withObject "DeleteTapeArchiveResponse" $ \o -> DeleteTapeArchiveResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/DeleteVolume.hs b/gen/Network/AWS/StorageGateway/DeleteVolume.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DeleteVolume.hs
@@ -0,0 +1,121 @@
+{-# 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.StorageGateway.DeleteVolume
+-- 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)
+
+-- | This operation delete the specified gateway volume that you previously
+-- created using the CreateStorediSCSIVolume API. For gateway-stored volumes,
+-- the local disk that was configured as the storage volume is not deleted.
+-- You can reuse the local disk to create another storage volume. Before you
+-- delete a gateway volume, make sure there are no iSCSI connections to the
+-- volume you are deleting. You should also make sure there is no snapshot in
+-- progress. You can use the Amazon Elastic Compute Cloud (Amazon EC2) API to
+-- query snapshots on the volume you are deleting and check the snapshot
+-- status. For more information, go to DescribeSnapshots in the Amazon Elastic
+-- Compute Cloud API Reference. In the request, you must provide the Amazon
+-- Resource Name (ARN) of the storage volume you want to delete.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DeleteVolume.html>
+module Network.AWS.StorageGateway.DeleteVolume
+    (
+    -- * Request
+      DeleteVolume
+    -- ** Request constructor
+    , deleteVolume
+    -- ** Request lenses
+    , dvVolumeARN
+
+    -- * Response
+    , DeleteVolumeResponse
+    -- ** Response constructor
+    , deleteVolumeResponse
+    -- ** Response lenses
+    , dvrVolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DeleteVolume = DeleteVolume
+    { _dvVolumeARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteVolume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvVolumeARN' @::@ 'Text'
+--
+deleteVolume :: Text -- ^ 'dvVolumeARN'
+             -> DeleteVolume
+deleteVolume p1 = DeleteVolume
+    { _dvVolumeARN = p1
+    }
+
+-- | The Amazon Resource Name (ARN) of the volume. Use the ListVolumes
+-- operation to return a list of gateway volumes.
+dvVolumeARN :: Lens' DeleteVolume Text
+dvVolumeARN = lens _dvVolumeARN (\s a -> s { _dvVolumeARN = a })
+
+newtype DeleteVolumeResponse = DeleteVolumeResponse
+    { _dvrVolumeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DeleteVolumeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvrVolumeARN' @::@ 'Maybe' 'Text'
+--
+deleteVolumeResponse :: DeleteVolumeResponse
+deleteVolumeResponse = DeleteVolumeResponse
+    { _dvrVolumeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the storage volume that was deleted. It
+-- is the same ARN you provided in the request.
+dvrVolumeARN :: Lens' DeleteVolumeResponse (Maybe Text)
+dvrVolumeARN = lens _dvrVolumeARN (\s a -> s { _dvrVolumeARN = a })
+
+instance ToPath DeleteVolume where
+    toPath = const "/"
+
+instance ToQuery DeleteVolume where
+    toQuery = const mempty
+
+instance ToHeaders DeleteVolume
+
+instance ToJSON DeleteVolume where
+    toJSON DeleteVolume{..} = object
+        [ "VolumeARN" .= _dvVolumeARN
+        ]
+
+instance AWSRequest DeleteVolume where
+    type Sv DeleteVolume = StorageGateway
+    type Rs DeleteVolume = DeleteVolumeResponse
+
+    request  = post "DeleteVolume"
+    response = jsonResponse
+
+instance FromJSON DeleteVolumeResponse where
+    parseJSON = withObject "DeleteVolumeResponse" $ \o -> DeleteVolumeResponse
+        <$> o .:? "VolumeARN"
diff --git a/gen/Network/AWS/StorageGateway/DescribeBandwidthRateLimit.hs b/gen/Network/AWS/StorageGateway/DescribeBandwidthRateLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeBandwidthRateLimit.hs
@@ -0,0 +1,141 @@
+{-# 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.StorageGateway.DescribeBandwidthRateLimit
+-- 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)
+
+-- | This operation returns the bandwidth rate limits of a gateway. By default,
+-- these limits are not set, which means no bandwidth rate limiting is in
+-- effect. This operation only returns a value for a bandwidth rate limit only
+-- if the limit is set. If no limits are set for the gateway, then this
+-- operation returns only the gateway ARN in the response body. To specify
+-- which gateway to describe, use the Amazon Resource Name (ARN) of the
+-- gateway in your request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeBandwidthRateLimit.html>
+module Network.AWS.StorageGateway.DescribeBandwidthRateLimit
+    (
+    -- * Request
+      DescribeBandwidthRateLimit
+    -- ** Request constructor
+    , describeBandwidthRateLimit
+    -- ** Request lenses
+    , dbrlGatewayARN
+
+    -- * Response
+    , DescribeBandwidthRateLimitResponse
+    -- ** Response constructor
+    , describeBandwidthRateLimitResponse
+    -- ** Response lenses
+    , dbrlrAverageDownloadRateLimitInBitsPerSec
+    , dbrlrAverageUploadRateLimitInBitsPerSec
+    , dbrlrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeBandwidthRateLimit = DescribeBandwidthRateLimit
+    { _dbrlGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeBandwidthRateLimit' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dbrlGatewayARN' @::@ 'Text'
+--
+describeBandwidthRateLimit :: Text -- ^ 'dbrlGatewayARN'
+                           -> DescribeBandwidthRateLimit
+describeBandwidthRateLimit p1 = DescribeBandwidthRateLimit
+    { _dbrlGatewayARN = p1
+    }
+
+dbrlGatewayARN :: Lens' DescribeBandwidthRateLimit Text
+dbrlGatewayARN = lens _dbrlGatewayARN (\s a -> s { _dbrlGatewayARN = a })
+
+data DescribeBandwidthRateLimitResponse = DescribeBandwidthRateLimitResponse
+    { _dbrlrAverageDownloadRateLimitInBitsPerSec :: Maybe Nat
+    , _dbrlrAverageUploadRateLimitInBitsPerSec   :: Maybe Nat
+    , _dbrlrGatewayARN                           :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeBandwidthRateLimitResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dbrlrAverageDownloadRateLimitInBitsPerSec' @::@ 'Maybe' 'Natural'
+--
+-- * 'dbrlrAverageUploadRateLimitInBitsPerSec' @::@ 'Maybe' 'Natural'
+--
+-- * 'dbrlrGatewayARN' @::@ 'Maybe' 'Text'
+--
+describeBandwidthRateLimitResponse :: DescribeBandwidthRateLimitResponse
+describeBandwidthRateLimitResponse = DescribeBandwidthRateLimitResponse
+    { _dbrlrGatewayARN                           = Nothing
+    , _dbrlrAverageUploadRateLimitInBitsPerSec   = Nothing
+    , _dbrlrAverageDownloadRateLimitInBitsPerSec = Nothing
+    }
+
+-- | The average download bandwidth rate limit in bits per second. This field
+-- does not appear in the response if the download rate limit is not set.
+dbrlrAverageDownloadRateLimitInBitsPerSec :: Lens' DescribeBandwidthRateLimitResponse (Maybe Natural)
+dbrlrAverageDownloadRateLimitInBitsPerSec =
+    lens _dbrlrAverageDownloadRateLimitInBitsPerSec
+        (\s a -> s { _dbrlrAverageDownloadRateLimitInBitsPerSec = a })
+            . mapping _Nat
+
+-- | The average upload bandwidth rate limit in bits per second. This field
+-- does not appear in the response if the upload rate limit is not set.
+dbrlrAverageUploadRateLimitInBitsPerSec :: Lens' DescribeBandwidthRateLimitResponse (Maybe Natural)
+dbrlrAverageUploadRateLimitInBitsPerSec =
+    lens _dbrlrAverageUploadRateLimitInBitsPerSec
+        (\s a -> s { _dbrlrAverageUploadRateLimitInBitsPerSec = a })
+            . mapping _Nat
+
+dbrlrGatewayARN :: Lens' DescribeBandwidthRateLimitResponse (Maybe Text)
+dbrlrGatewayARN = lens _dbrlrGatewayARN (\s a -> s { _dbrlrGatewayARN = a })
+
+instance ToPath DescribeBandwidthRateLimit where
+    toPath = const "/"
+
+instance ToQuery DescribeBandwidthRateLimit where
+    toQuery = const mempty
+
+instance ToHeaders DescribeBandwidthRateLimit
+
+instance ToJSON DescribeBandwidthRateLimit where
+    toJSON DescribeBandwidthRateLimit{..} = object
+        [ "GatewayARN" .= _dbrlGatewayARN
+        ]
+
+instance AWSRequest DescribeBandwidthRateLimit where
+    type Sv DescribeBandwidthRateLimit = StorageGateway
+    type Rs DescribeBandwidthRateLimit = DescribeBandwidthRateLimitResponse
+
+    request  = post "DescribeBandwidthRateLimit"
+    response = jsonResponse
+
+instance FromJSON DescribeBandwidthRateLimitResponse where
+    parseJSON = withObject "DescribeBandwidthRateLimitResponse" $ \o -> DescribeBandwidthRateLimitResponse
+        <$> o .:? "AverageDownloadRateLimitInBitsPerSec"
+        <*> o .:? "AverageUploadRateLimitInBitsPerSec"
+        <*> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/DescribeCache.hs b/gen/Network/AWS/StorageGateway/DescribeCache.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeCache.hs
@@ -0,0 +1,170 @@
+{-# 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.StorageGateway.DescribeCache
+-- 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)
+
+-- | This operation returns information about the cache of a gateway. This
+-- operation is supported only for the gateway-cached volume architecture. The
+-- response includes disk IDs that are configured as cache, and it includes
+-- the amount of cache allocated and used.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeCache.html>
+module Network.AWS.StorageGateway.DescribeCache
+    (
+    -- * Request
+      DescribeCache
+    -- ** Request constructor
+    , describeCache
+    -- ** Request lenses
+    , dcGatewayARN
+
+    -- * Response
+    , DescribeCacheResponse
+    -- ** Response constructor
+    , describeCacheResponse
+    -- ** Response lenses
+    , dcrCacheAllocatedInBytes
+    , dcrCacheDirtyPercentage
+    , dcrCacheHitPercentage
+    , dcrCacheMissPercentage
+    , dcrCacheUsedPercentage
+    , dcrDiskIds
+    , dcrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeCache = DescribeCache
+    { _dcGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeCache' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcGatewayARN' @::@ 'Text'
+--
+describeCache :: Text -- ^ 'dcGatewayARN'
+              -> DescribeCache
+describeCache p1 = DescribeCache
+    { _dcGatewayARN = p1
+    }
+
+dcGatewayARN :: Lens' DescribeCache Text
+dcGatewayARN = lens _dcGatewayARN (\s a -> s { _dcGatewayARN = a })
+
+data DescribeCacheResponse = DescribeCacheResponse
+    { _dcrCacheAllocatedInBytes :: Maybe Integer
+    , _dcrCacheDirtyPercentage  :: Maybe Double
+    , _dcrCacheHitPercentage    :: Maybe Double
+    , _dcrCacheMissPercentage   :: Maybe Double
+    , _dcrCacheUsedPercentage   :: Maybe Double
+    , _dcrDiskIds               :: List "DiskIds" Text
+    , _dcrGatewayARN            :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeCacheResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcrCacheAllocatedInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'dcrCacheDirtyPercentage' @::@ 'Maybe' 'Double'
+--
+-- * 'dcrCacheHitPercentage' @::@ 'Maybe' 'Double'
+--
+-- * 'dcrCacheMissPercentage' @::@ 'Maybe' 'Double'
+--
+-- * 'dcrCacheUsedPercentage' @::@ 'Maybe' 'Double'
+--
+-- * 'dcrDiskIds' @::@ ['Text']
+--
+-- * 'dcrGatewayARN' @::@ 'Maybe' 'Text'
+--
+describeCacheResponse :: DescribeCacheResponse
+describeCacheResponse = DescribeCacheResponse
+    { _dcrGatewayARN            = Nothing
+    , _dcrDiskIds               = mempty
+    , _dcrCacheAllocatedInBytes = Nothing
+    , _dcrCacheUsedPercentage   = Nothing
+    , _dcrCacheDirtyPercentage  = Nothing
+    , _dcrCacheHitPercentage    = Nothing
+    , _dcrCacheMissPercentage   = Nothing
+    }
+
+dcrCacheAllocatedInBytes :: Lens' DescribeCacheResponse (Maybe Integer)
+dcrCacheAllocatedInBytes =
+    lens _dcrCacheAllocatedInBytes
+        (\s a -> s { _dcrCacheAllocatedInBytes = a })
+
+dcrCacheDirtyPercentage :: Lens' DescribeCacheResponse (Maybe Double)
+dcrCacheDirtyPercentage =
+    lens _dcrCacheDirtyPercentage (\s a -> s { _dcrCacheDirtyPercentage = a })
+
+dcrCacheHitPercentage :: Lens' DescribeCacheResponse (Maybe Double)
+dcrCacheHitPercentage =
+    lens _dcrCacheHitPercentage (\s a -> s { _dcrCacheHitPercentage = a })
+
+dcrCacheMissPercentage :: Lens' DescribeCacheResponse (Maybe Double)
+dcrCacheMissPercentage =
+    lens _dcrCacheMissPercentage (\s a -> s { _dcrCacheMissPercentage = a })
+
+dcrCacheUsedPercentage :: Lens' DescribeCacheResponse (Maybe Double)
+dcrCacheUsedPercentage =
+    lens _dcrCacheUsedPercentage (\s a -> s { _dcrCacheUsedPercentage = a })
+
+dcrDiskIds :: Lens' DescribeCacheResponse [Text]
+dcrDiskIds = lens _dcrDiskIds (\s a -> s { _dcrDiskIds = a }) . _List
+
+dcrGatewayARN :: Lens' DescribeCacheResponse (Maybe Text)
+dcrGatewayARN = lens _dcrGatewayARN (\s a -> s { _dcrGatewayARN = a })
+
+instance ToPath DescribeCache where
+    toPath = const "/"
+
+instance ToQuery DescribeCache where
+    toQuery = const mempty
+
+instance ToHeaders DescribeCache
+
+instance ToJSON DescribeCache where
+    toJSON DescribeCache{..} = object
+        [ "GatewayARN" .= _dcGatewayARN
+        ]
+
+instance AWSRequest DescribeCache where
+    type Sv DescribeCache = StorageGateway
+    type Rs DescribeCache = DescribeCacheResponse
+
+    request  = post "DescribeCache"
+    response = jsonResponse
+
+instance FromJSON DescribeCacheResponse where
+    parseJSON = withObject "DescribeCacheResponse" $ \o -> DescribeCacheResponse
+        <$> o .:? "CacheAllocatedInBytes"
+        <*> o .:? "CacheDirtyPercentage"
+        <*> o .:? "CacheHitPercentage"
+        <*> o .:? "CacheMissPercentage"
+        <*> o .:? "CacheUsedPercentage"
+        <*> o .:  "DiskIds"
+        <*> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/DescribeCachediSCSIVolumes.hs b/gen/Network/AWS/StorageGateway/DescribeCachediSCSIVolumes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeCachediSCSIVolumes.hs
@@ -0,0 +1,129 @@
+{-# 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.StorageGateway.DescribeCachediSCSIVolumes
+-- 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)
+
+-- | This operation returns a description of the gateway volumes specified in
+-- the request. This operation is supported only for the gateway-cached volume
+-- architecture. The list of gateway volumes in the request must be from one
+-- gateway. In the response Amazon Storage Gateway returns volume information
+-- sorted by volume Amazon Resource Name (ARN).
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeCachediSCSIVolumes.html>
+module Network.AWS.StorageGateway.DescribeCachediSCSIVolumes
+    (
+    -- * Request
+      DescribeCachediSCSIVolumes
+    -- ** Request constructor
+    , describeCachediSCSIVolumes
+    -- ** Request lenses
+    , dcscsivVolumeARNs
+
+    -- * Response
+    , DescribeCachediSCSIVolumesResponse
+    -- ** Response constructor
+    , describeCachediSCSIVolumesResponse
+    -- ** Response lenses
+    , dcscsivrCachediSCSIVolumes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeCachediSCSIVolumes = DescribeCachediSCSIVolumes
+    { _dcscsivVolumeARNs :: List "VolumeARNs" Text
+    } deriving (Eq, Ord, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeCachediSCSIVolumes where
+    type Item DescribeCachediSCSIVolumes = Text
+
+    fromList = DescribeCachediSCSIVolumes . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dcscsivVolumeARNs
+
+-- | 'DescribeCachediSCSIVolumes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcscsivVolumeARNs' @::@ ['Text']
+--
+describeCachediSCSIVolumes :: DescribeCachediSCSIVolumes
+describeCachediSCSIVolumes = DescribeCachediSCSIVolumes
+    { _dcscsivVolumeARNs = mempty
+    }
+
+dcscsivVolumeARNs :: Lens' DescribeCachediSCSIVolumes [Text]
+dcscsivVolumeARNs =
+    lens _dcscsivVolumeARNs (\s a -> s { _dcscsivVolumeARNs = a })
+        . _List
+
+newtype DescribeCachediSCSIVolumesResponse = DescribeCachediSCSIVolumesResponse
+    { _dcscsivrCachediSCSIVolumes :: List "CachediSCSIVolumes" CachediSCSIVolume
+    } deriving (Eq, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeCachediSCSIVolumesResponse where
+    type Item DescribeCachediSCSIVolumesResponse = CachediSCSIVolume
+
+    fromList = DescribeCachediSCSIVolumesResponse . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dcscsivrCachediSCSIVolumes
+
+-- | 'DescribeCachediSCSIVolumesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcscsivrCachediSCSIVolumes' @::@ ['CachediSCSIVolume']
+--
+describeCachediSCSIVolumesResponse :: DescribeCachediSCSIVolumesResponse
+describeCachediSCSIVolumesResponse = DescribeCachediSCSIVolumesResponse
+    { _dcscsivrCachediSCSIVolumes = mempty
+    }
+
+-- | An array of objects where each object contains metadata about one cached
+-- volume.
+dcscsivrCachediSCSIVolumes :: Lens' DescribeCachediSCSIVolumesResponse [CachediSCSIVolume]
+dcscsivrCachediSCSIVolumes =
+    lens _dcscsivrCachediSCSIVolumes
+        (\s a -> s { _dcscsivrCachediSCSIVolumes = a })
+            . _List
+
+instance ToPath DescribeCachediSCSIVolumes where
+    toPath = const "/"
+
+instance ToQuery DescribeCachediSCSIVolumes where
+    toQuery = const mempty
+
+instance ToHeaders DescribeCachediSCSIVolumes
+
+instance ToJSON DescribeCachediSCSIVolumes where
+    toJSON DescribeCachediSCSIVolumes{..} = object
+        [ "VolumeARNs" .= _dcscsivVolumeARNs
+        ]
+
+instance AWSRequest DescribeCachediSCSIVolumes where
+    type Sv DescribeCachediSCSIVolumes = StorageGateway
+    type Rs DescribeCachediSCSIVolumes = DescribeCachediSCSIVolumesResponse
+
+    request  = post "DescribeCachediSCSIVolumes"
+    response = jsonResponse
+
+instance FromJSON DescribeCachediSCSIVolumesResponse where
+    parseJSON = withObject "DescribeCachediSCSIVolumesResponse" $ \o -> DescribeCachediSCSIVolumesResponse
+        <$> o .:  "CachediSCSIVolumes"
diff --git a/gen/Network/AWS/StorageGateway/DescribeChapCredentials.hs b/gen/Network/AWS/StorageGateway/DescribeChapCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeChapCredentials.hs
@@ -0,0 +1,131 @@
+{-# 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.StorageGateway.DescribeChapCredentials
+-- 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)
+
+-- | This operation returns an array of Challenge-Handshake Authentication
+-- Protocol (CHAP) credentials information for a specified iSCSI target, one
+-- for each target-initiator pair.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeChapCredentials.html>
+module Network.AWS.StorageGateway.DescribeChapCredentials
+    (
+    -- * Request
+      DescribeChapCredentials
+    -- ** Request constructor
+    , describeChapCredentials
+    -- ** Request lenses
+    , dccTargetARN
+
+    -- * Response
+    , DescribeChapCredentialsResponse
+    -- ** Response constructor
+    , describeChapCredentialsResponse
+    -- ** Response lenses
+    , dccrChapCredentials
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeChapCredentials = DescribeChapCredentials
+    { _dccTargetARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeChapCredentials' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dccTargetARN' @::@ 'Text'
+--
+describeChapCredentials :: Text -- ^ 'dccTargetARN'
+                        -> DescribeChapCredentials
+describeChapCredentials p1 = DescribeChapCredentials
+    { _dccTargetARN = p1
+    }
+
+-- | The Amazon Resource Name (ARN) of the iSCSI volume target. Use the
+-- DescribeStorediSCSIVolumes operation to return to retrieve the TargetARN
+-- for specified VolumeARN.
+dccTargetARN :: Lens' DescribeChapCredentials Text
+dccTargetARN = lens _dccTargetARN (\s a -> s { _dccTargetARN = a })
+
+newtype DescribeChapCredentialsResponse = DescribeChapCredentialsResponse
+    { _dccrChapCredentials :: List "ChapCredentials" ChapInfo
+    } deriving (Eq, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeChapCredentialsResponse where
+    type Item DescribeChapCredentialsResponse = ChapInfo
+
+    fromList = DescribeChapCredentialsResponse . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dccrChapCredentials
+
+-- | 'DescribeChapCredentialsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dccrChapCredentials' @::@ ['ChapInfo']
+--
+describeChapCredentialsResponse :: DescribeChapCredentialsResponse
+describeChapCredentialsResponse = DescribeChapCredentialsResponse
+    { _dccrChapCredentials = mempty
+    }
+
+-- | An array of ChapInfo objects that represent CHAP credentials. Each object
+-- in the array contains CHAP credential information for one
+-- target-initiator pair. If no CHAP credentials are set, an empty array is
+-- returned. CHAP credential information is provided in a JSON object with
+-- the following fields: InitiatorName: The iSCSI initiator that connects to
+-- the target. SecretToAuthenticateInitiator: The secret key that the
+-- initiator (e.g. Windows client) must provide to participate in mutual
+-- CHAP with the target. SecretToAuthenticateTarget: The secret key that the
+-- target must provide to participate in mutual CHAP with the initiator
+-- (e.g. Windows client). TargetARN: The Amazon Resource Name (ARN) of the
+-- storage volume.
+dccrChapCredentials :: Lens' DescribeChapCredentialsResponse [ChapInfo]
+dccrChapCredentials =
+    lens _dccrChapCredentials (\s a -> s { _dccrChapCredentials = a })
+        . _List
+
+instance ToPath DescribeChapCredentials where
+    toPath = const "/"
+
+instance ToQuery DescribeChapCredentials where
+    toQuery = const mempty
+
+instance ToHeaders DescribeChapCredentials
+
+instance ToJSON DescribeChapCredentials where
+    toJSON DescribeChapCredentials{..} = object
+        [ "TargetARN" .= _dccTargetARN
+        ]
+
+instance AWSRequest DescribeChapCredentials where
+    type Sv DescribeChapCredentials = StorageGateway
+    type Rs DescribeChapCredentials = DescribeChapCredentialsResponse
+
+    request  = post "DescribeChapCredentials"
+    response = jsonResponse
+
+instance FromJSON DescribeChapCredentialsResponse where
+    parseJSON = withObject "DescribeChapCredentialsResponse" $ \o -> DescribeChapCredentialsResponse
+        <$> o .:  "ChapCredentials"
diff --git a/gen/Network/AWS/StorageGateway/DescribeGatewayInformation.hs b/gen/Network/AWS/StorageGateway/DescribeGatewayInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeGatewayInformation.hs
@@ -0,0 +1,180 @@
+{-# 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.StorageGateway.DescribeGatewayInformation
+-- 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)
+
+-- | This operation returns metadata about a gateway such as its name, network
+-- interfaces, configured time zone, and the state (whether the gateway is
+-- running or not). To specify which gateway to describe, use the Amazon
+-- Resource Name (ARN) of the gateway in your request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeGatewayInformation.html>
+module Network.AWS.StorageGateway.DescribeGatewayInformation
+    (
+    -- * Request
+      DescribeGatewayInformation
+    -- ** Request constructor
+    , describeGatewayInformation
+    -- ** Request lenses
+    , dgiGatewayARN
+
+    -- * Response
+    , DescribeGatewayInformationResponse
+    -- ** Response constructor
+    , describeGatewayInformationResponse
+    -- ** Response lenses
+    , dgirGatewayARN
+    , dgirGatewayId
+    , dgirGatewayNetworkInterfaces
+    , dgirGatewayState
+    , dgirGatewayTimezone
+    , dgirGatewayType
+    , dgirNextUpdateAvailabilityDate
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeGatewayInformation = DescribeGatewayInformation
+    { _dgiGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeGatewayInformation' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dgiGatewayARN' @::@ 'Text'
+--
+describeGatewayInformation :: Text -- ^ 'dgiGatewayARN'
+                           -> DescribeGatewayInformation
+describeGatewayInformation p1 = DescribeGatewayInformation
+    { _dgiGatewayARN = p1
+    }
+
+dgiGatewayARN :: Lens' DescribeGatewayInformation Text
+dgiGatewayARN = lens _dgiGatewayARN (\s a -> s { _dgiGatewayARN = a })
+
+data DescribeGatewayInformationResponse = DescribeGatewayInformationResponse
+    { _dgirGatewayARN                 :: Maybe Text
+    , _dgirGatewayId                  :: Maybe Text
+    , _dgirGatewayNetworkInterfaces   :: List "GatewayNetworkInterfaces" NetworkInterface
+    , _dgirGatewayState               :: Maybe Text
+    , _dgirGatewayTimezone            :: Maybe Text
+    , _dgirGatewayType                :: Maybe Text
+    , _dgirNextUpdateAvailabilityDate :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeGatewayInformationResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dgirGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dgirGatewayId' @::@ 'Maybe' 'Text'
+--
+-- * 'dgirGatewayNetworkInterfaces' @::@ ['NetworkInterface']
+--
+-- * 'dgirGatewayState' @::@ 'Maybe' 'Text'
+--
+-- * 'dgirGatewayTimezone' @::@ 'Maybe' 'Text'
+--
+-- * 'dgirGatewayType' @::@ 'Maybe' 'Text'
+--
+-- * 'dgirNextUpdateAvailabilityDate' @::@ 'Maybe' 'Text'
+--
+describeGatewayInformationResponse :: DescribeGatewayInformationResponse
+describeGatewayInformationResponse = DescribeGatewayInformationResponse
+    { _dgirGatewayARN                 = Nothing
+    , _dgirGatewayId                  = Nothing
+    , _dgirGatewayTimezone            = Nothing
+    , _dgirGatewayState               = Nothing
+    , _dgirGatewayNetworkInterfaces   = mempty
+    , _dgirGatewayType                = Nothing
+    , _dgirNextUpdateAvailabilityDate = Nothing
+    }
+
+dgirGatewayARN :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirGatewayARN = lens _dgirGatewayARN (\s a -> s { _dgirGatewayARN = a })
+
+-- | The gateway ID.
+dgirGatewayId :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirGatewayId = lens _dgirGatewayId (\s a -> s { _dgirGatewayId = a })
+
+-- | A NetworkInterface array that contains descriptions of the gateway
+-- network interfaces.
+dgirGatewayNetworkInterfaces :: Lens' DescribeGatewayInformationResponse [NetworkInterface]
+dgirGatewayNetworkInterfaces =
+    lens _dgirGatewayNetworkInterfaces
+        (\s a -> s { _dgirGatewayNetworkInterfaces = a })
+            . _List
+
+-- | One of the values that indicates the operating state of the gateway.
+dgirGatewayState :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirGatewayState = lens _dgirGatewayState (\s a -> s { _dgirGatewayState = a })
+
+-- | One of the values that indicates the time zone configured for the
+-- gateway.
+dgirGatewayTimezone :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirGatewayTimezone =
+    lens _dgirGatewayTimezone (\s a -> s { _dgirGatewayTimezone = a })
+
+-- | TBD.
+dgirGatewayType :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirGatewayType = lens _dgirGatewayType (\s a -> s { _dgirGatewayType = a })
+
+-- | The date at which an update to the gateway is available. This date is in
+-- the time zone of the gateway. If the gateway is not available for an
+-- update this field is not returned in the response.
+dgirNextUpdateAvailabilityDate :: Lens' DescribeGatewayInformationResponse (Maybe Text)
+dgirNextUpdateAvailabilityDate =
+    lens _dgirNextUpdateAvailabilityDate
+        (\s a -> s { _dgirNextUpdateAvailabilityDate = a })
+
+instance ToPath DescribeGatewayInformation where
+    toPath = const "/"
+
+instance ToQuery DescribeGatewayInformation where
+    toQuery = const mempty
+
+instance ToHeaders DescribeGatewayInformation
+
+instance ToJSON DescribeGatewayInformation where
+    toJSON DescribeGatewayInformation{..} = object
+        [ "GatewayARN" .= _dgiGatewayARN
+        ]
+
+instance AWSRequest DescribeGatewayInformation where
+    type Sv DescribeGatewayInformation = StorageGateway
+    type Rs DescribeGatewayInformation = DescribeGatewayInformationResponse
+
+    request  = post "DescribeGatewayInformation"
+    response = jsonResponse
+
+instance FromJSON DescribeGatewayInformationResponse where
+    parseJSON = withObject "DescribeGatewayInformationResponse" $ \o -> DescribeGatewayInformationResponse
+        <$> o .:? "GatewayARN"
+        <*> o .:? "GatewayId"
+        <*> o .:  "GatewayNetworkInterfaces"
+        <*> o .:? "GatewayState"
+        <*> o .:? "GatewayTimezone"
+        <*> o .:? "GatewayType"
+        <*> o .:? "NextUpdateAvailabilityDate"
diff --git a/gen/Network/AWS/StorageGateway/DescribeMaintenanceStartTime.hs b/gen/Network/AWS/StorageGateway/DescribeMaintenanceStartTime.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeMaintenanceStartTime.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.StorageGateway.DescribeMaintenanceStartTime
+-- 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)
+
+-- | This operation returns your gateway's weekly maintenance start time
+-- including the day and time of the week. Note that values are in terms of
+-- the gateway's time zone.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeMaintenanceStartTime.html>
+module Network.AWS.StorageGateway.DescribeMaintenanceStartTime
+    (
+    -- * Request
+      DescribeMaintenanceStartTime
+    -- ** Request constructor
+    , describeMaintenanceStartTime
+    -- ** Request lenses
+    , dmstGatewayARN
+
+    -- * Response
+    , DescribeMaintenanceStartTimeResponse
+    -- ** Response constructor
+    , describeMaintenanceStartTimeResponse
+    -- ** Response lenses
+    , dmstrDayOfWeek
+    , dmstrGatewayARN
+    , dmstrHourOfDay
+    , dmstrMinuteOfHour
+    , dmstrTimezone
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeMaintenanceStartTime = DescribeMaintenanceStartTime
+    { _dmstGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeMaintenanceStartTime' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dmstGatewayARN' @::@ 'Text'
+--
+describeMaintenanceStartTime :: Text -- ^ 'dmstGatewayARN'
+                             -> DescribeMaintenanceStartTime
+describeMaintenanceStartTime p1 = DescribeMaintenanceStartTime
+    { _dmstGatewayARN = p1
+    }
+
+dmstGatewayARN :: Lens' DescribeMaintenanceStartTime Text
+dmstGatewayARN = lens _dmstGatewayARN (\s a -> s { _dmstGatewayARN = a })
+
+data DescribeMaintenanceStartTimeResponse = DescribeMaintenanceStartTimeResponse
+    { _dmstrDayOfWeek    :: Maybe Nat
+    , _dmstrGatewayARN   :: Maybe Text
+    , _dmstrHourOfDay    :: Maybe Nat
+    , _dmstrMinuteOfHour :: Maybe Nat
+    , _dmstrTimezone     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeMaintenanceStartTimeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dmstrDayOfWeek' @::@ 'Maybe' 'Natural'
+--
+-- * 'dmstrGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dmstrHourOfDay' @::@ 'Maybe' 'Natural'
+--
+-- * 'dmstrMinuteOfHour' @::@ 'Maybe' 'Natural'
+--
+-- * 'dmstrTimezone' @::@ 'Maybe' 'Text'
+--
+describeMaintenanceStartTimeResponse :: DescribeMaintenanceStartTimeResponse
+describeMaintenanceStartTimeResponse = DescribeMaintenanceStartTimeResponse
+    { _dmstrGatewayARN   = Nothing
+    , _dmstrHourOfDay    = Nothing
+    , _dmstrMinuteOfHour = Nothing
+    , _dmstrDayOfWeek    = Nothing
+    , _dmstrTimezone     = Nothing
+    }
+
+dmstrDayOfWeek :: Lens' DescribeMaintenanceStartTimeResponse (Maybe Natural)
+dmstrDayOfWeek = lens _dmstrDayOfWeek (\s a -> s { _dmstrDayOfWeek = a }) . mapping _Nat
+
+dmstrGatewayARN :: Lens' DescribeMaintenanceStartTimeResponse (Maybe Text)
+dmstrGatewayARN = lens _dmstrGatewayARN (\s a -> s { _dmstrGatewayARN = a })
+
+dmstrHourOfDay :: Lens' DescribeMaintenanceStartTimeResponse (Maybe Natural)
+dmstrHourOfDay = lens _dmstrHourOfDay (\s a -> s { _dmstrHourOfDay = a }) . mapping _Nat
+
+dmstrMinuteOfHour :: Lens' DescribeMaintenanceStartTimeResponse (Maybe Natural)
+dmstrMinuteOfHour =
+    lens _dmstrMinuteOfHour (\s a -> s { _dmstrMinuteOfHour = a })
+        . mapping _Nat
+
+dmstrTimezone :: Lens' DescribeMaintenanceStartTimeResponse (Maybe Text)
+dmstrTimezone = lens _dmstrTimezone (\s a -> s { _dmstrTimezone = a })
+
+instance ToPath DescribeMaintenanceStartTime where
+    toPath = const "/"
+
+instance ToQuery DescribeMaintenanceStartTime where
+    toQuery = const mempty
+
+instance ToHeaders DescribeMaintenanceStartTime
+
+instance ToJSON DescribeMaintenanceStartTime where
+    toJSON DescribeMaintenanceStartTime{..} = object
+        [ "GatewayARN" .= _dmstGatewayARN
+        ]
+
+instance AWSRequest DescribeMaintenanceStartTime where
+    type Sv DescribeMaintenanceStartTime = StorageGateway
+    type Rs DescribeMaintenanceStartTime = DescribeMaintenanceStartTimeResponse
+
+    request  = post "DescribeMaintenanceStartTime"
+    response = jsonResponse
+
+instance FromJSON DescribeMaintenanceStartTimeResponse where
+    parseJSON = withObject "DescribeMaintenanceStartTimeResponse" $ \o -> DescribeMaintenanceStartTimeResponse
+        <$> o .:? "DayOfWeek"
+        <*> o .:? "GatewayARN"
+        <*> o .:? "HourOfDay"
+        <*> o .:? "MinuteOfHour"
+        <*> o .:? "Timezone"
diff --git a/gen/Network/AWS/StorageGateway/DescribeSnapshotSchedule.hs b/gen/Network/AWS/StorageGateway/DescribeSnapshotSchedule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeSnapshotSchedule.hs
@@ -0,0 +1,149 @@
+{-# 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.StorageGateway.DescribeSnapshotSchedule
+-- 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)
+
+-- | This operation describes the snapshot schedule for the specified gateway
+-- volume. The snapshot schedule information includes intervals at which
+-- snapshots are automatically initiated on the volume.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeSnapshotSchedule.html>
+module Network.AWS.StorageGateway.DescribeSnapshotSchedule
+    (
+    -- * Request
+      DescribeSnapshotSchedule
+    -- ** Request constructor
+    , describeSnapshotSchedule
+    -- ** Request lenses
+    , dssVolumeARN
+
+    -- * Response
+    , DescribeSnapshotScheduleResponse
+    -- ** Response constructor
+    , describeSnapshotScheduleResponse
+    -- ** Response lenses
+    , dssrDescription
+    , dssrRecurrenceInHours
+    , dssrStartAt
+    , dssrTimezone
+    , dssrVolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeSnapshotSchedule = DescribeSnapshotSchedule
+    { _dssVolumeARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeSnapshotSchedule' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dssVolumeARN' @::@ 'Text'
+--
+describeSnapshotSchedule :: Text -- ^ 'dssVolumeARN'
+                         -> DescribeSnapshotSchedule
+describeSnapshotSchedule p1 = DescribeSnapshotSchedule
+    { _dssVolumeARN = p1
+    }
+
+-- | The Amazon Resource Name (ARN) of the volume. Use the ListVolumes
+-- operation to return a list of gateway volumes.
+dssVolumeARN :: Lens' DescribeSnapshotSchedule Text
+dssVolumeARN = lens _dssVolumeARN (\s a -> s { _dssVolumeARN = a })
+
+data DescribeSnapshotScheduleResponse = DescribeSnapshotScheduleResponse
+    { _dssrDescription       :: Maybe Text
+    , _dssrRecurrenceInHours :: Maybe Nat
+    , _dssrStartAt           :: Maybe Nat
+    , _dssrTimezone          :: Maybe Text
+    , _dssrVolumeARN         :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeSnapshotScheduleResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dssrDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'dssrRecurrenceInHours' @::@ 'Maybe' 'Natural'
+--
+-- * 'dssrStartAt' @::@ 'Maybe' 'Natural'
+--
+-- * 'dssrTimezone' @::@ 'Maybe' 'Text'
+--
+-- * 'dssrVolumeARN' @::@ 'Maybe' 'Text'
+--
+describeSnapshotScheduleResponse :: DescribeSnapshotScheduleResponse
+describeSnapshotScheduleResponse = DescribeSnapshotScheduleResponse
+    { _dssrVolumeARN         = Nothing
+    , _dssrStartAt           = Nothing
+    , _dssrRecurrenceInHours = Nothing
+    , _dssrDescription       = Nothing
+    , _dssrTimezone          = Nothing
+    }
+
+dssrDescription :: Lens' DescribeSnapshotScheduleResponse (Maybe Text)
+dssrDescription = lens _dssrDescription (\s a -> s { _dssrDescription = a })
+
+dssrRecurrenceInHours :: Lens' DescribeSnapshotScheduleResponse (Maybe Natural)
+dssrRecurrenceInHours =
+    lens _dssrRecurrenceInHours (\s a -> s { _dssrRecurrenceInHours = a })
+        . mapping _Nat
+
+dssrStartAt :: Lens' DescribeSnapshotScheduleResponse (Maybe Natural)
+dssrStartAt = lens _dssrStartAt (\s a -> s { _dssrStartAt = a }) . mapping _Nat
+
+dssrTimezone :: Lens' DescribeSnapshotScheduleResponse (Maybe Text)
+dssrTimezone = lens _dssrTimezone (\s a -> s { _dssrTimezone = a })
+
+dssrVolumeARN :: Lens' DescribeSnapshotScheduleResponse (Maybe Text)
+dssrVolumeARN = lens _dssrVolumeARN (\s a -> s { _dssrVolumeARN = a })
+
+instance ToPath DescribeSnapshotSchedule where
+    toPath = const "/"
+
+instance ToQuery DescribeSnapshotSchedule where
+    toQuery = const mempty
+
+instance ToHeaders DescribeSnapshotSchedule
+
+instance ToJSON DescribeSnapshotSchedule where
+    toJSON DescribeSnapshotSchedule{..} = object
+        [ "VolumeARN" .= _dssVolumeARN
+        ]
+
+instance AWSRequest DescribeSnapshotSchedule where
+    type Sv DescribeSnapshotSchedule = StorageGateway
+    type Rs DescribeSnapshotSchedule = DescribeSnapshotScheduleResponse
+
+    request  = post "DescribeSnapshotSchedule"
+    response = jsonResponse
+
+instance FromJSON DescribeSnapshotScheduleResponse where
+    parseJSON = withObject "DescribeSnapshotScheduleResponse" $ \o -> DescribeSnapshotScheduleResponse
+        <$> o .:? "Description"
+        <*> o .:? "RecurrenceInHours"
+        <*> o .:? "StartAt"
+        <*> o .:? "Timezone"
+        <*> o .:? "VolumeARN"
diff --git a/gen/Network/AWS/StorageGateway/DescribeStorediSCSIVolumes.hs b/gen/Network/AWS/StorageGateway/DescribeStorediSCSIVolumes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeStorediSCSIVolumes.hs
@@ -0,0 +1,129 @@
+{-# 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.StorageGateway.DescribeStorediSCSIVolumes
+-- 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)
+
+-- | This operation returns description of the gateway volumes specified in the
+-- request. The list of gateway volumes in the request must be from one
+-- gateway. In the response Amazon Storage Gateway returns volume information
+-- sorted by volume ARNs.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeStorediSCSIVolumes.html>
+module Network.AWS.StorageGateway.DescribeStorediSCSIVolumes
+    (
+    -- * Request
+      DescribeStorediSCSIVolumes
+    -- ** Request constructor
+    , describeStorediSCSIVolumes
+    -- ** Request lenses
+    , dsscsivVolumeARNs
+
+    -- * Response
+    , DescribeStorediSCSIVolumesResponse
+    -- ** Response constructor
+    , describeStorediSCSIVolumesResponse
+    -- ** Response lenses
+    , dsscsivrStorediSCSIVolumes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeStorediSCSIVolumes = DescribeStorediSCSIVolumes
+    { _dsscsivVolumeARNs :: List "VolumeARNs" Text
+    } deriving (Eq, Ord, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeStorediSCSIVolumes where
+    type Item DescribeStorediSCSIVolumes = Text
+
+    fromList = DescribeStorediSCSIVolumes . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dsscsivVolumeARNs
+
+-- | 'DescribeStorediSCSIVolumes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dsscsivVolumeARNs' @::@ ['Text']
+--
+describeStorediSCSIVolumes :: DescribeStorediSCSIVolumes
+describeStorediSCSIVolumes = DescribeStorediSCSIVolumes
+    { _dsscsivVolumeARNs = mempty
+    }
+
+-- | An array of strings where each string represents the Amazon Resource Name
+-- (ARN) of a stored volume. All of the specified stored volumes must from
+-- the same gateway. Use ListVolumes to get volume ARNs for a gateway.
+dsscsivVolumeARNs :: Lens' DescribeStorediSCSIVolumes [Text]
+dsscsivVolumeARNs =
+    lens _dsscsivVolumeARNs (\s a -> s { _dsscsivVolumeARNs = a })
+        . _List
+
+newtype DescribeStorediSCSIVolumesResponse = DescribeStorediSCSIVolumesResponse
+    { _dsscsivrStorediSCSIVolumes :: List "StorediSCSIVolumes" StorediSCSIVolume
+    } deriving (Eq, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeStorediSCSIVolumesResponse where
+    type Item DescribeStorediSCSIVolumesResponse = StorediSCSIVolume
+
+    fromList = DescribeStorediSCSIVolumesResponse . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dsscsivrStorediSCSIVolumes
+
+-- | 'DescribeStorediSCSIVolumesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dsscsivrStorediSCSIVolumes' @::@ ['StorediSCSIVolume']
+--
+describeStorediSCSIVolumesResponse :: DescribeStorediSCSIVolumesResponse
+describeStorediSCSIVolumesResponse = DescribeStorediSCSIVolumesResponse
+    { _dsscsivrStorediSCSIVolumes = mempty
+    }
+
+dsscsivrStorediSCSIVolumes :: Lens' DescribeStorediSCSIVolumesResponse [StorediSCSIVolume]
+dsscsivrStorediSCSIVolumes =
+    lens _dsscsivrStorediSCSIVolumes
+        (\s a -> s { _dsscsivrStorediSCSIVolumes = a })
+            . _List
+
+instance ToPath DescribeStorediSCSIVolumes where
+    toPath = const "/"
+
+instance ToQuery DescribeStorediSCSIVolumes where
+    toQuery = const mempty
+
+instance ToHeaders DescribeStorediSCSIVolumes
+
+instance ToJSON DescribeStorediSCSIVolumes where
+    toJSON DescribeStorediSCSIVolumes{..} = object
+        [ "VolumeARNs" .= _dsscsivVolumeARNs
+        ]
+
+instance AWSRequest DescribeStorediSCSIVolumes where
+    type Sv DescribeStorediSCSIVolumes = StorageGateway
+    type Rs DescribeStorediSCSIVolumes = DescribeStorediSCSIVolumesResponse
+
+    request  = post "DescribeStorediSCSIVolumes"
+    response = jsonResponse
+
+instance FromJSON DescribeStorediSCSIVolumesResponse where
+    parseJSON = withObject "DescribeStorediSCSIVolumesResponse" $ \o -> DescribeStorediSCSIVolumesResponse
+        <$> o .:  "StorediSCSIVolumes"
diff --git a/gen/Network/AWS/StorageGateway/DescribeTapeArchives.hs b/gen/Network/AWS/StorageGateway/DescribeTapeArchives.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeTapeArchives.hs
@@ -0,0 +1,158 @@
+{-# 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.StorageGateway.DescribeTapeArchives
+-- 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)
+
+-- | Returns a description of specified virtual tapes in the virtual tape shelf
+-- (VTS). If a specific TapeARN is not specified, AWS Storage Gateway returns
+-- a description of all virtual tapes found in the VTS associated with your
+-- account.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeTapeArchives.html>
+module Network.AWS.StorageGateway.DescribeTapeArchives
+    (
+    -- * Request
+      DescribeTapeArchives
+    -- ** Request constructor
+    , describeTapeArchives
+    -- ** Request lenses
+    , dtaLimit
+    , dtaMarker
+    , dtaTapeARNs
+
+    -- * Response
+    , DescribeTapeArchivesResponse
+    -- ** Response constructor
+    , describeTapeArchivesResponse
+    -- ** Response lenses
+    , dtarMarker
+    , dtarTapeArchives
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DescribeTapeArchives = DescribeTapeArchives
+    { _dtaLimit    :: Maybe Nat
+    , _dtaMarker   :: Maybe Text
+    , _dtaTapeARNs :: List "TapeARNs" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeTapeArchives' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtaLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'dtaMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtaTapeARNs' @::@ ['Text']
+--
+describeTapeArchives :: DescribeTapeArchives
+describeTapeArchives = DescribeTapeArchives
+    { _dtaTapeARNs = mempty
+    , _dtaMarker   = Nothing
+    , _dtaLimit    = Nothing
+    }
+
+-- | Specifies that the number of virtual tapes descried be limited to the
+-- specified number.
+dtaLimit :: Lens' DescribeTapeArchives (Maybe Natural)
+dtaLimit = lens _dtaLimit (\s a -> s { _dtaLimit = a }) . mapping _Nat
+
+-- | An opaque string that indicates the position at which to begin describing
+-- virtual tapes.
+dtaMarker :: Lens' DescribeTapeArchives (Maybe Text)
+dtaMarker = lens _dtaMarker (\s a -> s { _dtaMarker = a })
+
+-- | Specifies one or more unique Amazon Resource Names (ARNs) that represent
+-- the virtual tapes you want to describe.
+dtaTapeARNs :: Lens' DescribeTapeArchives [Text]
+dtaTapeARNs = lens _dtaTapeARNs (\s a -> s { _dtaTapeARNs = a }) . _List
+
+data DescribeTapeArchivesResponse = DescribeTapeArchivesResponse
+    { _dtarMarker       :: Maybe Text
+    , _dtarTapeArchives :: List "TapeArchives" TapeArchive
+    } deriving (Eq, Show)
+
+-- | 'DescribeTapeArchivesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtarMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtarTapeArchives' @::@ ['TapeArchive']
+--
+describeTapeArchivesResponse :: DescribeTapeArchivesResponse
+describeTapeArchivesResponse = DescribeTapeArchivesResponse
+    { _dtarTapeArchives = mempty
+    , _dtarMarker       = Nothing
+    }
+
+-- | An opaque string that indicates the position at which the virtual tapes
+-- that were fetched for description ended. Use this marker in your next
+-- request to fetch the next set of virtual tapes in the virtual tape shelf
+-- (VTS). If there are no more virtual tapes to describe, this field does
+-- not appear in the response.
+dtarMarker :: Lens' DescribeTapeArchivesResponse (Maybe Text)
+dtarMarker = lens _dtarMarker (\s a -> s { _dtarMarker = a })
+
+-- | An array of virtual tape objects in the virtual tape shelf (VTS). The
+-- description includes of the Amazon Resource Name(ARN) of the virtual
+-- tapes. The information returned includes the Amazon Resource Names (ARNs)
+-- of the tapes, size of the tapes, status of the tapes, progress of the
+-- description and tape barcode.
+dtarTapeArchives :: Lens' DescribeTapeArchivesResponse [TapeArchive]
+dtarTapeArchives = lens _dtarTapeArchives (\s a -> s { _dtarTapeArchives = a }) . _List
+
+instance ToPath DescribeTapeArchives where
+    toPath = const "/"
+
+instance ToQuery DescribeTapeArchives where
+    toQuery = const mempty
+
+instance ToHeaders DescribeTapeArchives
+
+instance ToJSON DescribeTapeArchives where
+    toJSON DescribeTapeArchives{..} = object
+        [ "TapeARNs" .= _dtaTapeARNs
+        , "Marker"   .= _dtaMarker
+        , "Limit"    .= _dtaLimit
+        ]
+
+instance AWSRequest DescribeTapeArchives where
+    type Sv DescribeTapeArchives = StorageGateway
+    type Rs DescribeTapeArchives = DescribeTapeArchivesResponse
+
+    request  = post "DescribeTapeArchives"
+    response = jsonResponse
+
+instance FromJSON DescribeTapeArchivesResponse where
+    parseJSON = withObject "DescribeTapeArchivesResponse" $ \o -> DescribeTapeArchivesResponse
+        <$> o .:? "Marker"
+        <*> o .:  "TapeArchives"
+
+instance AWSPager DescribeTapeArchives where
+    page rq rs
+        | stop (rq ^. dtaMarker) = Nothing
+        | otherwise = (\x -> rq & dtaMarker ?~ x)
+            <$> (rs ^. dtarMarker)
diff --git a/gen/Network/AWS/StorageGateway/DescribeTapeRecoveryPoints.hs b/gen/Network/AWS/StorageGateway/DescribeTapeRecoveryPoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeTapeRecoveryPoints.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.StorageGateway.DescribeTapeRecoveryPoints
+-- 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)
+
+-- | Returns a list of virtual tape recovery points that are available for the
+-- specified gateway-VTL. A recovery point is a point in time view of a
+-- virtual tape at which all the data on the virtual tape is consistent. If
+-- your gateway crashes, virtual tapes that have recovery points can be
+-- recovered to a new gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeTapeRecoveryPoints.html>
+module Network.AWS.StorageGateway.DescribeTapeRecoveryPoints
+    (
+    -- * Request
+      DescribeTapeRecoveryPoints
+    -- ** Request constructor
+    , describeTapeRecoveryPoints
+    -- ** Request lenses
+    , dtrpGatewayARN
+    , dtrpLimit
+    , dtrpMarker
+
+    -- * Response
+    , DescribeTapeRecoveryPointsResponse
+    -- ** Response constructor
+    , describeTapeRecoveryPointsResponse
+    -- ** Response lenses
+    , dtrprGatewayARN
+    , dtrprMarker
+    , dtrprTapeRecoveryPointInfos
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DescribeTapeRecoveryPoints = DescribeTapeRecoveryPoints
+    { _dtrpGatewayARN :: Text
+    , _dtrpLimit      :: Maybe Nat
+    , _dtrpMarker     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeTapeRecoveryPoints' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrpGatewayARN' @::@ 'Text'
+--
+-- * 'dtrpLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'dtrpMarker' @::@ 'Maybe' 'Text'
+--
+describeTapeRecoveryPoints :: Text -- ^ 'dtrpGatewayARN'
+                           -> DescribeTapeRecoveryPoints
+describeTapeRecoveryPoints p1 = DescribeTapeRecoveryPoints
+    { _dtrpGatewayARN = p1
+    , _dtrpMarker     = Nothing
+    , _dtrpLimit      = Nothing
+    }
+
+dtrpGatewayARN :: Lens' DescribeTapeRecoveryPoints Text
+dtrpGatewayARN = lens _dtrpGatewayARN (\s a -> s { _dtrpGatewayARN = a })
+
+-- | Specifies that the number of virtual tape recovery points that are
+-- described be limited to the specified number.
+dtrpLimit :: Lens' DescribeTapeRecoveryPoints (Maybe Natural)
+dtrpLimit = lens _dtrpLimit (\s a -> s { _dtrpLimit = a }) . mapping _Nat
+
+-- | An opaque string that indicates the position at which to begin describing
+-- the virtual tape recovery points.
+dtrpMarker :: Lens' DescribeTapeRecoveryPoints (Maybe Text)
+dtrpMarker = lens _dtrpMarker (\s a -> s { _dtrpMarker = a })
+
+data DescribeTapeRecoveryPointsResponse = DescribeTapeRecoveryPointsResponse
+    { _dtrprGatewayARN             :: Maybe Text
+    , _dtrprMarker                 :: Maybe Text
+    , _dtrprTapeRecoveryPointInfos :: List "TapeRecoveryPointInfos" TapeRecoveryPointInfo
+    } deriving (Eq, Show)
+
+-- | 'DescribeTapeRecoveryPointsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrprGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dtrprMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtrprTapeRecoveryPointInfos' @::@ ['TapeRecoveryPointInfo']
+--
+describeTapeRecoveryPointsResponse :: DescribeTapeRecoveryPointsResponse
+describeTapeRecoveryPointsResponse = DescribeTapeRecoveryPointsResponse
+    { _dtrprGatewayARN             = Nothing
+    , _dtrprTapeRecoveryPointInfos = mempty
+    , _dtrprMarker                 = Nothing
+    }
+
+dtrprGatewayARN :: Lens' DescribeTapeRecoveryPointsResponse (Maybe Text)
+dtrprGatewayARN = lens _dtrprGatewayARN (\s a -> s { _dtrprGatewayARN = a })
+
+-- | An opaque string that indicates the position at which the virtual tape
+-- recovery points that were listed for description ended. Use this marker
+-- in your next request to list the next set of virtual tape recovery points
+-- in the list. If there are no more recovery points to describe, this field
+-- does not appear in the response.
+dtrprMarker :: Lens' DescribeTapeRecoveryPointsResponse (Maybe Text)
+dtrprMarker = lens _dtrprMarker (\s a -> s { _dtrprMarker = a })
+
+-- | An array of TapeRecoveryPointInfos that are available for the specified
+-- gateway.
+dtrprTapeRecoveryPointInfos :: Lens' DescribeTapeRecoveryPointsResponse [TapeRecoveryPointInfo]
+dtrprTapeRecoveryPointInfos =
+    lens _dtrprTapeRecoveryPointInfos
+        (\s a -> s { _dtrprTapeRecoveryPointInfos = a })
+            . _List
+
+instance ToPath DescribeTapeRecoveryPoints where
+    toPath = const "/"
+
+instance ToQuery DescribeTapeRecoveryPoints where
+    toQuery = const mempty
+
+instance ToHeaders DescribeTapeRecoveryPoints
+
+instance ToJSON DescribeTapeRecoveryPoints where
+    toJSON DescribeTapeRecoveryPoints{..} = object
+        [ "GatewayARN" .= _dtrpGatewayARN
+        , "Marker"     .= _dtrpMarker
+        , "Limit"      .= _dtrpLimit
+        ]
+
+instance AWSRequest DescribeTapeRecoveryPoints where
+    type Sv DescribeTapeRecoveryPoints = StorageGateway
+    type Rs DescribeTapeRecoveryPoints = DescribeTapeRecoveryPointsResponse
+
+    request  = post "DescribeTapeRecoveryPoints"
+    response = jsonResponse
+
+instance FromJSON DescribeTapeRecoveryPointsResponse where
+    parseJSON = withObject "DescribeTapeRecoveryPointsResponse" $ \o -> DescribeTapeRecoveryPointsResponse
+        <$> o .:? "GatewayARN"
+        <*> o .:? "Marker"
+        <*> o .:  "TapeRecoveryPointInfos"
+
+instance AWSPager DescribeTapeRecoveryPoints where
+    page rq rs
+        | stop (rq ^. dtrpMarker) = Nothing
+        | otherwise = (\x -> rq & dtrpMarker ?~ x)
+            <$> (rs ^. dtrprMarker)
diff --git a/gen/Network/AWS/StorageGateway/DescribeTapes.hs b/gen/Network/AWS/StorageGateway/DescribeTapes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeTapes.hs
@@ -0,0 +1,164 @@
+{-# 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.StorageGateway.DescribeTapes
+-- 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)
+
+-- | Returns a description of the specified Amazon Resource Name (ARN) of
+-- virtual tapes. If a TapeARN is not specified, returns a description of all
+-- virtual tapes associated with the specified gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeTapes.html>
+module Network.AWS.StorageGateway.DescribeTapes
+    (
+    -- * Request
+      DescribeTapes
+    -- ** Request constructor
+    , describeTapes
+    -- ** Request lenses
+    , dtGatewayARN
+    , dtLimit
+    , dtMarker
+    , dtTapeARNs
+
+    -- * Response
+    , DescribeTapesResponse
+    -- ** Response constructor
+    , describeTapesResponse
+    -- ** Response lenses
+    , dtrMarker
+    , dtrTapes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DescribeTapes = DescribeTapes
+    { _dtGatewayARN :: Text
+    , _dtLimit      :: Maybe Nat
+    , _dtMarker     :: Maybe Text
+    , _dtTapeARNs   :: List "TapeARNs" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeTapes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtGatewayARN' @::@ 'Text'
+--
+-- * 'dtLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'dtMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtTapeARNs' @::@ ['Text']
+--
+describeTapes :: Text -- ^ 'dtGatewayARN'
+              -> DescribeTapes
+describeTapes p1 = DescribeTapes
+    { _dtGatewayARN = p1
+    , _dtTapeARNs   = mempty
+    , _dtMarker     = Nothing
+    , _dtLimit      = Nothing
+    }
+
+dtGatewayARN :: Lens' DescribeTapes Text
+dtGatewayARN = lens _dtGatewayARN (\s a -> s { _dtGatewayARN = a })
+
+-- | Specifies that the number of virtual tapes described be limited to the
+-- specified number.
+dtLimit :: Lens' DescribeTapes (Maybe Natural)
+dtLimit = lens _dtLimit (\s a -> s { _dtLimit = a }) . mapping _Nat
+
+-- | A marker value, obtained in a previous call to DescribeTapes. This marker
+-- indicates which page of results to retrieve. If not specified, the first
+-- page of results is retrieved.
+dtMarker :: Lens' DescribeTapes (Maybe Text)
+dtMarker = lens _dtMarker (\s a -> s { _dtMarker = a })
+
+-- | Specifies one or more unique Amazon Resource Names (ARNs) that represent
+-- the virtual tapes you want to describe. If this parameter is not
+-- specified, AWS Storage Gateway returns a description of all virtual tapes
+-- associated with the specified gateway.
+dtTapeARNs :: Lens' DescribeTapes [Text]
+dtTapeARNs = lens _dtTapeARNs (\s a -> s { _dtTapeARNs = a }) . _List
+
+data DescribeTapesResponse = DescribeTapesResponse
+    { _dtrMarker :: Maybe Text
+    , _dtrTapes  :: List "Tapes" Tape
+    } deriving (Eq, Show)
+
+-- | 'DescribeTapesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtrTapes' @::@ ['Tape']
+--
+describeTapesResponse :: DescribeTapesResponse
+describeTapesResponse = DescribeTapesResponse
+    { _dtrTapes  = mempty
+    , _dtrMarker = Nothing
+    }
+
+-- | An opaque string which can be used as part of a subsequent DescribeTapes
+-- call to retrieve the next page of results. If a response does not contain
+-- a marker, then there are no more results to be retrieved.
+dtrMarker :: Lens' DescribeTapesResponse (Maybe Text)
+dtrMarker = lens _dtrMarker (\s a -> s { _dtrMarker = a })
+
+-- | An array of virtual tape descriptions.
+dtrTapes :: Lens' DescribeTapesResponse [Tape]
+dtrTapes = lens _dtrTapes (\s a -> s { _dtrTapes = a }) . _List
+
+instance ToPath DescribeTapes where
+    toPath = const "/"
+
+instance ToQuery DescribeTapes where
+    toQuery = const mempty
+
+instance ToHeaders DescribeTapes
+
+instance ToJSON DescribeTapes where
+    toJSON DescribeTapes{..} = object
+        [ "GatewayARN" .= _dtGatewayARN
+        , "TapeARNs"   .= _dtTapeARNs
+        , "Marker"     .= _dtMarker
+        , "Limit"      .= _dtLimit
+        ]
+
+instance AWSRequest DescribeTapes where
+    type Sv DescribeTapes = StorageGateway
+    type Rs DescribeTapes = DescribeTapesResponse
+
+    request  = post "DescribeTapes"
+    response = jsonResponse
+
+instance FromJSON DescribeTapesResponse where
+    parseJSON = withObject "DescribeTapesResponse" $ \o -> DescribeTapesResponse
+        <$> o .:? "Marker"
+        <*> o .:  "Tapes"
+
+instance AWSPager DescribeTapes where
+    page rq rs
+        | stop (rq ^. dtMarker) = Nothing
+        | otherwise = (\x -> rq & dtMarker ?~ x)
+            <$> (rs ^. dtrMarker)
diff --git a/gen/Network/AWS/StorageGateway/DescribeUploadBuffer.hs b/gen/Network/AWS/StorageGateway/DescribeUploadBuffer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeUploadBuffer.hs
@@ -0,0 +1,142 @@
+{-# 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.StorageGateway.DescribeUploadBuffer
+-- 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)
+
+-- | This operation returns information about the upload buffer of a gateway.
+-- This operation is supported for both the gateway-stored and gateway-cached
+-- volume architectures. The response includes disk IDs that are configured as
+-- upload buffer space, and it includes the amount of upload buffer space
+-- allocated and used.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeUploadBuffer.html>
+module Network.AWS.StorageGateway.DescribeUploadBuffer
+    (
+    -- * Request
+      DescribeUploadBuffer
+    -- ** Request constructor
+    , describeUploadBuffer
+    -- ** Request lenses
+    , dubGatewayARN
+
+    -- * Response
+    , DescribeUploadBufferResponse
+    -- ** Response constructor
+    , describeUploadBufferResponse
+    -- ** Response lenses
+    , dubrDiskIds
+    , dubrGatewayARN
+    , dubrUploadBufferAllocatedInBytes
+    , dubrUploadBufferUsedInBytes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeUploadBuffer = DescribeUploadBuffer
+    { _dubGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeUploadBuffer' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dubGatewayARN' @::@ 'Text'
+--
+describeUploadBuffer :: Text -- ^ 'dubGatewayARN'
+                     -> DescribeUploadBuffer
+describeUploadBuffer p1 = DescribeUploadBuffer
+    { _dubGatewayARN = p1
+    }
+
+dubGatewayARN :: Lens' DescribeUploadBuffer Text
+dubGatewayARN = lens _dubGatewayARN (\s a -> s { _dubGatewayARN = a })
+
+data DescribeUploadBufferResponse = DescribeUploadBufferResponse
+    { _dubrDiskIds                      :: List "DiskIds" Text
+    , _dubrGatewayARN                   :: Maybe Text
+    , _dubrUploadBufferAllocatedInBytes :: Maybe Integer
+    , _dubrUploadBufferUsedInBytes      :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeUploadBufferResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dubrDiskIds' @::@ ['Text']
+--
+-- * 'dubrGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dubrUploadBufferAllocatedInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'dubrUploadBufferUsedInBytes' @::@ 'Maybe' 'Integer'
+--
+describeUploadBufferResponse :: DescribeUploadBufferResponse
+describeUploadBufferResponse = DescribeUploadBufferResponse
+    { _dubrGatewayARN                   = Nothing
+    , _dubrDiskIds                      = mempty
+    , _dubrUploadBufferUsedInBytes      = Nothing
+    , _dubrUploadBufferAllocatedInBytes = Nothing
+    }
+
+dubrDiskIds :: Lens' DescribeUploadBufferResponse [Text]
+dubrDiskIds = lens _dubrDiskIds (\s a -> s { _dubrDiskIds = a }) . _List
+
+dubrGatewayARN :: Lens' DescribeUploadBufferResponse (Maybe Text)
+dubrGatewayARN = lens _dubrGatewayARN (\s a -> s { _dubrGatewayARN = a })
+
+dubrUploadBufferAllocatedInBytes :: Lens' DescribeUploadBufferResponse (Maybe Integer)
+dubrUploadBufferAllocatedInBytes =
+    lens _dubrUploadBufferAllocatedInBytes
+        (\s a -> s { _dubrUploadBufferAllocatedInBytes = a })
+
+dubrUploadBufferUsedInBytes :: Lens' DescribeUploadBufferResponse (Maybe Integer)
+dubrUploadBufferUsedInBytes =
+    lens _dubrUploadBufferUsedInBytes
+        (\s a -> s { _dubrUploadBufferUsedInBytes = a })
+
+instance ToPath DescribeUploadBuffer where
+    toPath = const "/"
+
+instance ToQuery DescribeUploadBuffer where
+    toQuery = const mempty
+
+instance ToHeaders DescribeUploadBuffer
+
+instance ToJSON DescribeUploadBuffer where
+    toJSON DescribeUploadBuffer{..} = object
+        [ "GatewayARN" .= _dubGatewayARN
+        ]
+
+instance AWSRequest DescribeUploadBuffer where
+    type Sv DescribeUploadBuffer = StorageGateway
+    type Rs DescribeUploadBuffer = DescribeUploadBufferResponse
+
+    request  = post "DescribeUploadBuffer"
+    response = jsonResponse
+
+instance FromJSON DescribeUploadBufferResponse where
+    parseJSON = withObject "DescribeUploadBufferResponse" $ \o -> DescribeUploadBufferResponse
+        <$> o .:  "DiskIds"
+        <*> o .:? "GatewayARN"
+        <*> o .:? "UploadBufferAllocatedInBytes"
+        <*> o .:? "UploadBufferUsedInBytes"
diff --git a/gen/Network/AWS/StorageGateway/DescribeVTLDevices.hs b/gen/Network/AWS/StorageGateway/DescribeVTLDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeVTLDevices.hs
@@ -0,0 +1,174 @@
+{-# 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.StorageGateway.DescribeVTLDevices
+-- 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)
+
+-- | Returns a description of virtual tape library (VTL) devices for the
+-- specified gateway. In the response, AWS Storage Gateway returns VTL device
+-- information. The list of VTL devices must be from one gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeVTLDevices.html>
+module Network.AWS.StorageGateway.DescribeVTLDevices
+    (
+    -- * Request
+      DescribeVTLDevices
+    -- ** Request constructor
+    , describeVTLDevices
+    -- ** Request lenses
+    , dvtldGatewayARN
+    , dvtldLimit
+    , dvtldMarker
+    , dvtldVTLDeviceARNs
+
+    -- * Response
+    , DescribeVTLDevicesResponse
+    -- ** Response constructor
+    , describeVTLDevicesResponse
+    -- ** Response lenses
+    , dvtldrGatewayARN
+    , dvtldrMarker
+    , dvtldrVTLDevices
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data DescribeVTLDevices = DescribeVTLDevices
+    { _dvtldGatewayARN    :: Text
+    , _dvtldLimit         :: Maybe Nat
+    , _dvtldMarker        :: Maybe Text
+    , _dvtldVTLDeviceARNs :: List "VTLDeviceARNs" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeVTLDevices' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvtldGatewayARN' @::@ 'Text'
+--
+-- * 'dvtldLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'dvtldMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dvtldVTLDeviceARNs' @::@ ['Text']
+--
+describeVTLDevices :: Text -- ^ 'dvtldGatewayARN'
+                   -> DescribeVTLDevices
+describeVTLDevices p1 = DescribeVTLDevices
+    { _dvtldGatewayARN    = p1
+    , _dvtldVTLDeviceARNs = mempty
+    , _dvtldMarker        = Nothing
+    , _dvtldLimit         = Nothing
+    }
+
+dvtldGatewayARN :: Lens' DescribeVTLDevices Text
+dvtldGatewayARN = lens _dvtldGatewayARN (\s a -> s { _dvtldGatewayARN = a })
+
+-- | Specifies that the number of VTL devices described be limited to the
+-- specified number.
+dvtldLimit :: Lens' DescribeVTLDevices (Maybe Natural)
+dvtldLimit = lens _dvtldLimit (\s a -> s { _dvtldLimit = a }) . mapping _Nat
+
+-- | An opaque string that indicates the position at which to begin describing
+-- the VTL devices.
+dvtldMarker :: Lens' DescribeVTLDevices (Maybe Text)
+dvtldMarker = lens _dvtldMarker (\s a -> s { _dvtldMarker = a })
+
+-- | An array of strings, where each string represents the Amazon Resource
+-- Name (ARN) of a VTL device.
+dvtldVTLDeviceARNs :: Lens' DescribeVTLDevices [Text]
+dvtldVTLDeviceARNs =
+    lens _dvtldVTLDeviceARNs (\s a -> s { _dvtldVTLDeviceARNs = a })
+        . _List
+
+data DescribeVTLDevicesResponse = DescribeVTLDevicesResponse
+    { _dvtldrGatewayARN :: Maybe Text
+    , _dvtldrMarker     :: Maybe Text
+    , _dvtldrVTLDevices :: List "VTLDevices" VTLDevice
+    } deriving (Eq, Show)
+
+-- | 'DescribeVTLDevicesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dvtldrGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dvtldrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dvtldrVTLDevices' @::@ ['VTLDevice']
+--
+describeVTLDevicesResponse :: DescribeVTLDevicesResponse
+describeVTLDevicesResponse = DescribeVTLDevicesResponse
+    { _dvtldrGatewayARN = Nothing
+    , _dvtldrVTLDevices = mempty
+    , _dvtldrMarker     = Nothing
+    }
+
+dvtldrGatewayARN :: Lens' DescribeVTLDevicesResponse (Maybe Text)
+dvtldrGatewayARN = lens _dvtldrGatewayARN (\s a -> s { _dvtldrGatewayARN = a })
+
+-- | An opaque string that indicates the position at which the VTL devices
+-- that were fetched for description ended. Use the marker in your next
+-- request to fetch the next set of VTL devices in the list. If there are no
+-- more VTL devices to describe, this field does not appear in the response.
+dvtldrMarker :: Lens' DescribeVTLDevicesResponse (Maybe Text)
+dvtldrMarker = lens _dvtldrMarker (\s a -> s { _dvtldrMarker = a })
+
+-- | An array of VTL device objects composed of the Amazon Resource Name(ARN)
+-- of the VTL devices.
+dvtldrVTLDevices :: Lens' DescribeVTLDevicesResponse [VTLDevice]
+dvtldrVTLDevices = lens _dvtldrVTLDevices (\s a -> s { _dvtldrVTLDevices = a }) . _List
+
+instance ToPath DescribeVTLDevices where
+    toPath = const "/"
+
+instance ToQuery DescribeVTLDevices where
+    toQuery = const mempty
+
+instance ToHeaders DescribeVTLDevices
+
+instance ToJSON DescribeVTLDevices where
+    toJSON DescribeVTLDevices{..} = object
+        [ "GatewayARN"    .= _dvtldGatewayARN
+        , "VTLDeviceARNs" .= _dvtldVTLDeviceARNs
+        , "Marker"        .= _dvtldMarker
+        , "Limit"         .= _dvtldLimit
+        ]
+
+instance AWSRequest DescribeVTLDevices where
+    type Sv DescribeVTLDevices = StorageGateway
+    type Rs DescribeVTLDevices = DescribeVTLDevicesResponse
+
+    request  = post "DescribeVTLDevices"
+    response = jsonResponse
+
+instance FromJSON DescribeVTLDevicesResponse where
+    parseJSON = withObject "DescribeVTLDevicesResponse" $ \o -> DescribeVTLDevicesResponse
+        <$> o .:? "GatewayARN"
+        <*> o .:? "Marker"
+        <*> o .:  "VTLDevices"
+
+instance AWSPager DescribeVTLDevices where
+    page rq rs
+        | stop (rq ^. dvtldMarker) = Nothing
+        | otherwise = (\x -> rq & dvtldMarker ?~ x)
+            <$> (rs ^. dvtldrMarker)
diff --git a/gen/Network/AWS/StorageGateway/DescribeWorkingStorage.hs b/gen/Network/AWS/StorageGateway/DescribeWorkingStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DescribeWorkingStorage.hs
@@ -0,0 +1,151 @@
+{-# 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.StorageGateway.DescribeWorkingStorage
+-- 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)
+
+-- | This operation returns information about the working storage of a gateway.
+-- This operation is supported only for the gateway-stored volume
+-- architecture. This operation is deprecated in cached-volumes API version
+-- (20120630). Use DescribeUploadBuffer instead. The response includes disk
+-- IDs that are configured as working storage, and it includes the amount of
+-- working storage allocated and used.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DescribeWorkingStorage.html>
+module Network.AWS.StorageGateway.DescribeWorkingStorage
+    (
+    -- * Request
+      DescribeWorkingStorage
+    -- ** Request constructor
+    , describeWorkingStorage
+    -- ** Request lenses
+    , dwsGatewayARN
+
+    -- * Response
+    , DescribeWorkingStorageResponse
+    -- ** Response constructor
+    , describeWorkingStorageResponse
+    -- ** Response lenses
+    , dwsrDiskIds
+    , dwsrGatewayARN
+    , dwsrWorkingStorageAllocatedInBytes
+    , dwsrWorkingStorageUsedInBytes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DescribeWorkingStorage = DescribeWorkingStorage
+    { _dwsGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeWorkingStorage' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dwsGatewayARN' @::@ 'Text'
+--
+describeWorkingStorage :: Text -- ^ 'dwsGatewayARN'
+                       -> DescribeWorkingStorage
+describeWorkingStorage p1 = DescribeWorkingStorage
+    { _dwsGatewayARN = p1
+    }
+
+dwsGatewayARN :: Lens' DescribeWorkingStorage Text
+dwsGatewayARN = lens _dwsGatewayARN (\s a -> s { _dwsGatewayARN = a })
+
+data DescribeWorkingStorageResponse = DescribeWorkingStorageResponse
+    { _dwsrDiskIds                        :: List "DiskIds" Text
+    , _dwsrGatewayARN                     :: Maybe Text
+    , _dwsrWorkingStorageAllocatedInBytes :: Maybe Integer
+    , _dwsrWorkingStorageUsedInBytes      :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeWorkingStorageResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dwsrDiskIds' @::@ ['Text']
+--
+-- * 'dwsrGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'dwsrWorkingStorageAllocatedInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'dwsrWorkingStorageUsedInBytes' @::@ 'Maybe' 'Integer'
+--
+describeWorkingStorageResponse :: DescribeWorkingStorageResponse
+describeWorkingStorageResponse = DescribeWorkingStorageResponse
+    { _dwsrGatewayARN                     = Nothing
+    , _dwsrDiskIds                        = mempty
+    , _dwsrWorkingStorageUsedInBytes      = Nothing
+    , _dwsrWorkingStorageAllocatedInBytes = Nothing
+    }
+
+-- | An array of the gateway's local disk IDs that are configured as working
+-- storage. Each local disk ID is specified as a string (minimum length of 1
+-- and maximum length of 300). If no local disks are configured as working
+-- storage, then the DiskIds array is empty.
+dwsrDiskIds :: Lens' DescribeWorkingStorageResponse [Text]
+dwsrDiskIds = lens _dwsrDiskIds (\s a -> s { _dwsrDiskIds = a }) . _List
+
+dwsrGatewayARN :: Lens' DescribeWorkingStorageResponse (Maybe Text)
+dwsrGatewayARN = lens _dwsrGatewayARN (\s a -> s { _dwsrGatewayARN = a })
+
+-- | The total working storage in bytes allocated for the gateway. If no
+-- working storage is configured for the gateway, this field returns 0.
+dwsrWorkingStorageAllocatedInBytes :: Lens' DescribeWorkingStorageResponse (Maybe Integer)
+dwsrWorkingStorageAllocatedInBytes =
+    lens _dwsrWorkingStorageAllocatedInBytes
+        (\s a -> s { _dwsrWorkingStorageAllocatedInBytes = a })
+
+-- | The total working storage in bytes in use by the gateway. If no working
+-- storage is configured for the gateway, this field returns 0.
+dwsrWorkingStorageUsedInBytes :: Lens' DescribeWorkingStorageResponse (Maybe Integer)
+dwsrWorkingStorageUsedInBytes =
+    lens _dwsrWorkingStorageUsedInBytes
+        (\s a -> s { _dwsrWorkingStorageUsedInBytes = a })
+
+instance ToPath DescribeWorkingStorage where
+    toPath = const "/"
+
+instance ToQuery DescribeWorkingStorage where
+    toQuery = const mempty
+
+instance ToHeaders DescribeWorkingStorage
+
+instance ToJSON DescribeWorkingStorage where
+    toJSON DescribeWorkingStorage{..} = object
+        [ "GatewayARN" .= _dwsGatewayARN
+        ]
+
+instance AWSRequest DescribeWorkingStorage where
+    type Sv DescribeWorkingStorage = StorageGateway
+    type Rs DescribeWorkingStorage = DescribeWorkingStorageResponse
+
+    request  = post "DescribeWorkingStorage"
+    response = jsonResponse
+
+instance FromJSON DescribeWorkingStorageResponse where
+    parseJSON = withObject "DescribeWorkingStorageResponse" $ \o -> DescribeWorkingStorageResponse
+        <$> o .:  "DiskIds"
+        <*> o .:? "GatewayARN"
+        <*> o .:? "WorkingStorageAllocatedInBytes"
+        <*> o .:? "WorkingStorageUsedInBytes"
diff --git a/gen/Network/AWS/StorageGateway/DisableGateway.hs b/gen/Network/AWS/StorageGateway/DisableGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/DisableGateway.hs
@@ -0,0 +1,112 @@
+{-# 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.StorageGateway.DisableGateway
+-- 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)
+
+-- | Disables a gateway when the gateway is no longer functioning. For example,
+-- if your gateway VM is damaged, you can disable the gateway so you can
+-- recover virtual tapes. Use this operation for a gateway-VTL that is not
+-- reachable or not functioning. Once a gateway is disabled it cannot be
+-- enabled.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_DisableGateway.html>
+module Network.AWS.StorageGateway.DisableGateway
+    (
+    -- * Request
+      DisableGateway
+    -- ** Request constructor
+    , disableGateway
+    -- ** Request lenses
+    , dg1GatewayARN
+
+    -- * Response
+    , DisableGatewayResponse
+    -- ** Response constructor
+    , disableGatewayResponse
+    -- ** Response lenses
+    , dgr1GatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype DisableGateway = DisableGateway
+    { _dg1GatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DisableGateway' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dg1GatewayARN' @::@ 'Text'
+--
+disableGateway :: Text -- ^ 'dg1GatewayARN'
+               -> DisableGateway
+disableGateway p1 = DisableGateway
+    { _dg1GatewayARN = p1
+    }
+
+dg1GatewayARN :: Lens' DisableGateway Text
+dg1GatewayARN = lens _dg1GatewayARN (\s a -> s { _dg1GatewayARN = a })
+
+newtype DisableGatewayResponse = DisableGatewayResponse
+    { _dgr1GatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DisableGatewayResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dgr1GatewayARN' @::@ 'Maybe' 'Text'
+--
+disableGatewayResponse :: DisableGatewayResponse
+disableGatewayResponse = DisableGatewayResponse
+    { _dgr1GatewayARN = Nothing
+    }
+
+-- | The unique Amazon Resource Name of the disabled gateway.
+dgr1GatewayARN :: Lens' DisableGatewayResponse (Maybe Text)
+dgr1GatewayARN = lens _dgr1GatewayARN (\s a -> s { _dgr1GatewayARN = a })
+
+instance ToPath DisableGateway where
+    toPath = const "/"
+
+instance ToQuery DisableGateway where
+    toQuery = const mempty
+
+instance ToHeaders DisableGateway
+
+instance ToJSON DisableGateway where
+    toJSON DisableGateway{..} = object
+        [ "GatewayARN" .= _dg1GatewayARN
+        ]
+
+instance AWSRequest DisableGateway where
+    type Sv DisableGateway = StorageGateway
+    type Rs DisableGateway = DisableGatewayResponse
+
+    request  = post "DisableGateway"
+    response = jsonResponse
+
+instance FromJSON DisableGatewayResponse where
+    parseJSON = withObject "DisableGatewayResponse" $ \o -> DisableGatewayResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/ListGateways.hs b/gen/Network/AWS/StorageGateway/ListGateways.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ListGateways.hs
@@ -0,0 +1,141 @@
+{-# 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.StorageGateway.ListGateways
+-- 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)
+
+-- | This operation lists gateways owned by an AWS account in a region specified
+-- in the request. The returned list is ordered by gateway Amazon Resource
+-- Name (ARN). By default, the operation returns a maximum of 100 gateways.
+-- This operation supports pagination that allows you to optionally reduce the
+-- number of gateways returned in a response. If you have more gateways than
+-- are returned in a response-that is, the response returns only a truncated
+-- list of your gateways-the response contains a marker that you can specify
+-- in your next request to fetch the next page of gateways.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ListGateways.html>
+module Network.AWS.StorageGateway.ListGateways
+    (
+    -- * Request
+      ListGateways
+    -- ** Request constructor
+    , listGateways
+    -- ** Request lenses
+    , lgLimit
+    , lgMarker
+
+    -- * Response
+    , ListGatewaysResponse
+    -- ** Response constructor
+    , listGatewaysResponse
+    -- ** Response lenses
+    , lgrGateways
+    , lgrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data ListGateways = ListGateways
+    { _lgLimit  :: Maybe Nat
+    , _lgMarker :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ListGateways' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lgLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'lgMarker' @::@ 'Maybe' 'Text'
+--
+listGateways :: ListGateways
+listGateways = ListGateways
+    { _lgMarker = Nothing
+    , _lgLimit  = Nothing
+    }
+
+-- | Specifies that the list of gateways returned be limited to the specified
+-- number of items.
+lgLimit :: Lens' ListGateways (Maybe Natural)
+lgLimit = lens _lgLimit (\s a -> s { _lgLimit = a }) . mapping _Nat
+
+-- | An opaque string that indicates the position at which to begin the
+-- returned list of gateways.
+lgMarker :: Lens' ListGateways (Maybe Text)
+lgMarker = lens _lgMarker (\s a -> s { _lgMarker = a })
+
+data ListGatewaysResponse = ListGatewaysResponse
+    { _lgrGateways :: List "Gateways" GatewayInfo
+    , _lgrMarker   :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'ListGatewaysResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lgrGateways' @::@ ['GatewayInfo']
+--
+-- * 'lgrMarker' @::@ 'Maybe' 'Text'
+--
+listGatewaysResponse :: ListGatewaysResponse
+listGatewaysResponse = ListGatewaysResponse
+    { _lgrGateways = mempty
+    , _lgrMarker   = Nothing
+    }
+
+lgrGateways :: Lens' ListGatewaysResponse [GatewayInfo]
+lgrGateways = lens _lgrGateways (\s a -> s { _lgrGateways = a }) . _List
+
+lgrMarker :: Lens' ListGatewaysResponse (Maybe Text)
+lgrMarker = lens _lgrMarker (\s a -> s { _lgrMarker = a })
+
+instance ToPath ListGateways where
+    toPath = const "/"
+
+instance ToQuery ListGateways where
+    toQuery = const mempty
+
+instance ToHeaders ListGateways
+
+instance ToJSON ListGateways where
+    toJSON ListGateways{..} = object
+        [ "Marker" .= _lgMarker
+        , "Limit"  .= _lgLimit
+        ]
+
+instance AWSRequest ListGateways where
+    type Sv ListGateways = StorageGateway
+    type Rs ListGateways = ListGatewaysResponse
+
+    request  = post "ListGateways"
+    response = jsonResponse
+
+instance FromJSON ListGatewaysResponse where
+    parseJSON = withObject "ListGatewaysResponse" $ \o -> ListGatewaysResponse
+        <$> o .:  "Gateways"
+        <*> o .:? "Marker"
+
+instance AWSPager ListGateways where
+    page rq rs
+        | stop (rq ^. lgMarker) = Nothing
+        | otherwise = (\x -> rq & lgMarker ?~ x)
+            <$> (rs ^. lgrMarker)
diff --git a/gen/Network/AWS/StorageGateway/ListLocalDisks.hs b/gen/Network/AWS/StorageGateway/ListLocalDisks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ListLocalDisks.hs
@@ -0,0 +1,120 @@
+{-# 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.StorageGateway.ListLocalDisks
+-- 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)
+
+-- | This operation returns a list of the local disks of a gateway. To specify
+-- which gateway to describe you use the Amazon Resource Name (ARN) of the
+-- gateway in the body of the request. The request returns all disks,
+-- specifying which are configured as working storage, stored volume or not
+-- configured at all.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ListLocalDisks.html>
+module Network.AWS.StorageGateway.ListLocalDisks
+    (
+    -- * Request
+      ListLocalDisks
+    -- ** Request constructor
+    , listLocalDisks
+    -- ** Request lenses
+    , lldGatewayARN
+
+    -- * Response
+    , ListLocalDisksResponse
+    -- ** Response constructor
+    , listLocalDisksResponse
+    -- ** Response lenses
+    , lldrDisks
+    , lldrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype ListLocalDisks = ListLocalDisks
+    { _lldGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'ListLocalDisks' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lldGatewayARN' @::@ 'Text'
+--
+listLocalDisks :: Text -- ^ 'lldGatewayARN'
+               -> ListLocalDisks
+listLocalDisks p1 = ListLocalDisks
+    { _lldGatewayARN = p1
+    }
+
+lldGatewayARN :: Lens' ListLocalDisks Text
+lldGatewayARN = lens _lldGatewayARN (\s a -> s { _lldGatewayARN = a })
+
+data ListLocalDisksResponse = ListLocalDisksResponse
+    { _lldrDisks      :: List "Disks" Disk
+    , _lldrGatewayARN :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'ListLocalDisksResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lldrDisks' @::@ ['Disk']
+--
+-- * 'lldrGatewayARN' @::@ 'Maybe' 'Text'
+--
+listLocalDisksResponse :: ListLocalDisksResponse
+listLocalDisksResponse = ListLocalDisksResponse
+    { _lldrGatewayARN = Nothing
+    , _lldrDisks      = mempty
+    }
+
+lldrDisks :: Lens' ListLocalDisksResponse [Disk]
+lldrDisks = lens _lldrDisks (\s a -> s { _lldrDisks = a }) . _List
+
+lldrGatewayARN :: Lens' ListLocalDisksResponse (Maybe Text)
+lldrGatewayARN = lens _lldrGatewayARN (\s a -> s { _lldrGatewayARN = a })
+
+instance ToPath ListLocalDisks where
+    toPath = const "/"
+
+instance ToQuery ListLocalDisks where
+    toQuery = const mempty
+
+instance ToHeaders ListLocalDisks
+
+instance ToJSON ListLocalDisks where
+    toJSON ListLocalDisks{..} = object
+        [ "GatewayARN" .= _lldGatewayARN
+        ]
+
+instance AWSRequest ListLocalDisks where
+    type Sv ListLocalDisks = StorageGateway
+    type Rs ListLocalDisks = ListLocalDisksResponse
+
+    request  = post "ListLocalDisks"
+    response = jsonResponse
+
+instance FromJSON ListLocalDisksResponse where
+    parseJSON = withObject "ListLocalDisksResponse" $ \o -> ListLocalDisksResponse
+        <$> o .:  "Disks"
+        <*> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/ListVolumeRecoveryPoints.hs b/gen/Network/AWS/StorageGateway/ListVolumeRecoveryPoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ListVolumeRecoveryPoints.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.StorageGateway.ListVolumeRecoveryPoints
+-- 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)
+
+-- | This operation lists the recovery points for a specified gateway. This
+-- operation is supported only for the gateway-cached volume architecture.
+-- Each gateway-cached volume has one recovery point. A volume recovery point
+-- is a point in time at which all data of the volume is consistent and from
+-- which you can create a snapshot. To create a snapshot from a volume
+-- recovery point use the CreateSnapshotFromVolumeRecoveryPoint operation.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ListVolumeRecoveryPoints.html>
+module Network.AWS.StorageGateway.ListVolumeRecoveryPoints
+    (
+    -- * Request
+      ListVolumeRecoveryPoints
+    -- ** Request constructor
+    , listVolumeRecoveryPoints
+    -- ** Request lenses
+    , lvrpGatewayARN
+
+    -- * Response
+    , ListVolumeRecoveryPointsResponse
+    -- ** Response constructor
+    , listVolumeRecoveryPointsResponse
+    -- ** Response lenses
+    , lvrprGatewayARN
+    , lvrprVolumeRecoveryPointInfos
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype ListVolumeRecoveryPoints = ListVolumeRecoveryPoints
+    { _lvrpGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'ListVolumeRecoveryPoints' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvrpGatewayARN' @::@ 'Text'
+--
+listVolumeRecoveryPoints :: Text -- ^ 'lvrpGatewayARN'
+                         -> ListVolumeRecoveryPoints
+listVolumeRecoveryPoints p1 = ListVolumeRecoveryPoints
+    { _lvrpGatewayARN = p1
+    }
+
+lvrpGatewayARN :: Lens' ListVolumeRecoveryPoints Text
+lvrpGatewayARN = lens _lvrpGatewayARN (\s a -> s { _lvrpGatewayARN = a })
+
+data ListVolumeRecoveryPointsResponse = ListVolumeRecoveryPointsResponse
+    { _lvrprGatewayARN               :: Maybe Text
+    , _lvrprVolumeRecoveryPointInfos :: List "VolumeRecoveryPointInfos" VolumeRecoveryPointInfo
+    } deriving (Eq, Show)
+
+-- | 'ListVolumeRecoveryPointsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvrprGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'lvrprVolumeRecoveryPointInfos' @::@ ['VolumeRecoveryPointInfo']
+--
+listVolumeRecoveryPointsResponse :: ListVolumeRecoveryPointsResponse
+listVolumeRecoveryPointsResponse = ListVolumeRecoveryPointsResponse
+    { _lvrprGatewayARN               = Nothing
+    , _lvrprVolumeRecoveryPointInfos = mempty
+    }
+
+lvrprGatewayARN :: Lens' ListVolumeRecoveryPointsResponse (Maybe Text)
+lvrprGatewayARN = lens _lvrprGatewayARN (\s a -> s { _lvrprGatewayARN = a })
+
+lvrprVolumeRecoveryPointInfos :: Lens' ListVolumeRecoveryPointsResponse [VolumeRecoveryPointInfo]
+lvrprVolumeRecoveryPointInfos =
+    lens _lvrprVolumeRecoveryPointInfos
+        (\s a -> s { _lvrprVolumeRecoveryPointInfos = a })
+            . _List
+
+instance ToPath ListVolumeRecoveryPoints where
+    toPath = const "/"
+
+instance ToQuery ListVolumeRecoveryPoints where
+    toQuery = const mempty
+
+instance ToHeaders ListVolumeRecoveryPoints
+
+instance ToJSON ListVolumeRecoveryPoints where
+    toJSON ListVolumeRecoveryPoints{..} = object
+        [ "GatewayARN" .= _lvrpGatewayARN
+        ]
+
+instance AWSRequest ListVolumeRecoveryPoints where
+    type Sv ListVolumeRecoveryPoints = StorageGateway
+    type Rs ListVolumeRecoveryPoints = ListVolumeRecoveryPointsResponse
+
+    request  = post "ListVolumeRecoveryPoints"
+    response = jsonResponse
+
+instance FromJSON ListVolumeRecoveryPointsResponse where
+    parseJSON = withObject "ListVolumeRecoveryPointsResponse" $ \o -> ListVolumeRecoveryPointsResponse
+        <$> o .:? "GatewayARN"
+        <*> o .:  "VolumeRecoveryPointInfos"
diff --git a/gen/Network/AWS/StorageGateway/ListVolumes.hs b/gen/Network/AWS/StorageGateway/ListVolumes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ListVolumes.hs
@@ -0,0 +1,162 @@
+{-# 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.StorageGateway.ListVolumes
+-- 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)
+
+-- | This operation lists the iSCSI stored volumes of a gateway. Results are
+-- sorted by volume ARN. The response includes only the volume ARNs. If you
+-- want additional volume information, use the DescribeStorediSCSIVolumes API.
+-- The operation supports pagination. By default, the operation returns a
+-- maximum of up to 100 volumes. You can optionally specify the Limit field in
+-- the body to limit the number of volumes in the response. If the number of
+-- volumes returned in the response is truncated, the response includes a
+-- Marker field. You can use this Marker value in your subsequent request to
+-- retrieve the next set of volumes.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ListVolumes.html>
+module Network.AWS.StorageGateway.ListVolumes
+    (
+    -- * Request
+      ListVolumes
+    -- ** Request constructor
+    , listVolumes
+    -- ** Request lenses
+    , lvGatewayARN
+    , lvLimit
+    , lvMarker
+
+    -- * Response
+    , ListVolumesResponse
+    -- ** Response constructor
+    , listVolumesResponse
+    -- ** Response lenses
+    , lvrGatewayARN
+    , lvrMarker
+    , lvrVolumeInfos
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data ListVolumes = ListVolumes
+    { _lvGatewayARN :: Text
+    , _lvLimit      :: Maybe Nat
+    , _lvMarker     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ListVolumes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvGatewayARN' @::@ 'Text'
+--
+-- * 'lvLimit' @::@ 'Maybe' 'Natural'
+--
+-- * 'lvMarker' @::@ 'Maybe' 'Text'
+--
+listVolumes :: Text -- ^ 'lvGatewayARN'
+            -> ListVolumes
+listVolumes p1 = ListVolumes
+    { _lvGatewayARN = p1
+    , _lvMarker     = Nothing
+    , _lvLimit      = Nothing
+    }
+
+lvGatewayARN :: Lens' ListVolumes Text
+lvGatewayARN = lens _lvGatewayARN (\s a -> s { _lvGatewayARN = a })
+
+-- | Specifies that the list of volumes returned be limited to the specified
+-- number of items.
+lvLimit :: Lens' ListVolumes (Maybe Natural)
+lvLimit = lens _lvLimit (\s a -> s { _lvLimit = a }) . mapping _Nat
+
+-- | A string that indicates the position at which to begin the returned list
+-- of volumes. Obtain the marker from the response of a previous List iSCSI
+-- Volumes request.
+lvMarker :: Lens' ListVolumes (Maybe Text)
+lvMarker = lens _lvMarker (\s a -> s { _lvMarker = a })
+
+data ListVolumesResponse = ListVolumesResponse
+    { _lvrGatewayARN  :: Maybe Text
+    , _lvrMarker      :: Maybe Text
+    , _lvrVolumeInfos :: List "VolumeInfos" VolumeInfo
+    } deriving (Eq, Show)
+
+-- | 'ListVolumesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lvrGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'lvrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'lvrVolumeInfos' @::@ ['VolumeInfo']
+--
+listVolumesResponse :: ListVolumesResponse
+listVolumesResponse = ListVolumesResponse
+    { _lvrGatewayARN  = Nothing
+    , _lvrMarker      = Nothing
+    , _lvrVolumeInfos = mempty
+    }
+
+lvrGatewayARN :: Lens' ListVolumesResponse (Maybe Text)
+lvrGatewayARN = lens _lvrGatewayARN (\s a -> s { _lvrGatewayARN = a })
+
+lvrMarker :: Lens' ListVolumesResponse (Maybe Text)
+lvrMarker = lens _lvrMarker (\s a -> s { _lvrMarker = a })
+
+lvrVolumeInfos :: Lens' ListVolumesResponse [VolumeInfo]
+lvrVolumeInfos = lens _lvrVolumeInfos (\s a -> s { _lvrVolumeInfos = a }) . _List
+
+instance ToPath ListVolumes where
+    toPath = const "/"
+
+instance ToQuery ListVolumes where
+    toQuery = const mempty
+
+instance ToHeaders ListVolumes
+
+instance ToJSON ListVolumes where
+    toJSON ListVolumes{..} = object
+        [ "GatewayARN" .= _lvGatewayARN
+        , "Marker"     .= _lvMarker
+        , "Limit"      .= _lvLimit
+        ]
+
+instance AWSRequest ListVolumes where
+    type Sv ListVolumes = StorageGateway
+    type Rs ListVolumes = ListVolumesResponse
+
+    request  = post "ListVolumes"
+    response = jsonResponse
+
+instance FromJSON ListVolumesResponse where
+    parseJSON = withObject "ListVolumesResponse" $ \o -> ListVolumesResponse
+        <$> o .:? "GatewayARN"
+        <*> o .:? "Marker"
+        <*> o .:  "VolumeInfos"
+
+instance AWSPager ListVolumes where
+    page rq rs
+        | stop (rq ^. lvMarker) = Nothing
+        | otherwise = (\x -> rq & lvMarker ?~ x)
+            <$> (rs ^. lvrMarker)
diff --git a/gen/Network/AWS/StorageGateway/RetrieveTapeArchive.hs b/gen/Network/AWS/StorageGateway/RetrieveTapeArchive.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/RetrieveTapeArchive.hs
@@ -0,0 +1,130 @@
+{-# 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.StorageGateway.RetrieveTapeArchive
+-- 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)
+
+-- | Retrieves an archived virtual tape from the virtual tape shelf (VTS) to a
+-- gateway-VTL. Virtual tapes archived in the VTS are not associated with any
+-- gateway. However after a tape is retrieved, it is associated with a
+-- gateway, even though it is also listed in the VTS. Once a tape is
+-- successfully retrieved to a gateway, it cannot be retrieved again to
+-- another gateway. You must archive the tape again before you can retrieve it
+-- to another gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_RetrieveTapeArchive.html>
+module Network.AWS.StorageGateway.RetrieveTapeArchive
+    (
+    -- * Request
+      RetrieveTapeArchive
+    -- ** Request constructor
+    , retrieveTapeArchive
+    -- ** Request lenses
+    , rtaGatewayARN
+    , rtaTapeARN
+
+    -- * Response
+    , RetrieveTapeArchiveResponse
+    -- ** Response constructor
+    , retrieveTapeArchiveResponse
+    -- ** Response lenses
+    , rtarTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data RetrieveTapeArchive = RetrieveTapeArchive
+    { _rtaGatewayARN :: Text
+    , _rtaTapeARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RetrieveTapeArchive' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtaGatewayARN' @::@ 'Text'
+--
+-- * 'rtaTapeARN' @::@ 'Text'
+--
+retrieveTapeArchive :: Text -- ^ 'rtaTapeARN'
+                    -> Text -- ^ 'rtaGatewayARN'
+                    -> RetrieveTapeArchive
+retrieveTapeArchive p1 p2 = RetrieveTapeArchive
+    { _rtaTapeARN    = p1
+    , _rtaGatewayARN = p2
+    }
+
+-- | The Amazon Resource Name (ARN) of the gateway you want to retrieve the
+-- virtual tape to. Use the ListGateways operation to return a list of
+-- gateways for your account and region. You retrieve archived virtual tapes
+-- to only one gateway and the gateway must be a gateway-VTL.
+rtaGatewayARN :: Lens' RetrieveTapeArchive Text
+rtaGatewayARN = lens _rtaGatewayARN (\s a -> s { _rtaGatewayARN = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape you want to retrieve
+-- from the virtual tape shelf (VTS).
+rtaTapeARN :: Lens' RetrieveTapeArchive Text
+rtaTapeARN = lens _rtaTapeARN (\s a -> s { _rtaTapeARN = a })
+
+newtype RetrieveTapeArchiveResponse = RetrieveTapeArchiveResponse
+    { _rtarTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'RetrieveTapeArchiveResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtarTapeARN' @::@ 'Maybe' 'Text'
+--
+retrieveTapeArchiveResponse :: RetrieveTapeArchiveResponse
+retrieveTapeArchiveResponse = RetrieveTapeArchiveResponse
+    { _rtarTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the retrieved virtual tape.
+rtarTapeARN :: Lens' RetrieveTapeArchiveResponse (Maybe Text)
+rtarTapeARN = lens _rtarTapeARN (\s a -> s { _rtarTapeARN = a })
+
+instance ToPath RetrieveTapeArchive where
+    toPath = const "/"
+
+instance ToQuery RetrieveTapeArchive where
+    toQuery = const mempty
+
+instance ToHeaders RetrieveTapeArchive
+
+instance ToJSON RetrieveTapeArchive where
+    toJSON RetrieveTapeArchive{..} = object
+        [ "TapeARN"    .= _rtaTapeARN
+        , "GatewayARN" .= _rtaGatewayARN
+        ]
+
+instance AWSRequest RetrieveTapeArchive where
+    type Sv RetrieveTapeArchive = StorageGateway
+    type Rs RetrieveTapeArchive = RetrieveTapeArchiveResponse
+
+    request  = post "RetrieveTapeArchive"
+    response = jsonResponse
+
+instance FromJSON RetrieveTapeArchiveResponse where
+    parseJSON = withObject "RetrieveTapeArchiveResponse" $ \o -> RetrieveTapeArchiveResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/RetrieveTapeRecoveryPoint.hs b/gen/Network/AWS/StorageGateway/RetrieveTapeRecoveryPoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/RetrieveTapeRecoveryPoint.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.StorageGateway.RetrieveTapeRecoveryPoint
+-- 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)
+
+-- | Retrieves the recovery point for the specified virtual tape. A recovery
+-- point is a point in time view of a virtual tape at which all the data on
+-- the tape is consistent. If your gateway crashes, virtual tapes that have
+-- recovery points can be recovered to a new gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_RetrieveTapeRecoveryPoint.html>
+module Network.AWS.StorageGateway.RetrieveTapeRecoveryPoint
+    (
+    -- * Request
+      RetrieveTapeRecoveryPoint
+    -- ** Request constructor
+    , retrieveTapeRecoveryPoint
+    -- ** Request lenses
+    , rtrpGatewayARN
+    , rtrpTapeARN
+
+    -- * Response
+    , RetrieveTapeRecoveryPointResponse
+    -- ** Response constructor
+    , retrieveTapeRecoveryPointResponse
+    -- ** Response lenses
+    , rtrprTapeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data RetrieveTapeRecoveryPoint = RetrieveTapeRecoveryPoint
+    { _rtrpGatewayARN :: Text
+    , _rtrpTapeARN    :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RetrieveTapeRecoveryPoint' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtrpGatewayARN' @::@ 'Text'
+--
+-- * 'rtrpTapeARN' @::@ 'Text'
+--
+retrieveTapeRecoveryPoint :: Text -- ^ 'rtrpTapeARN'
+                          -> Text -- ^ 'rtrpGatewayARN'
+                          -> RetrieveTapeRecoveryPoint
+retrieveTapeRecoveryPoint p1 p2 = RetrieveTapeRecoveryPoint
+    { _rtrpTapeARN    = p1
+    , _rtrpGatewayARN = p2
+    }
+
+rtrpGatewayARN :: Lens' RetrieveTapeRecoveryPoint Text
+rtrpGatewayARN = lens _rtrpGatewayARN (\s a -> s { _rtrpGatewayARN = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape for which you want to
+-- retrieve the recovery point.
+rtrpTapeARN :: Lens' RetrieveTapeRecoveryPoint Text
+rtrpTapeARN = lens _rtrpTapeARN (\s a -> s { _rtrpTapeARN = a })
+
+newtype RetrieveTapeRecoveryPointResponse = RetrieveTapeRecoveryPointResponse
+    { _rtrprTapeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'RetrieveTapeRecoveryPointResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtrprTapeARN' @::@ 'Maybe' 'Text'
+--
+retrieveTapeRecoveryPointResponse :: RetrieveTapeRecoveryPointResponse
+retrieveTapeRecoveryPointResponse = RetrieveTapeRecoveryPointResponse
+    { _rtrprTapeARN = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape for which the recovery
+-- point was retrieved.
+rtrprTapeARN :: Lens' RetrieveTapeRecoveryPointResponse (Maybe Text)
+rtrprTapeARN = lens _rtrprTapeARN (\s a -> s { _rtrprTapeARN = a })
+
+instance ToPath RetrieveTapeRecoveryPoint where
+    toPath = const "/"
+
+instance ToQuery RetrieveTapeRecoveryPoint where
+    toQuery = const mempty
+
+instance ToHeaders RetrieveTapeRecoveryPoint
+
+instance ToJSON RetrieveTapeRecoveryPoint where
+    toJSON RetrieveTapeRecoveryPoint{..} = object
+        [ "TapeARN"    .= _rtrpTapeARN
+        , "GatewayARN" .= _rtrpGatewayARN
+        ]
+
+instance AWSRequest RetrieveTapeRecoveryPoint where
+    type Sv RetrieveTapeRecoveryPoint = StorageGateway
+    type Rs RetrieveTapeRecoveryPoint = RetrieveTapeRecoveryPointResponse
+
+    request  = post "RetrieveTapeRecoveryPoint"
+    response = jsonResponse
+
+instance FromJSON RetrieveTapeRecoveryPointResponse where
+    parseJSON = withObject "RetrieveTapeRecoveryPointResponse" $ \o -> RetrieveTapeRecoveryPointResponse
+        <$> o .:? "TapeARN"
diff --git a/gen/Network/AWS/StorageGateway/ShutdownGateway.hs b/gen/Network/AWS/StorageGateway/ShutdownGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/ShutdownGateway.hs
@@ -0,0 +1,117 @@
+{-# 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.StorageGateway.ShutdownGateway
+-- 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)
+
+-- | This operation shuts down a gateway. To specify which gateway to shut down,
+-- use the Amazon Resource Name (ARN) of the gateway in the body of your
+-- request. The operation shuts down the gateway service component running in
+-- the storage gateway's virtual machine (VM) and not the VM. After the
+-- gateway is shutdown, you cannot call any other API except StartGateway,
+-- DescribeGatewayInformation, and ListGateways. For more information, see
+-- ActivateGateway. Your applications cannot read from or write to the
+-- gateway's storage volumes, and there are no snapshots taken. If do not
+-- intend to use the gateway again, you must delete the gateway (using
+-- DeleteGateway) to no longer pay software charges associated with the
+-- gateway.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_ShutdownGateway.html>
+module Network.AWS.StorageGateway.ShutdownGateway
+    (
+    -- * Request
+      ShutdownGateway
+    -- ** Request constructor
+    , shutdownGateway
+    -- ** Request lenses
+    , sg1GatewayARN
+
+    -- * Response
+    , ShutdownGatewayResponse
+    -- ** Response constructor
+    , shutdownGatewayResponse
+    -- ** Response lenses
+    , sgr1GatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype ShutdownGateway = ShutdownGateway
+    { _sg1GatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'ShutdownGateway' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sg1GatewayARN' @::@ 'Text'
+--
+shutdownGateway :: Text -- ^ 'sg1GatewayARN'
+                -> ShutdownGateway
+shutdownGateway p1 = ShutdownGateway
+    { _sg1GatewayARN = p1
+    }
+
+sg1GatewayARN :: Lens' ShutdownGateway Text
+sg1GatewayARN = lens _sg1GatewayARN (\s a -> s { _sg1GatewayARN = a })
+
+newtype ShutdownGatewayResponse = ShutdownGatewayResponse
+    { _sgr1GatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'ShutdownGatewayResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sgr1GatewayARN' @::@ 'Maybe' 'Text'
+--
+shutdownGatewayResponse :: ShutdownGatewayResponse
+shutdownGatewayResponse = ShutdownGatewayResponse
+    { _sgr1GatewayARN = Nothing
+    }
+
+sgr1GatewayARN :: Lens' ShutdownGatewayResponse (Maybe Text)
+sgr1GatewayARN = lens _sgr1GatewayARN (\s a -> s { _sgr1GatewayARN = a })
+
+instance ToPath ShutdownGateway where
+    toPath = const "/"
+
+instance ToQuery ShutdownGateway where
+    toQuery = const mempty
+
+instance ToHeaders ShutdownGateway
+
+instance ToJSON ShutdownGateway where
+    toJSON ShutdownGateway{..} = object
+        [ "GatewayARN" .= _sg1GatewayARN
+        ]
+
+instance AWSRequest ShutdownGateway where
+    type Sv ShutdownGateway = StorageGateway
+    type Rs ShutdownGateway = ShutdownGatewayResponse
+
+    request  = post "ShutdownGateway"
+    response = jsonResponse
+
+instance FromJSON ShutdownGatewayResponse where
+    parseJSON = withObject "ShutdownGatewayResponse" $ \o -> ShutdownGatewayResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/StartGateway.hs b/gen/Network/AWS/StorageGateway/StartGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/StartGateway.hs
@@ -0,0 +1,112 @@
+{-# 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.StorageGateway.StartGateway
+-- 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)
+
+-- | This operation starts a gateway that you previously shut down (see
+-- ShutdownGateway). After the gateway starts, you can then make other API
+-- calls, your applications can read from or write to the gateway's storage
+-- volumes and you will be able to take snapshot backups. To specify which
+-- gateway to start, use the Amazon Resource Name (ARN) of the gateway in your
+-- request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_StartGateway.html>
+module Network.AWS.StorageGateway.StartGateway
+    (
+    -- * Request
+      StartGateway
+    -- ** Request constructor
+    , startGateway
+    -- ** Request lenses
+    , sgGatewayARN
+
+    -- * Response
+    , StartGatewayResponse
+    -- ** Response constructor
+    , startGatewayResponse
+    -- ** Response lenses
+    , sgrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype StartGateway = StartGateway
+    { _sgGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'StartGateway' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sgGatewayARN' @::@ 'Text'
+--
+startGateway :: Text -- ^ 'sgGatewayARN'
+             -> StartGateway
+startGateway p1 = StartGateway
+    { _sgGatewayARN = p1
+    }
+
+sgGatewayARN :: Lens' StartGateway Text
+sgGatewayARN = lens _sgGatewayARN (\s a -> s { _sgGatewayARN = a })
+
+newtype StartGatewayResponse = StartGatewayResponse
+    { _sgrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'StartGatewayResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sgrGatewayARN' @::@ 'Maybe' 'Text'
+--
+startGatewayResponse :: StartGatewayResponse
+startGatewayResponse = StartGatewayResponse
+    { _sgrGatewayARN = Nothing
+    }
+
+sgrGatewayARN :: Lens' StartGatewayResponse (Maybe Text)
+sgrGatewayARN = lens _sgrGatewayARN (\s a -> s { _sgrGatewayARN = a })
+
+instance ToPath StartGateway where
+    toPath = const "/"
+
+instance ToQuery StartGateway where
+    toQuery = const mempty
+
+instance ToHeaders StartGateway
+
+instance ToJSON StartGateway where
+    toJSON StartGateway{..} = object
+        [ "GatewayARN" .= _sgGatewayARN
+        ]
+
+instance AWSRequest StartGateway where
+    type Sv StartGateway = StorageGateway
+    type Rs StartGateway = StartGatewayResponse
+
+    request  = post "StartGateway"
+    response = jsonResponse
+
+instance FromJSON StartGatewayResponse where
+    parseJSON = withObject "StartGatewayResponse" $ \o -> StartGatewayResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/Types.hs b/gen/Network/AWS/StorageGateway/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/Types.hs
@@ -0,0 +1,1405 @@
+{-# 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.StorageGateway.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)
+
+module Network.AWS.StorageGateway.Types
+    (
+    -- * Service
+      StorageGateway
+    -- ** Error
+    , JSONError
+
+    -- * ChapInfo
+    , ChapInfo
+    , chapInfo
+    , ciInitiatorName
+    , ciSecretToAuthenticateInitiator
+    , ciSecretToAuthenticateTarget
+    , ciTargetARN
+
+    -- * VolumeiSCSIAttributes
+    , VolumeiSCSIAttributes
+    , volumeiSCSIAttributes
+    , vscsiaChapEnabled
+    , vscsiaLunNumber
+    , vscsiaNetworkInterfaceId
+    , vscsiaNetworkInterfacePort
+    , vscsiaTargetARN
+
+    -- * DeviceiSCSIAttributes
+    , DeviceiSCSIAttributes
+    , deviceiSCSIAttributes
+    , dscsiaChapEnabled
+    , dscsiaNetworkInterfaceId
+    , dscsiaNetworkInterfacePort
+    , dscsiaTargetARN
+
+    -- * Error'
+    , Error'
+    , error
+    , eErrorCode
+    , eErrorDetails
+
+    -- * Disk
+    , Disk
+    , disk
+    , dDiskAllocationResource
+    , dDiskAllocationType
+    , dDiskId
+    , dDiskNode
+    , dDiskPath
+    , dDiskSizeInBytes
+
+    -- * Tape
+    , Tape
+    , tape
+    , tProgress
+    , tTapeARN
+    , tTapeBarcode
+    , tTapeSizeInBytes
+    , tTapeStatus
+    , tVTLDevice
+
+    -- * NetworkInterface
+    , NetworkInterface
+    , networkInterface
+    , niIpv4Address
+    , niIpv6Address
+    , niMacAddress
+
+    -- * VTLDevice
+    , VTLDevice
+    , vtldevice
+    , vtldDeviceiSCSIAttributes
+    , vtldVTLDeviceARN
+    , vtldVTLDeviceProductIdentifier
+    , vtldVTLDeviceType
+    , vtldVTLDeviceVendor
+
+    -- * TapeRecoveryPointInfo
+    , TapeRecoveryPointInfo
+    , tapeRecoveryPointInfo
+    , trpiTapeARN
+    , trpiTapeRecoveryPointTime
+    , trpiTapeSizeInBytes
+    , trpiTapeStatus
+
+    -- * VolumeRecoveryPointInfo
+    , VolumeRecoveryPointInfo
+    , volumeRecoveryPointInfo
+    , vrpiVolumeARN
+    , vrpiVolumeRecoveryPointTime
+    , vrpiVolumeSizeInBytes
+    , vrpiVolumeUsageInBytes
+
+    -- * TapeArchive
+    , TapeArchive
+    , tapeArchive
+    , taCompletionTime
+    , taRetrievedTo
+    , taTapeARN
+    , taTapeBarcode
+    , taTapeSizeInBytes
+    , taTapeStatus
+
+    -- * ErrorCode
+    , ErrorCode (..)
+
+    -- * StorediSCSIVolume
+    , StorediSCSIVolume
+    , storediSCSIVolume
+    , sscsivPreservedExistingData
+    , sscsivSourceSnapshotId
+    , sscsivVolumeARN
+    , sscsivVolumeDiskId
+    , sscsivVolumeId
+    , sscsivVolumeProgress
+    , sscsivVolumeSizeInBytes
+    , sscsivVolumeStatus
+    , sscsivVolumeType
+    , sscsivVolumeiSCSIAttributes
+
+    -- * CachediSCSIVolume
+    , CachediSCSIVolume
+    , cachediSCSIVolume
+    , cscsivSourceSnapshotId
+    , cscsivVolumeARN
+    , cscsivVolumeId
+    , cscsivVolumeProgress
+    , cscsivVolumeSizeInBytes
+    , cscsivVolumeStatus
+    , cscsivVolumeType
+    , cscsivVolumeiSCSIAttributes
+
+    -- * VolumeInfo
+    , VolumeInfo
+    , volumeInfo
+    , viVolumeARN
+    , viVolumeType
+
+    -- * GatewayInfo
+    , GatewayInfo
+    , gatewayInfo
+    , giGatewayARN
+    , giGatewayOperationalState
+    , giGatewayType
+    ) where
+
+import Data.Char (isUpper)
+import Network.AWS.Error
+import Network.AWS.Prelude
+import Network.AWS.Signing.V4
+import qualified GHC.Exts
+
+-- | Version @2013-06-30@ of the Amazon Storage Gateway service.
+data StorageGateway
+
+instance AWSService StorageGateway where
+    type Sg StorageGateway = V4
+    type Er StorageGateway = JSONError
+
+    service = Service
+        { _svcEndpoint     = regional
+        , _svcAbbrev       = "StorageGateway"
+        , _svcPrefix       = "storagegateway"
+        , _svcVersion      = "2013-06-30"
+        , _svcTargetPrefix = Just "StorageGateway_20130630"
+        , _svcJSONVersion  = Just "1.1"
+        }
+
+    handle = jsonError statusSuccess
+
+data ChapInfo = ChapInfo
+    { _ciInitiatorName                 :: Maybe Text
+    , _ciSecretToAuthenticateInitiator :: Maybe Text
+    , _ciSecretToAuthenticateTarget    :: Maybe Text
+    , _ciTargetARN                     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ChapInfo' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ciInitiatorName' @::@ 'Maybe' 'Text'
+--
+-- * 'ciSecretToAuthenticateInitiator' @::@ 'Maybe' 'Text'
+--
+-- * 'ciSecretToAuthenticateTarget' @::@ 'Maybe' 'Text'
+--
+-- * 'ciTargetARN' @::@ 'Maybe' 'Text'
+--
+chapInfo :: ChapInfo
+chapInfo = ChapInfo
+    { _ciTargetARN                     = Nothing
+    , _ciSecretToAuthenticateInitiator = Nothing
+    , _ciInitiatorName                 = Nothing
+    , _ciSecretToAuthenticateTarget    = Nothing
+    }
+
+-- | The iSCSI initiator that connects to the target.
+ciInitiatorName :: Lens' ChapInfo (Maybe Text)
+ciInitiatorName = lens _ciInitiatorName (\s a -> s { _ciInitiatorName = a })
+
+-- | The secret key that the initiator (e.g. Windows client) must provide to
+-- participate in mutual CHAP with the target.
+ciSecretToAuthenticateInitiator :: Lens' ChapInfo (Maybe Text)
+ciSecretToAuthenticateInitiator =
+    lens _ciSecretToAuthenticateInitiator
+        (\s a -> s { _ciSecretToAuthenticateInitiator = a })
+
+-- | The secret key that the target must provide to participate in mutual CHAP
+-- with the initiator (e.g. Windows client).
+ciSecretToAuthenticateTarget :: Lens' ChapInfo (Maybe Text)
+ciSecretToAuthenticateTarget =
+    lens _ciSecretToAuthenticateTarget
+        (\s a -> s { _ciSecretToAuthenticateTarget = a })
+
+-- | The Amazon Resource Name (ARN) of the volume. Valid Values: 50 to 500
+-- lowercase letters, numbers, periods (.), and hyphens (-).
+ciTargetARN :: Lens' ChapInfo (Maybe Text)
+ciTargetARN = lens _ciTargetARN (\s a -> s { _ciTargetARN = a })
+
+instance FromJSON ChapInfo where
+    parseJSON = withObject "ChapInfo" $ \o -> ChapInfo
+        <$> o .:? "InitiatorName"
+        <*> o .:? "SecretToAuthenticateInitiator"
+        <*> o .:? "SecretToAuthenticateTarget"
+        <*> o .:? "TargetARN"
+
+instance ToJSON ChapInfo where
+    toJSON ChapInfo{..} = object
+        [ "TargetARN"                     .= _ciTargetARN
+        , "SecretToAuthenticateInitiator" .= _ciSecretToAuthenticateInitiator
+        , "InitiatorName"                 .= _ciInitiatorName
+        , "SecretToAuthenticateTarget"    .= _ciSecretToAuthenticateTarget
+        ]
+
+data VolumeiSCSIAttributes = VolumeiSCSIAttributes
+    { _vscsiaChapEnabled          :: Maybe Bool
+    , _vscsiaLunNumber            :: Maybe Nat
+    , _vscsiaNetworkInterfaceId   :: Maybe Text
+    , _vscsiaNetworkInterfacePort :: Maybe Int
+    , _vscsiaTargetARN            :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'VolumeiSCSIAttributes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vscsiaChapEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'vscsiaLunNumber' @::@ 'Maybe' 'Natural'
+--
+-- * 'vscsiaNetworkInterfaceId' @::@ 'Maybe' 'Text'
+--
+-- * 'vscsiaNetworkInterfacePort' @::@ 'Maybe' 'Int'
+--
+-- * 'vscsiaTargetARN' @::@ 'Maybe' 'Text'
+--
+volumeiSCSIAttributes :: VolumeiSCSIAttributes
+volumeiSCSIAttributes = VolumeiSCSIAttributes
+    { _vscsiaTargetARN            = Nothing
+    , _vscsiaNetworkInterfaceId   = Nothing
+    , _vscsiaNetworkInterfacePort = Nothing
+    , _vscsiaLunNumber            = Nothing
+    , _vscsiaChapEnabled          = Nothing
+    }
+
+-- | Indicates whether mutual CHAP is enabled for the iSCSI target.
+vscsiaChapEnabled :: Lens' VolumeiSCSIAttributes (Maybe Bool)
+vscsiaChapEnabled =
+    lens _vscsiaChapEnabled (\s a -> s { _vscsiaChapEnabled = a })
+
+-- | The logical disk number.
+vscsiaLunNumber :: Lens' VolumeiSCSIAttributes (Maybe Natural)
+vscsiaLunNumber = lens _vscsiaLunNumber (\s a -> s { _vscsiaLunNumber = a }) . mapping _Nat
+
+-- | The network interface identifier.
+vscsiaNetworkInterfaceId :: Lens' VolumeiSCSIAttributes (Maybe Text)
+vscsiaNetworkInterfaceId =
+    lens _vscsiaNetworkInterfaceId
+        (\s a -> s { _vscsiaNetworkInterfaceId = a })
+
+-- | The port used to communicate with iSCSI targets.
+vscsiaNetworkInterfacePort :: Lens' VolumeiSCSIAttributes (Maybe Int)
+vscsiaNetworkInterfacePort =
+    lens _vscsiaNetworkInterfacePort
+        (\s a -> s { _vscsiaNetworkInterfacePort = a })
+
+-- | The Amazon Resource Name (ARN) of the volume target.
+vscsiaTargetARN :: Lens' VolumeiSCSIAttributes (Maybe Text)
+vscsiaTargetARN = lens _vscsiaTargetARN (\s a -> s { _vscsiaTargetARN = a })
+
+instance FromJSON VolumeiSCSIAttributes where
+    parseJSON = withObject "VolumeiSCSIAttributes" $ \o -> VolumeiSCSIAttributes
+        <$> o .:? "ChapEnabled"
+        <*> o .:? "LunNumber"
+        <*> o .:? "NetworkInterfaceId"
+        <*> o .:? "NetworkInterfacePort"
+        <*> o .:? "TargetARN"
+
+instance ToJSON VolumeiSCSIAttributes where
+    toJSON VolumeiSCSIAttributes{..} = object
+        [ "TargetARN"            .= _vscsiaTargetARN
+        , "NetworkInterfaceId"   .= _vscsiaNetworkInterfaceId
+        , "NetworkInterfacePort" .= _vscsiaNetworkInterfacePort
+        , "LunNumber"            .= _vscsiaLunNumber
+        , "ChapEnabled"          .= _vscsiaChapEnabled
+        ]
+
+data DeviceiSCSIAttributes = DeviceiSCSIAttributes
+    { _dscsiaChapEnabled          :: Maybe Bool
+    , _dscsiaNetworkInterfaceId   :: Maybe Text
+    , _dscsiaNetworkInterfacePort :: Maybe Int
+    , _dscsiaTargetARN            :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeviceiSCSIAttributes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dscsiaChapEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'dscsiaNetworkInterfaceId' @::@ 'Maybe' 'Text'
+--
+-- * 'dscsiaNetworkInterfacePort' @::@ 'Maybe' 'Int'
+--
+-- * 'dscsiaTargetARN' @::@ 'Maybe' 'Text'
+--
+deviceiSCSIAttributes :: DeviceiSCSIAttributes
+deviceiSCSIAttributes = DeviceiSCSIAttributes
+    { _dscsiaTargetARN            = Nothing
+    , _dscsiaNetworkInterfaceId   = Nothing
+    , _dscsiaNetworkInterfacePort = Nothing
+    , _dscsiaChapEnabled          = Nothing
+    }
+
+-- | Indicates whether mutual CHAP is enabled for the iSCSI target.
+dscsiaChapEnabled :: Lens' DeviceiSCSIAttributes (Maybe Bool)
+dscsiaChapEnabled =
+    lens _dscsiaChapEnabled (\s a -> s { _dscsiaChapEnabled = a })
+
+-- | The network interface identifier of the VTL device.
+dscsiaNetworkInterfaceId :: Lens' DeviceiSCSIAttributes (Maybe Text)
+dscsiaNetworkInterfaceId =
+    lens _dscsiaNetworkInterfaceId
+        (\s a -> s { _dscsiaNetworkInterfaceId = a })
+
+-- | The port used to communicate with iSCSI VTL device targets.
+dscsiaNetworkInterfacePort :: Lens' DeviceiSCSIAttributes (Maybe Int)
+dscsiaNetworkInterfacePort =
+    lens _dscsiaNetworkInterfacePort
+        (\s a -> s { _dscsiaNetworkInterfacePort = a })
+
+-- | Specifies the unique Amazon Resource Name(ARN) that encodes the iSCSI
+-- qualified name(iqn) of a tape drive or media changer target.
+dscsiaTargetARN :: Lens' DeviceiSCSIAttributes (Maybe Text)
+dscsiaTargetARN = lens _dscsiaTargetARN (\s a -> s { _dscsiaTargetARN = a })
+
+instance FromJSON DeviceiSCSIAttributes where
+    parseJSON = withObject "DeviceiSCSIAttributes" $ \o -> DeviceiSCSIAttributes
+        <$> o .:? "ChapEnabled"
+        <*> o .:? "NetworkInterfaceId"
+        <*> o .:? "NetworkInterfacePort"
+        <*> o .:? "TargetARN"
+
+instance ToJSON DeviceiSCSIAttributes where
+    toJSON DeviceiSCSIAttributes{..} = object
+        [ "TargetARN"            .= _dscsiaTargetARN
+        , "NetworkInterfaceId"   .= _dscsiaNetworkInterfaceId
+        , "NetworkInterfacePort" .= _dscsiaNetworkInterfacePort
+        , "ChapEnabled"          .= _dscsiaChapEnabled
+        ]
+
+data Error' = Error'
+    { _eErrorCode    :: Maybe Text
+    , _eErrorDetails :: Map Text Text
+    } deriving (Eq, Show)
+
+-- | 'Error'' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'eErrorCode' @::@ 'Maybe' 'Text'
+--
+-- * 'eErrorDetails' @::@ 'HashMap' 'Text' 'Text'
+--
+error :: Error'
+error = Error'
+    { _eErrorCode    = Nothing
+    , _eErrorDetails = mempty
+    }
+
+-- | Additional information about the error.
+eErrorCode :: Lens' Error' (Maybe Text)
+eErrorCode = lens _eErrorCode (\s a -> s { _eErrorCode = a })
+
+-- | Human-readable text that provides detail about the error that occurred.
+eErrorDetails :: Lens' Error' (HashMap Text Text)
+eErrorDetails = lens _eErrorDetails (\s a -> s { _eErrorDetails = a }) . _Map
+
+instance FromJSON Error' where
+    parseJSON = withObject "Error'" $ \o -> Error'
+        <$> o .:? "errorCode"
+        <*> o .:  "errorDetails"
+
+instance ToJSON Error' where
+    toJSON Error'{..} = object
+        [ "errorCode"    .= _eErrorCode
+        , "errorDetails" .= _eErrorDetails
+        ]
+
+data Disk = Disk
+    { _dDiskAllocationResource :: Maybe Text
+    , _dDiskAllocationType     :: Maybe Text
+    , _dDiskId                 :: Maybe Text
+    , _dDiskNode               :: Maybe Text
+    , _dDiskPath               :: Maybe Text
+    , _dDiskSizeInBytes        :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'Disk' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dDiskAllocationResource' @::@ 'Maybe' 'Text'
+--
+-- * 'dDiskAllocationType' @::@ 'Maybe' 'Text'
+--
+-- * 'dDiskId' @::@ 'Maybe' 'Text'
+--
+-- * 'dDiskNode' @::@ 'Maybe' 'Text'
+--
+-- * 'dDiskPath' @::@ 'Maybe' 'Text'
+--
+-- * 'dDiskSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+disk :: Disk
+disk = Disk
+    { _dDiskId                 = Nothing
+    , _dDiskPath               = Nothing
+    , _dDiskNode               = Nothing
+    , _dDiskSizeInBytes        = Nothing
+    , _dDiskAllocationType     = Nothing
+    , _dDiskAllocationResource = Nothing
+    }
+
+dDiskAllocationResource :: Lens' Disk (Maybe Text)
+dDiskAllocationResource =
+    lens _dDiskAllocationResource (\s a -> s { _dDiskAllocationResource = a })
+
+dDiskAllocationType :: Lens' Disk (Maybe Text)
+dDiskAllocationType =
+    lens _dDiskAllocationType (\s a -> s { _dDiskAllocationType = a })
+
+dDiskId :: Lens' Disk (Maybe Text)
+dDiskId = lens _dDiskId (\s a -> s { _dDiskId = a })
+
+dDiskNode :: Lens' Disk (Maybe Text)
+dDiskNode = lens _dDiskNode (\s a -> s { _dDiskNode = a })
+
+dDiskPath :: Lens' Disk (Maybe Text)
+dDiskPath = lens _dDiskPath (\s a -> s { _dDiskPath = a })
+
+dDiskSizeInBytes :: Lens' Disk (Maybe Integer)
+dDiskSizeInBytes = lens _dDiskSizeInBytes (\s a -> s { _dDiskSizeInBytes = a })
+
+instance FromJSON Disk where
+    parseJSON = withObject "Disk" $ \o -> Disk
+        <$> o .:? "DiskAllocationResource"
+        <*> o .:? "DiskAllocationType"
+        <*> o .:? "DiskId"
+        <*> o .:? "DiskNode"
+        <*> o .:? "DiskPath"
+        <*> o .:? "DiskSizeInBytes"
+
+instance ToJSON Disk where
+    toJSON Disk{..} = object
+        [ "DiskId"                 .= _dDiskId
+        , "DiskPath"               .= _dDiskPath
+        , "DiskNode"               .= _dDiskNode
+        , "DiskSizeInBytes"        .= _dDiskSizeInBytes
+        , "DiskAllocationType"     .= _dDiskAllocationType
+        , "DiskAllocationResource" .= _dDiskAllocationResource
+        ]
+
+data Tape = Tape
+    { _tProgress        :: Maybe Double
+    , _tTapeARN         :: Maybe Text
+    , _tTapeBarcode     :: Maybe Text
+    , _tTapeSizeInBytes :: Maybe Nat
+    , _tTapeStatus      :: Maybe Text
+    , _tVTLDevice       :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'Tape' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'tProgress' @::@ 'Maybe' 'Double'
+--
+-- * 'tTapeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'tTapeBarcode' @::@ 'Maybe' 'Text'
+--
+-- * 'tTapeSizeInBytes' @::@ 'Maybe' 'Natural'
+--
+-- * 'tTapeStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'tVTLDevice' @::@ 'Maybe' 'Text'
+--
+tape :: Tape
+tape = Tape
+    { _tTapeARN         = Nothing
+    , _tTapeBarcode     = Nothing
+    , _tTapeSizeInBytes = Nothing
+    , _tTapeStatus      = Nothing
+    , _tVTLDevice       = Nothing
+    , _tProgress        = Nothing
+    }
+
+-- | For archiving virtual tapes, indicates how much data remains to be
+-- uploaded before archiving is complete. Range: 0 (not started) to 100
+-- (complete).
+tProgress :: Lens' Tape (Maybe Double)
+tProgress = lens _tProgress (\s a -> s { _tProgress = a })
+
+-- | The Amazon Resource Name (ARN) of the virtual tape.
+tTapeARN :: Lens' Tape (Maybe Text)
+tTapeARN = lens _tTapeARN (\s a -> s { _tTapeARN = a })
+
+-- | The barcode that identifies a specific virtual tape.
+tTapeBarcode :: Lens' Tape (Maybe Text)
+tTapeBarcode = lens _tTapeBarcode (\s a -> s { _tTapeBarcode = a })
+
+-- | The size, in bytes, of the virtual tape.
+tTapeSizeInBytes :: Lens' Tape (Maybe Natural)
+tTapeSizeInBytes = lens _tTapeSizeInBytes (\s a -> s { _tTapeSizeInBytes = a }) . mapping _Nat
+
+-- | The current state of the virtual tape.
+tTapeStatus :: Lens' Tape (Maybe Text)
+tTapeStatus = lens _tTapeStatus (\s a -> s { _tTapeStatus = a })
+
+-- | The virtual tape library (VTL) device that the virtual tape is associated
+-- with.
+tVTLDevice :: Lens' Tape (Maybe Text)
+tVTLDevice = lens _tVTLDevice (\s a -> s { _tVTLDevice = a })
+
+instance FromJSON Tape where
+    parseJSON = withObject "Tape" $ \o -> Tape
+        <$> o .:? "Progress"
+        <*> o .:? "TapeARN"
+        <*> o .:? "TapeBarcode"
+        <*> o .:? "TapeSizeInBytes"
+        <*> o .:? "TapeStatus"
+        <*> o .:? "VTLDevice"
+
+instance ToJSON Tape where
+    toJSON Tape{..} = object
+        [ "TapeARN"         .= _tTapeARN
+        , "TapeBarcode"     .= _tTapeBarcode
+        , "TapeSizeInBytes" .= _tTapeSizeInBytes
+        , "TapeStatus"      .= _tTapeStatus
+        , "VTLDevice"       .= _tVTLDevice
+        , "Progress"        .= _tProgress
+        ]
+
+data NetworkInterface = NetworkInterface
+    { _niIpv4Address :: Maybe Text
+    , _niIpv6Address :: Maybe Text
+    , _niMacAddress  :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'NetworkInterface' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'niIpv4Address' @::@ 'Maybe' 'Text'
+--
+-- * 'niIpv6Address' @::@ 'Maybe' 'Text'
+--
+-- * 'niMacAddress' @::@ 'Maybe' 'Text'
+--
+networkInterface :: NetworkInterface
+networkInterface = NetworkInterface
+    { _niIpv4Address = Nothing
+    , _niMacAddress  = Nothing
+    , _niIpv6Address = Nothing
+    }
+
+-- | The Internet Protocol version 4 (IPv4) address of the interface.
+niIpv4Address :: Lens' NetworkInterface (Maybe Text)
+niIpv4Address = lens _niIpv4Address (\s a -> s { _niIpv4Address = a })
+
+-- | The Internet Protocol version 6 (IPv6) address of the interface.
+-- Currently not supported.
+niIpv6Address :: Lens' NetworkInterface (Maybe Text)
+niIpv6Address = lens _niIpv6Address (\s a -> s { _niIpv6Address = a })
+
+-- | The Media Access Control (MAC) address of the interface.
+niMacAddress :: Lens' NetworkInterface (Maybe Text)
+niMacAddress = lens _niMacAddress (\s a -> s { _niMacAddress = a })
+
+instance FromJSON NetworkInterface where
+    parseJSON = withObject "NetworkInterface" $ \o -> NetworkInterface
+        <$> o .:? "Ipv4Address"
+        <*> o .:? "Ipv6Address"
+        <*> o .:? "MacAddress"
+
+instance ToJSON NetworkInterface where
+    toJSON NetworkInterface{..} = object
+        [ "Ipv4Address" .= _niIpv4Address
+        , "MacAddress"  .= _niMacAddress
+        , "Ipv6Address" .= _niIpv6Address
+        ]
+
+data VTLDevice = VTLDevice
+    { _vtldDeviceiSCSIAttributes      :: Maybe DeviceiSCSIAttributes
+    , _vtldVTLDeviceARN               :: Maybe Text
+    , _vtldVTLDeviceProductIdentifier :: Maybe Text
+    , _vtldVTLDeviceType              :: Maybe Text
+    , _vtldVTLDeviceVendor            :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'VTLDevice' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vtldDeviceiSCSIAttributes' @::@ 'Maybe' 'DeviceiSCSIAttributes'
+--
+-- * 'vtldVTLDeviceARN' @::@ 'Maybe' 'Text'
+--
+-- * 'vtldVTLDeviceProductIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'vtldVTLDeviceType' @::@ 'Maybe' 'Text'
+--
+-- * 'vtldVTLDeviceVendor' @::@ 'Maybe' 'Text'
+--
+vtldevice :: VTLDevice
+vtldevice = VTLDevice
+    { _vtldVTLDeviceARN               = Nothing
+    , _vtldVTLDeviceType              = Nothing
+    , _vtldVTLDeviceVendor            = Nothing
+    , _vtldVTLDeviceProductIdentifier = Nothing
+    , _vtldDeviceiSCSIAttributes      = Nothing
+    }
+
+-- | A list of iSCSI information about a VTL device.
+vtldDeviceiSCSIAttributes :: Lens' VTLDevice (Maybe DeviceiSCSIAttributes)
+vtldDeviceiSCSIAttributes =
+    lens _vtldDeviceiSCSIAttributes
+        (\s a -> s { _vtldDeviceiSCSIAttributes = a })
+
+-- | Specifies the unique Amazon Resource Name (ARN) of the device (tape drive
+-- or media changer).
+vtldVTLDeviceARN :: Lens' VTLDevice (Maybe Text)
+vtldVTLDeviceARN = lens _vtldVTLDeviceARN (\s a -> s { _vtldVTLDeviceARN = a })
+
+vtldVTLDeviceProductIdentifier :: Lens' VTLDevice (Maybe Text)
+vtldVTLDeviceProductIdentifier =
+    lens _vtldVTLDeviceProductIdentifier
+        (\s a -> s { _vtldVTLDeviceProductIdentifier = a })
+
+vtldVTLDeviceType :: Lens' VTLDevice (Maybe Text)
+vtldVTLDeviceType =
+    lens _vtldVTLDeviceType (\s a -> s { _vtldVTLDeviceType = a })
+
+vtldVTLDeviceVendor :: Lens' VTLDevice (Maybe Text)
+vtldVTLDeviceVendor =
+    lens _vtldVTLDeviceVendor (\s a -> s { _vtldVTLDeviceVendor = a })
+
+instance FromJSON VTLDevice where
+    parseJSON = withObject "VTLDevice" $ \o -> VTLDevice
+        <$> o .:? "DeviceiSCSIAttributes"
+        <*> o .:? "VTLDeviceARN"
+        <*> o .:? "VTLDeviceProductIdentifier"
+        <*> o .:? "VTLDeviceType"
+        <*> o .:? "VTLDeviceVendor"
+
+instance ToJSON VTLDevice where
+    toJSON VTLDevice{..} = object
+        [ "VTLDeviceARN"               .= _vtldVTLDeviceARN
+        , "VTLDeviceType"              .= _vtldVTLDeviceType
+        , "VTLDeviceVendor"            .= _vtldVTLDeviceVendor
+        , "VTLDeviceProductIdentifier" .= _vtldVTLDeviceProductIdentifier
+        , "DeviceiSCSIAttributes"      .= _vtldDeviceiSCSIAttributes
+        ]
+
+data TapeRecoveryPointInfo = TapeRecoveryPointInfo
+    { _trpiTapeARN               :: Maybe Text
+    , _trpiTapeRecoveryPointTime :: Maybe RFC822
+    , _trpiTapeSizeInBytes       :: Maybe Nat
+    , _trpiTapeStatus            :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'TapeRecoveryPointInfo' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'trpiTapeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'trpiTapeRecoveryPointTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'trpiTapeSizeInBytes' @::@ 'Maybe' 'Natural'
+--
+-- * 'trpiTapeStatus' @::@ 'Maybe' 'Text'
+--
+tapeRecoveryPointInfo :: TapeRecoveryPointInfo
+tapeRecoveryPointInfo = TapeRecoveryPointInfo
+    { _trpiTapeARN               = Nothing
+    , _trpiTapeRecoveryPointTime = Nothing
+    , _trpiTapeSizeInBytes       = Nothing
+    , _trpiTapeStatus            = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the virtual tape.
+trpiTapeARN :: Lens' TapeRecoveryPointInfo (Maybe Text)
+trpiTapeARN = lens _trpiTapeARN (\s a -> s { _trpiTapeARN = a })
+
+-- | The time when the point-in-time view of the virtual tape was replicated
+-- for later recovery. The string format of the tape recovery point time is
+-- in the ISO8601 extended YYYY-MM-DD'T'HH:MM:SS'Z' format.
+trpiTapeRecoveryPointTime :: Lens' TapeRecoveryPointInfo (Maybe UTCTime)
+trpiTapeRecoveryPointTime =
+    lens _trpiTapeRecoveryPointTime
+        (\s a -> s { _trpiTapeRecoveryPointTime = a })
+            . mapping _Time
+
+-- | The size, in bytes, of the virtual tapes to recover.
+trpiTapeSizeInBytes :: Lens' TapeRecoveryPointInfo (Maybe Natural)
+trpiTapeSizeInBytes =
+    lens _trpiTapeSizeInBytes (\s a -> s { _trpiTapeSizeInBytes = a })
+        . mapping _Nat
+
+trpiTapeStatus :: Lens' TapeRecoveryPointInfo (Maybe Text)
+trpiTapeStatus = lens _trpiTapeStatus (\s a -> s { _trpiTapeStatus = a })
+
+instance FromJSON TapeRecoveryPointInfo where
+    parseJSON = withObject "TapeRecoveryPointInfo" $ \o -> TapeRecoveryPointInfo
+        <$> o .:? "TapeARN"
+        <*> o .:? "TapeRecoveryPointTime"
+        <*> o .:? "TapeSizeInBytes"
+        <*> o .:? "TapeStatus"
+
+instance ToJSON TapeRecoveryPointInfo where
+    toJSON TapeRecoveryPointInfo{..} = object
+        [ "TapeARN"               .= _trpiTapeARN
+        , "TapeRecoveryPointTime" .= _trpiTapeRecoveryPointTime
+        , "TapeSizeInBytes"       .= _trpiTapeSizeInBytes
+        , "TapeStatus"            .= _trpiTapeStatus
+        ]
+
+data VolumeRecoveryPointInfo = VolumeRecoveryPointInfo
+    { _vrpiVolumeARN               :: Maybe Text
+    , _vrpiVolumeRecoveryPointTime :: Maybe Text
+    , _vrpiVolumeSizeInBytes       :: Maybe Integer
+    , _vrpiVolumeUsageInBytes      :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'VolumeRecoveryPointInfo' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vrpiVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'vrpiVolumeRecoveryPointTime' @::@ 'Maybe' 'Text'
+--
+-- * 'vrpiVolumeSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'vrpiVolumeUsageInBytes' @::@ 'Maybe' 'Integer'
+--
+volumeRecoveryPointInfo :: VolumeRecoveryPointInfo
+volumeRecoveryPointInfo = VolumeRecoveryPointInfo
+    { _vrpiVolumeARN               = Nothing
+    , _vrpiVolumeSizeInBytes       = Nothing
+    , _vrpiVolumeUsageInBytes      = Nothing
+    , _vrpiVolumeRecoveryPointTime = Nothing
+    }
+
+vrpiVolumeARN :: Lens' VolumeRecoveryPointInfo (Maybe Text)
+vrpiVolumeARN = lens _vrpiVolumeARN (\s a -> s { _vrpiVolumeARN = a })
+
+vrpiVolumeRecoveryPointTime :: Lens' VolumeRecoveryPointInfo (Maybe Text)
+vrpiVolumeRecoveryPointTime =
+    lens _vrpiVolumeRecoveryPointTime
+        (\s a -> s { _vrpiVolumeRecoveryPointTime = a })
+
+vrpiVolumeSizeInBytes :: Lens' VolumeRecoveryPointInfo (Maybe Integer)
+vrpiVolumeSizeInBytes =
+    lens _vrpiVolumeSizeInBytes (\s a -> s { _vrpiVolumeSizeInBytes = a })
+
+vrpiVolumeUsageInBytes :: Lens' VolumeRecoveryPointInfo (Maybe Integer)
+vrpiVolumeUsageInBytes =
+    lens _vrpiVolumeUsageInBytes (\s a -> s { _vrpiVolumeUsageInBytes = a })
+
+instance FromJSON VolumeRecoveryPointInfo where
+    parseJSON = withObject "VolumeRecoveryPointInfo" $ \o -> VolumeRecoveryPointInfo
+        <$> o .:? "VolumeARN"
+        <*> o .:? "VolumeRecoveryPointTime"
+        <*> o .:? "VolumeSizeInBytes"
+        <*> o .:? "VolumeUsageInBytes"
+
+instance ToJSON VolumeRecoveryPointInfo where
+    toJSON VolumeRecoveryPointInfo{..} = object
+        [ "VolumeARN"               .= _vrpiVolumeARN
+        , "VolumeSizeInBytes"       .= _vrpiVolumeSizeInBytes
+        , "VolumeUsageInBytes"      .= _vrpiVolumeUsageInBytes
+        , "VolumeRecoveryPointTime" .= _vrpiVolumeRecoveryPointTime
+        ]
+
+data TapeArchive = TapeArchive
+    { _taCompletionTime  :: Maybe RFC822
+    , _taRetrievedTo     :: Maybe Text
+    , _taTapeARN         :: Maybe Text
+    , _taTapeBarcode     :: Maybe Text
+    , _taTapeSizeInBytes :: Maybe Nat
+    , _taTapeStatus      :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'TapeArchive' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'taCompletionTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'taRetrievedTo' @::@ 'Maybe' 'Text'
+--
+-- * 'taTapeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'taTapeBarcode' @::@ 'Maybe' 'Text'
+--
+-- * 'taTapeSizeInBytes' @::@ 'Maybe' 'Natural'
+--
+-- * 'taTapeStatus' @::@ 'Maybe' 'Text'
+--
+tapeArchive :: TapeArchive
+tapeArchive = TapeArchive
+    { _taTapeARN         = Nothing
+    , _taTapeBarcode     = Nothing
+    , _taTapeSizeInBytes = Nothing
+    , _taCompletionTime  = Nothing
+    , _taRetrievedTo     = Nothing
+    , _taTapeStatus      = Nothing
+    }
+
+-- | The time that the archiving of the virtual tape was completed. The string
+-- format of the completion time is in the ISO8601 extended
+-- YYYY-MM-DD'T'HH:MM:SS'Z' format.
+taCompletionTime :: Lens' TapeArchive (Maybe UTCTime)
+taCompletionTime = lens _taCompletionTime (\s a -> s { _taCompletionTime = a }) . mapping _Time
+
+-- | The Amazon Resource Name (ARN) of the gateway-VTL that the virtual tape
+-- is being retrieved to. The virtual tape is retrieved from the virtual
+-- tape shelf (VTS).
+taRetrievedTo :: Lens' TapeArchive (Maybe Text)
+taRetrievedTo = lens _taRetrievedTo (\s a -> s { _taRetrievedTo = a })
+
+-- | The Amazon Resource Name (ARN) of an archived virtual tape.
+taTapeARN :: Lens' TapeArchive (Maybe Text)
+taTapeARN = lens _taTapeARN (\s a -> s { _taTapeARN = a })
+
+-- | The barcode that identifies the archived virtual tape.
+taTapeBarcode :: Lens' TapeArchive (Maybe Text)
+taTapeBarcode = lens _taTapeBarcode (\s a -> s { _taTapeBarcode = a })
+
+-- | The size, in bytes, of the archived virtual tape.
+taTapeSizeInBytes :: Lens' TapeArchive (Maybe Natural)
+taTapeSizeInBytes =
+    lens _taTapeSizeInBytes (\s a -> s { _taTapeSizeInBytes = a })
+        . mapping _Nat
+
+-- | The current state of the archived virtual tape.
+taTapeStatus :: Lens' TapeArchive (Maybe Text)
+taTapeStatus = lens _taTapeStatus (\s a -> s { _taTapeStatus = a })
+
+instance FromJSON TapeArchive where
+    parseJSON = withObject "TapeArchive" $ \o -> TapeArchive
+        <$> o .:? "CompletionTime"
+        <*> o .:? "RetrievedTo"
+        <*> o .:? "TapeARN"
+        <*> o .:? "TapeBarcode"
+        <*> o .:? "TapeSizeInBytes"
+        <*> o .:? "TapeStatus"
+
+instance ToJSON TapeArchive where
+    toJSON TapeArchive{..} = object
+        [ "TapeARN"         .= _taTapeARN
+        , "TapeBarcode"     .= _taTapeBarcode
+        , "TapeSizeInBytes" .= _taTapeSizeInBytes
+        , "CompletionTime"  .= _taCompletionTime
+        , "RetrievedTo"     .= _taRetrievedTo
+        , "TapeStatus"      .= _taTapeStatus
+        ]
+
+data ErrorCode
+    = ActivationKeyExpired              -- ^ ActivationKeyExpired
+    | ActivationKeyInvalid              -- ^ ActivationKeyInvalid
+    | ActivationKeyNotFound             -- ^ ActivationKeyNotFound
+    | AuthenticationFailure             -- ^ AuthenticationFailure
+    | BandwidthThrottleScheduleNotFound -- ^ BandwidthThrottleScheduleNotFound
+    | Blocked                           -- ^ Blocked
+    | CannotExportSnapshot              -- ^ CannotExportSnapshot
+    | ChapCredentialNotFound            -- ^ ChapCredentialNotFound
+    | DiskAlreadyAllocated              -- ^ DiskAlreadyAllocated
+    | DiskDoesNotExist                  -- ^ DiskDoesNotExist
+    | DiskSizeGreaterThanVolumeMaxSize  -- ^ DiskSizeGreaterThanVolumeMaxSize
+    | DiskSizeLessThanVolumeSize        -- ^ DiskSizeLessThanVolumeSize
+    | DiskSizeNotGigAligned             -- ^ DiskSizeNotGigAligned
+    | DuplicateCertificateInfo          -- ^ DuplicateCertificateInfo
+    | DuplicateSchedule                 -- ^ DuplicateSchedule
+    | EndpointNotFound                  -- ^ EndpointNotFound
+    | GatewayInternalError              -- ^ GatewayInternalError
+    | GatewayNotConnected               -- ^ GatewayNotConnected
+    | GatewayNotFound                   -- ^ GatewayNotFound
+    | GatewayProxyNetworkConnectionBusy -- ^ GatewayProxyNetworkConnectionBusy
+    | IAMNotSupported                   -- ^ IAMNotSupported
+    | InitiatorInvalid                  -- ^ InitiatorInvalid
+    | InitiatorNotFound                 -- ^ InitiatorNotFound
+    | InternalError                     -- ^ InternalError
+    | InvalidEndpoint                   -- ^ InvalidEndpoint
+    | InvalidGateway                    -- ^ InvalidGateway
+    | InvalidParameters                 -- ^ InvalidParameters
+    | InvalidSchedule                   -- ^ InvalidSchedule
+    | LocalStorageLimitExceeded         -- ^ LocalStorageLimitExceeded
+    | LunAlreadyAllocated               -- ^ LunAlreadyAllocated 
+    | LunInvalid                        -- ^ LunInvalid
+    | MaximumContentLengthExceeded      -- ^ MaximumContentLengthExceeded
+    | MaximumTapeCartridgeCountExceeded -- ^ MaximumTapeCartridgeCountExceeded
+    | MaximumVolumeCountExceeded        -- ^ MaximumVolumeCountExceeded
+    | NetworkConfigurationChanged       -- ^ NetworkConfigurationChanged
+    | NoDisksAvailable                  -- ^ NoDisksAvailable
+    | NotImplemented                    -- ^ NotImplemented
+    | NotSupported                      -- ^ NotSupported
+    | OperationAborted                  -- ^ OperationAborted
+    | OutdatedGateway                   -- ^ OutdatedGateway
+    | ParametersNotImplemented          -- ^ ParametersNotImplemented
+    | RegionInvalid                     -- ^ RegionInvalid
+    | RequestTimeout                    -- ^ RequestTimeout
+    | ServiceUnavailable                -- ^ ServiceUnavailable
+    | SnapshotDeleted                   -- ^ SnapshotDeleted
+    | SnapshotIdInvalid                 -- ^ SnapshotIdInvalid
+    | SnapshotInProgress                -- ^ SnapshotInProgress
+    | SnapshotNotFound                  -- ^ SnapshotNotFound
+    | SnapshotScheduleNotFound          -- ^ SnapshotScheduleNotFound
+    | StagingAreaFull                   -- ^ StagingAreaFull
+    | StorageFailure                    -- ^ StorageFailure
+    | TapeCartridgeNotFound             -- ^ TapeCartridgeNotFound
+    | TargetAlreadyExists               -- ^ TargetAlreadyExists
+    | TargetInvalid                     -- ^ TargetInvalid
+    | TargetNotFound                    -- ^ TargetNotFound
+    | UnauthorizedOperation             -- ^ UnauthorizedOperation
+    | VolumeAlreadyExists               -- ^ VolumeAlreadyExists
+    | VolumeIdInvalid                   -- ^ VolumeIdInvalid
+    | VolumeInUse                       -- ^ VolumeInUse
+    | VolumeNotFound                    -- ^ VolumeNotFound
+    | VolumeNotReady                    -- ^ VolumeNotReady
+      deriving (Eq, Ord, Show, Generic, Enum)
+
+instance Hashable ErrorCode
+
+instance FromText ErrorCode where
+    parser = match "ActivationKeyExpired"              ActivationKeyExpired
+         <|> match "ActivationKeyInvalid"              ActivationKeyInvalid
+         <|> match "ActivationKeyNotFound"             ActivationKeyNotFound
+         <|> match "AuthenticationFailure"             AuthenticationFailure
+         <|> match "BandwidthThrottleScheduleNotFound" BandwidthThrottleScheduleNotFound
+         <|> match "Blocked"                           Blocked
+         <|> match "CannotExportSnapshot"              CannotExportSnapshot
+         <|> match "ChapCredentialNotFound"            ChapCredentialNotFound
+         <|> match "DiskAlreadyAllocated"              DiskAlreadyAllocated
+         <|> match "DiskDoesNotExist"                  DiskDoesNotExist
+         <|> match "DiskSizeGreaterThanVolumeMaxSize"  DiskSizeGreaterThanVolumeMaxSize
+         <|> match "DiskSizeLessThanVolumeSize"        DiskSizeLessThanVolumeSize
+         <|> match "DiskSizeNotGigAligned"             DiskSizeNotGigAligned
+         <|> match "DuplicateCertificateInfo"          DuplicateCertificateInfo
+         <|> match "DuplicateSchedule"                 DuplicateSchedule
+         <|> match "EndpointNotFound"                  EndpointNotFound
+         <|> match "GatewayInternalError"              GatewayInternalError
+         <|> match "GatewayNotConnected"               GatewayNotConnected
+         <|> match "GatewayNotFound"                   GatewayNotFound
+         <|> match "GatewayProxyNetworkConnectionBusy" GatewayProxyNetworkConnectionBusy
+         <|> match "IAMNotSupported"                   IAMNotSupported
+         <|> match "InitiatorInvalid"                  InitiatorInvalid
+         <|> match "InitiatorNotFound"                 InitiatorNotFound
+         <|> match "InternalError"                     InternalError
+         <|> match "InvalidEndpoint"                   InvalidEndpoint
+         <|> match "InvalidGateway"                    InvalidGateway
+         <|> match "InvalidParameters"                 InvalidParameters
+         <|> match "InvalidSchedule"                   InvalidSchedule
+         <|> match "LocalStorageLimitExceeded"         LocalStorageLimitExceeded
+         <|> match "LunAlreadyAllocated "              LunAlreadyAllocated
+         <|> match "LunInvalid"                        LunInvalid
+         <|> match "MaximumContentLengthExceeded"      MaximumContentLengthExceeded
+         <|> match "MaximumTapeCartridgeCountExceeded" MaximumTapeCartridgeCountExceeded
+         <|> match "MaximumVolumeCountExceeded"        MaximumVolumeCountExceeded
+         <|> match "NetworkConfigurationChanged"       NetworkConfigurationChanged
+         <|> match "NoDisksAvailable"                  NoDisksAvailable
+         <|> match "NotImplemented"                    NotImplemented
+         <|> match "NotSupported"                      NotSupported
+         <|> match "OperationAborted"                  OperationAborted
+         <|> match "OutdatedGateway"                   OutdatedGateway
+         <|> match "ParametersNotImplemented"          ParametersNotImplemented
+         <|> match "RegionInvalid"                     RegionInvalid
+         <|> match "RequestTimeout"                    RequestTimeout
+         <|> match "ServiceUnavailable"                ServiceUnavailable
+         <|> match "SnapshotDeleted"                   SnapshotDeleted
+         <|> match "SnapshotIdInvalid"                 SnapshotIdInvalid
+         <|> match "SnapshotInProgress"                SnapshotInProgress
+         <|> match "SnapshotNotFound"                  SnapshotNotFound
+         <|> match "SnapshotScheduleNotFound"          SnapshotScheduleNotFound
+         <|> match "StagingAreaFull"                   StagingAreaFull
+         <|> match "StorageFailure"                    StorageFailure
+         <|> match "TapeCartridgeNotFound"             TapeCartridgeNotFound
+         <|> match "TargetAlreadyExists"               TargetAlreadyExists
+         <|> match "TargetInvalid"                     TargetInvalid
+         <|> match "TargetNotFound"                    TargetNotFound
+         <|> match "UnauthorizedOperation"             UnauthorizedOperation
+         <|> match "VolumeAlreadyExists"               VolumeAlreadyExists
+         <|> match "VolumeIdInvalid"                   VolumeIdInvalid
+         <|> match "VolumeInUse"                       VolumeInUse
+         <|> match "VolumeNotFound"                    VolumeNotFound
+         <|> match "VolumeNotReady"                    VolumeNotReady
+
+instance ToText ErrorCode where
+    toText = \case
+        ActivationKeyExpired              -> "ActivationKeyExpired"
+        ActivationKeyInvalid              -> "ActivationKeyInvalid"
+        ActivationKeyNotFound             -> "ActivationKeyNotFound"
+        AuthenticationFailure             -> "AuthenticationFailure"
+        BandwidthThrottleScheduleNotFound -> "BandwidthThrottleScheduleNotFound"
+        Blocked                           -> "Blocked"
+        CannotExportSnapshot              -> "CannotExportSnapshot"
+        ChapCredentialNotFound            -> "ChapCredentialNotFound"
+        DiskAlreadyAllocated              -> "DiskAlreadyAllocated"
+        DiskDoesNotExist                  -> "DiskDoesNotExist"
+        DiskSizeGreaterThanVolumeMaxSize  -> "DiskSizeGreaterThanVolumeMaxSize"
+        DiskSizeLessThanVolumeSize        -> "DiskSizeLessThanVolumeSize"
+        DiskSizeNotGigAligned             -> "DiskSizeNotGigAligned"
+        DuplicateCertificateInfo          -> "DuplicateCertificateInfo"
+        DuplicateSchedule                 -> "DuplicateSchedule"
+        EndpointNotFound                  -> "EndpointNotFound"
+        GatewayInternalError              -> "GatewayInternalError"
+        GatewayNotConnected               -> "GatewayNotConnected"
+        GatewayNotFound                   -> "GatewayNotFound"
+        GatewayProxyNetworkConnectionBusy -> "GatewayProxyNetworkConnectionBusy"
+        IAMNotSupported                   -> "IAMNotSupported"
+        InitiatorInvalid                  -> "InitiatorInvalid"
+        InitiatorNotFound                 -> "InitiatorNotFound"
+        InternalError                     -> "InternalError"
+        InvalidEndpoint                   -> "InvalidEndpoint"
+        InvalidGateway                    -> "InvalidGateway"
+        InvalidParameters                 -> "InvalidParameters"
+        InvalidSchedule                   -> "InvalidSchedule"
+        LocalStorageLimitExceeded         -> "LocalStorageLimitExceeded"
+        LunAlreadyAllocated               -> "LunAlreadyAllocated "
+        LunInvalid                        -> "LunInvalid"
+        MaximumContentLengthExceeded      -> "MaximumContentLengthExceeded"
+        MaximumTapeCartridgeCountExceeded -> "MaximumTapeCartridgeCountExceeded"
+        MaximumVolumeCountExceeded        -> "MaximumVolumeCountExceeded"
+        NetworkConfigurationChanged       -> "NetworkConfigurationChanged"
+        NoDisksAvailable                  -> "NoDisksAvailable"
+        NotImplemented                    -> "NotImplemented"
+        NotSupported                      -> "NotSupported"
+        OperationAborted                  -> "OperationAborted"
+        OutdatedGateway                   -> "OutdatedGateway"
+        ParametersNotImplemented          -> "ParametersNotImplemented"
+        RegionInvalid                     -> "RegionInvalid"
+        RequestTimeout                    -> "RequestTimeout"
+        ServiceUnavailable                -> "ServiceUnavailable"
+        SnapshotDeleted                   -> "SnapshotDeleted"
+        SnapshotIdInvalid                 -> "SnapshotIdInvalid"
+        SnapshotInProgress                -> "SnapshotInProgress"
+        SnapshotNotFound                  -> "SnapshotNotFound"
+        SnapshotScheduleNotFound          -> "SnapshotScheduleNotFound"
+        StagingAreaFull                   -> "StagingAreaFull"
+        StorageFailure                    -> "StorageFailure"
+        TapeCartridgeNotFound             -> "TapeCartridgeNotFound"
+        TargetAlreadyExists               -> "TargetAlreadyExists"
+        TargetInvalid                     -> "TargetInvalid"
+        TargetNotFound                    -> "TargetNotFound"
+        UnauthorizedOperation             -> "UnauthorizedOperation"
+        VolumeAlreadyExists               -> "VolumeAlreadyExists"
+        VolumeIdInvalid                   -> "VolumeIdInvalid"
+        VolumeInUse                       -> "VolumeInUse"
+        VolumeNotFound                    -> "VolumeNotFound"
+        VolumeNotReady                    -> "VolumeNotReady"
+
+instance FromJSON ErrorCode where
+    parseJSON = parseJSONText "ErrorCode"
+
+instance ToJSON ErrorCode where
+    toJSON = toJSONText
+
+data StorediSCSIVolume = StorediSCSIVolume
+    { _sscsivPreservedExistingData :: Maybe Bool
+    , _sscsivSourceSnapshotId      :: Maybe Text
+    , _sscsivVolumeARN             :: Maybe Text
+    , _sscsivVolumeDiskId          :: Maybe Text
+    , _sscsivVolumeId              :: Maybe Text
+    , _sscsivVolumeProgress        :: Maybe Double
+    , _sscsivVolumeSizeInBytes     :: Maybe Integer
+    , _sscsivVolumeStatus          :: Maybe Text
+    , _sscsivVolumeType            :: Maybe Text
+    , _sscsivVolumeiSCSIAttributes :: Maybe VolumeiSCSIAttributes
+    } deriving (Eq, Show)
+
+-- | 'StorediSCSIVolume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sscsivPreservedExistingData' @::@ 'Maybe' 'Bool'
+--
+-- * 'sscsivSourceSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeDiskId' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeId' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeProgress' @::@ 'Maybe' 'Double'
+--
+-- * 'sscsivVolumeSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'sscsivVolumeStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeType' @::@ 'Maybe' 'Text'
+--
+-- * 'sscsivVolumeiSCSIAttributes' @::@ 'Maybe' 'VolumeiSCSIAttributes'
+--
+storediSCSIVolume :: StorediSCSIVolume
+storediSCSIVolume = StorediSCSIVolume
+    { _sscsivVolumeARN             = Nothing
+    , _sscsivVolumeId              = Nothing
+    , _sscsivVolumeType            = Nothing
+    , _sscsivVolumeStatus          = Nothing
+    , _sscsivVolumeSizeInBytes     = Nothing
+    , _sscsivVolumeProgress        = Nothing
+    , _sscsivVolumeDiskId          = Nothing
+    , _sscsivSourceSnapshotId      = Nothing
+    , _sscsivPreservedExistingData = Nothing
+    , _sscsivVolumeiSCSIAttributes = Nothing
+    }
+
+sscsivPreservedExistingData :: Lens' StorediSCSIVolume (Maybe Bool)
+sscsivPreservedExistingData =
+    lens _sscsivPreservedExistingData
+        (\s a -> s { _sscsivPreservedExistingData = a })
+
+sscsivSourceSnapshotId :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivSourceSnapshotId =
+    lens _sscsivSourceSnapshotId (\s a -> s { _sscsivSourceSnapshotId = a })
+
+sscsivVolumeARN :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivVolumeARN = lens _sscsivVolumeARN (\s a -> s { _sscsivVolumeARN = a })
+
+sscsivVolumeDiskId :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivVolumeDiskId =
+    lens _sscsivVolumeDiskId (\s a -> s { _sscsivVolumeDiskId = a })
+
+sscsivVolumeId :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivVolumeId = lens _sscsivVolumeId (\s a -> s { _sscsivVolumeId = a })
+
+sscsivVolumeProgress :: Lens' StorediSCSIVolume (Maybe Double)
+sscsivVolumeProgress =
+    lens _sscsivVolumeProgress (\s a -> s { _sscsivVolumeProgress = a })
+
+sscsivVolumeSizeInBytes :: Lens' StorediSCSIVolume (Maybe Integer)
+sscsivVolumeSizeInBytes =
+    lens _sscsivVolumeSizeInBytes (\s a -> s { _sscsivVolumeSizeInBytes = a })
+
+sscsivVolumeStatus :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivVolumeStatus =
+    lens _sscsivVolumeStatus (\s a -> s { _sscsivVolumeStatus = a })
+
+sscsivVolumeType :: Lens' StorediSCSIVolume (Maybe Text)
+sscsivVolumeType = lens _sscsivVolumeType (\s a -> s { _sscsivVolumeType = a })
+
+sscsivVolumeiSCSIAttributes :: Lens' StorediSCSIVolume (Maybe VolumeiSCSIAttributes)
+sscsivVolumeiSCSIAttributes =
+    lens _sscsivVolumeiSCSIAttributes
+        (\s a -> s { _sscsivVolumeiSCSIAttributes = a })
+
+instance FromJSON StorediSCSIVolume where
+    parseJSON = withObject "StorediSCSIVolume" $ \o -> StorediSCSIVolume
+        <$> o .:? "PreservedExistingData"
+        <*> o .:? "SourceSnapshotId"
+        <*> o .:? "VolumeARN"
+        <*> o .:? "VolumeDiskId"
+        <*> o .:? "VolumeId"
+        <*> o .:? "VolumeProgress"
+        <*> o .:? "VolumeSizeInBytes"
+        <*> o .:? "VolumeStatus"
+        <*> o .:? "VolumeType"
+        <*> o .:? "VolumeiSCSIAttributes"
+
+instance ToJSON StorediSCSIVolume where
+    toJSON StorediSCSIVolume{..} = object
+        [ "VolumeARN"             .= _sscsivVolumeARN
+        , "VolumeId"              .= _sscsivVolumeId
+        , "VolumeType"            .= _sscsivVolumeType
+        , "VolumeStatus"          .= _sscsivVolumeStatus
+        , "VolumeSizeInBytes"     .= _sscsivVolumeSizeInBytes
+        , "VolumeProgress"        .= _sscsivVolumeProgress
+        , "VolumeDiskId"          .= _sscsivVolumeDiskId
+        , "SourceSnapshotId"      .= _sscsivSourceSnapshotId
+        , "PreservedExistingData" .= _sscsivPreservedExistingData
+        , "VolumeiSCSIAttributes" .= _sscsivVolumeiSCSIAttributes
+        ]
+
+data CachediSCSIVolume = CachediSCSIVolume
+    { _cscsivSourceSnapshotId      :: Maybe Text
+    , _cscsivVolumeARN             :: Maybe Text
+    , _cscsivVolumeId              :: Maybe Text
+    , _cscsivVolumeProgress        :: Maybe Double
+    , _cscsivVolumeSizeInBytes     :: Maybe Integer
+    , _cscsivVolumeStatus          :: Maybe Text
+    , _cscsivVolumeType            :: Maybe Text
+    , _cscsivVolumeiSCSIAttributes :: Maybe VolumeiSCSIAttributes
+    } deriving (Eq, Show)
+
+-- | 'CachediSCSIVolume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cscsivSourceSnapshotId' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsivVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsivVolumeId' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsivVolumeProgress' @::@ 'Maybe' 'Double'
+--
+-- * 'cscsivVolumeSizeInBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'cscsivVolumeStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsivVolumeType' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsivVolumeiSCSIAttributes' @::@ 'Maybe' 'VolumeiSCSIAttributes'
+--
+cachediSCSIVolume :: CachediSCSIVolume
+cachediSCSIVolume = CachediSCSIVolume
+    { _cscsivVolumeARN             = Nothing
+    , _cscsivVolumeId              = Nothing
+    , _cscsivVolumeType            = Nothing
+    , _cscsivVolumeStatus          = Nothing
+    , _cscsivVolumeSizeInBytes     = Nothing
+    , _cscsivVolumeProgress        = Nothing
+    , _cscsivSourceSnapshotId      = Nothing
+    , _cscsivVolumeiSCSIAttributes = Nothing
+    }
+
+cscsivSourceSnapshotId :: Lens' CachediSCSIVolume (Maybe Text)
+cscsivSourceSnapshotId =
+    lens _cscsivSourceSnapshotId (\s a -> s { _cscsivSourceSnapshotId = a })
+
+cscsivVolumeARN :: Lens' CachediSCSIVolume (Maybe Text)
+cscsivVolumeARN = lens _cscsivVolumeARN (\s a -> s { _cscsivVolumeARN = a })
+
+cscsivVolumeId :: Lens' CachediSCSIVolume (Maybe Text)
+cscsivVolumeId = lens _cscsivVolumeId (\s a -> s { _cscsivVolumeId = a })
+
+cscsivVolumeProgress :: Lens' CachediSCSIVolume (Maybe Double)
+cscsivVolumeProgress =
+    lens _cscsivVolumeProgress (\s a -> s { _cscsivVolumeProgress = a })
+
+cscsivVolumeSizeInBytes :: Lens' CachediSCSIVolume (Maybe Integer)
+cscsivVolumeSizeInBytes =
+    lens _cscsivVolumeSizeInBytes (\s a -> s { _cscsivVolumeSizeInBytes = a })
+
+cscsivVolumeStatus :: Lens' CachediSCSIVolume (Maybe Text)
+cscsivVolumeStatus =
+    lens _cscsivVolumeStatus (\s a -> s { _cscsivVolumeStatus = a })
+
+cscsivVolumeType :: Lens' CachediSCSIVolume (Maybe Text)
+cscsivVolumeType = lens _cscsivVolumeType (\s a -> s { _cscsivVolumeType = a })
+
+cscsivVolumeiSCSIAttributes :: Lens' CachediSCSIVolume (Maybe VolumeiSCSIAttributes)
+cscsivVolumeiSCSIAttributes =
+    lens _cscsivVolumeiSCSIAttributes
+        (\s a -> s { _cscsivVolumeiSCSIAttributes = a })
+
+instance FromJSON CachediSCSIVolume where
+    parseJSON = withObject "CachediSCSIVolume" $ \o -> CachediSCSIVolume
+        <$> o .:? "SourceSnapshotId"
+        <*> o .:? "VolumeARN"
+        <*> o .:? "VolumeId"
+        <*> o .:? "VolumeProgress"
+        <*> o .:? "VolumeSizeInBytes"
+        <*> o .:? "VolumeStatus"
+        <*> o .:? "VolumeType"
+        <*> o .:? "VolumeiSCSIAttributes"
+
+instance ToJSON CachediSCSIVolume where
+    toJSON CachediSCSIVolume{..} = object
+        [ "VolumeARN"             .= _cscsivVolumeARN
+        , "VolumeId"              .= _cscsivVolumeId
+        , "VolumeType"            .= _cscsivVolumeType
+        , "VolumeStatus"          .= _cscsivVolumeStatus
+        , "VolumeSizeInBytes"     .= _cscsivVolumeSizeInBytes
+        , "VolumeProgress"        .= _cscsivVolumeProgress
+        , "SourceSnapshotId"      .= _cscsivSourceSnapshotId
+        , "VolumeiSCSIAttributes" .= _cscsivVolumeiSCSIAttributes
+        ]
+
+data VolumeInfo = VolumeInfo
+    { _viVolumeARN  :: Maybe Text
+    , _viVolumeType :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'VolumeInfo' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'viVolumeARN' @::@ 'Maybe' 'Text'
+--
+-- * 'viVolumeType' @::@ 'Maybe' 'Text'
+--
+volumeInfo :: VolumeInfo
+volumeInfo = VolumeInfo
+    { _viVolumeARN  = Nothing
+    , _viVolumeType = Nothing
+    }
+
+viVolumeARN :: Lens' VolumeInfo (Maybe Text)
+viVolumeARN = lens _viVolumeARN (\s a -> s { _viVolumeARN = a })
+
+viVolumeType :: Lens' VolumeInfo (Maybe Text)
+viVolumeType = lens _viVolumeType (\s a -> s { _viVolumeType = a })
+
+instance FromJSON VolumeInfo where
+    parseJSON = withObject "VolumeInfo" $ \o -> VolumeInfo
+        <$> o .:? "VolumeARN"
+        <*> o .:? "VolumeType"
+
+instance ToJSON VolumeInfo where
+    toJSON VolumeInfo{..} = object
+        [ "VolumeARN"  .= _viVolumeARN
+        , "VolumeType" .= _viVolumeType
+        ]
+
+data GatewayInfo = GatewayInfo
+    { _giGatewayARN              :: Maybe Text
+    , _giGatewayOperationalState :: Maybe Text
+    , _giGatewayType             :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'GatewayInfo' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'giGatewayARN' @::@ 'Maybe' 'Text'
+--
+-- * 'giGatewayOperationalState' @::@ 'Maybe' 'Text'
+--
+-- * 'giGatewayType' @::@ 'Maybe' 'Text'
+--
+gatewayInfo :: GatewayInfo
+gatewayInfo = GatewayInfo
+    { _giGatewayARN              = Nothing
+    , _giGatewayType             = Nothing
+    , _giGatewayOperationalState = Nothing
+    }
+
+giGatewayARN :: Lens' GatewayInfo (Maybe Text)
+giGatewayARN = lens _giGatewayARN (\s a -> s { _giGatewayARN = a })
+
+giGatewayOperationalState :: Lens' GatewayInfo (Maybe Text)
+giGatewayOperationalState =
+    lens _giGatewayOperationalState
+        (\s a -> s { _giGatewayOperationalState = a })
+
+giGatewayType :: Lens' GatewayInfo (Maybe Text)
+giGatewayType = lens _giGatewayType (\s a -> s { _giGatewayType = a })
+
+instance FromJSON GatewayInfo where
+    parseJSON = withObject "GatewayInfo" $ \o -> GatewayInfo
+        <$> o .:? "GatewayARN"
+        <*> o .:? "GatewayOperationalState"
+        <*> o .:? "GatewayType"
+
+instance ToJSON GatewayInfo where
+    toJSON GatewayInfo{..} = object
+        [ "GatewayARN"              .= _giGatewayARN
+        , "GatewayType"             .= _giGatewayType
+        , "GatewayOperationalState" .= _giGatewayOperationalState
+        ]
diff --git a/gen/Network/AWS/StorageGateway/UpdateBandwidthRateLimit.hs b/gen/Network/AWS/StorageGateway/UpdateBandwidthRateLimit.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateBandwidthRateLimit.hs
@@ -0,0 +1,140 @@
+{-# 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.StorageGateway.UpdateBandwidthRateLimit
+-- 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)
+
+-- | This operation updates the bandwidth rate limits of a gateway. You can
+-- update both the upload and download bandwidth rate limit or specify only
+-- one of the two. If you don't set a bandwidth rate limit, the existing rate
+-- limit remains. By default, a gateway's bandwidth rate limits are not set.
+-- If you don't set any limit, the gateway does not have any limitations on
+-- its bandwidth usage and could potentially use the maximum available
+-- bandwidth. To specify which gateway to update, use the Amazon Resource Name
+-- (ARN) of the gateway in your request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateBandwidthRateLimit.html>
+module Network.AWS.StorageGateway.UpdateBandwidthRateLimit
+    (
+    -- * Request
+      UpdateBandwidthRateLimit
+    -- ** Request constructor
+    , updateBandwidthRateLimit
+    -- ** Request lenses
+    , ubrlAverageDownloadRateLimitInBitsPerSec
+    , ubrlAverageUploadRateLimitInBitsPerSec
+    , ubrlGatewayARN
+
+    -- * Response
+    , UpdateBandwidthRateLimitResponse
+    -- ** Response constructor
+    , updateBandwidthRateLimitResponse
+    -- ** Response lenses
+    , ubrlrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data UpdateBandwidthRateLimit = UpdateBandwidthRateLimit
+    { _ubrlAverageDownloadRateLimitInBitsPerSec :: Maybe Nat
+    , _ubrlAverageUploadRateLimitInBitsPerSec   :: Maybe Nat
+    , _ubrlGatewayARN                           :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateBandwidthRateLimit' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ubrlAverageDownloadRateLimitInBitsPerSec' @::@ 'Maybe' 'Natural'
+--
+-- * 'ubrlAverageUploadRateLimitInBitsPerSec' @::@ 'Maybe' 'Natural'
+--
+-- * 'ubrlGatewayARN' @::@ 'Text'
+--
+updateBandwidthRateLimit :: Text -- ^ 'ubrlGatewayARN'
+                         -> UpdateBandwidthRateLimit
+updateBandwidthRateLimit p1 = UpdateBandwidthRateLimit
+    { _ubrlGatewayARN                           = p1
+    , _ubrlAverageUploadRateLimitInBitsPerSec   = Nothing
+    , _ubrlAverageDownloadRateLimitInBitsPerSec = Nothing
+    }
+
+-- | The average download bandwidth rate limit in bits per second.
+ubrlAverageDownloadRateLimitInBitsPerSec :: Lens' UpdateBandwidthRateLimit (Maybe Natural)
+ubrlAverageDownloadRateLimitInBitsPerSec =
+    lens _ubrlAverageDownloadRateLimitInBitsPerSec
+        (\s a -> s { _ubrlAverageDownloadRateLimitInBitsPerSec = a })
+            . mapping _Nat
+
+-- | The average upload bandwidth rate limit in bits per second.
+ubrlAverageUploadRateLimitInBitsPerSec :: Lens' UpdateBandwidthRateLimit (Maybe Natural)
+ubrlAverageUploadRateLimitInBitsPerSec =
+    lens _ubrlAverageUploadRateLimitInBitsPerSec
+        (\s a -> s { _ubrlAverageUploadRateLimitInBitsPerSec = a })
+            . mapping _Nat
+
+ubrlGatewayARN :: Lens' UpdateBandwidthRateLimit Text
+ubrlGatewayARN = lens _ubrlGatewayARN (\s a -> s { _ubrlGatewayARN = a })
+
+newtype UpdateBandwidthRateLimitResponse = UpdateBandwidthRateLimitResponse
+    { _ubrlrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'UpdateBandwidthRateLimitResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ubrlrGatewayARN' @::@ 'Maybe' 'Text'
+--
+updateBandwidthRateLimitResponse :: UpdateBandwidthRateLimitResponse
+updateBandwidthRateLimitResponse = UpdateBandwidthRateLimitResponse
+    { _ubrlrGatewayARN = Nothing
+    }
+
+ubrlrGatewayARN :: Lens' UpdateBandwidthRateLimitResponse (Maybe Text)
+ubrlrGatewayARN = lens _ubrlrGatewayARN (\s a -> s { _ubrlrGatewayARN = a })
+
+instance ToPath UpdateBandwidthRateLimit where
+    toPath = const "/"
+
+instance ToQuery UpdateBandwidthRateLimit where
+    toQuery = const mempty
+
+instance ToHeaders UpdateBandwidthRateLimit
+
+instance ToJSON UpdateBandwidthRateLimit where
+    toJSON UpdateBandwidthRateLimit{..} = object
+        [ "GatewayARN"                           .= _ubrlGatewayARN
+        , "AverageUploadRateLimitInBitsPerSec"   .= _ubrlAverageUploadRateLimitInBitsPerSec
+        , "AverageDownloadRateLimitInBitsPerSec" .= _ubrlAverageDownloadRateLimitInBitsPerSec
+        ]
+
+instance AWSRequest UpdateBandwidthRateLimit where
+    type Sv UpdateBandwidthRateLimit = StorageGateway
+    type Rs UpdateBandwidthRateLimit = UpdateBandwidthRateLimitResponse
+
+    request  = post "UpdateBandwidthRateLimit"
+    response = jsonResponse
+
+instance FromJSON UpdateBandwidthRateLimitResponse where
+    parseJSON = withObject "UpdateBandwidthRateLimitResponse" $ \o -> UpdateBandwidthRateLimitResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/UpdateChapCredentials.hs b/gen/Network/AWS/StorageGateway/UpdateChapCredentials.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateChapCredentials.hs
@@ -0,0 +1,166 @@
+{-# 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.StorageGateway.UpdateChapCredentials
+-- 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)
+
+-- | This operation updates the Challenge-Handshake Authentication Protocol
+-- (CHAP) credentials for a specified iSCSI target. By default, a gateway does
+-- not have CHAP enabled; however, for added security, you might use it. When
+-- you update CHAP credentials, all existing connections on the target are
+-- closed and initiators must reconnect with the new credentials.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateChapCredentials.html>
+module Network.AWS.StorageGateway.UpdateChapCredentials
+    (
+    -- * Request
+      UpdateChapCredentials
+    -- ** Request constructor
+    , updateChapCredentials
+    -- ** Request lenses
+    , uccInitiatorName
+    , uccSecretToAuthenticateInitiator
+    , uccSecretToAuthenticateTarget
+    , uccTargetARN
+
+    -- * Response
+    , UpdateChapCredentialsResponse
+    -- ** Response constructor
+    , updateChapCredentialsResponse
+    -- ** Response lenses
+    , uccrInitiatorName
+    , uccrTargetARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data UpdateChapCredentials = UpdateChapCredentials
+    { _uccInitiatorName                 :: Text
+    , _uccSecretToAuthenticateInitiator :: Text
+    , _uccSecretToAuthenticateTarget    :: Maybe Text
+    , _uccTargetARN                     :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateChapCredentials' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'uccInitiatorName' @::@ 'Text'
+--
+-- * 'uccSecretToAuthenticateInitiator' @::@ 'Text'
+--
+-- * 'uccSecretToAuthenticateTarget' @::@ 'Maybe' 'Text'
+--
+-- * 'uccTargetARN' @::@ 'Text'
+--
+updateChapCredentials :: Text -- ^ 'uccTargetARN'
+                      -> Text -- ^ 'uccSecretToAuthenticateInitiator'
+                      -> Text -- ^ 'uccInitiatorName'
+                      -> UpdateChapCredentials
+updateChapCredentials p1 p2 p3 = UpdateChapCredentials
+    { _uccTargetARN                     = p1
+    , _uccSecretToAuthenticateInitiator = p2
+    , _uccInitiatorName                 = p3
+    , _uccSecretToAuthenticateTarget    = Nothing
+    }
+
+-- | The iSCSI initiator that connects to the target.
+uccInitiatorName :: Lens' UpdateChapCredentials Text
+uccInitiatorName = lens _uccInitiatorName (\s a -> s { _uccInitiatorName = a })
+
+-- | The secret key that the initiator (e.g. Windows client) must provide to
+-- participate in mutual CHAP with the target.
+uccSecretToAuthenticateInitiator :: Lens' UpdateChapCredentials Text
+uccSecretToAuthenticateInitiator =
+    lens _uccSecretToAuthenticateInitiator
+        (\s a -> s { _uccSecretToAuthenticateInitiator = a })
+
+-- | The secret key that the target must provide to participate in mutual CHAP
+-- with the initiator (e.g. Windows client).
+uccSecretToAuthenticateTarget :: Lens' UpdateChapCredentials (Maybe Text)
+uccSecretToAuthenticateTarget =
+    lens _uccSecretToAuthenticateTarget
+        (\s a -> s { _uccSecretToAuthenticateTarget = a })
+
+-- | The Amazon Resource Name (ARN) of the iSCSI volume target. Use the
+-- DescribeStorediSCSIVolumes operation to return to retrieve the TargetARN
+-- for specified VolumeARN.
+uccTargetARN :: Lens' UpdateChapCredentials Text
+uccTargetARN = lens _uccTargetARN (\s a -> s { _uccTargetARN = a })
+
+data UpdateChapCredentialsResponse = UpdateChapCredentialsResponse
+    { _uccrInitiatorName :: Maybe Text
+    , _uccrTargetARN     :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateChapCredentialsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'uccrInitiatorName' @::@ 'Maybe' 'Text'
+--
+-- * 'uccrTargetARN' @::@ 'Maybe' 'Text'
+--
+updateChapCredentialsResponse :: UpdateChapCredentialsResponse
+updateChapCredentialsResponse = UpdateChapCredentialsResponse
+    { _uccrTargetARN     = Nothing
+    , _uccrInitiatorName = Nothing
+    }
+
+-- | The iSCSI initiator that connects to the target. This is the same
+-- initiator name specified in the request.
+uccrInitiatorName :: Lens' UpdateChapCredentialsResponse (Maybe Text)
+uccrInitiatorName =
+    lens _uccrInitiatorName (\s a -> s { _uccrInitiatorName = a })
+
+-- | The Amazon Resource Name (ARN) of the target. This is the same target
+-- specified in the request.
+uccrTargetARN :: Lens' UpdateChapCredentialsResponse (Maybe Text)
+uccrTargetARN = lens _uccrTargetARN (\s a -> s { _uccrTargetARN = a })
+
+instance ToPath UpdateChapCredentials where
+    toPath = const "/"
+
+instance ToQuery UpdateChapCredentials where
+    toQuery = const mempty
+
+instance ToHeaders UpdateChapCredentials
+
+instance ToJSON UpdateChapCredentials where
+    toJSON UpdateChapCredentials{..} = object
+        [ "TargetARN"                     .= _uccTargetARN
+        , "SecretToAuthenticateInitiator" .= _uccSecretToAuthenticateInitiator
+        , "InitiatorName"                 .= _uccInitiatorName
+        , "SecretToAuthenticateTarget"    .= _uccSecretToAuthenticateTarget
+        ]
+
+instance AWSRequest UpdateChapCredentials where
+    type Sv UpdateChapCredentials = StorageGateway
+    type Rs UpdateChapCredentials = UpdateChapCredentialsResponse
+
+    request  = post "UpdateChapCredentials"
+    response = jsonResponse
+
+instance FromJSON UpdateChapCredentialsResponse where
+    parseJSON = withObject "UpdateChapCredentialsResponse" $ \o -> UpdateChapCredentialsResponse
+        <$> o .:? "InitiatorName"
+        <*> o .:? "TargetARN"
diff --git a/gen/Network/AWS/StorageGateway/UpdateGatewayInformation.hs b/gen/Network/AWS/StorageGateway/UpdateGatewayInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateGatewayInformation.hs
@@ -0,0 +1,128 @@
+{-# 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.StorageGateway.UpdateGatewayInformation
+-- 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)
+
+-- | This operation updates a gateway's metadata, which includes the gateway's
+-- name and time zone. To specify which gateway to update, use the Amazon
+-- Resource Name (ARN) of the gateway in your request.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateGatewayInformation.html>
+module Network.AWS.StorageGateway.UpdateGatewayInformation
+    (
+    -- * Request
+      UpdateGatewayInformation
+    -- ** Request constructor
+    , updateGatewayInformation
+    -- ** Request lenses
+    , ugiGatewayARN
+    , ugiGatewayName
+    , ugiGatewayTimezone
+
+    -- * Response
+    , UpdateGatewayInformationResponse
+    -- ** Response constructor
+    , updateGatewayInformationResponse
+    -- ** Response lenses
+    , ugirGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data UpdateGatewayInformation = UpdateGatewayInformation
+    { _ugiGatewayARN      :: Text
+    , _ugiGatewayName     :: Maybe Text
+    , _ugiGatewayTimezone :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateGatewayInformation' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ugiGatewayARN' @::@ 'Text'
+--
+-- * 'ugiGatewayName' @::@ 'Maybe' 'Text'
+--
+-- * 'ugiGatewayTimezone' @::@ 'Maybe' 'Text'
+--
+updateGatewayInformation :: Text -- ^ 'ugiGatewayARN'
+                         -> UpdateGatewayInformation
+updateGatewayInformation p1 = UpdateGatewayInformation
+    { _ugiGatewayARN      = p1
+    , _ugiGatewayName     = Nothing
+    , _ugiGatewayTimezone = Nothing
+    }
+
+ugiGatewayARN :: Lens' UpdateGatewayInformation Text
+ugiGatewayARN = lens _ugiGatewayARN (\s a -> s { _ugiGatewayARN = a })
+
+ugiGatewayName :: Lens' UpdateGatewayInformation (Maybe Text)
+ugiGatewayName = lens _ugiGatewayName (\s a -> s { _ugiGatewayName = a })
+
+ugiGatewayTimezone :: Lens' UpdateGatewayInformation (Maybe Text)
+ugiGatewayTimezone =
+    lens _ugiGatewayTimezone (\s a -> s { _ugiGatewayTimezone = a })
+
+newtype UpdateGatewayInformationResponse = UpdateGatewayInformationResponse
+    { _ugirGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'UpdateGatewayInformationResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ugirGatewayARN' @::@ 'Maybe' 'Text'
+--
+updateGatewayInformationResponse :: UpdateGatewayInformationResponse
+updateGatewayInformationResponse = UpdateGatewayInformationResponse
+    { _ugirGatewayARN = Nothing
+    }
+
+ugirGatewayARN :: Lens' UpdateGatewayInformationResponse (Maybe Text)
+ugirGatewayARN = lens _ugirGatewayARN (\s a -> s { _ugirGatewayARN = a })
+
+instance ToPath UpdateGatewayInformation where
+    toPath = const "/"
+
+instance ToQuery UpdateGatewayInformation where
+    toQuery = const mempty
+
+instance ToHeaders UpdateGatewayInformation
+
+instance ToJSON UpdateGatewayInformation where
+    toJSON UpdateGatewayInformation{..} = object
+        [ "GatewayARN"      .= _ugiGatewayARN
+        , "GatewayName"     .= _ugiGatewayName
+        , "GatewayTimezone" .= _ugiGatewayTimezone
+        ]
+
+instance AWSRequest UpdateGatewayInformation where
+    type Sv UpdateGatewayInformation = StorageGateway
+    type Rs UpdateGatewayInformation = UpdateGatewayInformationResponse
+
+    request  = post "UpdateGatewayInformation"
+    response = jsonResponse
+
+instance FromJSON UpdateGatewayInformationResponse where
+    parseJSON = withObject "UpdateGatewayInformationResponse" $ \o -> UpdateGatewayInformationResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/UpdateGatewaySoftwareNow.hs b/gen/Network/AWS/StorageGateway/UpdateGatewaySoftwareNow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateGatewaySoftwareNow.hs
@@ -0,0 +1,113 @@
+{-# 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.StorageGateway.UpdateGatewaySoftwareNow
+-- 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)
+
+-- | This operation updates the gateway virtual machine (VM) software. The
+-- request immediately triggers the software update. A software update forces
+-- a system restart of your gateway. You can minimize the chance of any
+-- disruption to your applications by increasing your iSCSI Initiators'
+-- timeouts. For more information about increasing iSCSI Initiator timeouts
+-- for Windows and Linux, see Customizing Your Windows iSCSI Settings and
+-- Customizing Your Linux iSCSI Settings, respectively.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateGatewaySoftwareNow.html>
+module Network.AWS.StorageGateway.UpdateGatewaySoftwareNow
+    (
+    -- * Request
+      UpdateGatewaySoftwareNow
+    -- ** Request constructor
+    , updateGatewaySoftwareNow
+    -- ** Request lenses
+    , ugsnGatewayARN
+
+    -- * Response
+    , UpdateGatewaySoftwareNowResponse
+    -- ** Response constructor
+    , updateGatewaySoftwareNowResponse
+    -- ** Response lenses
+    , ugsnrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+newtype UpdateGatewaySoftwareNow = UpdateGatewaySoftwareNow
+    { _ugsnGatewayARN :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'UpdateGatewaySoftwareNow' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ugsnGatewayARN' @::@ 'Text'
+--
+updateGatewaySoftwareNow :: Text -- ^ 'ugsnGatewayARN'
+                         -> UpdateGatewaySoftwareNow
+updateGatewaySoftwareNow p1 = UpdateGatewaySoftwareNow
+    { _ugsnGatewayARN = p1
+    }
+
+ugsnGatewayARN :: Lens' UpdateGatewaySoftwareNow Text
+ugsnGatewayARN = lens _ugsnGatewayARN (\s a -> s { _ugsnGatewayARN = a })
+
+newtype UpdateGatewaySoftwareNowResponse = UpdateGatewaySoftwareNowResponse
+    { _ugsnrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'UpdateGatewaySoftwareNowResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ugsnrGatewayARN' @::@ 'Maybe' 'Text'
+--
+updateGatewaySoftwareNowResponse :: UpdateGatewaySoftwareNowResponse
+updateGatewaySoftwareNowResponse = UpdateGatewaySoftwareNowResponse
+    { _ugsnrGatewayARN = Nothing
+    }
+
+ugsnrGatewayARN :: Lens' UpdateGatewaySoftwareNowResponse (Maybe Text)
+ugsnrGatewayARN = lens _ugsnrGatewayARN (\s a -> s { _ugsnrGatewayARN = a })
+
+instance ToPath UpdateGatewaySoftwareNow where
+    toPath = const "/"
+
+instance ToQuery UpdateGatewaySoftwareNow where
+    toQuery = const mempty
+
+instance ToHeaders UpdateGatewaySoftwareNow
+
+instance ToJSON UpdateGatewaySoftwareNow where
+    toJSON UpdateGatewaySoftwareNow{..} = object
+        [ "GatewayARN" .= _ugsnGatewayARN
+        ]
+
+instance AWSRequest UpdateGatewaySoftwareNow where
+    type Sv UpdateGatewaySoftwareNow = StorageGateway
+    type Rs UpdateGatewaySoftwareNow = UpdateGatewaySoftwareNowResponse
+
+    request  = post "UpdateGatewaySoftwareNow"
+    response = jsonResponse
+
+instance FromJSON UpdateGatewaySoftwareNowResponse where
+    parseJSON = withObject "UpdateGatewaySoftwareNowResponse" $ \o -> UpdateGatewaySoftwareNowResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/UpdateMaintenanceStartTime.hs b/gen/Network/AWS/StorageGateway/UpdateMaintenanceStartTime.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateMaintenanceStartTime.hs
@@ -0,0 +1,146 @@
+{-# 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.StorageGateway.UpdateMaintenanceStartTime
+-- 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)
+
+-- | This operation updates a gateway's weekly maintenance start time
+-- information, including day and time of the week. The maintenance time is
+-- the time in your gateway's time zone.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateMaintenanceStartTime.html>
+module Network.AWS.StorageGateway.UpdateMaintenanceStartTime
+    (
+    -- * Request
+      UpdateMaintenanceStartTime
+    -- ** Request constructor
+    , updateMaintenanceStartTime
+    -- ** Request lenses
+    , umstDayOfWeek
+    , umstGatewayARN
+    , umstHourOfDay
+    , umstMinuteOfHour
+
+    -- * Response
+    , UpdateMaintenanceStartTimeResponse
+    -- ** Response constructor
+    , updateMaintenanceStartTimeResponse
+    -- ** Response lenses
+    , umstrGatewayARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data UpdateMaintenanceStartTime = UpdateMaintenanceStartTime
+    { _umstDayOfWeek    :: Nat
+    , _umstGatewayARN   :: Text
+    , _umstHourOfDay    :: Nat
+    , _umstMinuteOfHour :: Nat
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateMaintenanceStartTime' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'umstDayOfWeek' @::@ 'Natural'
+--
+-- * 'umstGatewayARN' @::@ 'Text'
+--
+-- * 'umstHourOfDay' @::@ 'Natural'
+--
+-- * 'umstMinuteOfHour' @::@ 'Natural'
+--
+updateMaintenanceStartTime :: Text -- ^ 'umstGatewayARN'
+                           -> Natural -- ^ 'umstHourOfDay'
+                           -> Natural -- ^ 'umstMinuteOfHour'
+                           -> Natural -- ^ 'umstDayOfWeek'
+                           -> UpdateMaintenanceStartTime
+updateMaintenanceStartTime p1 p2 p3 p4 = UpdateMaintenanceStartTime
+    { _umstGatewayARN   = p1
+    , _umstHourOfDay    = withIso _Nat (const id) p2
+    , _umstMinuteOfHour = withIso _Nat (const id) p3
+    , _umstDayOfWeek    = withIso _Nat (const id) p4
+    }
+
+-- | The maintenance start time day of the week.
+umstDayOfWeek :: Lens' UpdateMaintenanceStartTime Natural
+umstDayOfWeek = lens _umstDayOfWeek (\s a -> s { _umstDayOfWeek = a }) . _Nat
+
+umstGatewayARN :: Lens' UpdateMaintenanceStartTime Text
+umstGatewayARN = lens _umstGatewayARN (\s a -> s { _umstGatewayARN = a })
+
+-- | The hour component of the maintenance start time represented as hh, where
+-- hh is the hour (00 to 23). The hour of the day is in the time zone of the
+-- gateway.
+umstHourOfDay :: Lens' UpdateMaintenanceStartTime Natural
+umstHourOfDay = lens _umstHourOfDay (\s a -> s { _umstHourOfDay = a }) . _Nat
+
+-- | The minute component of the maintenance start time represented as mm,
+-- where mm is the minute (00 to 59). The minute of the hour is in the time
+-- zone of the gateway.
+umstMinuteOfHour :: Lens' UpdateMaintenanceStartTime Natural
+umstMinuteOfHour = lens _umstMinuteOfHour (\s a -> s { _umstMinuteOfHour = a }) . _Nat
+
+newtype UpdateMaintenanceStartTimeResponse = UpdateMaintenanceStartTimeResponse
+    { _umstrGatewayARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'UpdateMaintenanceStartTimeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'umstrGatewayARN' @::@ 'Maybe' 'Text'
+--
+updateMaintenanceStartTimeResponse :: UpdateMaintenanceStartTimeResponse
+updateMaintenanceStartTimeResponse = UpdateMaintenanceStartTimeResponse
+    { _umstrGatewayARN = Nothing
+    }
+
+umstrGatewayARN :: Lens' UpdateMaintenanceStartTimeResponse (Maybe Text)
+umstrGatewayARN = lens _umstrGatewayARN (\s a -> s { _umstrGatewayARN = a })
+
+instance ToPath UpdateMaintenanceStartTime where
+    toPath = const "/"
+
+instance ToQuery UpdateMaintenanceStartTime where
+    toQuery = const mempty
+
+instance ToHeaders UpdateMaintenanceStartTime
+
+instance ToJSON UpdateMaintenanceStartTime where
+    toJSON UpdateMaintenanceStartTime{..} = object
+        [ "GatewayARN"   .= _umstGatewayARN
+        , "HourOfDay"    .= _umstHourOfDay
+        , "MinuteOfHour" .= _umstMinuteOfHour
+        , "DayOfWeek"    .= _umstDayOfWeek
+        ]
+
+instance AWSRequest UpdateMaintenanceStartTime where
+    type Sv UpdateMaintenanceStartTime = StorageGateway
+    type Rs UpdateMaintenanceStartTime = UpdateMaintenanceStartTimeResponse
+
+    request  = post "UpdateMaintenanceStartTime"
+    response = jsonResponse
+
+instance FromJSON UpdateMaintenanceStartTimeResponse where
+    parseJSON = withObject "UpdateMaintenanceStartTimeResponse" $ \o -> UpdateMaintenanceStartTimeResponse
+        <$> o .:? "GatewayARN"
diff --git a/gen/Network/AWS/StorageGateway/UpdateSnapshotSchedule.hs b/gen/Network/AWS/StorageGateway/UpdateSnapshotSchedule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/StorageGateway/UpdateSnapshotSchedule.hs
@@ -0,0 +1,152 @@
+{-# 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.StorageGateway.UpdateSnapshotSchedule
+-- 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)
+
+-- | This operation updates a snapshot schedule configured for a gateway volume.
+-- The default snapshot schedule for volume is once every 24 hours, starting
+-- at the creation time of the volume. You can use this API to change the
+-- snapshot schedule configured for the volume. In the request you must
+-- identify the gateway volume whose snapshot schedule you want to update, and
+-- the schedule information, including when you want the snapshot to begin on
+-- a day and the frequency (in hours) of snapshots.
+--
+-- <http://docs.aws.amazon.com/storagegateway/latest/APIReference/API_UpdateSnapshotSchedule.html>
+module Network.AWS.StorageGateway.UpdateSnapshotSchedule
+    (
+    -- * Request
+      UpdateSnapshotSchedule
+    -- ** Request constructor
+    , updateSnapshotSchedule
+    -- ** Request lenses
+    , ussDescription
+    , ussRecurrenceInHours
+    , ussStartAt
+    , ussVolumeARN
+
+    -- * Response
+    , UpdateSnapshotScheduleResponse
+    -- ** Response constructor
+    , updateSnapshotScheduleResponse
+    -- ** Response lenses
+    , ussrVolumeARN
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.StorageGateway.Types
+import qualified GHC.Exts
+
+data UpdateSnapshotSchedule = UpdateSnapshotSchedule
+    { _ussDescription       :: Maybe Text
+    , _ussRecurrenceInHours :: Nat
+    , _ussStartAt           :: Nat
+    , _ussVolumeARN         :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'UpdateSnapshotSchedule' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ussDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'ussRecurrenceInHours' @::@ 'Natural'
+--
+-- * 'ussStartAt' @::@ 'Natural'
+--
+-- * 'ussVolumeARN' @::@ 'Text'
+--
+updateSnapshotSchedule :: Text -- ^ 'ussVolumeARN'
+                       -> Natural -- ^ 'ussStartAt'
+                       -> Natural -- ^ 'ussRecurrenceInHours'
+                       -> UpdateSnapshotSchedule
+updateSnapshotSchedule p1 p2 p3 = UpdateSnapshotSchedule
+    { _ussVolumeARN         = p1
+    , _ussStartAt           = withIso _Nat (const id) p2
+    , _ussRecurrenceInHours = withIso _Nat (const id) p3
+    , _ussDescription       = Nothing
+    }
+
+-- | Optional description of the snapshot that overwrites the existing
+-- description.
+ussDescription :: Lens' UpdateSnapshotSchedule (Maybe Text)
+ussDescription = lens _ussDescription (\s a -> s { _ussDescription = a })
+
+-- | Frequency of snapshots. Specify the number of hours between snapshots.
+ussRecurrenceInHours :: Lens' UpdateSnapshotSchedule Natural
+ussRecurrenceInHours =
+    lens _ussRecurrenceInHours (\s a -> s { _ussRecurrenceInHours = a })
+        . _Nat
+
+-- | The hour of the day at which the snapshot schedule begins represented as
+-- hh, where hh is the hour (0 to 23). The hour of the day is in the time
+-- zone of the gateway.
+ussStartAt :: Lens' UpdateSnapshotSchedule Natural
+ussStartAt = lens _ussStartAt (\s a -> s { _ussStartAt = a }) . _Nat
+
+-- | The Amazon Resource Name (ARN) of the volume. Use the ListVolumes
+-- operation to return a list of gateway volumes.
+ussVolumeARN :: Lens' UpdateSnapshotSchedule Text
+ussVolumeARN = lens _ussVolumeARN (\s a -> s { _ussVolumeARN = a })
+
+newtype UpdateSnapshotScheduleResponse = UpdateSnapshotScheduleResponse
+    { _ussrVolumeARN :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'UpdateSnapshotScheduleResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ussrVolumeARN' @::@ 'Maybe' 'Text'
+--
+updateSnapshotScheduleResponse :: UpdateSnapshotScheduleResponse
+updateSnapshotScheduleResponse = UpdateSnapshotScheduleResponse
+    { _ussrVolumeARN = Nothing
+    }
+
+ussrVolumeARN :: Lens' UpdateSnapshotScheduleResponse (Maybe Text)
+ussrVolumeARN = lens _ussrVolumeARN (\s a -> s { _ussrVolumeARN = a })
+
+instance ToPath UpdateSnapshotSchedule where
+    toPath = const "/"
+
+instance ToQuery UpdateSnapshotSchedule where
+    toQuery = const mempty
+
+instance ToHeaders UpdateSnapshotSchedule
+
+instance ToJSON UpdateSnapshotSchedule where
+    toJSON UpdateSnapshotSchedule{..} = object
+        [ "VolumeARN"         .= _ussVolumeARN
+        , "StartAt"           .= _ussStartAt
+        , "RecurrenceInHours" .= _ussRecurrenceInHours
+        , "Description"       .= _ussDescription
+        ]
+
+instance AWSRequest UpdateSnapshotSchedule where
+    type Sv UpdateSnapshotSchedule = StorageGateway
+    type Rs UpdateSnapshotSchedule = UpdateSnapshotScheduleResponse
+
+    request  = post "UpdateSnapshotSchedule"
+    response = jsonResponse
+
+instance FromJSON UpdateSnapshotScheduleResponse where
+    parseJSON = withObject "UpdateSnapshotScheduleResponse" $ \o -> UpdateSnapshotScheduleResponse
+        <$> o .:? "VolumeARN"
