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 Redshift SDK
+
+> _Warning:_ This is an experimental preview release which is still under heavy development and not intended for public consumption, _caveat emptor_!
+
+* [description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+## Description
+
+Amazon Redshift is a fast, fully managed, petabyte-scale data warehouse service that makes it simple and cost-effective to efficiently analyze all your data using your existing business intelligence tools. You can start small for just $0.25 per hour with no commitments or upfront costs and scale to a petabyte or more for $1,000 per terabyte per year, less than a tenth of most other data warehousing solutions.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-redshift)
+and [AWS API Reference](http://docs.aws.amazon.com/redshift/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-redshift` 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-redshift.cabal b/amazonka-redshift.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-redshift.cabal
@@ -0,0 +1,102 @@
+name:                  amazonka-redshift
+version:               0.0.0
+synopsis:              Amazon Redshift 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:
+    Amazon Redshift is a fast, fully managed, petabyte-scale data warehouse
+    service that makes it simple and cost-effective to efficiently analyze
+    all your data using your existing business intelligence tools. You can
+    start small for just $0.25 per hour with no commitments or upfront
+    costs and scale to a petabyte or more for $1,000 per terabyte per year,
+    less than a tenth of most other data warehousing solutions.
+    .
+    /See:/ <http://docs.aws.amazon.com/redshift/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.Redshift
+        , Network.AWS.Redshift.AuthorizeClusterSecurityGroupIngress
+        , Network.AWS.Redshift.AuthorizeSnapshotAccess
+        , Network.AWS.Redshift.CopyClusterSnapshot
+        , Network.AWS.Redshift.CreateCluster
+        , Network.AWS.Redshift.CreateClusterParameterGroup
+        , Network.AWS.Redshift.CreateClusterSecurityGroup
+        , Network.AWS.Redshift.CreateClusterSnapshot
+        , Network.AWS.Redshift.CreateClusterSubnetGroup
+        , Network.AWS.Redshift.CreateEventSubscription
+        , Network.AWS.Redshift.CreateHsmClientCertificate
+        , Network.AWS.Redshift.CreateHsmConfiguration
+        , Network.AWS.Redshift.CreateTags
+        , Network.AWS.Redshift.DeleteCluster
+        , Network.AWS.Redshift.DeleteClusterParameterGroup
+        , Network.AWS.Redshift.DeleteClusterSecurityGroup
+        , Network.AWS.Redshift.DeleteClusterSnapshot
+        , Network.AWS.Redshift.DeleteClusterSubnetGroup
+        , Network.AWS.Redshift.DeleteEventSubscription
+        , Network.AWS.Redshift.DeleteHsmClientCertificate
+        , Network.AWS.Redshift.DeleteHsmConfiguration
+        , Network.AWS.Redshift.DeleteTags
+        , Network.AWS.Redshift.DescribeClusterParameterGroups
+        , Network.AWS.Redshift.DescribeClusterParameters
+        , Network.AWS.Redshift.DescribeClusterSecurityGroups
+        , Network.AWS.Redshift.DescribeClusterSnapshots
+        , Network.AWS.Redshift.DescribeClusterSubnetGroups
+        , Network.AWS.Redshift.DescribeClusterVersions
+        , Network.AWS.Redshift.DescribeClusters
+        , Network.AWS.Redshift.DescribeDefaultClusterParameters
+        , Network.AWS.Redshift.DescribeEventCategories
+        , Network.AWS.Redshift.DescribeEventSubscriptions
+        , Network.AWS.Redshift.DescribeEvents
+        , Network.AWS.Redshift.DescribeHsmClientCertificates
+        , Network.AWS.Redshift.DescribeHsmConfigurations
+        , Network.AWS.Redshift.DescribeLoggingStatus
+        , Network.AWS.Redshift.DescribeOrderableClusterOptions
+        , Network.AWS.Redshift.DescribeReservedNodeOfferings
+        , Network.AWS.Redshift.DescribeReservedNodes
+        , Network.AWS.Redshift.DescribeResize
+        , Network.AWS.Redshift.DescribeTags
+        , Network.AWS.Redshift.DisableLogging
+        , Network.AWS.Redshift.DisableSnapshotCopy
+        , Network.AWS.Redshift.EnableLogging
+        , Network.AWS.Redshift.EnableSnapshotCopy
+        , Network.AWS.Redshift.ModifyCluster
+        , Network.AWS.Redshift.ModifyClusterParameterGroup
+        , Network.AWS.Redshift.ModifyClusterSubnetGroup
+        , Network.AWS.Redshift.ModifyEventSubscription
+        , Network.AWS.Redshift.ModifySnapshotCopyRetentionPeriod
+        , Network.AWS.Redshift.PurchaseReservedNodeOffering
+        , Network.AWS.Redshift.RebootCluster
+        , Network.AWS.Redshift.ResetClusterParameterGroup
+        , Network.AWS.Redshift.RestoreFromClusterSnapshot
+        , Network.AWS.Redshift.RevokeClusterSecurityGroupIngress
+        , Network.AWS.Redshift.RevokeSnapshotAccess
+        , Network.AWS.Redshift.RotateEncryptionKey
+        , Network.AWS.Redshift.Types
+
+    other-modules:
+
+    build-depends:
+          amazonka-core
+        , base          >= 4.7 && < 5
diff --git a/gen/Network/AWS/Redshift.hs b/gen/Network/AWS/Redshift.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift.hs
@@ -0,0 +1,133 @@
+-- Module      : Network.AWS.Redshift
+-- 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)
+
+-- | Amazon Redshift is a fast, fully managed, petabyte-scale data warehouse
+-- service that makes it simple and cost-effective to efficiently analyze all
+-- your data using your existing business intelligence tools. You can start
+-- small for just $0.25 per hour with no commitments or upfront costs and
+-- scale to a petabyte or more for $1,000 per terabyte per year, less than a
+-- tenth of most other data warehousing solutions.
+module Network.AWS.Redshift
+    ( module Network.AWS.Redshift.AuthorizeClusterSecurityGroupIngress
+    , module Network.AWS.Redshift.AuthorizeSnapshotAccess
+    , module Network.AWS.Redshift.CopyClusterSnapshot
+    , module Network.AWS.Redshift.CreateCluster
+    , module Network.AWS.Redshift.CreateClusterParameterGroup
+    , module Network.AWS.Redshift.CreateClusterSecurityGroup
+    , module Network.AWS.Redshift.CreateClusterSnapshot
+    , module Network.AWS.Redshift.CreateClusterSubnetGroup
+    , module Network.AWS.Redshift.CreateEventSubscription
+    , module Network.AWS.Redshift.CreateHsmClientCertificate
+    , module Network.AWS.Redshift.CreateHsmConfiguration
+    , module Network.AWS.Redshift.CreateTags
+    , module Network.AWS.Redshift.DeleteCluster
+    , module Network.AWS.Redshift.DeleteClusterParameterGroup
+    , module Network.AWS.Redshift.DeleteClusterSecurityGroup
+    , module Network.AWS.Redshift.DeleteClusterSnapshot
+    , module Network.AWS.Redshift.DeleteClusterSubnetGroup
+    , module Network.AWS.Redshift.DeleteEventSubscription
+    , module Network.AWS.Redshift.DeleteHsmClientCertificate
+    , module Network.AWS.Redshift.DeleteHsmConfiguration
+    , module Network.AWS.Redshift.DeleteTags
+    , module Network.AWS.Redshift.DescribeClusterParameterGroups
+    , module Network.AWS.Redshift.DescribeClusterParameters
+    , module Network.AWS.Redshift.DescribeClusterSecurityGroups
+    , module Network.AWS.Redshift.DescribeClusterSnapshots
+    , module Network.AWS.Redshift.DescribeClusterSubnetGroups
+    , module Network.AWS.Redshift.DescribeClusterVersions
+    , module Network.AWS.Redshift.DescribeClusters
+    , module Network.AWS.Redshift.DescribeDefaultClusterParameters
+    , module Network.AWS.Redshift.DescribeEventCategories
+    , module Network.AWS.Redshift.DescribeEventSubscriptions
+    , module Network.AWS.Redshift.DescribeEvents
+    , module Network.AWS.Redshift.DescribeHsmClientCertificates
+    , module Network.AWS.Redshift.DescribeHsmConfigurations
+    , module Network.AWS.Redshift.DescribeLoggingStatus
+    , module Network.AWS.Redshift.DescribeOrderableClusterOptions
+    , module Network.AWS.Redshift.DescribeReservedNodeOfferings
+    , module Network.AWS.Redshift.DescribeReservedNodes
+    , module Network.AWS.Redshift.DescribeResize
+    , module Network.AWS.Redshift.DescribeTags
+    , module Network.AWS.Redshift.DisableLogging
+    , module Network.AWS.Redshift.DisableSnapshotCopy
+    , module Network.AWS.Redshift.EnableLogging
+    , module Network.AWS.Redshift.EnableSnapshotCopy
+    , module Network.AWS.Redshift.ModifyCluster
+    , module Network.AWS.Redshift.ModifyClusterParameterGroup
+    , module Network.AWS.Redshift.ModifyClusterSubnetGroup
+    , module Network.AWS.Redshift.ModifyEventSubscription
+    , module Network.AWS.Redshift.ModifySnapshotCopyRetentionPeriod
+    , module Network.AWS.Redshift.PurchaseReservedNodeOffering
+    , module Network.AWS.Redshift.RebootCluster
+    , module Network.AWS.Redshift.ResetClusterParameterGroup
+    , module Network.AWS.Redshift.RestoreFromClusterSnapshot
+    , module Network.AWS.Redshift.RevokeClusterSecurityGroupIngress
+    , module Network.AWS.Redshift.RevokeSnapshotAccess
+    , module Network.AWS.Redshift.RotateEncryptionKey
+    , module Network.AWS.Redshift.Types
+    ) where
+
+import Network.AWS.Redshift.AuthorizeClusterSecurityGroupIngress
+import Network.AWS.Redshift.AuthorizeSnapshotAccess
+import Network.AWS.Redshift.CopyClusterSnapshot
+import Network.AWS.Redshift.CreateCluster
+import Network.AWS.Redshift.CreateClusterParameterGroup
+import Network.AWS.Redshift.CreateClusterSecurityGroup
+import Network.AWS.Redshift.CreateClusterSnapshot
+import Network.AWS.Redshift.CreateClusterSubnetGroup
+import Network.AWS.Redshift.CreateEventSubscription
+import Network.AWS.Redshift.CreateHsmClientCertificate
+import Network.AWS.Redshift.CreateHsmConfiguration
+import Network.AWS.Redshift.CreateTags
+import Network.AWS.Redshift.DeleteCluster
+import Network.AWS.Redshift.DeleteClusterParameterGroup
+import Network.AWS.Redshift.DeleteClusterSecurityGroup
+import Network.AWS.Redshift.DeleteClusterSnapshot
+import Network.AWS.Redshift.DeleteClusterSubnetGroup
+import Network.AWS.Redshift.DeleteEventSubscription
+import Network.AWS.Redshift.DeleteHsmClientCertificate
+import Network.AWS.Redshift.DeleteHsmConfiguration
+import Network.AWS.Redshift.DeleteTags
+import Network.AWS.Redshift.DescribeClusterParameterGroups
+import Network.AWS.Redshift.DescribeClusterParameters
+import Network.AWS.Redshift.DescribeClusterSecurityGroups
+import Network.AWS.Redshift.DescribeClusterSnapshots
+import Network.AWS.Redshift.DescribeClusterSubnetGroups
+import Network.AWS.Redshift.DescribeClusterVersions
+import Network.AWS.Redshift.DescribeClusters
+import Network.AWS.Redshift.DescribeDefaultClusterParameters
+import Network.AWS.Redshift.DescribeEventCategories
+import Network.AWS.Redshift.DescribeEventSubscriptions
+import Network.AWS.Redshift.DescribeEvents
+import Network.AWS.Redshift.DescribeHsmClientCertificates
+import Network.AWS.Redshift.DescribeHsmConfigurations
+import Network.AWS.Redshift.DescribeLoggingStatus
+import Network.AWS.Redshift.DescribeOrderableClusterOptions
+import Network.AWS.Redshift.DescribeReservedNodeOfferings
+import Network.AWS.Redshift.DescribeReservedNodes
+import Network.AWS.Redshift.DescribeResize
+import Network.AWS.Redshift.DescribeTags
+import Network.AWS.Redshift.DisableLogging
+import Network.AWS.Redshift.DisableSnapshotCopy
+import Network.AWS.Redshift.EnableLogging
+import Network.AWS.Redshift.EnableSnapshotCopy
+import Network.AWS.Redshift.ModifyCluster
+import Network.AWS.Redshift.ModifyClusterParameterGroup
+import Network.AWS.Redshift.ModifyClusterSubnetGroup
+import Network.AWS.Redshift.ModifyEventSubscription
+import Network.AWS.Redshift.ModifySnapshotCopyRetentionPeriod
+import Network.AWS.Redshift.PurchaseReservedNodeOffering
+import Network.AWS.Redshift.RebootCluster
+import Network.AWS.Redshift.ResetClusterParameterGroup
+import Network.AWS.Redshift.RestoreFromClusterSnapshot
+import Network.AWS.Redshift.RevokeClusterSecurityGroupIngress
+import Network.AWS.Redshift.RevokeSnapshotAccess
+import Network.AWS.Redshift.RotateEncryptionKey
+import Network.AWS.Redshift.Types
diff --git a/gen/Network/AWS/Redshift/AuthorizeClusterSecurityGroupIngress.hs b/gen/Network/AWS/Redshift/AuthorizeClusterSecurityGroupIngress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/AuthorizeClusterSecurityGroupIngress.hs
@@ -0,0 +1,156 @@
+{-# 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.Redshift.AuthorizeClusterSecurityGroupIngress
+-- 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)
+
+-- | Adds an inbound (ingress) rule to an Amazon Redshift security group.
+-- Depending on whether the application accessing your cluster is running on
+-- the Internet or an EC2 instance, you can authorize inbound access to either
+-- a Classless Interdomain Routing (CIDR) IP address range or an EC2 security
+-- group. You can add as many as 20 ingress rules to an Amazon Redshift
+-- security group. The EC2 security group must be defined in the AWS region
+-- where the cluster resides. For an overview of CIDR blocks, see the
+-- Wikipedia article on Classless Inter-Domain Routing. You must also
+-- associate the security group with a cluster so that clients running on
+-- these IP addresses or the EC2 instance are authorized to connect to the
+-- cluster. For information about managing security groups, go to Working with
+-- Security Groups in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_AuthorizeClusterSecurityGroupIngress.html>
+module Network.AWS.Redshift.AuthorizeClusterSecurityGroupIngress
+    (
+    -- * Request
+      AuthorizeClusterSecurityGroupIngress
+    -- ** Request constructor
+    , authorizeClusterSecurityGroupIngress
+    -- ** Request lenses
+    , acsgiCIDRIP
+    , acsgiClusterSecurityGroupName
+    , acsgiEC2SecurityGroupName
+    , acsgiEC2SecurityGroupOwnerId
+
+    -- * Response
+    , AuthorizeClusterSecurityGroupIngressResponse
+    -- ** Response constructor
+    , authorizeClusterSecurityGroupIngressResponse
+    -- ** Response lenses
+    , acsgirClusterSecurityGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data AuthorizeClusterSecurityGroupIngress = AuthorizeClusterSecurityGroupIngress
+    { _acsgiCIDRIP                   :: Maybe Text
+    , _acsgiClusterSecurityGroupName :: Text
+    , _acsgiEC2SecurityGroupName     :: Maybe Text
+    , _acsgiEC2SecurityGroupOwnerId  :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'AuthorizeClusterSecurityGroupIngress' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'acsgiCIDRIP' @::@ 'Maybe' 'Text'
+--
+-- * 'acsgiClusterSecurityGroupName' @::@ 'Text'
+--
+-- * 'acsgiEC2SecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'acsgiEC2SecurityGroupOwnerId' @::@ 'Maybe' 'Text'
+--
+authorizeClusterSecurityGroupIngress :: Text -- ^ 'acsgiClusterSecurityGroupName'
+                                     -> AuthorizeClusterSecurityGroupIngress
+authorizeClusterSecurityGroupIngress p1 = AuthorizeClusterSecurityGroupIngress
+    { _acsgiClusterSecurityGroupName = p1
+    , _acsgiCIDRIP                   = Nothing
+    , _acsgiEC2SecurityGroupName     = Nothing
+    , _acsgiEC2SecurityGroupOwnerId  = Nothing
+    }
+
+-- | The IP range to be added the Amazon Redshift security group.
+acsgiCIDRIP :: Lens' AuthorizeClusterSecurityGroupIngress (Maybe Text)
+acsgiCIDRIP = lens _acsgiCIDRIP (\s a -> s { _acsgiCIDRIP = a })
+
+-- | The name of the security group to which the ingress rule is added.
+acsgiClusterSecurityGroupName :: Lens' AuthorizeClusterSecurityGroupIngress Text
+acsgiClusterSecurityGroupName =
+    lens _acsgiClusterSecurityGroupName
+        (\s a -> s { _acsgiClusterSecurityGroupName = a })
+
+-- | The EC2 security group to be added the Amazon Redshift security group.
+acsgiEC2SecurityGroupName :: Lens' AuthorizeClusterSecurityGroupIngress (Maybe Text)
+acsgiEC2SecurityGroupName =
+    lens _acsgiEC2SecurityGroupName
+        (\s a -> s { _acsgiEC2SecurityGroupName = a })
+
+-- | The AWS account number of the owner of the security group specified by
+-- the EC2SecurityGroupName parameter. The AWS Access Key ID is not an
+-- acceptable value. Example: 111122223333.
+acsgiEC2SecurityGroupOwnerId :: Lens' AuthorizeClusterSecurityGroupIngress (Maybe Text)
+acsgiEC2SecurityGroupOwnerId =
+    lens _acsgiEC2SecurityGroupOwnerId
+        (\s a -> s { _acsgiEC2SecurityGroupOwnerId = a })
+
+newtype AuthorizeClusterSecurityGroupIngressResponse = AuthorizeClusterSecurityGroupIngressResponse
+    { _acsgirClusterSecurityGroup :: Maybe ClusterSecurityGroup
+    } deriving (Eq, Show)
+
+-- | 'AuthorizeClusterSecurityGroupIngressResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'acsgirClusterSecurityGroup' @::@ 'Maybe' 'ClusterSecurityGroup'
+--
+authorizeClusterSecurityGroupIngressResponse :: AuthorizeClusterSecurityGroupIngressResponse
+authorizeClusterSecurityGroupIngressResponse = AuthorizeClusterSecurityGroupIngressResponse
+    { _acsgirClusterSecurityGroup = Nothing
+    }
+
+acsgirClusterSecurityGroup :: Lens' AuthorizeClusterSecurityGroupIngressResponse (Maybe ClusterSecurityGroup)
+acsgirClusterSecurityGroup =
+    lens _acsgirClusterSecurityGroup
+        (\s a -> s { _acsgirClusterSecurityGroup = a })
+
+instance ToPath AuthorizeClusterSecurityGroupIngress where
+    toPath = const "/"
+
+instance ToQuery AuthorizeClusterSecurityGroupIngress where
+    toQuery AuthorizeClusterSecurityGroupIngress{..} = mconcat
+        [ "CIDRIP"                   =? _acsgiCIDRIP
+        , "ClusterSecurityGroupName" =? _acsgiClusterSecurityGroupName
+        , "EC2SecurityGroupName"     =? _acsgiEC2SecurityGroupName
+        , "EC2SecurityGroupOwnerId"  =? _acsgiEC2SecurityGroupOwnerId
+        ]
+
+instance ToHeaders AuthorizeClusterSecurityGroupIngress
+
+instance AWSRequest AuthorizeClusterSecurityGroupIngress where
+    type Sv AuthorizeClusterSecurityGroupIngress = Redshift
+    type Rs AuthorizeClusterSecurityGroupIngress = AuthorizeClusterSecurityGroupIngressResponse
+
+    request  = post "AuthorizeClusterSecurityGroupIngress"
+    response = xmlResponse
+
+instance FromXML AuthorizeClusterSecurityGroupIngressResponse where
+    parseXML = withElement "AuthorizeClusterSecurityGroupIngressResult" $ \x -> AuthorizeClusterSecurityGroupIngressResponse
+        <$> x .@? "ClusterSecurityGroup"
diff --git a/gen/Network/AWS/Redshift/AuthorizeSnapshotAccess.hs b/gen/Network/AWS/Redshift/AuthorizeSnapshotAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/AuthorizeSnapshotAccess.hs
@@ -0,0 +1,137 @@
+{-# 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.Redshift.AuthorizeSnapshotAccess
+-- 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)
+
+-- | Authorizes the specified AWS customer account to restore the specified
+-- snapshot. For more information about working with snapshots, go to Amazon
+-- Redshift Snapshots in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_AuthorizeSnapshotAccess.html>
+module Network.AWS.Redshift.AuthorizeSnapshotAccess
+    (
+    -- * Request
+      AuthorizeSnapshotAccess
+    -- ** Request constructor
+    , authorizeSnapshotAccess
+    -- ** Request lenses
+    , asaAccountWithRestoreAccess
+    , asaSnapshotClusterIdentifier
+    , asaSnapshotIdentifier
+
+    -- * Response
+    , AuthorizeSnapshotAccessResponse
+    -- ** Response constructor
+    , authorizeSnapshotAccessResponse
+    -- ** Response lenses
+    , asarSnapshot
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data AuthorizeSnapshotAccess = AuthorizeSnapshotAccess
+    { _asaAccountWithRestoreAccess  :: Text
+    , _asaSnapshotClusterIdentifier :: Maybe Text
+    , _asaSnapshotIdentifier        :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'AuthorizeSnapshotAccess' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'asaAccountWithRestoreAccess' @::@ 'Text'
+--
+-- * 'asaSnapshotClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'asaSnapshotIdentifier' @::@ 'Text'
+--
+authorizeSnapshotAccess :: Text -- ^ 'asaSnapshotIdentifier'
+                        -> Text -- ^ 'asaAccountWithRestoreAccess'
+                        -> AuthorizeSnapshotAccess
+authorizeSnapshotAccess p1 p2 = AuthorizeSnapshotAccess
+    { _asaSnapshotIdentifier        = p1
+    , _asaAccountWithRestoreAccess  = p2
+    , _asaSnapshotClusterIdentifier = Nothing
+    }
+
+-- | The identifier of the AWS customer account authorized to restore the
+-- specified snapshot.
+asaAccountWithRestoreAccess :: Lens' AuthorizeSnapshotAccess Text
+asaAccountWithRestoreAccess =
+    lens _asaAccountWithRestoreAccess
+        (\s a -> s { _asaAccountWithRestoreAccess = a })
+
+-- | The identifier of the cluster the snapshot was created from. This
+-- parameter is required if your IAM user has a policy containing a snapshot
+-- resource element that specifies anything other than * for the cluster
+-- name.
+asaSnapshotClusterIdentifier :: Lens' AuthorizeSnapshotAccess (Maybe Text)
+asaSnapshotClusterIdentifier =
+    lens _asaSnapshotClusterIdentifier
+        (\s a -> s { _asaSnapshotClusterIdentifier = a })
+
+-- | The identifier of the snapshot the account is authorized to restore.
+asaSnapshotIdentifier :: Lens' AuthorizeSnapshotAccess Text
+asaSnapshotIdentifier =
+    lens _asaSnapshotIdentifier (\s a -> s { _asaSnapshotIdentifier = a })
+
+newtype AuthorizeSnapshotAccessResponse = AuthorizeSnapshotAccessResponse
+    { _asarSnapshot :: Maybe Snapshot
+    } deriving (Eq, Show)
+
+-- | 'AuthorizeSnapshotAccessResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'asarSnapshot' @::@ 'Maybe' 'Snapshot'
+--
+authorizeSnapshotAccessResponse :: AuthorizeSnapshotAccessResponse
+authorizeSnapshotAccessResponse = AuthorizeSnapshotAccessResponse
+    { _asarSnapshot = Nothing
+    }
+
+asarSnapshot :: Lens' AuthorizeSnapshotAccessResponse (Maybe Snapshot)
+asarSnapshot = lens _asarSnapshot (\s a -> s { _asarSnapshot = a })
+
+instance ToPath AuthorizeSnapshotAccess where
+    toPath = const "/"
+
+instance ToQuery AuthorizeSnapshotAccess where
+    toQuery AuthorizeSnapshotAccess{..} = mconcat
+        [ "AccountWithRestoreAccess"  =? _asaAccountWithRestoreAccess
+        , "SnapshotClusterIdentifier" =? _asaSnapshotClusterIdentifier
+        , "SnapshotIdentifier"        =? _asaSnapshotIdentifier
+        ]
+
+instance ToHeaders AuthorizeSnapshotAccess
+
+instance AWSRequest AuthorizeSnapshotAccess where
+    type Sv AuthorizeSnapshotAccess = Redshift
+    type Rs AuthorizeSnapshotAccess = AuthorizeSnapshotAccessResponse
+
+    request  = post "AuthorizeSnapshotAccess"
+    response = xmlResponse
+
+instance FromXML AuthorizeSnapshotAccessResponse where
+    parseXML = withElement "AuthorizeSnapshotAccessResult" $ \x -> AuthorizeSnapshotAccessResponse
+        <$> x .@? "Snapshot"
diff --git a/gen/Network/AWS/Redshift/CopyClusterSnapshot.hs b/gen/Network/AWS/Redshift/CopyClusterSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CopyClusterSnapshot.hs
@@ -0,0 +1,148 @@
+{-# 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.Redshift.CopyClusterSnapshot
+-- 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)
+
+-- | Copies the specified automated cluster snapshot to a new manual cluster
+-- snapshot. The source must be an automated snapshot and it must be in the
+-- available state. When you delete a cluster, Amazon Redshift deletes any
+-- automated snapshots of the cluster. Also, when the retention period of the
+-- snapshot expires, Amazon Redshift automatically deletes it. If you want to
+-- keep an automated snapshot for a longer period, you can make a manual copy
+-- of the snapshot. Manual snapshots are retained until you delete them. For
+-- more information about working with snapshots, go to Amazon Redshift
+-- Snapshots in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CopyClusterSnapshot.html>
+module Network.AWS.Redshift.CopyClusterSnapshot
+    (
+    -- * Request
+      CopyClusterSnapshot
+    -- ** Request constructor
+    , copyClusterSnapshot
+    -- ** Request lenses
+    , ccsSourceSnapshotClusterIdentifier
+    , ccsSourceSnapshotIdentifier
+    , ccsTargetSnapshotIdentifier
+
+    -- * Response
+    , CopyClusterSnapshotResponse
+    -- ** Response constructor
+    , copyClusterSnapshotResponse
+    -- ** Response lenses
+    , ccsrSnapshot
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CopyClusterSnapshot = CopyClusterSnapshot
+    { _ccsSourceSnapshotClusterIdentifier :: Maybe Text
+    , _ccsSourceSnapshotIdentifier        :: Text
+    , _ccsTargetSnapshotIdentifier        :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'CopyClusterSnapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsSourceSnapshotClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'ccsSourceSnapshotIdentifier' @::@ 'Text'
+--
+-- * 'ccsTargetSnapshotIdentifier' @::@ 'Text'
+--
+copyClusterSnapshot :: Text -- ^ 'ccsSourceSnapshotIdentifier'
+                    -> Text -- ^ 'ccsTargetSnapshotIdentifier'
+                    -> CopyClusterSnapshot
+copyClusterSnapshot p1 p2 = CopyClusterSnapshot
+    { _ccsSourceSnapshotIdentifier        = p1
+    , _ccsTargetSnapshotIdentifier        = p2
+    , _ccsSourceSnapshotClusterIdentifier = Nothing
+    }
+
+-- | The identifier of the cluster the source snapshot was created from. This
+-- parameter is required if your IAM user has a policy containing a snapshot
+-- resource element that specifies anything other than * for the cluster
+-- name. Constraints: Must be the identifier for a valid cluster.
+ccsSourceSnapshotClusterIdentifier :: Lens' CopyClusterSnapshot (Maybe Text)
+ccsSourceSnapshotClusterIdentifier =
+    lens _ccsSourceSnapshotClusterIdentifier
+        (\s a -> s { _ccsSourceSnapshotClusterIdentifier = a })
+
+-- | The identifier for the source snapshot. Constraints: Must be the
+-- identifier for a valid automated snapshot whose state is available.
+ccsSourceSnapshotIdentifier :: Lens' CopyClusterSnapshot Text
+ccsSourceSnapshotIdentifier =
+    lens _ccsSourceSnapshotIdentifier
+        (\s a -> s { _ccsSourceSnapshotIdentifier = a })
+
+-- | The identifier given to the new manual snapshot. Constraints: Cannot be
+-- null, empty, or blank. Must contain from 1 to 255 alphanumeric characters
+-- or hyphens. First character must be a letter. Cannot end with a hyphen or
+-- contain two consecutive hyphens. Must be unique for the AWS account that
+-- is making the request.
+ccsTargetSnapshotIdentifier :: Lens' CopyClusterSnapshot Text
+ccsTargetSnapshotIdentifier =
+    lens _ccsTargetSnapshotIdentifier
+        (\s a -> s { _ccsTargetSnapshotIdentifier = a })
+
+newtype CopyClusterSnapshotResponse = CopyClusterSnapshotResponse
+    { _ccsrSnapshot :: Maybe Snapshot
+    } deriving (Eq, Show)
+
+-- | 'CopyClusterSnapshotResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsrSnapshot' @::@ 'Maybe' 'Snapshot'
+--
+copyClusterSnapshotResponse :: CopyClusterSnapshotResponse
+copyClusterSnapshotResponse = CopyClusterSnapshotResponse
+    { _ccsrSnapshot = Nothing
+    }
+
+ccsrSnapshot :: Lens' CopyClusterSnapshotResponse (Maybe Snapshot)
+ccsrSnapshot = lens _ccsrSnapshot (\s a -> s { _ccsrSnapshot = a })
+
+instance ToPath CopyClusterSnapshot where
+    toPath = const "/"
+
+instance ToQuery CopyClusterSnapshot where
+    toQuery CopyClusterSnapshot{..} = mconcat
+        [ "SourceSnapshotClusterIdentifier" =? _ccsSourceSnapshotClusterIdentifier
+        , "SourceSnapshotIdentifier"        =? _ccsSourceSnapshotIdentifier
+        , "TargetSnapshotIdentifier"        =? _ccsTargetSnapshotIdentifier
+        ]
+
+instance ToHeaders CopyClusterSnapshot
+
+instance AWSRequest CopyClusterSnapshot where
+    type Sv CopyClusterSnapshot = Redshift
+    type Rs CopyClusterSnapshot = CopyClusterSnapshotResponse
+
+    request  = post "CopyClusterSnapshot"
+    response = xmlResponse
+
+instance FromXML CopyClusterSnapshotResponse where
+    parseXML = withElement "CopyClusterSnapshotResult" $ \x -> CopyClusterSnapshotResponse
+        <$> x .@? "Snapshot"
diff --git a/gen/Network/AWS/Redshift/CreateCluster.hs b/gen/Network/AWS/Redshift/CreateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateCluster.hs
@@ -0,0 +1,445 @@
+{-# 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.Redshift.CreateCluster
+-- 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 a new cluster. To create the cluster in virtual private cloud
+-- (VPC), you must provide cluster subnet group name. If you don't provide a
+-- cluster subnet group name or the cluster security group parameter, Amazon
+-- Redshift creates a non-VPC cluster, it associates the default cluster
+-- security group with the cluster. For more information about managing
+-- clusters, go to Amazon Redshift Clusters in the Amazon Redshift Cluster
+-- Management Guide .
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateCluster.html>
+module Network.AWS.Redshift.CreateCluster
+    (
+    -- * Request
+      CreateCluster
+    -- ** Request constructor
+    , createCluster
+    -- ** Request lenses
+    , ccAllowVersionUpgrade
+    , ccAutomatedSnapshotRetentionPeriod
+    , ccAvailabilityZone
+    , ccClusterIdentifier
+    , ccClusterParameterGroupName
+    , ccClusterSecurityGroups
+    , ccClusterSubnetGroupName
+    , ccClusterType
+    , ccClusterVersion
+    , ccDBName
+    , ccElasticIp
+    , ccEncrypted
+    , ccHsmClientCertificateIdentifier
+    , ccHsmConfigurationIdentifier
+    , ccKmsKeyId
+    , ccMasterUserPassword
+    , ccMasterUsername
+    , ccNodeType
+    , ccNumberOfNodes
+    , ccPort
+    , ccPreferredMaintenanceWindow
+    , ccPubliclyAccessible
+    , ccTags
+    , ccVpcSecurityGroupIds
+
+    -- * Response
+    , CreateClusterResponse
+    -- ** Response constructor
+    , createClusterResponse
+    -- ** Response lenses
+    , ccrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateCluster = CreateCluster
+    { _ccAllowVersionUpgrade              :: Maybe Bool
+    , _ccAutomatedSnapshotRetentionPeriod :: Maybe Int
+    , _ccAvailabilityZone                 :: Maybe Text
+    , _ccClusterIdentifier                :: Text
+    , _ccClusterParameterGroupName        :: Maybe Text
+    , _ccClusterSecurityGroups            :: List "ClusterSecurityGroupName" Text
+    , _ccClusterSubnetGroupName           :: Maybe Text
+    , _ccClusterType                      :: Maybe Text
+    , _ccClusterVersion                   :: Maybe Text
+    , _ccDBName                           :: Maybe Text
+    , _ccElasticIp                        :: Maybe Text
+    , _ccEncrypted                        :: Maybe Bool
+    , _ccHsmClientCertificateIdentifier   :: Maybe Text
+    , _ccHsmConfigurationIdentifier       :: Maybe Text
+    , _ccKmsKeyId                         :: Maybe Text
+    , _ccMasterUserPassword               :: Text
+    , _ccMasterUsername                   :: Text
+    , _ccNodeType                         :: Text
+    , _ccNumberOfNodes                    :: Maybe Int
+    , _ccPort                             :: Maybe Int
+    , _ccPreferredMaintenanceWindow       :: Maybe Text
+    , _ccPubliclyAccessible               :: Maybe Bool
+    , _ccTags                             :: List "Tag" Tag
+    , _ccVpcSecurityGroupIds              :: List "VpcSecurityGroupId" Text
+    } deriving (Eq, Show)
+
+-- | 'CreateCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccAllowVersionUpgrade' @::@ 'Maybe' 'Bool'
+--
+-- * 'ccAutomatedSnapshotRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+-- * 'ccAvailabilityZone' @::@ 'Maybe' 'Text'
+--
+-- * 'ccClusterIdentifier' @::@ 'Text'
+--
+-- * 'ccClusterParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'ccClusterSecurityGroups' @::@ ['Text']
+--
+-- * 'ccClusterSubnetGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'ccClusterType' @::@ 'Maybe' 'Text'
+--
+-- * 'ccClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'ccDBName' @::@ 'Maybe' 'Text'
+--
+-- * 'ccElasticIp' @::@ 'Maybe' 'Text'
+--
+-- * 'ccEncrypted' @::@ 'Maybe' 'Bool'
+--
+-- * 'ccHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'ccHsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'ccKmsKeyId' @::@ 'Maybe' 'Text'
+--
+-- * 'ccMasterUserPassword' @::@ 'Text'
+--
+-- * 'ccMasterUsername' @::@ 'Text'
+--
+-- * 'ccNodeType' @::@ 'Text'
+--
+-- * 'ccNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+-- * 'ccPort' @::@ 'Maybe' 'Int'
+--
+-- * 'ccPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+--
+-- * 'ccPubliclyAccessible' @::@ 'Maybe' 'Bool'
+--
+-- * 'ccTags' @::@ ['Tag']
+--
+-- * 'ccVpcSecurityGroupIds' @::@ ['Text']
+--
+createCluster :: Text -- ^ 'ccClusterIdentifier'
+              -> Text -- ^ 'ccNodeType'
+              -> Text -- ^ 'ccMasterUsername'
+              -> Text -- ^ 'ccMasterUserPassword'
+              -> CreateCluster
+createCluster p1 p2 p3 p4 = CreateCluster
+    { _ccClusterIdentifier                = p1
+    , _ccNodeType                         = p2
+    , _ccMasterUsername                   = p3
+    , _ccMasterUserPassword               = p4
+    , _ccDBName                           = Nothing
+    , _ccClusterType                      = Nothing
+    , _ccClusterSecurityGroups            = mempty
+    , _ccVpcSecurityGroupIds              = mempty
+    , _ccClusterSubnetGroupName           = Nothing
+    , _ccAvailabilityZone                 = Nothing
+    , _ccPreferredMaintenanceWindow       = Nothing
+    , _ccClusterParameterGroupName        = Nothing
+    , _ccAutomatedSnapshotRetentionPeriod = Nothing
+    , _ccPort                             = Nothing
+    , _ccClusterVersion                   = Nothing
+    , _ccAllowVersionUpgrade              = Nothing
+    , _ccNumberOfNodes                    = Nothing
+    , _ccPubliclyAccessible               = Nothing
+    , _ccEncrypted                        = Nothing
+    , _ccHsmClientCertificateIdentifier   = Nothing
+    , _ccHsmConfigurationIdentifier       = Nothing
+    , _ccElasticIp                        = Nothing
+    , _ccTags                             = mempty
+    , _ccKmsKeyId                         = Nothing
+    }
+
+-- | If true, major version upgrades can be applied during the maintenance
+-- window to the Amazon Redshift engine that is running on the cluster. When
+-- a new major version of the Amazon Redshift engine is released, you can
+-- request that the service automatically apply upgrades during the
+-- maintenance window to the Amazon Redshift engine that is running on your
+-- cluster. Default: true.
+ccAllowVersionUpgrade :: Lens' CreateCluster (Maybe Bool)
+ccAllowVersionUpgrade =
+    lens _ccAllowVersionUpgrade (\s a -> s { _ccAllowVersionUpgrade = a })
+
+-- | The number of days that automated snapshots are retained. If the value is
+-- 0, automated snapshots are disabled. Even if automated snapshots are
+-- disabled, you can still create manual snapshots when you want with
+-- CreateClusterSnapshot. Default: 1 Constraints: Must be a value from 0 to
+-- 35.
+ccAutomatedSnapshotRetentionPeriod :: Lens' CreateCluster (Maybe Int)
+ccAutomatedSnapshotRetentionPeriod =
+    lens _ccAutomatedSnapshotRetentionPeriod
+        (\s a -> s { _ccAutomatedSnapshotRetentionPeriod = a })
+
+-- | The EC2 Availability Zone (AZ) in which you want Amazon Redshift to
+-- provision the cluster. For example, if you have several EC2 instances
+-- running in a specific Availability Zone, then you might want the cluster
+-- to be provisioned in the same zone in order to decrease network latency.
+-- Default: A random, system-chosen Availability Zone in the region that is
+-- specified by the endpoint. Example: us-east-1d Constraint: The specified
+-- Availability Zone must be in the same region as the current endpoint.
+ccAvailabilityZone :: Lens' CreateCluster (Maybe Text)
+ccAvailabilityZone =
+    lens _ccAvailabilityZone (\s a -> s { _ccAvailabilityZone = a })
+
+-- | A unique identifier for the cluster. You use this identifier to refer to
+-- the cluster for any subsequent cluster operations such as deleting or
+-- modifying. The identifier also appears in the Amazon Redshift console.
+-- Constraints: Must contain from 1 to 63 alphanumeric characters or
+-- hyphens. Alphabetic characters must be lowercase. First character must be
+-- a letter. Cannot end with a hyphen or contain two consecutive hyphens.
+-- Must be unique for all clusters within an AWS account. Example:
+-- myexamplecluster.
+ccClusterIdentifier :: Lens' CreateCluster Text
+ccClusterIdentifier =
+    lens _ccClusterIdentifier (\s a -> s { _ccClusterIdentifier = a })
+
+-- | The name of the parameter group to be associated with this cluster.
+-- Default: The default Amazon Redshift cluster parameter group. For
+-- information about the default parameter group, go to Working with Amazon
+-- Redshift Parameter Groups Constraints: Must be 1 to 255 alphanumeric
+-- characters or hyphens. First character must be a letter. Cannot end with
+-- a hyphen or contain two consecutive hyphens.
+ccClusterParameterGroupName :: Lens' CreateCluster (Maybe Text)
+ccClusterParameterGroupName =
+    lens _ccClusterParameterGroupName
+        (\s a -> s { _ccClusterParameterGroupName = a })
+
+-- | A list of security groups to be associated with this cluster. Default:
+-- The default cluster security group for Amazon Redshift.
+ccClusterSecurityGroups :: Lens' CreateCluster [Text]
+ccClusterSecurityGroups =
+    lens _ccClusterSecurityGroups (\s a -> s { _ccClusterSecurityGroups = a })
+        . _List
+
+-- | The name of a cluster subnet group to be associated with this cluster. If
+-- this parameter is not provided the resulting cluster will be deployed
+-- outside virtual private cloud (VPC).
+ccClusterSubnetGroupName :: Lens' CreateCluster (Maybe Text)
+ccClusterSubnetGroupName =
+    lens _ccClusterSubnetGroupName
+        (\s a -> s { _ccClusterSubnetGroupName = a })
+
+-- | The type of the cluster. When cluster type is specified as single-node,
+-- the NumberOfNodes parameter is not required. multi-node, the
+-- NumberOfNodes parameter is required. Valid Values: multi-node |
+-- single-node Default: multi-node.
+ccClusterType :: Lens' CreateCluster (Maybe Text)
+ccClusterType = lens _ccClusterType (\s a -> s { _ccClusterType = a })
+
+-- | The version of the Amazon Redshift engine software that you want to
+-- deploy on the cluster. The version selected runs on all the nodes in the
+-- cluster. Constraints: Only version 1.0 is currently available. Example:
+-- 1.0.
+ccClusterVersion :: Lens' CreateCluster (Maybe Text)
+ccClusterVersion = lens _ccClusterVersion (\s a -> s { _ccClusterVersion = a })
+
+-- | The name of the first database to be created when the cluster is created.
+-- To create additional databases after the cluster is created, connect to
+-- the cluster with a SQL client and use SQL commands to create a database.
+-- For more information, go to Create a Database in the Amazon Redshift
+-- Database Developer Guide. Default: dev Constraints: Must contain 1 to 64
+-- alphanumeric characters. Must contain only lowercase letters. Cannot be a
+-- word that is reserved by the service. A list of reserved words can be
+-- found in Reserved Words in the Amazon Redshift Database Developer Guide.
+ccDBName :: Lens' CreateCluster (Maybe Text)
+ccDBName = lens _ccDBName (\s a -> s { _ccDBName = a })
+
+-- | The Elastic IP (EIP) address for the cluster. Constraints: The cluster
+-- must be provisioned in EC2-VPC and publicly-accessible through an
+-- Internet gateway. For more information about provisioning clusters in
+-- EC2-VPC, go to Supported Platforms to Launch Your Cluster in the Amazon
+-- Redshift Cluster Management Guide.
+ccElasticIp :: Lens' CreateCluster (Maybe Text)
+ccElasticIp = lens _ccElasticIp (\s a -> s { _ccElasticIp = a })
+
+-- | If true, the data in the cluster is encrypted at rest. Default: false.
+ccEncrypted :: Lens' CreateCluster (Maybe Bool)
+ccEncrypted = lens _ccEncrypted (\s a -> s { _ccEncrypted = a })
+
+-- | Specifies the name of the HSM client certificate the Amazon Redshift
+-- cluster uses to retrieve the data encryption keys stored in an HSM.
+ccHsmClientCertificateIdentifier :: Lens' CreateCluster (Maybe Text)
+ccHsmClientCertificateIdentifier =
+    lens _ccHsmClientCertificateIdentifier
+        (\s a -> s { _ccHsmClientCertificateIdentifier = a })
+
+-- | Specifies the name of the HSM configuration that contains the information
+-- the Amazon Redshift cluster can use to retrieve and store keys in an HSM.
+ccHsmConfigurationIdentifier :: Lens' CreateCluster (Maybe Text)
+ccHsmConfigurationIdentifier =
+    lens _ccHsmConfigurationIdentifier
+        (\s a -> s { _ccHsmConfigurationIdentifier = a })
+
+-- | The AWS Key Management Service (KMS) key ID of the encryption key that
+-- you want to use to encrypt data in the cluster.
+ccKmsKeyId :: Lens' CreateCluster (Maybe Text)
+ccKmsKeyId = lens _ccKmsKeyId (\s a -> s { _ccKmsKeyId = a })
+
+-- | The password associated with the master user account for the cluster that
+-- is being created. Constraints: Must be between 8 and 64 characters in
+-- length. Must contain at least one uppercase letter. Must contain at least
+-- one lowercase letter. Must contain one number. Can be any printable ASCII
+-- character (ASCII code 33 to 126) except ' (single quote), " (double
+-- quote), \, /, @, or space.
+ccMasterUserPassword :: Lens' CreateCluster Text
+ccMasterUserPassword =
+    lens _ccMasterUserPassword (\s a -> s { _ccMasterUserPassword = a })
+
+-- | The user name associated with the master user account for the cluster
+-- that is being created. Constraints: Must be 1 - 128 alphanumeric
+-- characters. First character must be a letter. Cannot be a reserved word.
+-- A list of reserved words can be found in Reserved Words in the Amazon
+-- Redshift Database Developer Guide.
+ccMasterUsername :: Lens' CreateCluster Text
+ccMasterUsername = lens _ccMasterUsername (\s a -> s { _ccMasterUsername = a })
+
+-- | The node type to be provisioned for the cluster. For information about
+-- node types, go to Working with Clusters in the Amazon Redshift Cluster
+-- Management Guide. Valid Values: dw1.xlarge | dw1.8xlarge | dw2.large |
+-- dw2.8xlarge.
+ccNodeType :: Lens' CreateCluster Text
+ccNodeType = lens _ccNodeType (\s a -> s { _ccNodeType = a })
+
+-- | The number of compute nodes in the cluster. This parameter is required
+-- when the ClusterType parameter is specified as multi-node. For
+-- information about determining how many nodes you need, go to Working with
+-- Clusters in the Amazon Redshift Cluster Management Guide. If you don't
+-- specify this parameter, you get a single-node cluster. When requesting a
+-- multi-node cluster, you must specify the number of nodes that you want in
+-- the cluster. Default: 1 Constraints: Value must be at least 1 and no more
+-- than 100.
+ccNumberOfNodes :: Lens' CreateCluster (Maybe Int)
+ccNumberOfNodes = lens _ccNumberOfNodes (\s a -> s { _ccNumberOfNodes = a })
+
+-- | The port number on which the cluster accepts incoming connections. The
+-- cluster is accessible only via the JDBC and ODBC connection strings. Part
+-- of the connection string requires the port on which the cluster will
+-- listen for incoming connections. Default: 5439 Valid Values: 1150-65535.
+ccPort :: Lens' CreateCluster (Maybe Int)
+ccPort = lens _ccPort (\s a -> s { _ccPort = a })
+
+-- | The weekly time range (in UTC) during which automated cluster maintenance
+-- can occur. Format: ddd:hh24:mi-ddd:hh24:mi Default: A 30-minute window
+-- selected at random from an 8-hour block of time per region, occurring on
+-- a random day of the week. For more information about the time blocks for
+-- each region, see Maintenance Windows in Amazon Redshift Cluster
+-- Management Guide. Valid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun
+-- Constraints: Minimum 30-minute window.
+ccPreferredMaintenanceWindow :: Lens' CreateCluster (Maybe Text)
+ccPreferredMaintenanceWindow =
+    lens _ccPreferredMaintenanceWindow
+        (\s a -> s { _ccPreferredMaintenanceWindow = a })
+
+-- | If true, the cluster can be accessed from a public network.
+ccPubliclyAccessible :: Lens' CreateCluster (Maybe Bool)
+ccPubliclyAccessible =
+    lens _ccPubliclyAccessible (\s a -> s { _ccPubliclyAccessible = a })
+
+-- | A list of tag instances.
+ccTags :: Lens' CreateCluster [Tag]
+ccTags = lens _ccTags (\s a -> s { _ccTags = a }) . _List
+
+-- | A list of Virtual Private Cloud (VPC) security groups to be associated
+-- with the cluster. Default: The default VPC security group is associated
+-- with the cluster.
+ccVpcSecurityGroupIds :: Lens' CreateCluster [Text]
+ccVpcSecurityGroupIds =
+    lens _ccVpcSecurityGroupIds (\s a -> s { _ccVpcSecurityGroupIds = a })
+        . _List
+
+newtype CreateClusterResponse = CreateClusterResponse
+    { _ccrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccrCluster' @::@ 'Maybe' 'Cluster'
+--
+createClusterResponse :: CreateClusterResponse
+createClusterResponse = CreateClusterResponse
+    { _ccrCluster = Nothing
+    }
+
+ccrCluster :: Lens' CreateClusterResponse (Maybe Cluster)
+ccrCluster = lens _ccrCluster (\s a -> s { _ccrCluster = a })
+
+instance ToPath CreateCluster where
+    toPath = const "/"
+
+instance ToQuery CreateCluster where
+    toQuery CreateCluster{..} = mconcat
+        [ "AllowVersionUpgrade"              =? _ccAllowVersionUpgrade
+        , "AutomatedSnapshotRetentionPeriod" =? _ccAutomatedSnapshotRetentionPeriod
+        , "AvailabilityZone"                 =? _ccAvailabilityZone
+        , "ClusterIdentifier"                =? _ccClusterIdentifier
+        , "ClusterParameterGroupName"        =? _ccClusterParameterGroupName
+        , "ClusterSecurityGroups"            =? _ccClusterSecurityGroups
+        , "ClusterSubnetGroupName"           =? _ccClusterSubnetGroupName
+        , "ClusterType"                      =? _ccClusterType
+        , "ClusterVersion"                   =? _ccClusterVersion
+        , "DBName"                           =? _ccDBName
+        , "ElasticIp"                        =? _ccElasticIp
+        , "Encrypted"                        =? _ccEncrypted
+        , "HsmClientCertificateIdentifier"   =? _ccHsmClientCertificateIdentifier
+        , "HsmConfigurationIdentifier"       =? _ccHsmConfigurationIdentifier
+        , "KmsKeyId"                         =? _ccKmsKeyId
+        , "MasterUserPassword"               =? _ccMasterUserPassword
+        , "MasterUsername"                   =? _ccMasterUsername
+        , "NodeType"                         =? _ccNodeType
+        , "NumberOfNodes"                    =? _ccNumberOfNodes
+        , "Port"                             =? _ccPort
+        , "PreferredMaintenanceWindow"       =? _ccPreferredMaintenanceWindow
+        , "PubliclyAccessible"               =? _ccPubliclyAccessible
+        , "Tags"                             =? _ccTags
+        , "VpcSecurityGroupIds"              =? _ccVpcSecurityGroupIds
+        ]
+
+instance ToHeaders CreateCluster
+
+instance AWSRequest CreateCluster where
+    type Sv CreateCluster = Redshift
+    type Rs CreateCluster = CreateClusterResponse
+
+    request  = post "CreateCluster"
+    response = xmlResponse
+
+instance FromXML CreateClusterResponse where
+    parseXML = withElement "CreateClusterResult" $ \x -> CreateClusterResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/CreateClusterParameterGroup.hs b/gen/Network/AWS/Redshift/CreateClusterParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateClusterParameterGroup.hs
@@ -0,0 +1,161 @@
+{-# 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.Redshift.CreateClusterParameterGroup
+-- 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 an Amazon Redshift parameter group. Creating parameter groups is
+-- independent of creating clusters. You can associate a cluster with a
+-- parameter group when you create the cluster. You can also associate an
+-- existing cluster with a parameter group after the cluster is created by
+-- using ModifyCluster. Parameters in the parameter group define specific
+-- behavior that applies to the databases you create on the cluster. For more
+-- information about managing parameter groups, go to Amazon Redshift
+-- Parameter Groups in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateClusterParameterGroup.html>
+module Network.AWS.Redshift.CreateClusterParameterGroup
+    (
+    -- * Request
+      CreateClusterParameterGroup
+    -- ** Request constructor
+    , createClusterParameterGroup
+    -- ** Request lenses
+    , ccpgDescription
+    , ccpgParameterGroupFamily
+    , ccpgParameterGroupName
+    , ccpgTags
+
+    -- * Response
+    , CreateClusterParameterGroupResponse
+    -- ** Response constructor
+    , createClusterParameterGroupResponse
+    -- ** Response lenses
+    , ccpgrClusterParameterGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateClusterParameterGroup = CreateClusterParameterGroup
+    { _ccpgDescription          :: Text
+    , _ccpgParameterGroupFamily :: Text
+    , _ccpgParameterGroupName   :: Text
+    , _ccpgTags                 :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterParameterGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccpgDescription' @::@ 'Text'
+--
+-- * 'ccpgParameterGroupFamily' @::@ 'Text'
+--
+-- * 'ccpgParameterGroupName' @::@ 'Text'
+--
+-- * 'ccpgTags' @::@ ['Tag']
+--
+createClusterParameterGroup :: Text -- ^ 'ccpgParameterGroupName'
+                            -> Text -- ^ 'ccpgParameterGroupFamily'
+                            -> Text -- ^ 'ccpgDescription'
+                            -> CreateClusterParameterGroup
+createClusterParameterGroup p1 p2 p3 = CreateClusterParameterGroup
+    { _ccpgParameterGroupName   = p1
+    , _ccpgParameterGroupFamily = p2
+    , _ccpgDescription          = p3
+    , _ccpgTags                 = mempty
+    }
+
+-- | A description of the parameter group.
+ccpgDescription :: Lens' CreateClusterParameterGroup Text
+ccpgDescription = lens _ccpgDescription (\s a -> s { _ccpgDescription = a })
+
+-- | The Amazon Redshift engine version to which the cluster parameter group
+-- applies. The cluster engine version determines the set of parameters. To
+-- get a list of valid parameter group family names, you can call
+-- DescribeClusterParameterGroups. By default, Amazon Redshift returns a
+-- list of all the parameter groups that are owned by your AWS account,
+-- including the default parameter groups for each Amazon Redshift engine
+-- version. The parameter group family names associated with the default
+-- parameter groups provide you the valid values. For example, a valid
+-- family name is "redshift-1.0".
+ccpgParameterGroupFamily :: Lens' CreateClusterParameterGroup Text
+ccpgParameterGroupFamily =
+    lens _ccpgParameterGroupFamily
+        (\s a -> s { _ccpgParameterGroupFamily = a })
+
+-- | The name of the cluster parameter group. Constraints: Must be 1 to 255
+-- alphanumeric characters or hyphens First character must be a letter.
+-- Cannot end with a hyphen or contain two consecutive hyphens. Must be
+-- unique withing your AWS account. This value is stored as a lower-case
+-- string.
+ccpgParameterGroupName :: Lens' CreateClusterParameterGroup Text
+ccpgParameterGroupName =
+    lens _ccpgParameterGroupName (\s a -> s { _ccpgParameterGroupName = a })
+
+-- | A list of tag instances.
+ccpgTags :: Lens' CreateClusterParameterGroup [Tag]
+ccpgTags = lens _ccpgTags (\s a -> s { _ccpgTags = a }) . _List
+
+newtype CreateClusterParameterGroupResponse = CreateClusterParameterGroupResponse
+    { _ccpgrClusterParameterGroup :: Maybe ClusterParameterGroup
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterParameterGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccpgrClusterParameterGroup' @::@ 'Maybe' 'ClusterParameterGroup'
+--
+createClusterParameterGroupResponse :: CreateClusterParameterGroupResponse
+createClusterParameterGroupResponse = CreateClusterParameterGroupResponse
+    { _ccpgrClusterParameterGroup = Nothing
+    }
+
+ccpgrClusterParameterGroup :: Lens' CreateClusterParameterGroupResponse (Maybe ClusterParameterGroup)
+ccpgrClusterParameterGroup =
+    lens _ccpgrClusterParameterGroup
+        (\s a -> s { _ccpgrClusterParameterGroup = a })
+
+instance ToPath CreateClusterParameterGroup where
+    toPath = const "/"
+
+instance ToQuery CreateClusterParameterGroup where
+    toQuery CreateClusterParameterGroup{..} = mconcat
+        [ "Description"          =? _ccpgDescription
+        , "ParameterGroupFamily" =? _ccpgParameterGroupFamily
+        , "ParameterGroupName"   =? _ccpgParameterGroupName
+        , "Tags"                 =? _ccpgTags
+        ]
+
+instance ToHeaders CreateClusterParameterGroup
+
+instance AWSRequest CreateClusterParameterGroup where
+    type Sv CreateClusterParameterGroup = Redshift
+    type Rs CreateClusterParameterGroup = CreateClusterParameterGroupResponse
+
+    request  = post "CreateClusterParameterGroup"
+    response = xmlResponse
+
+instance FromXML CreateClusterParameterGroupResponse where
+    parseXML = withElement "CreateClusterParameterGroupResult" $ \x -> CreateClusterParameterGroupResponse
+        <$> x .@? "ClusterParameterGroup"
diff --git a/gen/Network/AWS/Redshift/CreateClusterSecurityGroup.hs b/gen/Network/AWS/Redshift/CreateClusterSecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateClusterSecurityGroup.hs
@@ -0,0 +1,137 @@
+{-# 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.Redshift.CreateClusterSecurityGroup
+-- 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 a new Amazon Redshift security group. You use security groups to
+-- control access to non-VPC clusters. For information about managing security
+-- groups, go to Amazon Redshift Cluster Security Groups in the Amazon
+-- Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateClusterSecurityGroup.html>
+module Network.AWS.Redshift.CreateClusterSecurityGroup
+    (
+    -- * Request
+      CreateClusterSecurityGroup
+    -- ** Request constructor
+    , createClusterSecurityGroup
+    -- ** Request lenses
+    , ccsg1ClusterSecurityGroupName
+    , ccsg1Description
+    , ccsg1Tags
+
+    -- * Response
+    , CreateClusterSecurityGroupResponse
+    -- ** Response constructor
+    , createClusterSecurityGroupResponse
+    -- ** Response lenses
+    , ccsgrClusterSecurityGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateClusterSecurityGroup = CreateClusterSecurityGroup
+    { _ccsg1ClusterSecurityGroupName :: Text
+    , _ccsg1Description              :: Text
+    , _ccsg1Tags                     :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSecurityGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsg1ClusterSecurityGroupName' @::@ 'Text'
+--
+-- * 'ccsg1Description' @::@ 'Text'
+--
+-- * 'ccsg1Tags' @::@ ['Tag']
+--
+createClusterSecurityGroup :: Text -- ^ 'ccsg1ClusterSecurityGroupName'
+                           -> Text -- ^ 'ccsg1Description'
+                           -> CreateClusterSecurityGroup
+createClusterSecurityGroup p1 p2 = CreateClusterSecurityGroup
+    { _ccsg1ClusterSecurityGroupName = p1
+    , _ccsg1Description              = p2
+    , _ccsg1Tags                     = mempty
+    }
+
+-- | The name for the security group. Amazon Redshift stores the value as a
+-- lowercase string. Constraints: Must contain no more than 255 alphanumeric
+-- characters or hyphens. Must not be "Default". Must be unique for all
+-- security groups that are created by your AWS account. Example:
+-- examplesecuritygroup.
+ccsg1ClusterSecurityGroupName :: Lens' CreateClusterSecurityGroup Text
+ccsg1ClusterSecurityGroupName =
+    lens _ccsg1ClusterSecurityGroupName
+        (\s a -> s { _ccsg1ClusterSecurityGroupName = a })
+
+-- | A description for the security group.
+ccsg1Description :: Lens' CreateClusterSecurityGroup Text
+ccsg1Description = lens _ccsg1Description (\s a -> s { _ccsg1Description = a })
+
+-- | A list of tag instances.
+ccsg1Tags :: Lens' CreateClusterSecurityGroup [Tag]
+ccsg1Tags = lens _ccsg1Tags (\s a -> s { _ccsg1Tags = a }) . _List
+
+newtype CreateClusterSecurityGroupResponse = CreateClusterSecurityGroupResponse
+    { _ccsgrClusterSecurityGroup :: Maybe ClusterSecurityGroup
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSecurityGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsgrClusterSecurityGroup' @::@ 'Maybe' 'ClusterSecurityGroup'
+--
+createClusterSecurityGroupResponse :: CreateClusterSecurityGroupResponse
+createClusterSecurityGroupResponse = CreateClusterSecurityGroupResponse
+    { _ccsgrClusterSecurityGroup = Nothing
+    }
+
+ccsgrClusterSecurityGroup :: Lens' CreateClusterSecurityGroupResponse (Maybe ClusterSecurityGroup)
+ccsgrClusterSecurityGroup =
+    lens _ccsgrClusterSecurityGroup
+        (\s a -> s { _ccsgrClusterSecurityGroup = a })
+
+instance ToPath CreateClusterSecurityGroup where
+    toPath = const "/"
+
+instance ToQuery CreateClusterSecurityGroup where
+    toQuery CreateClusterSecurityGroup{..} = mconcat
+        [ "ClusterSecurityGroupName" =? _ccsg1ClusterSecurityGroupName
+        , "Description"              =? _ccsg1Description
+        , "Tags"                     =? _ccsg1Tags
+        ]
+
+instance ToHeaders CreateClusterSecurityGroup
+
+instance AWSRequest CreateClusterSecurityGroup where
+    type Sv CreateClusterSecurityGroup = Redshift
+    type Rs CreateClusterSecurityGroup = CreateClusterSecurityGroupResponse
+
+    request  = post "CreateClusterSecurityGroup"
+    response = xmlResponse
+
+instance FromXML CreateClusterSecurityGroupResponse where
+    parseXML = withElement "CreateClusterSecurityGroupResult" $ \x -> CreateClusterSecurityGroupResponse
+        <$> x .@? "ClusterSecurityGroup"
diff --git a/gen/Network/AWS/Redshift/CreateClusterSnapshot.hs b/gen/Network/AWS/Redshift/CreateClusterSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateClusterSnapshot.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Redshift.CreateClusterSnapshot
+-- 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 a manual snapshot of the specified cluster. The cluster must be in
+-- the available state. For more information about working with snapshots, go
+-- to Amazon Redshift Snapshots in the Amazon Redshift Cluster Management
+-- Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateClusterSnapshot.html>
+module Network.AWS.Redshift.CreateClusterSnapshot
+    (
+    -- * Request
+      CreateClusterSnapshot
+    -- ** Request constructor
+    , createClusterSnapshot
+    -- ** Request lenses
+    , ccsClusterIdentifier
+    , ccsSnapshotIdentifier
+    , ccsTags
+
+    -- * Response
+    , CreateClusterSnapshotResponse
+    -- ** Response constructor
+    , createClusterSnapshotResponse
+    -- ** Response lenses
+    , ccsr1Snapshot
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateClusterSnapshot = CreateClusterSnapshot
+    { _ccsClusterIdentifier  :: Text
+    , _ccsSnapshotIdentifier :: Text
+    , _ccsTags               :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSnapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsClusterIdentifier' @::@ 'Text'
+--
+-- * 'ccsSnapshotIdentifier' @::@ 'Text'
+--
+-- * 'ccsTags' @::@ ['Tag']
+--
+createClusterSnapshot :: Text -- ^ 'ccsSnapshotIdentifier'
+                      -> Text -- ^ 'ccsClusterIdentifier'
+                      -> CreateClusterSnapshot
+createClusterSnapshot p1 p2 = CreateClusterSnapshot
+    { _ccsSnapshotIdentifier = p1
+    , _ccsClusterIdentifier  = p2
+    , _ccsTags               = mempty
+    }
+
+-- | The cluster identifier for which you want a snapshot.
+ccsClusterIdentifier :: Lens' CreateClusterSnapshot Text
+ccsClusterIdentifier =
+    lens _ccsClusterIdentifier (\s a -> s { _ccsClusterIdentifier = a })
+
+-- | A unique identifier for the snapshot that you are requesting. This
+-- identifier must be unique for all snapshots within the AWS account.
+-- Constraints: Cannot be null, empty, or blank Must contain from 1 to 255
+-- alphanumeric characters or hyphens First character must be a letter
+-- Cannot end with a hyphen or contain two consecutive hyphens Example:
+-- my-snapshot-id.
+ccsSnapshotIdentifier :: Lens' CreateClusterSnapshot Text
+ccsSnapshotIdentifier =
+    lens _ccsSnapshotIdentifier (\s a -> s { _ccsSnapshotIdentifier = a })
+
+-- | A list of tag instances.
+ccsTags :: Lens' CreateClusterSnapshot [Tag]
+ccsTags = lens _ccsTags (\s a -> s { _ccsTags = a }) . _List
+
+newtype CreateClusterSnapshotResponse = CreateClusterSnapshotResponse
+    { _ccsr1Snapshot :: Maybe Snapshot
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSnapshotResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsr1Snapshot' @::@ 'Maybe' 'Snapshot'
+--
+createClusterSnapshotResponse :: CreateClusterSnapshotResponse
+createClusterSnapshotResponse = CreateClusterSnapshotResponse
+    { _ccsr1Snapshot = Nothing
+    }
+
+ccsr1Snapshot :: Lens' CreateClusterSnapshotResponse (Maybe Snapshot)
+ccsr1Snapshot = lens _ccsr1Snapshot (\s a -> s { _ccsr1Snapshot = a })
+
+instance ToPath CreateClusterSnapshot where
+    toPath = const "/"
+
+instance ToQuery CreateClusterSnapshot where
+    toQuery CreateClusterSnapshot{..} = mconcat
+        [ "ClusterIdentifier"  =? _ccsClusterIdentifier
+        , "SnapshotIdentifier" =? _ccsSnapshotIdentifier
+        , "Tags"               =? _ccsTags
+        ]
+
+instance ToHeaders CreateClusterSnapshot
+
+instance AWSRequest CreateClusterSnapshot where
+    type Sv CreateClusterSnapshot = Redshift
+    type Rs CreateClusterSnapshot = CreateClusterSnapshotResponse
+
+    request  = post "CreateClusterSnapshot"
+    response = xmlResponse
+
+instance FromXML CreateClusterSnapshotResponse where
+    parseXML = withElement "CreateClusterSnapshotResult" $ \x -> CreateClusterSnapshotResponse
+        <$> x .@? "Snapshot"
diff --git a/gen/Network/AWS/Redshift/CreateClusterSubnetGroup.hs b/gen/Network/AWS/Redshift/CreateClusterSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateClusterSubnetGroup.hs
@@ -0,0 +1,148 @@
+{-# 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.Redshift.CreateClusterSubnetGroup
+-- 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 a new Amazon Redshift subnet group. You must provide a list of one
+-- or more subnets in your existing Amazon Virtual Private Cloud (Amazon VPC)
+-- when creating Amazon Redshift subnet group. For information about subnet
+-- groups, go to Amazon Redshift Cluster Subnet Groups in the Amazon Redshift
+-- Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateClusterSubnetGroup.html>
+module Network.AWS.Redshift.CreateClusterSubnetGroup
+    (
+    -- * Request
+      CreateClusterSubnetGroup
+    -- ** Request constructor
+    , createClusterSubnetGroup
+    -- ** Request lenses
+    , ccsgClusterSubnetGroupName
+    , ccsgDescription
+    , ccsgSubnetIds
+    , ccsgTags
+
+    -- * Response
+    , CreateClusterSubnetGroupResponse
+    -- ** Response constructor
+    , createClusterSubnetGroupResponse
+    -- ** Response lenses
+    , ccsgrClusterSubnetGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateClusterSubnetGroup = CreateClusterSubnetGroup
+    { _ccsgClusterSubnetGroupName :: Text
+    , _ccsgDescription            :: Text
+    , _ccsgSubnetIds              :: List "SubnetIdentifier" Text
+    , _ccsgTags                   :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSubnetGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsgClusterSubnetGroupName' @::@ 'Text'
+--
+-- * 'ccsgDescription' @::@ 'Text'
+--
+-- * 'ccsgSubnetIds' @::@ ['Text']
+--
+-- * 'ccsgTags' @::@ ['Tag']
+--
+createClusterSubnetGroup :: Text -- ^ 'ccsgClusterSubnetGroupName'
+                         -> Text -- ^ 'ccsgDescription'
+                         -> CreateClusterSubnetGroup
+createClusterSubnetGroup p1 p2 = CreateClusterSubnetGroup
+    { _ccsgClusterSubnetGroupName = p1
+    , _ccsgDescription            = p2
+    , _ccsgSubnetIds              = mempty
+    , _ccsgTags                   = mempty
+    }
+
+-- | The name for the subnet group. Amazon Redshift stores the value as a
+-- lowercase string. Constraints: Must contain no more than 255 alphanumeric
+-- characters or hyphens. Must not be "Default". Must be unique for all
+-- subnet groups that are created by your AWS account. Example:
+-- examplesubnetgroup.
+ccsgClusterSubnetGroupName :: Lens' CreateClusterSubnetGroup Text
+ccsgClusterSubnetGroupName =
+    lens _ccsgClusterSubnetGroupName
+        (\s a -> s { _ccsgClusterSubnetGroupName = a })
+
+-- | A description for the subnet group.
+ccsgDescription :: Lens' CreateClusterSubnetGroup Text
+ccsgDescription = lens _ccsgDescription (\s a -> s { _ccsgDescription = a })
+
+-- | An array of VPC subnet IDs. A maximum of 20 subnets can be modified in a
+-- single request.
+ccsgSubnetIds :: Lens' CreateClusterSubnetGroup [Text]
+ccsgSubnetIds = lens _ccsgSubnetIds (\s a -> s { _ccsgSubnetIds = a }) . _List
+
+-- | A list of tag instances.
+ccsgTags :: Lens' CreateClusterSubnetGroup [Tag]
+ccsgTags = lens _ccsgTags (\s a -> s { _ccsgTags = a }) . _List
+
+newtype CreateClusterSubnetGroupResponse = CreateClusterSubnetGroupResponse
+    { _ccsgrClusterSubnetGroup :: Maybe ClusterSubnetGroup
+    } deriving (Eq, Show)
+
+-- | 'CreateClusterSubnetGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccsgrClusterSubnetGroup' @::@ 'Maybe' 'ClusterSubnetGroup'
+--
+createClusterSubnetGroupResponse :: CreateClusterSubnetGroupResponse
+createClusterSubnetGroupResponse = CreateClusterSubnetGroupResponse
+    { _ccsgrClusterSubnetGroup = Nothing
+    }
+
+ccsgrClusterSubnetGroup :: Lens' CreateClusterSubnetGroupResponse (Maybe ClusterSubnetGroup)
+ccsgrClusterSubnetGroup =
+    lens _ccsgrClusterSubnetGroup (\s a -> s { _ccsgrClusterSubnetGroup = a })
+
+instance ToPath CreateClusterSubnetGroup where
+    toPath = const "/"
+
+instance ToQuery CreateClusterSubnetGroup where
+    toQuery CreateClusterSubnetGroup{..} = mconcat
+        [ "ClusterSubnetGroupName" =? _ccsgClusterSubnetGroupName
+        , "Description"            =? _ccsgDescription
+        , "SubnetIds"              =? _ccsgSubnetIds
+        , "Tags"                   =? _ccsgTags
+        ]
+
+instance ToHeaders CreateClusterSubnetGroup
+
+instance AWSRequest CreateClusterSubnetGroup where
+    type Sv CreateClusterSubnetGroup = Redshift
+    type Rs CreateClusterSubnetGroup = CreateClusterSubnetGroupResponse
+
+    request  = post "CreateClusterSubnetGroup"
+    response = xmlResponse
+
+instance FromXML CreateClusterSubnetGroupResponse where
+    parseXML = withElement "CreateClusterSubnetGroupResult" $ \x -> CreateClusterSubnetGroupResponse
+        <$> x .@? "ClusterSubnetGroup"
diff --git a/gen/Network/AWS/Redshift/CreateEventSubscription.hs b/gen/Network/AWS/Redshift/CreateEventSubscription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateEventSubscription.hs
@@ -0,0 +1,219 @@
+{-# 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.Redshift.CreateEventSubscription
+-- 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 an Amazon Redshift event notification subscription. This action
+-- requires an ARN (Amazon Resource Name) of an Amazon SNS topic created by
+-- either the Amazon Redshift console, the Amazon SNS console, or the Amazon
+-- SNS API. To obtain an ARN with Amazon SNS, you must create a topic in
+-- Amazon SNS and subscribe to the topic. The ARN is displayed in the SNS
+-- console. You can specify the source type, and lists of Amazon Redshift
+-- source IDs, event categories, and event severities. Notifications will be
+-- sent for all events you want that match those criteria. For example, you
+-- can specify source type = cluster, source ID = my-cluster-1 and mycluster2,
+-- event categories = Availability, Backup, and severity = ERROR. The
+-- subscription will only send notifications for those ERROR events in the
+-- Availability and Backup categories for the specified clusters. If you
+-- specify both the source type and source IDs, such as source type = cluster
+-- and source identifier = my-cluster-1, notifications will be sent for all
+-- the cluster events for my-cluster-1. If you specify a source type but do
+-- not specify a source identifier, you will receive notice of the events for
+-- the objects of that type in your AWS account. If you do not specify either
+-- the SourceType nor the SourceIdentifier, you will be notified of events
+-- generated from all Amazon Redshift sources belonging to your AWS account.
+-- You must specify a source type if you specify a source ID.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateEventSubscription.html>
+module Network.AWS.Redshift.CreateEventSubscription
+    (
+    -- * Request
+      CreateEventSubscription
+    -- ** Request constructor
+    , createEventSubscription
+    -- ** Request lenses
+    , cesEnabled
+    , cesEventCategories
+    , cesSeverity
+    , cesSnsTopicArn
+    , cesSourceIds
+    , cesSourceType
+    , cesSubscriptionName
+    , cesTags
+
+    -- * Response
+    , CreateEventSubscriptionResponse
+    -- ** Response constructor
+    , createEventSubscriptionResponse
+    -- ** Response lenses
+    , cesrEventSubscription
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateEventSubscription = CreateEventSubscription
+    { _cesEnabled          :: Maybe Bool
+    , _cesEventCategories  :: List "EventCategory" Text
+    , _cesSeverity         :: Maybe Text
+    , _cesSnsTopicArn      :: Text
+    , _cesSourceIds        :: List "SourceId" Text
+    , _cesSourceType       :: Maybe Text
+    , _cesSubscriptionName :: Text
+    , _cesTags             :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateEventSubscription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cesEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'cesEventCategories' @::@ ['Text']
+--
+-- * 'cesSeverity' @::@ 'Maybe' 'Text'
+--
+-- * 'cesSnsTopicArn' @::@ 'Text'
+--
+-- * 'cesSourceIds' @::@ ['Text']
+--
+-- * 'cesSourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'cesSubscriptionName' @::@ 'Text'
+--
+-- * 'cesTags' @::@ ['Tag']
+--
+createEventSubscription :: Text -- ^ 'cesSubscriptionName'
+                        -> Text -- ^ 'cesSnsTopicArn'
+                        -> CreateEventSubscription
+createEventSubscription p1 p2 = CreateEventSubscription
+    { _cesSubscriptionName = p1
+    , _cesSnsTopicArn      = p2
+    , _cesSourceType       = Nothing
+    , _cesSourceIds        = mempty
+    , _cesEventCategories  = mempty
+    , _cesSeverity         = Nothing
+    , _cesEnabled          = Nothing
+    , _cesTags             = mempty
+    }
+
+-- | A Boolean value; set to true to activate the subscription, set to false
+-- to create the subscription but not active it.
+cesEnabled :: Lens' CreateEventSubscription (Maybe Bool)
+cesEnabled = lens _cesEnabled (\s a -> s { _cesEnabled = a })
+
+-- | Specifies the Amazon Redshift event categories to be published by the
+-- event notification subscription. Values: Configuration, Management,
+-- Monitoring, Security.
+cesEventCategories :: Lens' CreateEventSubscription [Text]
+cesEventCategories =
+    lens _cesEventCategories (\s a -> s { _cesEventCategories = a })
+        . _List
+
+-- | Specifies the Amazon Redshift event severity to be published by the event
+-- notification subscription. Values: ERROR, INFO.
+cesSeverity :: Lens' CreateEventSubscription (Maybe Text)
+cesSeverity = lens _cesSeverity (\s a -> s { _cesSeverity = a })
+
+-- | The Amazon Resource Name (ARN) of the Amazon SNS topic used to transmit
+-- the event notifications. The ARN is created by Amazon SNS when you create
+-- a topic and subscribe to it.
+cesSnsTopicArn :: Lens' CreateEventSubscription Text
+cesSnsTopicArn = lens _cesSnsTopicArn (\s a -> s { _cesSnsTopicArn = a })
+
+-- | A list of one or more identifiers of Amazon Redshift source objects. All
+-- of the objects must be of the same type as was specified in the source
+-- type parameter. The event subscription will return only events generated
+-- by the specified objects. If not specified, then events are returned for
+-- all objects within the source type specified. Example: my-cluster-1,
+-- my-cluster-2 Example: my-snapshot-20131010.
+cesSourceIds :: Lens' CreateEventSubscription [Text]
+cesSourceIds = lens _cesSourceIds (\s a -> s { _cesSourceIds = a }) . _List
+
+-- | The type of source that will be generating the events. For example, if
+-- you want to be notified of events generated by a cluster, you would set
+-- this parameter to cluster. If this value is not specified, events are
+-- returned for all Amazon Redshift objects in your AWS account. You must
+-- specify a source type in order to specify source IDs. Valid values:
+-- cluster, cluster-parameter-group, cluster-security-group, and
+-- cluster-snapshot.
+cesSourceType :: Lens' CreateEventSubscription (Maybe Text)
+cesSourceType = lens _cesSourceType (\s a -> s { _cesSourceType = a })
+
+-- | The name of the event subscription to be created. Constraints: Cannot be
+-- null, empty, or blank. Must contain from 1 to 255 alphanumeric characters
+-- or hyphens. First character must be a letter. Cannot end with a hyphen or
+-- contain two consecutive hyphens.
+cesSubscriptionName :: Lens' CreateEventSubscription Text
+cesSubscriptionName =
+    lens _cesSubscriptionName (\s a -> s { _cesSubscriptionName = a })
+
+-- | A list of tag instances.
+cesTags :: Lens' CreateEventSubscription [Tag]
+cesTags = lens _cesTags (\s a -> s { _cesTags = a }) . _List
+
+newtype CreateEventSubscriptionResponse = CreateEventSubscriptionResponse
+    { _cesrEventSubscription :: Maybe EventSubscription
+    } deriving (Eq, Show)
+
+-- | 'CreateEventSubscriptionResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cesrEventSubscription' @::@ 'Maybe' 'EventSubscription'
+--
+createEventSubscriptionResponse :: CreateEventSubscriptionResponse
+createEventSubscriptionResponse = CreateEventSubscriptionResponse
+    { _cesrEventSubscription = Nothing
+    }
+
+cesrEventSubscription :: Lens' CreateEventSubscriptionResponse (Maybe EventSubscription)
+cesrEventSubscription =
+    lens _cesrEventSubscription (\s a -> s { _cesrEventSubscription = a })
+
+instance ToPath CreateEventSubscription where
+    toPath = const "/"
+
+instance ToQuery CreateEventSubscription where
+    toQuery CreateEventSubscription{..} = mconcat
+        [ "Enabled"          =? _cesEnabled
+        , "EventCategories"  =? _cesEventCategories
+        , "Severity"         =? _cesSeverity
+        , "SnsTopicArn"      =? _cesSnsTopicArn
+        , "SourceIds"        =? _cesSourceIds
+        , "SourceType"       =? _cesSourceType
+        , "SubscriptionName" =? _cesSubscriptionName
+        , "Tags"             =? _cesTags
+        ]
+
+instance ToHeaders CreateEventSubscription
+
+instance AWSRequest CreateEventSubscription where
+    type Sv CreateEventSubscription = Redshift
+    type Rs CreateEventSubscription = CreateEventSubscriptionResponse
+
+    request  = post "CreateEventSubscription"
+    response = xmlResponse
+
+instance FromXML CreateEventSubscriptionResponse where
+    parseXML = withElement "CreateEventSubscriptionResult" $ \x -> CreateEventSubscriptionResponse
+        <$> x .@? "EventSubscription"
diff --git a/gen/Network/AWS/Redshift/CreateHsmClientCertificate.hs b/gen/Network/AWS/Redshift/CreateHsmClientCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateHsmClientCertificate.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.Redshift.CreateHsmClientCertificate
+-- 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 an HSM client certificate that an Amazon Redshift cluster will use
+-- to connect to the client's HSM in order to store and retrieve the keys used
+-- to encrypt the cluster databases. The command returns a public key, which
+-- you must store in the HSM. In addition to creating the HSM certificate, you
+-- must create an Amazon Redshift HSM configuration that provides a cluster
+-- the information needed to store and use encryption keys in the HSM. For
+-- more information, go to Hardware Security Modules in the Amazon Redshift
+-- Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateHsmClientCertificate.html>
+module Network.AWS.Redshift.CreateHsmClientCertificate
+    (
+    -- * Request
+      CreateHsmClientCertificate
+    -- ** Request constructor
+    , createHsmClientCertificate
+    -- ** Request lenses
+    , chccHsmClientCertificateIdentifier
+    , chccTags
+
+    -- * Response
+    , CreateHsmClientCertificateResponse
+    -- ** Response constructor
+    , createHsmClientCertificateResponse
+    -- ** Response lenses
+    , chccrHsmClientCertificate
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateHsmClientCertificate = CreateHsmClientCertificate
+    { _chccHsmClientCertificateIdentifier :: Text
+    , _chccTags                           :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateHsmClientCertificate' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'chccHsmClientCertificateIdentifier' @::@ 'Text'
+--
+-- * 'chccTags' @::@ ['Tag']
+--
+createHsmClientCertificate :: Text -- ^ 'chccHsmClientCertificateIdentifier'
+                           -> CreateHsmClientCertificate
+createHsmClientCertificate p1 = CreateHsmClientCertificate
+    { _chccHsmClientCertificateIdentifier = p1
+    , _chccTags                           = mempty
+    }
+
+-- | The identifier to be assigned to the new HSM client certificate that the
+-- cluster will use to connect to the HSM to use the database encryption
+-- keys.
+chccHsmClientCertificateIdentifier :: Lens' CreateHsmClientCertificate Text
+chccHsmClientCertificateIdentifier =
+    lens _chccHsmClientCertificateIdentifier
+        (\s a -> s { _chccHsmClientCertificateIdentifier = a })
+
+-- | A list of tag instances.
+chccTags :: Lens' CreateHsmClientCertificate [Tag]
+chccTags = lens _chccTags (\s a -> s { _chccTags = a }) . _List
+
+newtype CreateHsmClientCertificateResponse = CreateHsmClientCertificateResponse
+    { _chccrHsmClientCertificate :: Maybe HsmClientCertificate
+    } deriving (Eq, Show)
+
+-- | 'CreateHsmClientCertificateResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'chccrHsmClientCertificate' @::@ 'Maybe' 'HsmClientCertificate'
+--
+createHsmClientCertificateResponse :: CreateHsmClientCertificateResponse
+createHsmClientCertificateResponse = CreateHsmClientCertificateResponse
+    { _chccrHsmClientCertificate = Nothing
+    }
+
+chccrHsmClientCertificate :: Lens' CreateHsmClientCertificateResponse (Maybe HsmClientCertificate)
+chccrHsmClientCertificate =
+    lens _chccrHsmClientCertificate
+        (\s a -> s { _chccrHsmClientCertificate = a })
+
+instance ToPath CreateHsmClientCertificate where
+    toPath = const "/"
+
+instance ToQuery CreateHsmClientCertificate where
+    toQuery CreateHsmClientCertificate{..} = mconcat
+        [ "HsmClientCertificateIdentifier" =? _chccHsmClientCertificateIdentifier
+        , "Tags"                           =? _chccTags
+        ]
+
+instance ToHeaders CreateHsmClientCertificate
+
+instance AWSRequest CreateHsmClientCertificate where
+    type Sv CreateHsmClientCertificate = Redshift
+    type Rs CreateHsmClientCertificate = CreateHsmClientCertificateResponse
+
+    request  = post "CreateHsmClientCertificate"
+    response = xmlResponse
+
+instance FromXML CreateHsmClientCertificateResponse where
+    parseXML = withElement "CreateHsmClientCertificateResult" $ \x -> CreateHsmClientCertificateResponse
+        <$> x .@? "HsmClientCertificate"
diff --git a/gen/Network/AWS/Redshift/CreateHsmConfiguration.hs b/gen/Network/AWS/Redshift/CreateHsmConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateHsmConfiguration.hs
@@ -0,0 +1,188 @@
+{-# 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.Redshift.CreateHsmConfiguration
+-- 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 an HSM configuration that contains the information required by an
+-- Amazon Redshift cluster to store and use database encryption keys in a
+-- Hardware Security Module (HSM). After creating the HSM configuration, you
+-- can specify it as a parameter when creating a cluster. The cluster will
+-- then store its encryption keys in the HSM. In addition to creating an HSM
+-- configuration, you must also create an HSM client certificate. For more
+-- information, go to Hardware Security Modules in the Amazon Redshift Cluster
+-- Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateHsmConfiguration.html>
+module Network.AWS.Redshift.CreateHsmConfiguration
+    (
+    -- * Request
+      CreateHsmConfiguration
+    -- ** Request constructor
+    , createHsmConfiguration
+    -- ** Request lenses
+    , chcDescription
+    , chcHsmConfigurationIdentifier
+    , chcHsmIpAddress
+    , chcHsmPartitionName
+    , chcHsmPartitionPassword
+    , chcHsmServerPublicCertificate
+    , chcTags
+
+    -- * Response
+    , CreateHsmConfigurationResponse
+    -- ** Response constructor
+    , createHsmConfigurationResponse
+    -- ** Response lenses
+    , chcrHsmConfiguration
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateHsmConfiguration = CreateHsmConfiguration
+    { _chcDescription                :: Text
+    , _chcHsmConfigurationIdentifier :: Text
+    , _chcHsmIpAddress               :: Text
+    , _chcHsmPartitionName           :: Text
+    , _chcHsmPartitionPassword       :: Text
+    , _chcHsmServerPublicCertificate :: Text
+    , _chcTags                       :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateHsmConfiguration' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'chcDescription' @::@ 'Text'
+--
+-- * 'chcHsmConfigurationIdentifier' @::@ 'Text'
+--
+-- * 'chcHsmIpAddress' @::@ 'Text'
+--
+-- * 'chcHsmPartitionName' @::@ 'Text'
+--
+-- * 'chcHsmPartitionPassword' @::@ 'Text'
+--
+-- * 'chcHsmServerPublicCertificate' @::@ 'Text'
+--
+-- * 'chcTags' @::@ ['Tag']
+--
+createHsmConfiguration :: Text -- ^ 'chcHsmConfigurationIdentifier'
+                       -> Text -- ^ 'chcDescription'
+                       -> Text -- ^ 'chcHsmIpAddress'
+                       -> Text -- ^ 'chcHsmPartitionName'
+                       -> Text -- ^ 'chcHsmPartitionPassword'
+                       -> Text -- ^ 'chcHsmServerPublicCertificate'
+                       -> CreateHsmConfiguration
+createHsmConfiguration p1 p2 p3 p4 p5 p6 = CreateHsmConfiguration
+    { _chcHsmConfigurationIdentifier = p1
+    , _chcDescription                = p2
+    , _chcHsmIpAddress               = p3
+    , _chcHsmPartitionName           = p4
+    , _chcHsmPartitionPassword       = p5
+    , _chcHsmServerPublicCertificate = p6
+    , _chcTags                       = mempty
+    }
+
+-- | A text description of the HSM configuration to be created.
+chcDescription :: Lens' CreateHsmConfiguration Text
+chcDescription = lens _chcDescription (\s a -> s { _chcDescription = a })
+
+-- | The identifier to be assigned to the new Amazon Redshift HSM
+-- configuration.
+chcHsmConfigurationIdentifier :: Lens' CreateHsmConfiguration Text
+chcHsmConfigurationIdentifier =
+    lens _chcHsmConfigurationIdentifier
+        (\s a -> s { _chcHsmConfigurationIdentifier = a })
+
+-- | The IP address that the Amazon Redshift cluster must use to access the
+-- HSM.
+chcHsmIpAddress :: Lens' CreateHsmConfiguration Text
+chcHsmIpAddress = lens _chcHsmIpAddress (\s a -> s { _chcHsmIpAddress = a })
+
+-- | The name of the partition in the HSM where the Amazon Redshift clusters
+-- will store their database encryption keys.
+chcHsmPartitionName :: Lens' CreateHsmConfiguration Text
+chcHsmPartitionName =
+    lens _chcHsmPartitionName (\s a -> s { _chcHsmPartitionName = a })
+
+-- | The password required to access the HSM partition.
+chcHsmPartitionPassword :: Lens' CreateHsmConfiguration Text
+chcHsmPartitionPassword =
+    lens _chcHsmPartitionPassword (\s a -> s { _chcHsmPartitionPassword = a })
+
+-- | The HSMs public certificate file. When using Cloud HSM, the file name is
+-- server.pem.
+chcHsmServerPublicCertificate :: Lens' CreateHsmConfiguration Text
+chcHsmServerPublicCertificate =
+    lens _chcHsmServerPublicCertificate
+        (\s a -> s { _chcHsmServerPublicCertificate = a })
+
+-- | A list of tag instances.
+chcTags :: Lens' CreateHsmConfiguration [Tag]
+chcTags = lens _chcTags (\s a -> s { _chcTags = a }) . _List
+
+newtype CreateHsmConfigurationResponse = CreateHsmConfigurationResponse
+    { _chcrHsmConfiguration :: Maybe HsmConfiguration
+    } deriving (Eq, Show)
+
+-- | 'CreateHsmConfigurationResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'chcrHsmConfiguration' @::@ 'Maybe' 'HsmConfiguration'
+--
+createHsmConfigurationResponse :: CreateHsmConfigurationResponse
+createHsmConfigurationResponse = CreateHsmConfigurationResponse
+    { _chcrHsmConfiguration = Nothing
+    }
+
+chcrHsmConfiguration :: Lens' CreateHsmConfigurationResponse (Maybe HsmConfiguration)
+chcrHsmConfiguration =
+    lens _chcrHsmConfiguration (\s a -> s { _chcrHsmConfiguration = a })
+
+instance ToPath CreateHsmConfiguration where
+    toPath = const "/"
+
+instance ToQuery CreateHsmConfiguration where
+    toQuery CreateHsmConfiguration{..} = mconcat
+        [ "Description"                =? _chcDescription
+        , "HsmConfigurationIdentifier" =? _chcHsmConfigurationIdentifier
+        , "HsmIpAddress"               =? _chcHsmIpAddress
+        , "HsmPartitionName"           =? _chcHsmPartitionName
+        , "HsmPartitionPassword"       =? _chcHsmPartitionPassword
+        , "HsmServerPublicCertificate" =? _chcHsmServerPublicCertificate
+        , "Tags"                       =? _chcTags
+        ]
+
+instance ToHeaders CreateHsmConfiguration
+
+instance AWSRequest CreateHsmConfiguration where
+    type Sv CreateHsmConfiguration = Redshift
+    type Rs CreateHsmConfiguration = CreateHsmConfigurationResponse
+
+    request  = post "CreateHsmConfiguration"
+    response = xmlResponse
+
+instance FromXML CreateHsmConfigurationResponse where
+    parseXML = withElement "CreateHsmConfigurationResult" $ \x -> CreateHsmConfigurationResponse
+        <$> x .@? "HsmConfiguration"
diff --git a/gen/Network/AWS/Redshift/CreateTags.hs b/gen/Network/AWS/Redshift/CreateTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/CreateTags.hs
@@ -0,0 +1,110 @@
+{-# 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.Redshift.CreateTags
+-- 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)
+
+-- | Adds one or more tags to a specified resource. A resource can have up to 10
+-- tags. If you try to create more than 10 tags for a resource, you will
+-- receive an error and the attempt will fail. If you specify a key that
+-- already exists for the resource, the value for that key will be updated
+-- with the new value.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateTags.html>
+module Network.AWS.Redshift.CreateTags
+    (
+    -- * Request
+      CreateTags
+    -- ** Request constructor
+    , createTags
+    -- ** Request lenses
+    , ctResourceName
+    , ctTags
+
+    -- * Response
+    , CreateTagsResponse
+    -- ** Response constructor
+    , createTagsResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data CreateTags = CreateTags
+    { _ctResourceName :: Text
+    , _ctTags         :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'CreateTags' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ctResourceName' @::@ 'Text'
+--
+-- * 'ctTags' @::@ ['Tag']
+--
+createTags :: Text -- ^ 'ctResourceName'
+           -> CreateTags
+createTags p1 = CreateTags
+    { _ctResourceName = p1
+    , _ctTags         = mempty
+    }
+
+-- | The Amazon Resource Name (ARN) to which you want to add the tag or tags.
+-- For example, arn:aws:redshift:us-east-1:123456789:cluster:t1.
+ctResourceName :: Lens' CreateTags Text
+ctResourceName = lens _ctResourceName (\s a -> s { _ctResourceName = a })
+
+-- | One or more name/value pairs to add as tags to the specified resource.
+-- Each tag name is passed in with the parameter tag-key and the
+-- corresponding value is passed in with the parameter tag-value. The
+-- tag-key and tag-value parameters are separated by a colon (:). Separate
+-- multiple tags with a space. For example, --tags
+-- "tag-key"="owner":"tag-value"="admin"
+-- "tag-key"="environment":"tag-value"="test"
+-- "tag-key"="version":"tag-value"="1.0".
+ctTags :: Lens' CreateTags [Tag]
+ctTags = lens _ctTags (\s a -> s { _ctTags = a }) . _List
+
+data CreateTagsResponse = CreateTagsResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'CreateTagsResponse' constructor.
+createTagsResponse :: CreateTagsResponse
+createTagsResponse = CreateTagsResponse
+
+instance ToPath CreateTags where
+    toPath = const "/"
+
+instance ToQuery CreateTags where
+    toQuery CreateTags{..} = mconcat
+        [ "ResourceName" =? _ctResourceName
+        , "Tags"         =? _ctTags
+        ]
+
+instance ToHeaders CreateTags
+
+instance AWSRequest CreateTags where
+    type Sv CreateTags = Redshift
+    type Rs CreateTags = CreateTagsResponse
+
+    request  = post "CreateTags"
+    response = nullResponse CreateTagsResponse
diff --git a/gen/Network/AWS/Redshift/DeleteCluster.hs b/gen/Network/AWS/Redshift/DeleteCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteCluster.hs
@@ -0,0 +1,154 @@
+{-# 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.Redshift.DeleteCluster
+-- 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 a previously provisioned cluster. A successful response from the
+-- web service indicates that the request was received correctly. Use
+-- DescribeClusters to monitor the status of the deletion. The delete
+-- operation cannot be canceled or reverted once submitted. For more
+-- information about managing clusters, go to Amazon Redshift Clusters in the
+-- Amazon Redshift Cluster Management Guide . If you want to shut down the
+-- cluster and retain it for future use, set SkipFinalClusterSnapshot to false
+-- and specify a name for FinalClusterSnapshotIdentifier. You can later
+-- restore this snapshot to resume using the cluster. If a final cluster
+-- snapshot is requested, the status of the cluster will be "final-snapshot"
+-- while the snapshot is being taken, then it's "deleting" once Amazon
+-- Redshift begins deleting the cluster. For more information about managing
+-- clusters, go to Amazon Redshift Clusters in the Amazon Redshift Cluster
+-- Management Guide .
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteCluster.html>
+module Network.AWS.Redshift.DeleteCluster
+    (
+    -- * Request
+      DeleteCluster
+    -- ** Request constructor
+    , deleteCluster
+    -- ** Request lenses
+    , dc1ClusterIdentifier
+    , dc1FinalClusterSnapshotIdentifier
+    , dc1SkipFinalClusterSnapshot
+
+    -- * Response
+    , DeleteClusterResponse
+    -- ** Response constructor
+    , deleteClusterResponse
+    -- ** Response lenses
+    , dcrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DeleteCluster = DeleteCluster
+    { _dc1ClusterIdentifier              :: Text
+    , _dc1FinalClusterSnapshotIdentifier :: Maybe Text
+    , _dc1SkipFinalClusterSnapshot       :: Maybe Bool
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dc1ClusterIdentifier' @::@ 'Text'
+--
+-- * 'dc1FinalClusterSnapshotIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dc1SkipFinalClusterSnapshot' @::@ 'Maybe' 'Bool'
+--
+deleteCluster :: Text -- ^ 'dc1ClusterIdentifier'
+              -> DeleteCluster
+deleteCluster p1 = DeleteCluster
+    { _dc1ClusterIdentifier              = p1
+    , _dc1SkipFinalClusterSnapshot       = Nothing
+    , _dc1FinalClusterSnapshotIdentifier = Nothing
+    }
+
+-- | The identifier of the cluster to be deleted. Constraints: Must contain
+-- lowercase characters. Must contain from 1 to 63 alphanumeric characters
+-- or hyphens. First character must be a letter. Cannot end with a hyphen or
+-- contain two consecutive hyphens.
+dc1ClusterIdentifier :: Lens' DeleteCluster Text
+dc1ClusterIdentifier =
+    lens _dc1ClusterIdentifier (\s a -> s { _dc1ClusterIdentifier = a })
+
+-- | The identifier of the final snapshot that is to be created immediately
+-- before deleting the cluster. If this parameter is provided,
+-- SkipFinalClusterSnapshot must be false. Constraints: Must be 1 to 255
+-- alphanumeric characters. First character must be a letter. Cannot end
+-- with a hyphen or contain two consecutive hyphens.
+dc1FinalClusterSnapshotIdentifier :: Lens' DeleteCluster (Maybe Text)
+dc1FinalClusterSnapshotIdentifier =
+    lens _dc1FinalClusterSnapshotIdentifier
+        (\s a -> s { _dc1FinalClusterSnapshotIdentifier = a })
+
+-- | Determines whether a final snapshot of the cluster is created before
+-- Amazon Redshift deletes the cluster. If true, a final cluster snapshot is
+-- not created. If false, a final cluster snapshot is created before the
+-- cluster is deleted. The FinalClusterSnapshotIdentifier parameter must be
+-- specified if SkipFinalClusterSnapshot is false. Default: false.
+dc1SkipFinalClusterSnapshot :: Lens' DeleteCluster (Maybe Bool)
+dc1SkipFinalClusterSnapshot =
+    lens _dc1SkipFinalClusterSnapshot
+        (\s a -> s { _dc1SkipFinalClusterSnapshot = a })
+
+newtype DeleteClusterResponse = DeleteClusterResponse
+    { _dcrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'DeleteClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcrCluster' @::@ 'Maybe' 'Cluster'
+--
+deleteClusterResponse :: DeleteClusterResponse
+deleteClusterResponse = DeleteClusterResponse
+    { _dcrCluster = Nothing
+    }
+
+dcrCluster :: Lens' DeleteClusterResponse (Maybe Cluster)
+dcrCluster = lens _dcrCluster (\s a -> s { _dcrCluster = a })
+
+instance ToPath DeleteCluster where
+    toPath = const "/"
+
+instance ToQuery DeleteCluster where
+    toQuery DeleteCluster{..} = mconcat
+        [ "ClusterIdentifier"              =? _dc1ClusterIdentifier
+        , "FinalClusterSnapshotIdentifier" =? _dc1FinalClusterSnapshotIdentifier
+        , "SkipFinalClusterSnapshot"       =? _dc1SkipFinalClusterSnapshot
+        ]
+
+instance ToHeaders DeleteCluster
+
+instance AWSRequest DeleteCluster where
+    type Sv DeleteCluster = Redshift
+    type Rs DeleteCluster = DeleteClusterResponse
+
+    request  = post "DeleteCluster"
+    response = xmlResponse
+
+instance FromXML DeleteClusterResponse where
+    parseXML = withElement "DeleteClusterResult" $ \x -> DeleteClusterResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/DeleteClusterParameterGroup.hs b/gen/Network/AWS/Redshift/DeleteClusterParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteClusterParameterGroup.hs
@@ -0,0 +1,92 @@
+{-# 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.Redshift.DeleteClusterParameterGroup
+-- 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 a specified Amazon Redshift parameter group. You cannot delete a
+-- parameter group if it is associated with a cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteClusterParameterGroup.html>
+module Network.AWS.Redshift.DeleteClusterParameterGroup
+    (
+    -- * Request
+      DeleteClusterParameterGroup
+    -- ** Request constructor
+    , deleteClusterParameterGroup
+    -- ** Request lenses
+    , dcpg1ParameterGroupName
+
+    -- * Response
+    , DeleteClusterParameterGroupResponse
+    -- ** Response constructor
+    , deleteClusterParameterGroupResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteClusterParameterGroup = DeleteClusterParameterGroup
+    { _dcpg1ParameterGroupName :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteClusterParameterGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcpg1ParameterGroupName' @::@ 'Text'
+--
+deleteClusterParameterGroup :: Text -- ^ 'dcpg1ParameterGroupName'
+                            -> DeleteClusterParameterGroup
+deleteClusterParameterGroup p1 = DeleteClusterParameterGroup
+    { _dcpg1ParameterGroupName = p1
+    }
+
+-- | The name of the parameter group to be deleted. Constraints: Must be the
+-- name of an existing cluster parameter group. Cannot delete a default
+-- cluster parameter group.
+dcpg1ParameterGroupName :: Lens' DeleteClusterParameterGroup Text
+dcpg1ParameterGroupName =
+    lens _dcpg1ParameterGroupName (\s a -> s { _dcpg1ParameterGroupName = a })
+
+data DeleteClusterParameterGroupResponse = DeleteClusterParameterGroupResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteClusterParameterGroupResponse' constructor.
+deleteClusterParameterGroupResponse :: DeleteClusterParameterGroupResponse
+deleteClusterParameterGroupResponse = DeleteClusterParameterGroupResponse
+
+instance ToPath DeleteClusterParameterGroup where
+    toPath = const "/"
+
+instance ToQuery DeleteClusterParameterGroup where
+    toQuery DeleteClusterParameterGroup{..} = mconcat
+        [ "ParameterGroupName" =? _dcpg1ParameterGroupName
+        ]
+
+instance ToHeaders DeleteClusterParameterGroup
+
+instance AWSRequest DeleteClusterParameterGroup where
+    type Sv DeleteClusterParameterGroup = Redshift
+    type Rs DeleteClusterParameterGroup = DeleteClusterParameterGroupResponse
+
+    request  = post "DeleteClusterParameterGroup"
+    response = nullResponse DeleteClusterParameterGroupResponse
diff --git a/gen/Network/AWS/Redshift/DeleteClusterSecurityGroup.hs b/gen/Network/AWS/Redshift/DeleteClusterSecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteClusterSecurityGroup.hs
@@ -0,0 +1,94 @@
+{-# 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.Redshift.DeleteClusterSecurityGroup
+-- 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 an Amazon Redshift security group. You cannot delete a security
+-- group that is associated with any clusters. You cannot delete the default
+-- security group. For information about managing security groups, go to
+-- Amazon Redshift Cluster Security Groups in the Amazon Redshift Cluster
+-- Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteClusterSecurityGroup.html>
+module Network.AWS.Redshift.DeleteClusterSecurityGroup
+    (
+    -- * Request
+      DeleteClusterSecurityGroup
+    -- ** Request constructor
+    , deleteClusterSecurityGroup
+    -- ** Request lenses
+    , dcsg1ClusterSecurityGroupName
+
+    -- * Response
+    , DeleteClusterSecurityGroupResponse
+    -- ** Response constructor
+    , deleteClusterSecurityGroupResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteClusterSecurityGroup = DeleteClusterSecurityGroup
+    { _dcsg1ClusterSecurityGroupName :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteClusterSecurityGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsg1ClusterSecurityGroupName' @::@ 'Text'
+--
+deleteClusterSecurityGroup :: Text -- ^ 'dcsg1ClusterSecurityGroupName'
+                           -> DeleteClusterSecurityGroup
+deleteClusterSecurityGroup p1 = DeleteClusterSecurityGroup
+    { _dcsg1ClusterSecurityGroupName = p1
+    }
+
+-- | The name of the cluster security group to be deleted.
+dcsg1ClusterSecurityGroupName :: Lens' DeleteClusterSecurityGroup Text
+dcsg1ClusterSecurityGroupName =
+    lens _dcsg1ClusterSecurityGroupName
+        (\s a -> s { _dcsg1ClusterSecurityGroupName = a })
+
+data DeleteClusterSecurityGroupResponse = DeleteClusterSecurityGroupResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteClusterSecurityGroupResponse' constructor.
+deleteClusterSecurityGroupResponse :: DeleteClusterSecurityGroupResponse
+deleteClusterSecurityGroupResponse = DeleteClusterSecurityGroupResponse
+
+instance ToPath DeleteClusterSecurityGroup where
+    toPath = const "/"
+
+instance ToQuery DeleteClusterSecurityGroup where
+    toQuery DeleteClusterSecurityGroup{..} = mconcat
+        [ "ClusterSecurityGroupName" =? _dcsg1ClusterSecurityGroupName
+        ]
+
+instance ToHeaders DeleteClusterSecurityGroup
+
+instance AWSRequest DeleteClusterSecurityGroup where
+    type Sv DeleteClusterSecurityGroup = Redshift
+    type Rs DeleteClusterSecurityGroup = DeleteClusterSecurityGroupResponse
+
+    request  = post "DeleteClusterSecurityGroup"
+    response = nullResponse DeleteClusterSecurityGroupResponse
diff --git a/gen/Network/AWS/Redshift/DeleteClusterSnapshot.hs b/gen/Network/AWS/Redshift/DeleteClusterSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteClusterSnapshot.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.Redshift.DeleteClusterSnapshot
+-- 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 manual snapshot. The snapshot must be in the
+-- available state, with no other users authorized to access the snapshot.
+-- Unlike automated snapshots, manual snapshots are retained even after you
+-- delete your cluster. Amazon Redshift does not delete your manual snapshots.
+-- You must delete manual snapshot explicitly to avoid getting charged. If
+-- other accounts are authorized to access the snapshot, you must revoke all
+-- of the authorizations before you can delete the snapshot.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteClusterSnapshot.html>
+module Network.AWS.Redshift.DeleteClusterSnapshot
+    (
+    -- * Request
+      DeleteClusterSnapshot
+    -- ** Request constructor
+    , deleteClusterSnapshot
+    -- ** Request lenses
+    , dcsSnapshotClusterIdentifier
+    , dcsSnapshotIdentifier
+
+    -- * Response
+    , DeleteClusterSnapshotResponse
+    -- ** Response constructor
+    , deleteClusterSnapshotResponse
+    -- ** Response lenses
+    , dcsrSnapshot
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DeleteClusterSnapshot = DeleteClusterSnapshot
+    { _dcsSnapshotClusterIdentifier :: Maybe Text
+    , _dcsSnapshotIdentifier        :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteClusterSnapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsSnapshotClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsSnapshotIdentifier' @::@ 'Text'
+--
+deleteClusterSnapshot :: Text -- ^ 'dcsSnapshotIdentifier'
+                      -> DeleteClusterSnapshot
+deleteClusterSnapshot p1 = DeleteClusterSnapshot
+    { _dcsSnapshotIdentifier        = p1
+    , _dcsSnapshotClusterIdentifier = Nothing
+    }
+
+-- | The unique identifier of the cluster the snapshot was created from. This
+-- parameter is required if your IAM user has a policy containing a snapshot
+-- resource element that specifies anything other than * for the cluster
+-- name. Constraints: Must be the name of valid cluster.
+dcsSnapshotClusterIdentifier :: Lens' DeleteClusterSnapshot (Maybe Text)
+dcsSnapshotClusterIdentifier =
+    lens _dcsSnapshotClusterIdentifier
+        (\s a -> s { _dcsSnapshotClusterIdentifier = a })
+
+-- | The unique identifier of the manual snapshot to be deleted. Constraints:
+-- Must be the name of an existing snapshot that is in the available state.
+dcsSnapshotIdentifier :: Lens' DeleteClusterSnapshot Text
+dcsSnapshotIdentifier =
+    lens _dcsSnapshotIdentifier (\s a -> s { _dcsSnapshotIdentifier = a })
+
+newtype DeleteClusterSnapshotResponse = DeleteClusterSnapshotResponse
+    { _dcsrSnapshot :: Maybe Snapshot
+    } deriving (Eq, Show)
+
+-- | 'DeleteClusterSnapshotResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsrSnapshot' @::@ 'Maybe' 'Snapshot'
+--
+deleteClusterSnapshotResponse :: DeleteClusterSnapshotResponse
+deleteClusterSnapshotResponse = DeleteClusterSnapshotResponse
+    { _dcsrSnapshot = Nothing
+    }
+
+dcsrSnapshot :: Lens' DeleteClusterSnapshotResponse (Maybe Snapshot)
+dcsrSnapshot = lens _dcsrSnapshot (\s a -> s { _dcsrSnapshot = a })
+
+instance ToPath DeleteClusterSnapshot where
+    toPath = const "/"
+
+instance ToQuery DeleteClusterSnapshot where
+    toQuery DeleteClusterSnapshot{..} = mconcat
+        [ "SnapshotClusterIdentifier" =? _dcsSnapshotClusterIdentifier
+        , "SnapshotIdentifier"        =? _dcsSnapshotIdentifier
+        ]
+
+instance ToHeaders DeleteClusterSnapshot
+
+instance AWSRequest DeleteClusterSnapshot where
+    type Sv DeleteClusterSnapshot = Redshift
+    type Rs DeleteClusterSnapshot = DeleteClusterSnapshotResponse
+
+    request  = post "DeleteClusterSnapshot"
+    response = xmlResponse
+
+instance FromXML DeleteClusterSnapshotResponse where
+    parseXML = withElement "DeleteClusterSnapshotResult" $ \x -> DeleteClusterSnapshotResponse
+        <$> x .@? "Snapshot"
diff --git a/gen/Network/AWS/Redshift/DeleteClusterSubnetGroup.hs b/gen/Network/AWS/Redshift/DeleteClusterSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteClusterSubnetGroup.hs
@@ -0,0 +1,90 @@
+{-# 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.Redshift.DeleteClusterSubnetGroup
+-- 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 cluster subnet group.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteClusterSubnetGroup.html>
+module Network.AWS.Redshift.DeleteClusterSubnetGroup
+    (
+    -- * Request
+      DeleteClusterSubnetGroup
+    -- ** Request constructor
+    , deleteClusterSubnetGroup
+    -- ** Request lenses
+    , dcsgClusterSubnetGroupName
+
+    -- * Response
+    , DeleteClusterSubnetGroupResponse
+    -- ** Response constructor
+    , deleteClusterSubnetGroupResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteClusterSubnetGroup = DeleteClusterSubnetGroup
+    { _dcsgClusterSubnetGroupName :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteClusterSubnetGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsgClusterSubnetGroupName' @::@ 'Text'
+--
+deleteClusterSubnetGroup :: Text -- ^ 'dcsgClusterSubnetGroupName'
+                         -> DeleteClusterSubnetGroup
+deleteClusterSubnetGroup p1 = DeleteClusterSubnetGroup
+    { _dcsgClusterSubnetGroupName = p1
+    }
+
+-- | The name of the cluster subnet group name to be deleted.
+dcsgClusterSubnetGroupName :: Lens' DeleteClusterSubnetGroup Text
+dcsgClusterSubnetGroupName =
+    lens _dcsgClusterSubnetGroupName
+        (\s a -> s { _dcsgClusterSubnetGroupName = a })
+
+data DeleteClusterSubnetGroupResponse = DeleteClusterSubnetGroupResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteClusterSubnetGroupResponse' constructor.
+deleteClusterSubnetGroupResponse :: DeleteClusterSubnetGroupResponse
+deleteClusterSubnetGroupResponse = DeleteClusterSubnetGroupResponse
+
+instance ToPath DeleteClusterSubnetGroup where
+    toPath = const "/"
+
+instance ToQuery DeleteClusterSubnetGroup where
+    toQuery DeleteClusterSubnetGroup{..} = mconcat
+        [ "ClusterSubnetGroupName" =? _dcsgClusterSubnetGroupName
+        ]
+
+instance ToHeaders DeleteClusterSubnetGroup
+
+instance AWSRequest DeleteClusterSubnetGroup where
+    type Sv DeleteClusterSubnetGroup = Redshift
+    type Rs DeleteClusterSubnetGroup = DeleteClusterSubnetGroupResponse
+
+    request  = post "DeleteClusterSubnetGroup"
+    response = nullResponse DeleteClusterSubnetGroupResponse
diff --git a/gen/Network/AWS/Redshift/DeleteEventSubscription.hs b/gen/Network/AWS/Redshift/DeleteEventSubscription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteEventSubscription.hs
@@ -0,0 +1,90 @@
+{-# 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.Redshift.DeleteEventSubscription
+-- 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 an Amazon Redshift event notification subscription.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteEventSubscription.html>
+module Network.AWS.Redshift.DeleteEventSubscription
+    (
+    -- * Request
+      DeleteEventSubscription
+    -- ** Request constructor
+    , deleteEventSubscription
+    -- ** Request lenses
+    , desSubscriptionName
+
+    -- * Response
+    , DeleteEventSubscriptionResponse
+    -- ** Response constructor
+    , deleteEventSubscriptionResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteEventSubscription = DeleteEventSubscription
+    { _desSubscriptionName :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteEventSubscription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'desSubscriptionName' @::@ 'Text'
+--
+deleteEventSubscription :: Text -- ^ 'desSubscriptionName'
+                        -> DeleteEventSubscription
+deleteEventSubscription p1 = DeleteEventSubscription
+    { _desSubscriptionName = p1
+    }
+
+-- | The name of the Amazon Redshift event notification subscription to be
+-- deleted.
+desSubscriptionName :: Lens' DeleteEventSubscription Text
+desSubscriptionName =
+    lens _desSubscriptionName (\s a -> s { _desSubscriptionName = a })
+
+data DeleteEventSubscriptionResponse = DeleteEventSubscriptionResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteEventSubscriptionResponse' constructor.
+deleteEventSubscriptionResponse :: DeleteEventSubscriptionResponse
+deleteEventSubscriptionResponse = DeleteEventSubscriptionResponse
+
+instance ToPath DeleteEventSubscription where
+    toPath = const "/"
+
+instance ToQuery DeleteEventSubscription where
+    toQuery DeleteEventSubscription{..} = mconcat
+        [ "SubscriptionName" =? _desSubscriptionName
+        ]
+
+instance ToHeaders DeleteEventSubscription
+
+instance AWSRequest DeleteEventSubscription where
+    type Sv DeleteEventSubscription = Redshift
+    type Rs DeleteEventSubscription = DeleteEventSubscriptionResponse
+
+    request  = post "DeleteEventSubscription"
+    response = nullResponse DeleteEventSubscriptionResponse
diff --git a/gen/Network/AWS/Redshift/DeleteHsmClientCertificate.hs b/gen/Network/AWS/Redshift/DeleteHsmClientCertificate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteHsmClientCertificate.hs
@@ -0,0 +1,90 @@
+{-# 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.Redshift.DeleteHsmClientCertificate
+-- 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 HSM client certificate.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteHsmClientCertificate.html>
+module Network.AWS.Redshift.DeleteHsmClientCertificate
+    (
+    -- * Request
+      DeleteHsmClientCertificate
+    -- ** Request constructor
+    , deleteHsmClientCertificate
+    -- ** Request lenses
+    , dhcc1HsmClientCertificateIdentifier
+
+    -- * Response
+    , DeleteHsmClientCertificateResponse
+    -- ** Response constructor
+    , deleteHsmClientCertificateResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteHsmClientCertificate = DeleteHsmClientCertificate
+    { _dhcc1HsmClientCertificateIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteHsmClientCertificate' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhcc1HsmClientCertificateIdentifier' @::@ 'Text'
+--
+deleteHsmClientCertificate :: Text -- ^ 'dhcc1HsmClientCertificateIdentifier'
+                           -> DeleteHsmClientCertificate
+deleteHsmClientCertificate p1 = DeleteHsmClientCertificate
+    { _dhcc1HsmClientCertificateIdentifier = p1
+    }
+
+-- | The identifier of the HSM client certificate to be deleted.
+dhcc1HsmClientCertificateIdentifier :: Lens' DeleteHsmClientCertificate Text
+dhcc1HsmClientCertificateIdentifier =
+    lens _dhcc1HsmClientCertificateIdentifier
+        (\s a -> s { _dhcc1HsmClientCertificateIdentifier = a })
+
+data DeleteHsmClientCertificateResponse = DeleteHsmClientCertificateResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteHsmClientCertificateResponse' constructor.
+deleteHsmClientCertificateResponse :: DeleteHsmClientCertificateResponse
+deleteHsmClientCertificateResponse = DeleteHsmClientCertificateResponse
+
+instance ToPath DeleteHsmClientCertificate where
+    toPath = const "/"
+
+instance ToQuery DeleteHsmClientCertificate where
+    toQuery DeleteHsmClientCertificate{..} = mconcat
+        [ "HsmClientCertificateIdentifier" =? _dhcc1HsmClientCertificateIdentifier
+        ]
+
+instance ToHeaders DeleteHsmClientCertificate
+
+instance AWSRequest DeleteHsmClientCertificate where
+    type Sv DeleteHsmClientCertificate = Redshift
+    type Rs DeleteHsmClientCertificate = DeleteHsmClientCertificateResponse
+
+    request  = post "DeleteHsmClientCertificate"
+    response = nullResponse DeleteHsmClientCertificateResponse
diff --git a/gen/Network/AWS/Redshift/DeleteHsmConfiguration.hs b/gen/Network/AWS/Redshift/DeleteHsmConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteHsmConfiguration.hs
@@ -0,0 +1,90 @@
+{-# 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.Redshift.DeleteHsmConfiguration
+-- 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 Amazon Redshift HSM configuration.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteHsmConfiguration.html>
+module Network.AWS.Redshift.DeleteHsmConfiguration
+    (
+    -- * Request
+      DeleteHsmConfiguration
+    -- ** Request constructor
+    , deleteHsmConfiguration
+    -- ** Request lenses
+    , dhcHsmConfigurationIdentifier
+
+    -- * Response
+    , DeleteHsmConfigurationResponse
+    -- ** Response constructor
+    , deleteHsmConfigurationResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DeleteHsmConfiguration = DeleteHsmConfiguration
+    { _dhcHsmConfigurationIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DeleteHsmConfiguration' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhcHsmConfigurationIdentifier' @::@ 'Text'
+--
+deleteHsmConfiguration :: Text -- ^ 'dhcHsmConfigurationIdentifier'
+                       -> DeleteHsmConfiguration
+deleteHsmConfiguration p1 = DeleteHsmConfiguration
+    { _dhcHsmConfigurationIdentifier = p1
+    }
+
+-- | The identifier of the Amazon Redshift HSM configuration to be deleted.
+dhcHsmConfigurationIdentifier :: Lens' DeleteHsmConfiguration Text
+dhcHsmConfigurationIdentifier =
+    lens _dhcHsmConfigurationIdentifier
+        (\s a -> s { _dhcHsmConfigurationIdentifier = a })
+
+data DeleteHsmConfigurationResponse = DeleteHsmConfigurationResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteHsmConfigurationResponse' constructor.
+deleteHsmConfigurationResponse :: DeleteHsmConfigurationResponse
+deleteHsmConfigurationResponse = DeleteHsmConfigurationResponse
+
+instance ToPath DeleteHsmConfiguration where
+    toPath = const "/"
+
+instance ToQuery DeleteHsmConfiguration where
+    toQuery DeleteHsmConfiguration{..} = mconcat
+        [ "HsmConfigurationIdentifier" =? _dhcHsmConfigurationIdentifier
+        ]
+
+instance ToHeaders DeleteHsmConfiguration
+
+instance AWSRequest DeleteHsmConfiguration where
+    type Sv DeleteHsmConfiguration = Redshift
+    type Rs DeleteHsmConfiguration = DeleteHsmConfigurationResponse
+
+    request  = post "DeleteHsmConfiguration"
+    response = nullResponse DeleteHsmConfigurationResponse
diff --git a/gen/Network/AWS/Redshift/DeleteTags.hs b/gen/Network/AWS/Redshift/DeleteTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DeleteTags.hs
@@ -0,0 +1,100 @@
+{-# 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.Redshift.DeleteTags
+-- 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 a tag or tags from a resource. You must provide the ARN of the
+-- resource from which you want to delete the tag or tags.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DeleteTags.html>
+module Network.AWS.Redshift.DeleteTags
+    (
+    -- * Request
+      DeleteTags
+    -- ** Request constructor
+    , deleteTags
+    -- ** Request lenses
+    , dt1ResourceName
+    , dt1TagKeys
+
+    -- * Response
+    , DeleteTagsResponse
+    -- ** Response constructor
+    , deleteTagsResponse
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DeleteTags = DeleteTags
+    { _dt1ResourceName :: Text
+    , _dt1TagKeys      :: List "TagKey" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DeleteTags' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dt1ResourceName' @::@ 'Text'
+--
+-- * 'dt1TagKeys' @::@ ['Text']
+--
+deleteTags :: Text -- ^ 'dt1ResourceName'
+           -> DeleteTags
+deleteTags p1 = DeleteTags
+    { _dt1ResourceName = p1
+    , _dt1TagKeys      = mempty
+    }
+
+-- | The Amazon Resource Name (ARN) from which you want to remove the tag or
+-- tags. For example, arn:aws:redshift:us-east-1:123456789:cluster:t1.
+dt1ResourceName :: Lens' DeleteTags Text
+dt1ResourceName = lens _dt1ResourceName (\s a -> s { _dt1ResourceName = a })
+
+-- | The tag key that you want to delete.
+dt1TagKeys :: Lens' DeleteTags [Text]
+dt1TagKeys = lens _dt1TagKeys (\s a -> s { _dt1TagKeys = a }) . _List
+
+data DeleteTagsResponse = DeleteTagsResponse
+    deriving (Eq, Ord, Show, Generic)
+
+-- | 'DeleteTagsResponse' constructor.
+deleteTagsResponse :: DeleteTagsResponse
+deleteTagsResponse = DeleteTagsResponse
+
+instance ToPath DeleteTags where
+    toPath = const "/"
+
+instance ToQuery DeleteTags where
+    toQuery DeleteTags{..} = mconcat
+        [ "ResourceName" =? _dt1ResourceName
+        , "TagKeys"      =? _dt1TagKeys
+        ]
+
+instance ToHeaders DeleteTags
+
+instance AWSRequest DeleteTags where
+    type Sv DeleteTags = Redshift
+    type Rs DeleteTags = DeleteTagsResponse
+
+    request  = post "DeleteTags"
+    response = nullResponse DeleteTagsResponse
diff --git a/gen/Network/AWS/Redshift/DescribeClusterParameterGroups.hs b/gen/Network/AWS/Redshift/DescribeClusterParameterGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterParameterGroups.hs
@@ -0,0 +1,205 @@
+{-# 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.Redshift.DescribeClusterParameterGroups
+-- 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 Amazon Redshift parameter groups, including parameter
+-- groups you created and the default parameter group. For each parameter
+-- group, the response includes the parameter group name, description, and
+-- parameter group family name. You can optionally specify a name to retrieve
+-- the description of a specific parameter group. For more information about
+-- managing parameter groups, go to Amazon Redshift Parameter Groups in the
+-- Amazon Redshift Cluster Management Guide. If you specify both tag keys and
+-- tag values in the same request, Amazon Redshift returns all parameter
+-- groups that match any combination of the specified keys and values. For
+-- example, if you have owner and environment for tag keys, and admin and test
+-- for tag values, all parameter groups that have any combination of those
+-- values are returned. If both tag keys and values are omitted from the
+-- request, parameter groups are returned regardless of whether they have tag
+-- keys or values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterParameterGroups.html>
+module Network.AWS.Redshift.DescribeClusterParameterGroups
+    (
+    -- * Request
+      DescribeClusterParameterGroups
+    -- ** Request constructor
+    , describeClusterParameterGroups
+    -- ** Request lenses
+    , dcpgMarker
+    , dcpgMaxRecords
+    , dcpgParameterGroupName
+    , dcpgTagKeys
+    , dcpgTagValues
+
+    -- * Response
+    , DescribeClusterParameterGroupsResponse
+    -- ** Response constructor
+    , describeClusterParameterGroupsResponse
+    -- ** Response lenses
+    , dcpgrMarker
+    , dcpgrParameterGroups
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterParameterGroups = DescribeClusterParameterGroups
+    { _dcpgMarker             :: Maybe Text
+    , _dcpgMaxRecords         :: Maybe Int
+    , _dcpgParameterGroupName :: Maybe Text
+    , _dcpgTagKeys            :: List "TagKey" Text
+    , _dcpgTagValues          :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterParameterGroups' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcpgMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcpgMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcpgParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'dcpgTagKeys' @::@ ['Text']
+--
+-- * 'dcpgTagValues' @::@ ['Text']
+--
+describeClusterParameterGroups :: DescribeClusterParameterGroups
+describeClusterParameterGroups = DescribeClusterParameterGroups
+    { _dcpgParameterGroupName = Nothing
+    , _dcpgMaxRecords         = Nothing
+    , _dcpgMarker             = Nothing
+    , _dcpgTagKeys            = mempty
+    , _dcpgTagValues          = mempty
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterParameterGroups
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dcpgMarker :: Lens' DescribeClusterParameterGroups (Maybe Text)
+dcpgMarker = lens _dcpgMarker (\s a -> s { _dcpgMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcpgMaxRecords :: Lens' DescribeClusterParameterGroups (Maybe Int)
+dcpgMaxRecords = lens _dcpgMaxRecords (\s a -> s { _dcpgMaxRecords = a })
+
+-- | The name of a specific parameter group for which to return details. By
+-- default, details about all parameter groups and the default parameter
+-- group are returned.
+dcpgParameterGroupName :: Lens' DescribeClusterParameterGroups (Maybe Text)
+dcpgParameterGroupName =
+    lens _dcpgParameterGroupName (\s a -> s { _dcpgParameterGroupName = a })
+
+-- | A tag key or keys for which you want to return all matching cluster
+-- parameter groups that are associated with the specified key or keys. For
+-- example, suppose that you have parameter groups that are tagged with keys
+-- called owner and environment. If you specify both of these tag keys in
+-- the request, Amazon Redshift returns a response with the parameter groups
+-- that have either or both of these tag keys associated with them.
+dcpgTagKeys :: Lens' DescribeClusterParameterGroups [Text]
+dcpgTagKeys = lens _dcpgTagKeys (\s a -> s { _dcpgTagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching cluster
+-- parameter groups that are associated with the specified tag value or
+-- values. For example, suppose that you have parameter groups that are
+-- tagged with values called admin and test. If you specify both of these
+-- tag values in the request, Amazon Redshift returns a response with the
+-- parameter groups that have either or both of these tag values associated
+-- with them.
+dcpgTagValues :: Lens' DescribeClusterParameterGroups [Text]
+dcpgTagValues = lens _dcpgTagValues (\s a -> s { _dcpgTagValues = a }) . _List
+
+data DescribeClusterParameterGroupsResponse = DescribeClusterParameterGroupsResponse
+    { _dcpgrMarker          :: Maybe Text
+    , _dcpgrParameterGroups :: List "ClusterParameterGroup" ClusterParameterGroup
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterParameterGroupsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcpgrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcpgrParameterGroups' @::@ ['ClusterParameterGroup']
+--
+describeClusterParameterGroupsResponse :: DescribeClusterParameterGroupsResponse
+describeClusterParameterGroupsResponse = DescribeClusterParameterGroupsResponse
+    { _dcpgrMarker          = Nothing
+    , _dcpgrParameterGroups = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcpgrMarker :: Lens' DescribeClusterParameterGroupsResponse (Maybe Text)
+dcpgrMarker = lens _dcpgrMarker (\s a -> s { _dcpgrMarker = a })
+
+-- | A list of ClusterParameterGroup instances. Each instance describes one
+-- cluster parameter group.
+dcpgrParameterGroups :: Lens' DescribeClusterParameterGroupsResponse [ClusterParameterGroup]
+dcpgrParameterGroups =
+    lens _dcpgrParameterGroups (\s a -> s { _dcpgrParameterGroups = a })
+        . _List
+
+instance ToPath DescribeClusterParameterGroups where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterParameterGroups where
+    toQuery DescribeClusterParameterGroups{..} = mconcat
+        [ "Marker"             =? _dcpgMarker
+        , "MaxRecords"         =? _dcpgMaxRecords
+        , "ParameterGroupName" =? _dcpgParameterGroupName
+        , "TagKeys"            =? _dcpgTagKeys
+        , "TagValues"          =? _dcpgTagValues
+        ]
+
+instance ToHeaders DescribeClusterParameterGroups
+
+instance AWSRequest DescribeClusterParameterGroups where
+    type Sv DescribeClusterParameterGroups = Redshift
+    type Rs DescribeClusterParameterGroups = DescribeClusterParameterGroupsResponse
+
+    request  = post "DescribeClusterParameterGroups"
+    response = xmlResponse
+
+instance FromXML DescribeClusterParameterGroupsResponse where
+    parseXML = withElement "DescribeClusterParameterGroupsResult" $ \x -> DescribeClusterParameterGroupsResponse
+        <$> x .@? "Marker"
+        <*> x .@  "ParameterGroups"
+
+instance AWSPager DescribeClusterParameterGroups where
+    page rq rs
+        | stop (rq ^. dcpgMarker) = Nothing
+        | otherwise = (\x -> rq & dcpgMarker ?~ x)
+            <$> (rs ^. dcpgrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusterParameters.hs b/gen/Network/AWS/Redshift/DescribeClusterParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterParameters.hs
@@ -0,0 +1,179 @@
+{-# 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.Redshift.DescribeClusterParameters
+-- 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 detailed list of parameters contained within the specified Amazon
+-- Redshift parameter group. For each parameter the response includes
+-- information such as parameter name, description, data type, value, whether
+-- the parameter value is modifiable, and so on. You can specify source filter
+-- to retrieve parameters of only specific type. For example, to retrieve
+-- parameters that were modified by a user action such as from
+-- ModifyClusterParameterGroup, you can specify source equal to user. For more
+-- information about managing parameter groups, go to Amazon Redshift
+-- Parameter Groups in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterParameters.html>
+module Network.AWS.Redshift.DescribeClusterParameters
+    (
+    -- * Request
+      DescribeClusterParameters
+    -- ** Request constructor
+    , describeClusterParameters
+    -- ** Request lenses
+    , dcp1Marker
+    , dcp1MaxRecords
+    , dcp1ParameterGroupName
+    , dcp1Source
+
+    -- * Response
+    , DescribeClusterParametersResponse
+    -- ** Response constructor
+    , describeClusterParametersResponse
+    -- ** Response lenses
+    , dcprMarker
+    , dcprParameters
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterParameters = DescribeClusterParameters
+    { _dcp1Marker             :: Maybe Text
+    , _dcp1MaxRecords         :: Maybe Int
+    , _dcp1ParameterGroupName :: Text
+    , _dcp1Source             :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterParameters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcp1Marker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcp1MaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcp1ParameterGroupName' @::@ 'Text'
+--
+-- * 'dcp1Source' @::@ 'Maybe' 'Text'
+--
+describeClusterParameters :: Text -- ^ 'dcp1ParameterGroupName'
+                          -> DescribeClusterParameters
+describeClusterParameters p1 = DescribeClusterParameters
+    { _dcp1ParameterGroupName = p1
+    , _dcp1Source             = Nothing
+    , _dcp1MaxRecords         = Nothing
+    , _dcp1Marker             = Nothing
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterParameters
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dcp1Marker :: Lens' DescribeClusterParameters (Maybe Text)
+dcp1Marker = lens _dcp1Marker (\s a -> s { _dcp1Marker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcp1MaxRecords :: Lens' DescribeClusterParameters (Maybe Int)
+dcp1MaxRecords = lens _dcp1MaxRecords (\s a -> s { _dcp1MaxRecords = a })
+
+-- | The name of a cluster parameter group for which to return details.
+dcp1ParameterGroupName :: Lens' DescribeClusterParameters Text
+dcp1ParameterGroupName =
+    lens _dcp1ParameterGroupName (\s a -> s { _dcp1ParameterGroupName = a })
+
+-- | The parameter types to return. Specify user to show parameters that are
+-- different form the default. Similarly, specify engine-default to show
+-- parameters that are the same as the default parameter group. Default: All
+-- parameter types returned. Valid Values: user | engine-default.
+dcp1Source :: Lens' DescribeClusterParameters (Maybe Text)
+dcp1Source = lens _dcp1Source (\s a -> s { _dcp1Source = a })
+
+data DescribeClusterParametersResponse = DescribeClusterParametersResponse
+    { _dcprMarker     :: Maybe Text
+    , _dcprParameters :: List "Parameter" Parameter
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterParametersResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcprMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcprParameters' @::@ ['Parameter']
+--
+describeClusterParametersResponse :: DescribeClusterParametersResponse
+describeClusterParametersResponse = DescribeClusterParametersResponse
+    { _dcprParameters = mempty
+    , _dcprMarker     = Nothing
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcprMarker :: Lens' DescribeClusterParametersResponse (Maybe Text)
+dcprMarker = lens _dcprMarker (\s a -> s { _dcprMarker = a })
+
+-- | A list of Parameter instances. Each instance lists the parameters of one
+-- cluster parameter group.
+dcprParameters :: Lens' DescribeClusterParametersResponse [Parameter]
+dcprParameters = lens _dcprParameters (\s a -> s { _dcprParameters = a }) . _List
+
+instance ToPath DescribeClusterParameters where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterParameters where
+    toQuery DescribeClusterParameters{..} = mconcat
+        [ "Marker"             =? _dcp1Marker
+        , "MaxRecords"         =? _dcp1MaxRecords
+        , "ParameterGroupName" =? _dcp1ParameterGroupName
+        , "Source"             =? _dcp1Source
+        ]
+
+instance ToHeaders DescribeClusterParameters
+
+instance AWSRequest DescribeClusterParameters where
+    type Sv DescribeClusterParameters = Redshift
+    type Rs DescribeClusterParameters = DescribeClusterParametersResponse
+
+    request  = post "DescribeClusterParameters"
+    response = xmlResponse
+
+instance FromXML DescribeClusterParametersResponse where
+    parseXML = withElement "DescribeClusterParametersResult" $ \x -> DescribeClusterParametersResponse
+        <$> x .@? "Marker"
+        <*> x .@  "Parameters"
+
+instance AWSPager DescribeClusterParameters where
+    page rq rs
+        | stop (rq ^. dcp1Marker) = Nothing
+        | otherwise = (\x -> rq & dcp1Marker ?~ x)
+            <$> (rs ^. dcprMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusterSecurityGroups.hs b/gen/Network/AWS/Redshift/DescribeClusterSecurityGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterSecurityGroups.hs
@@ -0,0 +1,207 @@
+{-# 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.Redshift.DescribeClusterSecurityGroups
+-- 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 information about Amazon Redshift security groups. If the name of a
+-- security group is specified, the response will contain only information
+-- about only that security group. For information about managing security
+-- groups, go to Amazon Redshift Cluster Security Groups in the Amazon
+-- Redshift Cluster Management Guide. If you specify both tag keys and tag
+-- values in the same request, Amazon Redshift returns all security groups
+-- that match any combination of the specified keys and values. For example,
+-- if you have owner and environment for tag keys, and admin and test for tag
+-- values, all security groups that have any combination of those values are
+-- returned. If both tag keys and values are omitted from the request,
+-- security groups are returned regardless of whether they have tag keys or
+-- values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterSecurityGroups.html>
+module Network.AWS.Redshift.DescribeClusterSecurityGroups
+    (
+    -- * Request
+      DescribeClusterSecurityGroups
+    -- ** Request constructor
+    , describeClusterSecurityGroups
+    -- ** Request lenses
+    , dcsgClusterSecurityGroupName
+    , dcsgMarker
+    , dcsgMaxRecords
+    , dcsgTagKeys
+    , dcsgTagValues
+
+    -- * Response
+    , DescribeClusterSecurityGroupsResponse
+    -- ** Response constructor
+    , describeClusterSecurityGroupsResponse
+    -- ** Response lenses
+    , dcsgr1ClusterSecurityGroups
+    , dcsgr1Marker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterSecurityGroups = DescribeClusterSecurityGroups
+    { _dcsgClusterSecurityGroupName :: Maybe Text
+    , _dcsgMarker                   :: Maybe Text
+    , _dcsgMaxRecords               :: Maybe Int
+    , _dcsgTagKeys                  :: List "TagKey" Text
+    , _dcsgTagValues                :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterSecurityGroups' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsgClusterSecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsgMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsgMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcsgTagKeys' @::@ ['Text']
+--
+-- * 'dcsgTagValues' @::@ ['Text']
+--
+describeClusterSecurityGroups :: DescribeClusterSecurityGroups
+describeClusterSecurityGroups = DescribeClusterSecurityGroups
+    { _dcsgClusterSecurityGroupName = Nothing
+    , _dcsgMaxRecords               = Nothing
+    , _dcsgMarker                   = Nothing
+    , _dcsgTagKeys                  = mempty
+    , _dcsgTagValues                = mempty
+    }
+
+-- | The name of a cluster security group for which you are requesting
+-- details. You can specify either the Marker parameter or a
+-- ClusterSecurityGroupName parameter, but not both. Example:
+-- securitygroup1.
+dcsgClusterSecurityGroupName :: Lens' DescribeClusterSecurityGroups (Maybe Text)
+dcsgClusterSecurityGroupName =
+    lens _dcsgClusterSecurityGroupName
+        (\s a -> s { _dcsgClusterSecurityGroupName = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterSecurityGroups
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request. Constraints: You can specify either
+-- the ClusterSecurityGroupName parameter or the Marker parameter, but not
+-- both.
+dcsgMarker :: Lens' DescribeClusterSecurityGroups (Maybe Text)
+dcsgMarker = lens _dcsgMarker (\s a -> s { _dcsgMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcsgMaxRecords :: Lens' DescribeClusterSecurityGroups (Maybe Int)
+dcsgMaxRecords = lens _dcsgMaxRecords (\s a -> s { _dcsgMaxRecords = a })
+
+-- | A tag key or keys for which you want to return all matching cluster
+-- security groups that are associated with the specified key or keys. For
+-- example, suppose that you have security groups that are tagged with keys
+-- called owner and environment. If you specify both of these tag keys in
+-- the request, Amazon Redshift returns a response with the security groups
+-- that have either or both of these tag keys associated with them.
+dcsgTagKeys :: Lens' DescribeClusterSecurityGroups [Text]
+dcsgTagKeys = lens _dcsgTagKeys (\s a -> s { _dcsgTagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching cluster
+-- security groups that are associated with the specified tag value or
+-- values. For example, suppose that you have security groups that are
+-- tagged with values called admin and test. If you specify both of these
+-- tag values in the request, Amazon Redshift returns a response with the
+-- security groups that have either or both of these tag values associated
+-- with them.
+dcsgTagValues :: Lens' DescribeClusterSecurityGroups [Text]
+dcsgTagValues = lens _dcsgTagValues (\s a -> s { _dcsgTagValues = a }) . _List
+
+data DescribeClusterSecurityGroupsResponse = DescribeClusterSecurityGroupsResponse
+    { _dcsgr1ClusterSecurityGroups :: List "ClusterSecurityGroup" ClusterSecurityGroup
+    , _dcsgr1Marker                :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterSecurityGroupsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsgr1ClusterSecurityGroups' @::@ ['ClusterSecurityGroup']
+--
+-- * 'dcsgr1Marker' @::@ 'Maybe' 'Text'
+--
+describeClusterSecurityGroupsResponse :: DescribeClusterSecurityGroupsResponse
+describeClusterSecurityGroupsResponse = DescribeClusterSecurityGroupsResponse
+    { _dcsgr1Marker                = Nothing
+    , _dcsgr1ClusterSecurityGroups = mempty
+    }
+
+-- | A list of ClusterSecurityGroup instances.
+dcsgr1ClusterSecurityGroups :: Lens' DescribeClusterSecurityGroupsResponse [ClusterSecurityGroup]
+dcsgr1ClusterSecurityGroups =
+    lens _dcsgr1ClusterSecurityGroups
+        (\s a -> s { _dcsgr1ClusterSecurityGroups = a })
+            . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcsgr1Marker :: Lens' DescribeClusterSecurityGroupsResponse (Maybe Text)
+dcsgr1Marker = lens _dcsgr1Marker (\s a -> s { _dcsgr1Marker = a })
+
+instance ToPath DescribeClusterSecurityGroups where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterSecurityGroups where
+    toQuery DescribeClusterSecurityGroups{..} = mconcat
+        [ "ClusterSecurityGroupName" =? _dcsgClusterSecurityGroupName
+        , "Marker"                   =? _dcsgMarker
+        , "MaxRecords"               =? _dcsgMaxRecords
+        , "TagKeys"                  =? _dcsgTagKeys
+        , "TagValues"                =? _dcsgTagValues
+        ]
+
+instance ToHeaders DescribeClusterSecurityGroups
+
+instance AWSRequest DescribeClusterSecurityGroups where
+    type Sv DescribeClusterSecurityGroups = Redshift
+    type Rs DescribeClusterSecurityGroups = DescribeClusterSecurityGroupsResponse
+
+    request  = post "DescribeClusterSecurityGroups"
+    response = xmlResponse
+
+instance FromXML DescribeClusterSecurityGroupsResponse where
+    parseXML = withElement "DescribeClusterSecurityGroupsResult" $ \x -> DescribeClusterSecurityGroupsResponse
+        <$> x .@  "ClusterSecurityGroups"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeClusterSecurityGroups where
+    page rq rs
+        | stop (rq ^. dcsgMarker) = Nothing
+        | otherwise = (\x -> rq & dcsgMarker ?~ x)
+            <$> (rs ^. dcsgr1Marker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusterSnapshots.hs b/gen/Network/AWS/Redshift/DescribeClusterSnapshots.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterSnapshots.hs
@@ -0,0 +1,262 @@
+{-# 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.Redshift.DescribeClusterSnapshots
+-- 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 one or more snapshot objects, which contain metadata about your
+-- cluster snapshots. By default, this operation returns information about all
+-- snapshots of all clusters that are owned by you AWS customer account. No
+-- information is returned for snapshots owned by inactive AWS customer
+-- accounts. If you specify both tag keys and tag values in the same request,
+-- Amazon Redshift returns all snapshots that match any combination of the
+-- specified keys and values. For example, if you have owner and environment
+-- for tag keys, and admin and test for tag values, all snapshots that have
+-- any combination of those values are returned. Only snapshots that you own
+-- are returned in the response; shared snapshots are not returned with the
+-- tag key and tag value request parameters. If both tag keys and values are
+-- omitted from the request, snapshots are returned regardless of whether they
+-- have tag keys or values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterSnapshots.html>
+module Network.AWS.Redshift.DescribeClusterSnapshots
+    (
+    -- * Request
+      DescribeClusterSnapshots
+    -- ** Request constructor
+    , describeClusterSnapshots
+    -- ** Request lenses
+    , dcs1ClusterIdentifier
+    , dcs1EndTime
+    , dcs1Marker
+    , dcs1MaxRecords
+    , dcs1OwnerAccount
+    , dcs1SnapshotIdentifier
+    , dcs1SnapshotType
+    , dcs1StartTime
+    , dcs1TagKeys
+    , dcs1TagValues
+
+    -- * Response
+    , DescribeClusterSnapshotsResponse
+    -- ** Response constructor
+    , describeClusterSnapshotsResponse
+    -- ** Response lenses
+    , dcsrMarker
+    , dcsrSnapshots
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterSnapshots = DescribeClusterSnapshots
+    { _dcs1ClusterIdentifier  :: Maybe Text
+    , _dcs1EndTime            :: Maybe RFC822
+    , _dcs1Marker             :: Maybe Text
+    , _dcs1MaxRecords         :: Maybe Int
+    , _dcs1OwnerAccount       :: Maybe Text
+    , _dcs1SnapshotIdentifier :: Maybe Text
+    , _dcs1SnapshotType       :: Maybe Text
+    , _dcs1StartTime          :: Maybe RFC822
+    , _dcs1TagKeys            :: List "TagKey" Text
+    , _dcs1TagValues          :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterSnapshots' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcs1ClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dcs1EndTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dcs1Marker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcs1MaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcs1OwnerAccount' @::@ 'Maybe' 'Text'
+--
+-- * 'dcs1SnapshotIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dcs1SnapshotType' @::@ 'Maybe' 'Text'
+--
+-- * 'dcs1StartTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dcs1TagKeys' @::@ ['Text']
+--
+-- * 'dcs1TagValues' @::@ ['Text']
+--
+describeClusterSnapshots :: DescribeClusterSnapshots
+describeClusterSnapshots = DescribeClusterSnapshots
+    { _dcs1ClusterIdentifier  = Nothing
+    , _dcs1SnapshotIdentifier = Nothing
+    , _dcs1SnapshotType       = Nothing
+    , _dcs1StartTime          = Nothing
+    , _dcs1EndTime            = Nothing
+    , _dcs1MaxRecords         = Nothing
+    , _dcs1Marker             = Nothing
+    , _dcs1OwnerAccount       = Nothing
+    , _dcs1TagKeys            = mempty
+    , _dcs1TagValues          = mempty
+    }
+
+-- | The identifier of the cluster for which information about snapshots is
+-- requested.
+dcs1ClusterIdentifier :: Lens' DescribeClusterSnapshots (Maybe Text)
+dcs1ClusterIdentifier =
+    lens _dcs1ClusterIdentifier (\s a -> s { _dcs1ClusterIdentifier = a })
+
+-- | A time value that requests only snapshots created at or before the
+-- specified time. The time value is specified in ISO 8601 format. For more
+-- information about ISO 8601, go to the ISO8601 Wikipedia page. Example:
+-- 2012-07-16T18:00:00Z.
+dcs1EndTime :: Lens' DescribeClusterSnapshots (Maybe UTCTime)
+dcs1EndTime = lens _dcs1EndTime (\s a -> s { _dcs1EndTime = a }) . mapping _Time
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterSnapshots
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dcs1Marker :: Lens' DescribeClusterSnapshots (Maybe Text)
+dcs1Marker = lens _dcs1Marker (\s a -> s { _dcs1Marker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcs1MaxRecords :: Lens' DescribeClusterSnapshots (Maybe Int)
+dcs1MaxRecords = lens _dcs1MaxRecords (\s a -> s { _dcs1MaxRecords = a })
+
+-- | The AWS customer account used to create or copy the snapshot. Use this
+-- field to filter the results to snapshots owned by a particular account.
+-- To describe snapshots you own, either specify your AWS customer account,
+-- or do not specify the parameter.
+dcs1OwnerAccount :: Lens' DescribeClusterSnapshots (Maybe Text)
+dcs1OwnerAccount = lens _dcs1OwnerAccount (\s a -> s { _dcs1OwnerAccount = a })
+
+-- | The snapshot identifier of the snapshot about which to return
+-- information.
+dcs1SnapshotIdentifier :: Lens' DescribeClusterSnapshots (Maybe Text)
+dcs1SnapshotIdentifier =
+    lens _dcs1SnapshotIdentifier (\s a -> s { _dcs1SnapshotIdentifier = a })
+
+-- | The type of snapshots for which you are requesting information. By
+-- default, snapshots of all types are returned. Valid Values: automated |
+-- manual.
+dcs1SnapshotType :: Lens' DescribeClusterSnapshots (Maybe Text)
+dcs1SnapshotType = lens _dcs1SnapshotType (\s a -> s { _dcs1SnapshotType = a })
+
+-- | A value that requests only snapshots created at or after the specified
+-- time. The time value is specified in ISO 8601 format. For more
+-- information about ISO 8601, go to the ISO8601 Wikipedia page. Example:
+-- 2012-07-16T18:00:00Z.
+dcs1StartTime :: Lens' DescribeClusterSnapshots (Maybe UTCTime)
+dcs1StartTime = lens _dcs1StartTime (\s a -> s { _dcs1StartTime = a }) . mapping _Time
+
+-- | A tag key or keys for which you want to return all matching cluster
+-- snapshots that are associated with the specified key or keys. For
+-- example, suppose that you have snapshots that are tagged with keys called
+-- owner and environment. If you specify both of these tag keys in the
+-- request, Amazon Redshift returns a response with the snapshots that have
+-- either or both of these tag keys associated with them.
+dcs1TagKeys :: Lens' DescribeClusterSnapshots [Text]
+dcs1TagKeys = lens _dcs1TagKeys (\s a -> s { _dcs1TagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching cluster
+-- snapshots that are associated with the specified tag value or values. For
+-- example, suppose that you have snapshots that are tagged with values
+-- called admin and test. If you specify both of these tag values in the
+-- request, Amazon Redshift returns a response with the snapshots that have
+-- either or both of these tag values associated with them.
+dcs1TagValues :: Lens' DescribeClusterSnapshots [Text]
+dcs1TagValues = lens _dcs1TagValues (\s a -> s { _dcs1TagValues = a }) . _List
+
+data DescribeClusterSnapshotsResponse = DescribeClusterSnapshotsResponse
+    { _dcsrMarker    :: Maybe Text
+    , _dcsrSnapshots :: List "Snapshot" Snapshot
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterSnapshotsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsrSnapshots' @::@ ['Snapshot']
+--
+describeClusterSnapshotsResponse :: DescribeClusterSnapshotsResponse
+describeClusterSnapshotsResponse = DescribeClusterSnapshotsResponse
+    { _dcsrMarker    = Nothing
+    , _dcsrSnapshots = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcsrMarker :: Lens' DescribeClusterSnapshotsResponse (Maybe Text)
+dcsrMarker = lens _dcsrMarker (\s a -> s { _dcsrMarker = a })
+
+-- | A list of Snapshot instances.
+dcsrSnapshots :: Lens' DescribeClusterSnapshotsResponse [Snapshot]
+dcsrSnapshots = lens _dcsrSnapshots (\s a -> s { _dcsrSnapshots = a }) . _List
+
+instance ToPath DescribeClusterSnapshots where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterSnapshots where
+    toQuery DescribeClusterSnapshots{..} = mconcat
+        [ "ClusterIdentifier"  =? _dcs1ClusterIdentifier
+        , "EndTime"            =? _dcs1EndTime
+        , "Marker"             =? _dcs1Marker
+        , "MaxRecords"         =? _dcs1MaxRecords
+        , "OwnerAccount"       =? _dcs1OwnerAccount
+        , "SnapshotIdentifier" =? _dcs1SnapshotIdentifier
+        , "SnapshotType"       =? _dcs1SnapshotType
+        , "StartTime"          =? _dcs1StartTime
+        , "TagKeys"            =? _dcs1TagKeys
+        , "TagValues"          =? _dcs1TagValues
+        ]
+
+instance ToHeaders DescribeClusterSnapshots
+
+instance AWSRequest DescribeClusterSnapshots where
+    type Sv DescribeClusterSnapshots = Redshift
+    type Rs DescribeClusterSnapshots = DescribeClusterSnapshotsResponse
+
+    request  = post "DescribeClusterSnapshots"
+    response = xmlResponse
+
+instance FromXML DescribeClusterSnapshotsResponse where
+    parseXML = withElement "DescribeClusterSnapshotsResult" $ \x -> DescribeClusterSnapshotsResponse
+        <$> x .@? "Marker"
+        <*> x .@  "Snapshots"
+
+instance AWSPager DescribeClusterSnapshots where
+    page rq rs
+        | stop (rq ^. dcs1Marker) = Nothing
+        | otherwise = (\x -> rq & dcs1Marker ?~ x)
+            <$> (rs ^. dcsrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusterSubnetGroups.hs b/gen/Network/AWS/Redshift/DescribeClusterSubnetGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterSubnetGroups.hs
@@ -0,0 +1,199 @@
+{-# 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.Redshift.DescribeClusterSubnetGroups
+-- 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 one or more cluster subnet group objects, which contain metadata
+-- about your cluster subnet groups. By default, this operation returns
+-- information about all cluster subnet groups that are defined in you AWS
+-- account. If you specify both tag keys and tag values in the same request,
+-- Amazon Redshift returns all subnet groups that match any combination of the
+-- specified keys and values. For example, if you have owner and environment
+-- for tag keys, and admin and test for tag values, all subnet groups that
+-- have any combination of those values are returned. If both tag keys and
+-- values are omitted from the request, subnet groups are returned regardless
+-- of whether they have tag keys or values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterSubnetGroups.html>
+module Network.AWS.Redshift.DescribeClusterSubnetGroups
+    (
+    -- * Request
+      DescribeClusterSubnetGroups
+    -- ** Request constructor
+    , describeClusterSubnetGroups
+    -- ** Request lenses
+    , dcsg1ClusterSubnetGroupName
+    , dcsg1Marker
+    , dcsg1MaxRecords
+    , dcsg1TagKeys
+    , dcsg1TagValues
+
+    -- * Response
+    , DescribeClusterSubnetGroupsResponse
+    -- ** Response constructor
+    , describeClusterSubnetGroupsResponse
+    -- ** Response lenses
+    , dcsgrClusterSubnetGroups
+    , dcsgrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterSubnetGroups = DescribeClusterSubnetGroups
+    { _dcsg1ClusterSubnetGroupName :: Maybe Text
+    , _dcsg1Marker                 :: Maybe Text
+    , _dcsg1MaxRecords             :: Maybe Int
+    , _dcsg1TagKeys                :: List "TagKey" Text
+    , _dcsg1TagValues              :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterSubnetGroups' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsg1ClusterSubnetGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsg1Marker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcsg1MaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcsg1TagKeys' @::@ ['Text']
+--
+-- * 'dcsg1TagValues' @::@ ['Text']
+--
+describeClusterSubnetGroups :: DescribeClusterSubnetGroups
+describeClusterSubnetGroups = DescribeClusterSubnetGroups
+    { _dcsg1ClusterSubnetGroupName = Nothing
+    , _dcsg1MaxRecords             = Nothing
+    , _dcsg1Marker                 = Nothing
+    , _dcsg1TagKeys                = mempty
+    , _dcsg1TagValues              = mempty
+    }
+
+-- | The name of the cluster subnet group for which information is requested.
+dcsg1ClusterSubnetGroupName :: Lens' DescribeClusterSubnetGroups (Maybe Text)
+dcsg1ClusterSubnetGroupName =
+    lens _dcsg1ClusterSubnetGroupName
+        (\s a -> s { _dcsg1ClusterSubnetGroupName = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterSubnetGroups
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dcsg1Marker :: Lens' DescribeClusterSubnetGroups (Maybe Text)
+dcsg1Marker = lens _dcsg1Marker (\s a -> s { _dcsg1Marker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcsg1MaxRecords :: Lens' DescribeClusterSubnetGroups (Maybe Int)
+dcsg1MaxRecords = lens _dcsg1MaxRecords (\s a -> s { _dcsg1MaxRecords = a })
+
+-- | A tag key or keys for which you want to return all matching cluster
+-- subnet groups that are associated with the specified key or keys. For
+-- example, suppose that you have subnet groups that are tagged with keys
+-- called owner and environment. If you specify both of these tag keys in
+-- the request, Amazon Redshift returns a response with the subnet groups
+-- that have either or both of these tag keys associated with them.
+dcsg1TagKeys :: Lens' DescribeClusterSubnetGroups [Text]
+dcsg1TagKeys = lens _dcsg1TagKeys (\s a -> s { _dcsg1TagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching cluster
+-- subnet groups that are associated with the specified tag value or values.
+-- For example, suppose that you have subnet groups that are tagged with
+-- values called admin and test. If you specify both of these tag values in
+-- the request, Amazon Redshift returns a response with the subnet groups
+-- that have either or both of these tag values associated with them.
+dcsg1TagValues :: Lens' DescribeClusterSubnetGroups [Text]
+dcsg1TagValues = lens _dcsg1TagValues (\s a -> s { _dcsg1TagValues = a }) . _List
+
+data DescribeClusterSubnetGroupsResponse = DescribeClusterSubnetGroupsResponse
+    { _dcsgrClusterSubnetGroups :: List "ClusterSubnetGroup" ClusterSubnetGroup
+    , _dcsgrMarker              :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterSubnetGroupsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcsgrClusterSubnetGroups' @::@ ['ClusterSubnetGroup']
+--
+-- * 'dcsgrMarker' @::@ 'Maybe' 'Text'
+--
+describeClusterSubnetGroupsResponse :: DescribeClusterSubnetGroupsResponse
+describeClusterSubnetGroupsResponse = DescribeClusterSubnetGroupsResponse
+    { _dcsgrMarker              = Nothing
+    , _dcsgrClusterSubnetGroups = mempty
+    }
+
+-- | A list of ClusterSubnetGroup instances.
+dcsgrClusterSubnetGroups :: Lens' DescribeClusterSubnetGroupsResponse [ClusterSubnetGroup]
+dcsgrClusterSubnetGroups =
+    lens _dcsgrClusterSubnetGroups
+        (\s a -> s { _dcsgrClusterSubnetGroups = a })
+            . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcsgrMarker :: Lens' DescribeClusterSubnetGroupsResponse (Maybe Text)
+dcsgrMarker = lens _dcsgrMarker (\s a -> s { _dcsgrMarker = a })
+
+instance ToPath DescribeClusterSubnetGroups where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterSubnetGroups where
+    toQuery DescribeClusterSubnetGroups{..} = mconcat
+        [ "ClusterSubnetGroupName" =? _dcsg1ClusterSubnetGroupName
+        , "Marker"                 =? _dcsg1Marker
+        , "MaxRecords"             =? _dcsg1MaxRecords
+        , "TagKeys"                =? _dcsg1TagKeys
+        , "TagValues"              =? _dcsg1TagValues
+        ]
+
+instance ToHeaders DescribeClusterSubnetGroups
+
+instance AWSRequest DescribeClusterSubnetGroups where
+    type Sv DescribeClusterSubnetGroups = Redshift
+    type Rs DescribeClusterSubnetGroups = DescribeClusterSubnetGroupsResponse
+
+    request  = post "DescribeClusterSubnetGroups"
+    response = xmlResponse
+
+instance FromXML DescribeClusterSubnetGroupsResponse where
+    parseXML = withElement "DescribeClusterSubnetGroupsResult" $ \x -> DescribeClusterSubnetGroupsResponse
+        <$> x .@  "ClusterSubnetGroups"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeClusterSubnetGroups where
+    page rq rs
+        | stop (rq ^. dcsg1Marker) = Nothing
+        | otherwise = (\x -> rq & dcsg1Marker ?~ x)
+            <$> (rs ^. dcsgrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusterVersions.hs b/gen/Network/AWS/Redshift/DescribeClusterVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusterVersions.hs
@@ -0,0 +1,177 @@
+{-# 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.Redshift.DescribeClusterVersions
+-- 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 descriptions of the available Amazon Redshift cluster versions. You
+-- can call this operation even before creating any clusters to learn more
+-- about the Amazon Redshift versions. For more information about managing
+-- clusters, go to Amazon Redshift Clusters in the Amazon Redshift Cluster
+-- Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusterVersions.html>
+module Network.AWS.Redshift.DescribeClusterVersions
+    (
+    -- * Request
+      DescribeClusterVersions
+    -- ** Request constructor
+    , describeClusterVersions
+    -- ** Request lenses
+    , dcvClusterParameterGroupFamily
+    , dcvClusterVersion
+    , dcvMarker
+    , dcvMaxRecords
+
+    -- * Response
+    , DescribeClusterVersionsResponse
+    -- ** Response constructor
+    , describeClusterVersionsResponse
+    -- ** Response lenses
+    , dcvrClusterVersions
+    , dcvrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusterVersions = DescribeClusterVersions
+    { _dcvClusterParameterGroupFamily :: Maybe Text
+    , _dcvClusterVersion              :: Maybe Text
+    , _dcvMarker                      :: Maybe Text
+    , _dcvMaxRecords                  :: Maybe Int
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusterVersions' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcvClusterParameterGroupFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'dcvClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'dcvMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcvMaxRecords' @::@ 'Maybe' 'Int'
+--
+describeClusterVersions :: DescribeClusterVersions
+describeClusterVersions = DescribeClusterVersions
+    { _dcvClusterVersion              = Nothing
+    , _dcvClusterParameterGroupFamily = Nothing
+    , _dcvMaxRecords                  = Nothing
+    , _dcvMarker                      = Nothing
+    }
+
+-- | The name of a specific cluster parameter group family to return details
+-- for. Constraints: Must be 1 to 255 alphanumeric characters First
+-- character must be a letter Cannot end with a hyphen or contain two
+-- consecutive hyphens.
+dcvClusterParameterGroupFamily :: Lens' DescribeClusterVersions (Maybe Text)
+dcvClusterParameterGroupFamily =
+    lens _dcvClusterParameterGroupFamily
+        (\s a -> s { _dcvClusterParameterGroupFamily = a })
+
+-- | The specific cluster version to return. Example: 1.0.
+dcvClusterVersion :: Lens' DescribeClusterVersions (Maybe Text)
+dcvClusterVersion =
+    lens _dcvClusterVersion (\s a -> s { _dcvClusterVersion = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusterVersions
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dcvMarker :: Lens' DescribeClusterVersions (Maybe Text)
+dcvMarker = lens _dcvMarker (\s a -> s { _dcvMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcvMaxRecords :: Lens' DescribeClusterVersions (Maybe Int)
+dcvMaxRecords = lens _dcvMaxRecords (\s a -> s { _dcvMaxRecords = a })
+
+data DescribeClusterVersionsResponse = DescribeClusterVersionsResponse
+    { _dcvrClusterVersions :: List "ClusterVersion" ClusterVersion
+    , _dcvrMarker          :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeClusterVersionsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcvrClusterVersions' @::@ ['ClusterVersion']
+--
+-- * 'dcvrMarker' @::@ 'Maybe' 'Text'
+--
+describeClusterVersionsResponse :: DescribeClusterVersionsResponse
+describeClusterVersionsResponse = DescribeClusterVersionsResponse
+    { _dcvrMarker          = Nothing
+    , _dcvrClusterVersions = mempty
+    }
+
+-- | A list of Version elements.
+dcvrClusterVersions :: Lens' DescribeClusterVersionsResponse [ClusterVersion]
+dcvrClusterVersions =
+    lens _dcvrClusterVersions (\s a -> s { _dcvrClusterVersions = a })
+        . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcvrMarker :: Lens' DescribeClusterVersionsResponse (Maybe Text)
+dcvrMarker = lens _dcvrMarker (\s a -> s { _dcvrMarker = a })
+
+instance ToPath DescribeClusterVersions where
+    toPath = const "/"
+
+instance ToQuery DescribeClusterVersions where
+    toQuery DescribeClusterVersions{..} = mconcat
+        [ "ClusterParameterGroupFamily" =? _dcvClusterParameterGroupFamily
+        , "ClusterVersion"              =? _dcvClusterVersion
+        , "Marker"                      =? _dcvMarker
+        , "MaxRecords"                  =? _dcvMaxRecords
+        ]
+
+instance ToHeaders DescribeClusterVersions
+
+instance AWSRequest DescribeClusterVersions where
+    type Sv DescribeClusterVersions = Redshift
+    type Rs DescribeClusterVersions = DescribeClusterVersionsResponse
+
+    request  = post "DescribeClusterVersions"
+    response = xmlResponse
+
+instance FromXML DescribeClusterVersionsResponse where
+    parseXML = withElement "DescribeClusterVersionsResult" $ \x -> DescribeClusterVersionsResponse
+        <$> x .@  "ClusterVersions"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeClusterVersions where
+    page rq rs
+        | stop (rq ^. dcvMarker) = Nothing
+        | otherwise = (\x -> rq & dcvMarker ?~ x)
+            <$> (rs ^. dcvrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeClusters.hs b/gen/Network/AWS/Redshift/DescribeClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeClusters.hs
@@ -0,0 +1,200 @@
+{-# 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.Redshift.DescribeClusters
+-- 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 properties of provisioned clusters including general cluster
+-- properties, cluster database properties, maintenance and backup properties,
+-- and security and access properties. This operation supports pagination. For
+-- more information about managing clusters, go to Amazon Redshift Clusters in
+-- the Amazon Redshift Cluster Management Guide . If you specify both tag keys
+-- and tag values in the same request, Amazon Redshift returns all clusters
+-- that match any combination of the specified keys and values. For example,
+-- if you have owner and environment for tag keys, and admin and test for tag
+-- values, all clusters that have any combination of those values are
+-- returned. If both tag keys and values are omitted from the request,
+-- clusters are returned regardless of whether they have tag keys or values
+-- associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html>
+module Network.AWS.Redshift.DescribeClusters
+    (
+    -- * Request
+      DescribeClusters
+    -- ** Request constructor
+    , describeClusters
+    -- ** Request lenses
+    , dcClusterIdentifier
+    , dcMarker
+    , dcMaxRecords
+    , dcTagKeys
+    , dcTagValues
+
+    -- * Response
+    , DescribeClustersResponse
+    -- ** Response constructor
+    , describeClustersResponse
+    -- ** Response lenses
+    , dcrClusters
+    , dcrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeClusters = DescribeClusters
+    { _dcClusterIdentifier :: Maybe Text
+    , _dcMarker            :: Maybe Text
+    , _dcMaxRecords        :: Maybe Int
+    , _dcTagKeys           :: List "TagKey" Text
+    , _dcTagValues         :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeClusters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dcMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dcTagKeys' @::@ ['Text']
+--
+-- * 'dcTagValues' @::@ ['Text']
+--
+describeClusters :: DescribeClusters
+describeClusters = DescribeClusters
+    { _dcClusterIdentifier = Nothing
+    , _dcMaxRecords        = Nothing
+    , _dcMarker            = Nothing
+    , _dcTagKeys           = mempty
+    , _dcTagValues         = mempty
+    }
+
+-- | The unique identifier of a cluster whose properties you are requesting.
+-- This parameter is case sensitive. The default is that all clusters
+-- defined for an account are returned.
+dcClusterIdentifier :: Lens' DescribeClusters (Maybe Text)
+dcClusterIdentifier =
+    lens _dcClusterIdentifier (\s a -> s { _dcClusterIdentifier = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeClusters request
+-- exceed the value specified in MaxRecords, AWS returns a value in the
+-- Marker field of the response. You can retrieve the next set of response
+-- records by providing the returned marker value in the Marker parameter
+-- and retrying the request. Constraints: You can specify either the
+-- ClusterIdentifier parameter or the Marker parameter, but not both.
+dcMarker :: Lens' DescribeClusters (Maybe Text)
+dcMarker = lens _dcMarker (\s a -> s { _dcMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dcMaxRecords :: Lens' DescribeClusters (Maybe Int)
+dcMaxRecords = lens _dcMaxRecords (\s a -> s { _dcMaxRecords = a })
+
+-- | A tag key or keys for which you want to return all matching clusters that
+-- are associated with the specified key or keys. For example, suppose that
+-- you have clusters that are tagged with keys called owner and environment.
+-- If you specify both of these tag keys in the request, Amazon Redshift
+-- returns a response with the clusters that have either or both of these
+-- tag keys associated with them.
+dcTagKeys :: Lens' DescribeClusters [Text]
+dcTagKeys = lens _dcTagKeys (\s a -> s { _dcTagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching clusters
+-- that are associated with the specified tag value or values. For example,
+-- suppose that you have clusters that are tagged with values called admin
+-- and test. If you specify both of these tag values in the request, Amazon
+-- Redshift returns a response with the clusters that have either or both of
+-- these tag values associated with them.
+dcTagValues :: Lens' DescribeClusters [Text]
+dcTagValues = lens _dcTagValues (\s a -> s { _dcTagValues = a }) . _List
+
+data DescribeClustersResponse = DescribeClustersResponse
+    { _dcrClusters :: List "Cluster" Cluster
+    , _dcrMarker   :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeClustersResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcrClusters' @::@ ['Cluster']
+--
+-- * 'dcrMarker' @::@ 'Maybe' 'Text'
+--
+describeClustersResponse :: DescribeClustersResponse
+describeClustersResponse = DescribeClustersResponse
+    { _dcrMarker   = Nothing
+    , _dcrClusters = mempty
+    }
+
+-- | A list of Cluster objects, where each object describes one cluster.
+dcrClusters :: Lens' DescribeClustersResponse [Cluster]
+dcrClusters = lens _dcrClusters (\s a -> s { _dcrClusters = a }) . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcrMarker :: Lens' DescribeClustersResponse (Maybe Text)
+dcrMarker = lens _dcrMarker (\s a -> s { _dcrMarker = a })
+
+instance ToPath DescribeClusters where
+    toPath = const "/"
+
+instance ToQuery DescribeClusters where
+    toQuery DescribeClusters{..} = mconcat
+        [ "ClusterIdentifier" =? _dcClusterIdentifier
+        , "Marker"            =? _dcMarker
+        , "MaxRecords"        =? _dcMaxRecords
+        , "TagKeys"           =? _dcTagKeys
+        , "TagValues"         =? _dcTagValues
+        ]
+
+instance ToHeaders DescribeClusters
+
+instance AWSRequest DescribeClusters where
+    type Sv DescribeClusters = Redshift
+    type Rs DescribeClusters = DescribeClustersResponse
+
+    request  = post "DescribeClusters"
+    response = xmlResponse
+
+instance FromXML DescribeClustersResponse where
+    parseXML = withElement "DescribeClustersResult" $ \x -> DescribeClustersResponse
+        <$> x .@  "Clusters"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeClusters where
+    page rq rs
+        | stop (rq ^. dcMarker) = Nothing
+        | otherwise = (\x -> rq & dcMarker ?~ x)
+            <$> (rs ^. dcrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeDefaultClusterParameters.hs b/gen/Network/AWS/Redshift/DescribeDefaultClusterParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeDefaultClusterParameters.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.Redshift.DescribeDefaultClusterParameters
+-- 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 parameter settings for the specified parameter group
+-- family. For more information about managing parameter groups, go to Amazon
+-- Redshift Parameter Groups in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeDefaultClusterParameters.html>
+module Network.AWS.Redshift.DescribeDefaultClusterParameters
+    (
+    -- * Request
+      DescribeDefaultClusterParameters
+    -- ** Request constructor
+    , describeDefaultClusterParameters
+    -- ** Request lenses
+    , ddcpMarker
+    , ddcpMaxRecords
+    , ddcpParameterGroupFamily
+
+    -- * Response
+    , DescribeDefaultClusterParametersResponse
+    -- ** Response constructor
+    , describeDefaultClusterParametersResponse
+    -- ** Response lenses
+    , ddcprDefaultClusterParameters
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeDefaultClusterParameters = DescribeDefaultClusterParameters
+    { _ddcpMarker               :: Maybe Text
+    , _ddcpMaxRecords           :: Maybe Int
+    , _ddcpParameterGroupFamily :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeDefaultClusterParameters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ddcpMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'ddcpMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'ddcpParameterGroupFamily' @::@ 'Text'
+--
+describeDefaultClusterParameters :: Text -- ^ 'ddcpParameterGroupFamily'
+                                 -> DescribeDefaultClusterParameters
+describeDefaultClusterParameters p1 = DescribeDefaultClusterParameters
+    { _ddcpParameterGroupFamily = p1
+    , _ddcpMaxRecords           = Nothing
+    , _ddcpMarker               = Nothing
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a
+-- DescribeDefaultClusterParameters request exceed the value specified in
+-- MaxRecords, AWS returns a value in the Marker field of the response. You
+-- can retrieve the next set of response records by providing the returned
+-- marker value in the Marker parameter and retrying the request.
+ddcpMarker :: Lens' DescribeDefaultClusterParameters (Maybe Text)
+ddcpMarker = lens _ddcpMarker (\s a -> s { _ddcpMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+ddcpMaxRecords :: Lens' DescribeDefaultClusterParameters (Maybe Int)
+ddcpMaxRecords = lens _ddcpMaxRecords (\s a -> s { _ddcpMaxRecords = a })
+
+-- | The name of the cluster parameter group family.
+ddcpParameterGroupFamily :: Lens' DescribeDefaultClusterParameters Text
+ddcpParameterGroupFamily =
+    lens _ddcpParameterGroupFamily
+        (\s a -> s { _ddcpParameterGroupFamily = a })
+
+newtype DescribeDefaultClusterParametersResponse = DescribeDefaultClusterParametersResponse
+    { _ddcprDefaultClusterParameters :: DefaultClusterParameters
+    } deriving (Eq, Show)
+
+-- | 'DescribeDefaultClusterParametersResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ddcprDefaultClusterParameters' @::@ 'DefaultClusterParameters'
+--
+describeDefaultClusterParametersResponse :: DefaultClusterParameters -- ^ 'ddcprDefaultClusterParameters'
+                                         -> DescribeDefaultClusterParametersResponse
+describeDefaultClusterParametersResponse p1 = DescribeDefaultClusterParametersResponse
+    { _ddcprDefaultClusterParameters = p1
+    }
+
+ddcprDefaultClusterParameters :: Lens' DescribeDefaultClusterParametersResponse DefaultClusterParameters
+ddcprDefaultClusterParameters =
+    lens _ddcprDefaultClusterParameters
+        (\s a -> s { _ddcprDefaultClusterParameters = a })
+
+instance ToPath DescribeDefaultClusterParameters where
+    toPath = const "/"
+
+instance ToQuery DescribeDefaultClusterParameters where
+    toQuery DescribeDefaultClusterParameters{..} = mconcat
+        [ "Marker"               =? _ddcpMarker
+        , "MaxRecords"           =? _ddcpMaxRecords
+        , "ParameterGroupFamily" =? _ddcpParameterGroupFamily
+        ]
+
+instance ToHeaders DescribeDefaultClusterParameters
+
+instance AWSRequest DescribeDefaultClusterParameters where
+    type Sv DescribeDefaultClusterParameters = Redshift
+    type Rs DescribeDefaultClusterParameters = DescribeDefaultClusterParametersResponse
+
+    request  = post "DescribeDefaultClusterParameters"
+    response = xmlResponse
+
+instance FromXML DescribeDefaultClusterParametersResponse where
+    parseXML = withElement "DescribeDefaultClusterParametersResult" $ \x -> DescribeDefaultClusterParametersResponse
+        <$> x .@  "DefaultClusterParameters"
+
+instance AWSPager DescribeDefaultClusterParameters where
+    page rq rs
+        | stop (rq ^. ddcpMarker) = Nothing
+        | otherwise = (\x -> rq & ddcpMarker ?~ x)
+            <$> (rs ^. ddcprDefaultClusterParameters . dcpMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeEventCategories.hs b/gen/Network/AWS/Redshift/DescribeEventCategories.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeEventCategories.hs
@@ -0,0 +1,118 @@
+{-# 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.Redshift.DescribeEventCategories
+-- 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)
+
+-- | Displays a list of event categories for all event source types, or for a
+-- specified source type. For a list of the event categories and source types,
+-- go to Amazon Redshift Event Notifications.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeEventCategories.html>
+module Network.AWS.Redshift.DescribeEventCategories
+    (
+    -- * Request
+      DescribeEventCategories
+    -- ** Request constructor
+    , describeEventCategories
+    -- ** Request lenses
+    , decSourceType
+
+    -- * Response
+    , DescribeEventCategoriesResponse
+    -- ** Response constructor
+    , describeEventCategoriesResponse
+    -- ** Response lenses
+    , decrEventCategoriesMapList
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DescribeEventCategories = DescribeEventCategories
+    { _decSourceType :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'DescribeEventCategories' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'decSourceType' @::@ 'Maybe' 'Text'
+--
+describeEventCategories :: DescribeEventCategories
+describeEventCategories = DescribeEventCategories
+    { _decSourceType = Nothing
+    }
+
+-- | The source type, such as cluster or parameter group, to which the
+-- described event categories apply. Valid values: cluster, snapshot,
+-- parameter group, and security group.
+decSourceType :: Lens' DescribeEventCategories (Maybe Text)
+decSourceType = lens _decSourceType (\s a -> s { _decSourceType = a })
+
+newtype DescribeEventCategoriesResponse = DescribeEventCategoriesResponse
+    { _decrEventCategoriesMapList :: List "EventCategoriesMap" EventCategoriesMap
+    } deriving (Eq, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeEventCategoriesResponse where
+    type Item DescribeEventCategoriesResponse = EventCategoriesMap
+
+    fromList = DescribeEventCategoriesResponse . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _decrEventCategoriesMapList
+
+-- | 'DescribeEventCategoriesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'decrEventCategoriesMapList' @::@ ['EventCategoriesMap']
+--
+describeEventCategoriesResponse :: DescribeEventCategoriesResponse
+describeEventCategoriesResponse = DescribeEventCategoriesResponse
+    { _decrEventCategoriesMapList = mempty
+    }
+
+-- | A list of event categories descriptions.
+decrEventCategoriesMapList :: Lens' DescribeEventCategoriesResponse [EventCategoriesMap]
+decrEventCategoriesMapList =
+    lens _decrEventCategoriesMapList
+        (\s a -> s { _decrEventCategoriesMapList = a })
+            . _List
+
+instance ToPath DescribeEventCategories where
+    toPath = const "/"
+
+instance ToQuery DescribeEventCategories where
+    toQuery DescribeEventCategories{..} = mconcat
+        [ "SourceType" =? _decSourceType
+        ]
+
+instance ToHeaders DescribeEventCategories
+
+instance AWSRequest DescribeEventCategories where
+    type Sv DescribeEventCategories = Redshift
+    type Rs DescribeEventCategories = DescribeEventCategoriesResponse
+
+    request  = post "DescribeEventCategories"
+    response = xmlResponse
+
+instance FromXML DescribeEventCategoriesResponse where
+    parseXML = withElement "DescribeEventCategoriesResult" $ \x -> DescribeEventCategoriesResponse
+        <$> x .@  "EventCategoriesMapList"
diff --git a/gen/Network/AWS/Redshift/DescribeEventSubscriptions.hs b/gen/Network/AWS/Redshift/DescribeEventSubscriptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeEventSubscriptions.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.Redshift.DescribeEventSubscriptions
+-- 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)
+
+-- | Lists descriptions of all the Amazon Redshift event notifications
+-- subscription for a customer account. If you specify a subscription name,
+-- lists the description for that subscription.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeEventSubscriptions.html>
+module Network.AWS.Redshift.DescribeEventSubscriptions
+    (
+    -- * Request
+      DescribeEventSubscriptions
+    -- ** Request constructor
+    , describeEventSubscriptions
+    -- ** Request lenses
+    , des1Marker
+    , des1MaxRecords
+    , des1SubscriptionName
+
+    -- * Response
+    , DescribeEventSubscriptionsResponse
+    -- ** Response constructor
+    , describeEventSubscriptionsResponse
+    -- ** Response lenses
+    , desrEventSubscriptionsList
+    , desrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeEventSubscriptions = DescribeEventSubscriptions
+    { _des1Marker           :: Maybe Text
+    , _des1MaxRecords       :: Maybe Int
+    , _des1SubscriptionName :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeEventSubscriptions' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'des1Marker' @::@ 'Maybe' 'Text'
+--
+-- * 'des1MaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'des1SubscriptionName' @::@ 'Maybe' 'Text'
+--
+describeEventSubscriptions :: DescribeEventSubscriptions
+describeEventSubscriptions = DescribeEventSubscriptions
+    { _des1SubscriptionName = Nothing
+    , _des1MaxRecords       = Nothing
+    , _des1Marker           = Nothing
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeEventSubscriptions
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+des1Marker :: Lens' DescribeEventSubscriptions (Maybe Text)
+des1Marker = lens _des1Marker (\s a -> s { _des1Marker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+des1MaxRecords :: Lens' DescribeEventSubscriptions (Maybe Int)
+des1MaxRecords = lens _des1MaxRecords (\s a -> s { _des1MaxRecords = a })
+
+-- | The name of the Amazon Redshift event notification subscription to be
+-- described.
+des1SubscriptionName :: Lens' DescribeEventSubscriptions (Maybe Text)
+des1SubscriptionName =
+    lens _des1SubscriptionName (\s a -> s { _des1SubscriptionName = a })
+
+data DescribeEventSubscriptionsResponse = DescribeEventSubscriptionsResponse
+    { _desrEventSubscriptionsList :: List "EventSubscription" EventSubscription
+    , _desrMarker                 :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeEventSubscriptionsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'desrEventSubscriptionsList' @::@ ['EventSubscription']
+--
+-- * 'desrMarker' @::@ 'Maybe' 'Text'
+--
+describeEventSubscriptionsResponse :: DescribeEventSubscriptionsResponse
+describeEventSubscriptionsResponse = DescribeEventSubscriptionsResponse
+    { _desrMarker                 = Nothing
+    , _desrEventSubscriptionsList = mempty
+    }
+
+-- | A list of event subscriptions.
+desrEventSubscriptionsList :: Lens' DescribeEventSubscriptionsResponse [EventSubscription]
+desrEventSubscriptionsList =
+    lens _desrEventSubscriptionsList
+        (\s a -> s { _desrEventSubscriptionsList = a })
+            . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+desrMarker :: Lens' DescribeEventSubscriptionsResponse (Maybe Text)
+desrMarker = lens _desrMarker (\s a -> s { _desrMarker = a })
+
+instance ToPath DescribeEventSubscriptions where
+    toPath = const "/"
+
+instance ToQuery DescribeEventSubscriptions where
+    toQuery DescribeEventSubscriptions{..} = mconcat
+        [ "Marker"           =? _des1Marker
+        , "MaxRecords"       =? _des1MaxRecords
+        , "SubscriptionName" =? _des1SubscriptionName
+        ]
+
+instance ToHeaders DescribeEventSubscriptions
+
+instance AWSRequest DescribeEventSubscriptions where
+    type Sv DescribeEventSubscriptions = Redshift
+    type Rs DescribeEventSubscriptions = DescribeEventSubscriptionsResponse
+
+    request  = post "DescribeEventSubscriptions"
+    response = xmlResponse
+
+instance FromXML DescribeEventSubscriptionsResponse where
+    parseXML = withElement "DescribeEventSubscriptionsResult" $ \x -> DescribeEventSubscriptionsResponse
+        <$> x .@  "EventSubscriptionsList"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeEventSubscriptions where
+    page rq rs
+        | stop (rq ^. des1Marker) = Nothing
+        | otherwise = (\x -> rq & des1Marker ?~ x)
+            <$> (rs ^. desrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeEvents.hs b/gen/Network/AWS/Redshift/DescribeEvents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeEvents.hs
@@ -0,0 +1,221 @@
+{-# 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.Redshift.DescribeEvents
+-- 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 events related to clusters, security groups, snapshots, and
+-- parameter groups for the past 14 days. Events specific to a particular
+-- cluster, security group, snapshot or parameter group can be obtained by
+-- providing the name as a parameter. By default, the past hour of events are
+-- returned.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeEvents.html>
+module Network.AWS.Redshift.DescribeEvents
+    (
+    -- * Request
+      DescribeEvents
+    -- ** Request constructor
+    , describeEvents
+    -- ** Request lenses
+    , deDuration
+    , deEndTime
+    , deMarker
+    , deMaxRecords
+    , deSourceIdentifier
+    , deSourceType
+    , deStartTime
+
+    -- * Response
+    , DescribeEventsResponse
+    -- ** Response constructor
+    , describeEventsResponse
+    -- ** Response lenses
+    , derEvents
+    , derMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeEvents = DescribeEvents
+    { _deDuration         :: Maybe Int
+    , _deEndTime          :: Maybe RFC822
+    , _deMarker           :: Maybe Text
+    , _deMaxRecords       :: Maybe Int
+    , _deSourceIdentifier :: Maybe Text
+    , _deSourceType       :: Maybe Text
+    , _deStartTime        :: Maybe RFC822
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeEvents' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'deDuration' @::@ 'Maybe' 'Int'
+--
+-- * 'deEndTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'deMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'deMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'deSourceIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'deSourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'deStartTime' @::@ 'Maybe' 'UTCTime'
+--
+describeEvents :: DescribeEvents
+describeEvents = DescribeEvents
+    { _deSourceIdentifier = Nothing
+    , _deSourceType       = Nothing
+    , _deStartTime        = Nothing
+    , _deEndTime          = Nothing
+    , _deDuration         = Nothing
+    , _deMaxRecords       = Nothing
+    , _deMarker           = Nothing
+    }
+
+-- | The number of minutes prior to the time of the request for which to
+-- retrieve events. For example, if the request is sent at 18:00 and you
+-- specify a duration of 60, then only events which have occurred after
+-- 17:00 will be returned. Default: 60.
+deDuration :: Lens' DescribeEvents (Maybe Int)
+deDuration = lens _deDuration (\s a -> s { _deDuration = a })
+
+-- | The end of the time interval for which to retrieve events, specified in
+-- ISO 8601 format. For more information about ISO 8601, go to the ISO8601
+-- Wikipedia page. Example: 2009-07-08T18:00Z.
+deEndTime :: Lens' DescribeEvents (Maybe UTCTime)
+deEndTime = lens _deEndTime (\s a -> s { _deEndTime = a }) . mapping _Time
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeEvents request exceed
+-- the value specified in MaxRecords, AWS returns a value in the Marker
+-- field of the response. You can retrieve the next set of response records
+-- by providing the returned marker value in the Marker parameter and
+-- retrying the request.
+deMarker :: Lens' DescribeEvents (Maybe Text)
+deMarker = lens _deMarker (\s a -> s { _deMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+deMaxRecords :: Lens' DescribeEvents (Maybe Int)
+deMaxRecords = lens _deMaxRecords (\s a -> s { _deMaxRecords = a })
+
+-- | The identifier of the event source for which events will be returned. If
+-- this parameter is not specified, then all sources are included in the
+-- response. Constraints: If SourceIdentifier is supplied, SourceType must
+-- also be provided. Specify a cluster identifier when SourceType is
+-- cluster. Specify a cluster security group name when SourceType is
+-- cluster-security-group. Specify a cluster parameter group name when
+-- SourceType is cluster-parameter-group. Specify a cluster snapshot
+-- identifier when SourceType is cluster-snapshot.
+deSourceIdentifier :: Lens' DescribeEvents (Maybe Text)
+deSourceIdentifier =
+    lens _deSourceIdentifier (\s a -> s { _deSourceIdentifier = a })
+
+-- | The event source to retrieve events for. If no value is specified, all
+-- events are returned. Constraints: If SourceType is supplied,
+-- SourceIdentifier must also be provided. Specify cluster when
+-- SourceIdentifier is a cluster identifier. Specify cluster-security-group
+-- when SourceIdentifier is a cluster security group name. Specify
+-- cluster-parameter-group when SourceIdentifier is a cluster parameter
+-- group name. Specify cluster-snapshot when SourceIdentifier is a cluster
+-- snapshot identifier.
+deSourceType :: Lens' DescribeEvents (Maybe Text)
+deSourceType = lens _deSourceType (\s a -> s { _deSourceType = a })
+
+-- | The beginning of the time interval to retrieve events for, specified in
+-- ISO 8601 format. For more information about ISO 8601, go to the ISO8601
+-- Wikipedia page. Example: 2009-07-08T18:00Z.
+deStartTime :: Lens' DescribeEvents (Maybe UTCTime)
+deStartTime = lens _deStartTime (\s a -> s { _deStartTime = a }) . mapping _Time
+
+data DescribeEventsResponse = DescribeEventsResponse
+    { _derEvents :: List "Event" Event
+    , _derMarker :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeEventsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'derEvents' @::@ ['Event']
+--
+-- * 'derMarker' @::@ 'Maybe' 'Text'
+--
+describeEventsResponse :: DescribeEventsResponse
+describeEventsResponse = DescribeEventsResponse
+    { _derMarker = Nothing
+    , _derEvents = mempty
+    }
+
+-- | A list of Event instances.
+derEvents :: Lens' DescribeEventsResponse [Event]
+derEvents = lens _derEvents (\s a -> s { _derEvents = a }) . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+derMarker :: Lens' DescribeEventsResponse (Maybe Text)
+derMarker = lens _derMarker (\s a -> s { _derMarker = a })
+
+instance ToPath DescribeEvents where
+    toPath = const "/"
+
+instance ToQuery DescribeEvents where
+    toQuery DescribeEvents{..} = mconcat
+        [ "Duration"         =? _deDuration
+        , "EndTime"          =? _deEndTime
+        , "Marker"           =? _deMarker
+        , "MaxRecords"       =? _deMaxRecords
+        , "SourceIdentifier" =? _deSourceIdentifier
+        , "SourceType"       =? _deSourceType
+        , "StartTime"        =? _deStartTime
+        ]
+
+instance ToHeaders DescribeEvents
+
+instance AWSRequest DescribeEvents where
+    type Sv DescribeEvents = Redshift
+    type Rs DescribeEvents = DescribeEventsResponse
+
+    request  = post "DescribeEvents"
+    response = xmlResponse
+
+instance FromXML DescribeEventsResponse where
+    parseXML = withElement "DescribeEventsResult" $ \x -> DescribeEventsResponse
+        <$> x .@  "Events"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeEvents where
+    page rq rs
+        | stop (rq ^. deMarker) = Nothing
+        | otherwise = (\x -> rq & deMarker ?~ x)
+            <$> (rs ^. derMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeHsmClientCertificates.hs b/gen/Network/AWS/Redshift/DescribeHsmClientCertificates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeHsmClientCertificates.hs
@@ -0,0 +1,205 @@
+{-# 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.Redshift.DescribeHsmClientCertificates
+-- 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 information about the specified HSM client certificate. If no
+-- certificate ID is specified, returns information about all the HSM
+-- certificates owned by your AWS customer account. If you specify both tag
+-- keys and tag values in the same request, Amazon Redshift returns all HSM
+-- client certificates that match any combination of the specified keys and
+-- values. For example, if you have owner and environment for tag keys, and
+-- admin and test for tag values, all HSM client certificates that have any
+-- combination of those values are returned. If both tag keys and values are
+-- omitted from the request, HSM client certificates are returned regardless
+-- of whether they have tag keys or values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeHsmClientCertificates.html>
+module Network.AWS.Redshift.DescribeHsmClientCertificates
+    (
+    -- * Request
+      DescribeHsmClientCertificates
+    -- ** Request constructor
+    , describeHsmClientCertificates
+    -- ** Request lenses
+    , dhccHsmClientCertificateIdentifier
+    , dhccMarker
+    , dhccMaxRecords
+    , dhccTagKeys
+    , dhccTagValues
+
+    -- * Response
+    , DescribeHsmClientCertificatesResponse
+    -- ** Response constructor
+    , describeHsmClientCertificatesResponse
+    -- ** Response lenses
+    , dhccrHsmClientCertificates
+    , dhccrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeHsmClientCertificates = DescribeHsmClientCertificates
+    { _dhccHsmClientCertificateIdentifier :: Maybe Text
+    , _dhccMarker                         :: Maybe Text
+    , _dhccMaxRecords                     :: Maybe Int
+    , _dhccTagKeys                        :: List "TagKey" Text
+    , _dhccTagValues                      :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeHsmClientCertificates' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhccHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dhccMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dhccMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dhccTagKeys' @::@ ['Text']
+--
+-- * 'dhccTagValues' @::@ ['Text']
+--
+describeHsmClientCertificates :: DescribeHsmClientCertificates
+describeHsmClientCertificates = DescribeHsmClientCertificates
+    { _dhccHsmClientCertificateIdentifier = Nothing
+    , _dhccMaxRecords                     = Nothing
+    , _dhccMarker                         = Nothing
+    , _dhccTagKeys                        = mempty
+    , _dhccTagValues                      = mempty
+    }
+
+-- | The identifier of a specific HSM client certificate for which you want
+-- information. If no identifier is specified, information is returned for
+-- all HSM client certificates owned by your AWS customer account.
+dhccHsmClientCertificateIdentifier :: Lens' DescribeHsmClientCertificates (Maybe Text)
+dhccHsmClientCertificateIdentifier =
+    lens _dhccHsmClientCertificateIdentifier
+        (\s a -> s { _dhccHsmClientCertificateIdentifier = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeHsmClientCertificates
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dhccMarker :: Lens' DescribeHsmClientCertificates (Maybe Text)
+dhccMarker = lens _dhccMarker (\s a -> s { _dhccMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dhccMaxRecords :: Lens' DescribeHsmClientCertificates (Maybe Int)
+dhccMaxRecords = lens _dhccMaxRecords (\s a -> s { _dhccMaxRecords = a })
+
+-- | A tag key or keys for which you want to return all matching HSM client
+-- certificates that are associated with the specified key or keys. For
+-- example, suppose that you have HSM client certificates that are tagged
+-- with keys called owner and environment. If you specify both of these tag
+-- keys in the request, Amazon Redshift returns a response with the HSM
+-- client certificates that have either or both of these tag keys associated
+-- with them.
+dhccTagKeys :: Lens' DescribeHsmClientCertificates [Text]
+dhccTagKeys = lens _dhccTagKeys (\s a -> s { _dhccTagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching HSM
+-- client certificates that are associated with the specified tag value or
+-- values. For example, suppose that you have HSM client certificates that
+-- are tagged with values called admin and test. If you specify both of
+-- these tag values in the request, Amazon Redshift returns a response with
+-- the HSM client certificates that have either or both of these tag values
+-- associated with them.
+dhccTagValues :: Lens' DescribeHsmClientCertificates [Text]
+dhccTagValues = lens _dhccTagValues (\s a -> s { _dhccTagValues = a }) . _List
+
+data DescribeHsmClientCertificatesResponse = DescribeHsmClientCertificatesResponse
+    { _dhccrHsmClientCertificates :: List "HsmClientCertificate" HsmClientCertificate
+    , _dhccrMarker                :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeHsmClientCertificatesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhccrHsmClientCertificates' @::@ ['HsmClientCertificate']
+--
+-- * 'dhccrMarker' @::@ 'Maybe' 'Text'
+--
+describeHsmClientCertificatesResponse :: DescribeHsmClientCertificatesResponse
+describeHsmClientCertificatesResponse = DescribeHsmClientCertificatesResponse
+    { _dhccrMarker                = Nothing
+    , _dhccrHsmClientCertificates = mempty
+    }
+
+-- | A list of the identifiers for one or more HSM client certificates used by
+-- Amazon Redshift clusters to store and retrieve database encryption keys
+-- in an HSM.
+dhccrHsmClientCertificates :: Lens' DescribeHsmClientCertificatesResponse [HsmClientCertificate]
+dhccrHsmClientCertificates =
+    lens _dhccrHsmClientCertificates
+        (\s a -> s { _dhccrHsmClientCertificates = a })
+            . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dhccrMarker :: Lens' DescribeHsmClientCertificatesResponse (Maybe Text)
+dhccrMarker = lens _dhccrMarker (\s a -> s { _dhccrMarker = a })
+
+instance ToPath DescribeHsmClientCertificates where
+    toPath = const "/"
+
+instance ToQuery DescribeHsmClientCertificates where
+    toQuery DescribeHsmClientCertificates{..} = mconcat
+        [ "HsmClientCertificateIdentifier" =? _dhccHsmClientCertificateIdentifier
+        , "Marker"                         =? _dhccMarker
+        , "MaxRecords"                     =? _dhccMaxRecords
+        , "TagKeys"                        =? _dhccTagKeys
+        , "TagValues"                      =? _dhccTagValues
+        ]
+
+instance ToHeaders DescribeHsmClientCertificates
+
+instance AWSRequest DescribeHsmClientCertificates where
+    type Sv DescribeHsmClientCertificates = Redshift
+    type Rs DescribeHsmClientCertificates = DescribeHsmClientCertificatesResponse
+
+    request  = post "DescribeHsmClientCertificates"
+    response = xmlResponse
+
+instance FromXML DescribeHsmClientCertificatesResponse where
+    parseXML = withElement "DescribeHsmClientCertificatesResult" $ \x -> DescribeHsmClientCertificatesResponse
+        <$> x .@  "HsmClientCertificates"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeHsmClientCertificates where
+    page rq rs
+        | stop (rq ^. dhccMarker) = Nothing
+        | otherwise = (\x -> rq & dhccMarker ?~ x)
+            <$> (rs ^. dhccrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeHsmConfigurations.hs b/gen/Network/AWS/Redshift/DescribeHsmConfigurations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeHsmConfigurations.hs
@@ -0,0 +1,202 @@
+{-# 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.Redshift.DescribeHsmConfigurations
+-- 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 information about the specified Amazon Redshift HSM configuration.
+-- If no configuration ID is specified, returns information about all the HSM
+-- configurations owned by your AWS customer account. If you specify both tag
+-- keys and tag values in the same request, Amazon Redshift returns all HSM
+-- connections that match any combination of the specified keys and values.
+-- For example, if you have owner and environment for tag keys, and admin and
+-- test for tag values, all HSM connections that have any combination of those
+-- values are returned. If both tag keys and values are omitted from the
+-- request, HSM connections are returned regardless of whether they have tag
+-- keys or values associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeHsmConfigurations.html>
+module Network.AWS.Redshift.DescribeHsmConfigurations
+    (
+    -- * Request
+      DescribeHsmConfigurations
+    -- ** Request constructor
+    , describeHsmConfigurations
+    -- ** Request lenses
+    , dhc1HsmConfigurationIdentifier
+    , dhc1Marker
+    , dhc1MaxRecords
+    , dhc1TagKeys
+    , dhc1TagValues
+
+    -- * Response
+    , DescribeHsmConfigurationsResponse
+    -- ** Response constructor
+    , describeHsmConfigurationsResponse
+    -- ** Response lenses
+    , dhcrHsmConfigurations
+    , dhcrMarker
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeHsmConfigurations = DescribeHsmConfigurations
+    { _dhc1HsmConfigurationIdentifier :: Maybe Text
+    , _dhc1Marker                     :: Maybe Text
+    , _dhc1MaxRecords                 :: Maybe Int
+    , _dhc1TagKeys                    :: List "TagKey" Text
+    , _dhc1TagValues                  :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeHsmConfigurations' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhc1HsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'dhc1Marker' @::@ 'Maybe' 'Text'
+--
+-- * 'dhc1MaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dhc1TagKeys' @::@ ['Text']
+--
+-- * 'dhc1TagValues' @::@ ['Text']
+--
+describeHsmConfigurations :: DescribeHsmConfigurations
+describeHsmConfigurations = DescribeHsmConfigurations
+    { _dhc1HsmConfigurationIdentifier = Nothing
+    , _dhc1MaxRecords                 = Nothing
+    , _dhc1Marker                     = Nothing
+    , _dhc1TagKeys                    = mempty
+    , _dhc1TagValues                  = mempty
+    }
+
+-- | The identifier of a specific Amazon Redshift HSM configuration to be
+-- described. If no identifier is specified, information is returned for all
+-- HSM configurations owned by your AWS customer account.
+dhc1HsmConfigurationIdentifier :: Lens' DescribeHsmConfigurations (Maybe Text)
+dhc1HsmConfigurationIdentifier =
+    lens _dhc1HsmConfigurationIdentifier
+        (\s a -> s { _dhc1HsmConfigurationIdentifier = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeHsmConfigurations
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+dhc1Marker :: Lens' DescribeHsmConfigurations (Maybe Text)
+dhc1Marker = lens _dhc1Marker (\s a -> s { _dhc1Marker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+dhc1MaxRecords :: Lens' DescribeHsmConfigurations (Maybe Int)
+dhc1MaxRecords = lens _dhc1MaxRecords (\s a -> s { _dhc1MaxRecords = a })
+
+-- | A tag key or keys for which you want to return all matching HSM
+-- configurations that are associated with the specified key or keys. For
+-- example, suppose that you have HSM configurations that are tagged with
+-- keys called owner and environment. If you specify both of these tag keys
+-- in the request, Amazon Redshift returns a response with the HSM
+-- configurations that have either or both of these tag keys associated with
+-- them.
+dhc1TagKeys :: Lens' DescribeHsmConfigurations [Text]
+dhc1TagKeys = lens _dhc1TagKeys (\s a -> s { _dhc1TagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching HSM
+-- configurations that are associated with the specified tag value or
+-- values. For example, suppose that you have HSM configurations that are
+-- tagged with values called admin and test. If you specify both of these
+-- tag values in the request, Amazon Redshift returns a response with the
+-- HSM configurations that have either or both of these tag values
+-- associated with them.
+dhc1TagValues :: Lens' DescribeHsmConfigurations [Text]
+dhc1TagValues = lens _dhc1TagValues (\s a -> s { _dhc1TagValues = a }) . _List
+
+data DescribeHsmConfigurationsResponse = DescribeHsmConfigurationsResponse
+    { _dhcrHsmConfigurations :: List "HsmConfiguration" HsmConfiguration
+    , _dhcrMarker            :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'DescribeHsmConfigurationsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dhcrHsmConfigurations' @::@ ['HsmConfiguration']
+--
+-- * 'dhcrMarker' @::@ 'Maybe' 'Text'
+--
+describeHsmConfigurationsResponse :: DescribeHsmConfigurationsResponse
+describeHsmConfigurationsResponse = DescribeHsmConfigurationsResponse
+    { _dhcrMarker            = Nothing
+    , _dhcrHsmConfigurations = mempty
+    }
+
+-- | A list of Amazon Redshift HSM configurations.
+dhcrHsmConfigurations :: Lens' DescribeHsmConfigurationsResponse [HsmConfiguration]
+dhcrHsmConfigurations =
+    lens _dhcrHsmConfigurations (\s a -> s { _dhcrHsmConfigurations = a })
+        . _List
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dhcrMarker :: Lens' DescribeHsmConfigurationsResponse (Maybe Text)
+dhcrMarker = lens _dhcrMarker (\s a -> s { _dhcrMarker = a })
+
+instance ToPath DescribeHsmConfigurations where
+    toPath = const "/"
+
+instance ToQuery DescribeHsmConfigurations where
+    toQuery DescribeHsmConfigurations{..} = mconcat
+        [ "HsmConfigurationIdentifier" =? _dhc1HsmConfigurationIdentifier
+        , "Marker"                     =? _dhc1Marker
+        , "MaxRecords"                 =? _dhc1MaxRecords
+        , "TagKeys"                    =? _dhc1TagKeys
+        , "TagValues"                  =? _dhc1TagValues
+        ]
+
+instance ToHeaders DescribeHsmConfigurations
+
+instance AWSRequest DescribeHsmConfigurations where
+    type Sv DescribeHsmConfigurations = Redshift
+    type Rs DescribeHsmConfigurations = DescribeHsmConfigurationsResponse
+
+    request  = post "DescribeHsmConfigurations"
+    response = xmlResponse
+
+instance FromXML DescribeHsmConfigurationsResponse where
+    parseXML = withElement "DescribeHsmConfigurationsResult" $ \x -> DescribeHsmConfigurationsResponse
+        <$> x .@  "HsmConfigurations"
+        <*> x .@? "Marker"
+
+instance AWSPager DescribeHsmConfigurations where
+    page rq rs
+        | stop (rq ^. dhc1Marker) = Nothing
+        | otherwise = (\x -> rq & dhc1Marker ?~ x)
+            <$> (rs ^. dhcrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeLoggingStatus.hs b/gen/Network/AWS/Redshift/DescribeLoggingStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeLoggingStatus.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.Redshift.DescribeLoggingStatus
+-- 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)
+
+-- | Describes whether information, such as queries and connection attempts, is
+-- being logged for the specified Amazon Redshift cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeLoggingStatus.html>
+module Network.AWS.Redshift.DescribeLoggingStatus
+    (
+    -- * Request
+      DescribeLoggingStatus
+    -- ** Request constructor
+    , describeLoggingStatus
+    -- ** Request lenses
+    , dlsClusterIdentifier
+
+    -- * Response
+    , DescribeLoggingStatusResponse
+    -- ** Response constructor
+    , describeLoggingStatusResponse
+    -- ** Response lenses
+    , dlsrBucketName
+    , dlsrLastFailureMessage
+    , dlsrLastFailureTime
+    , dlsrLastSuccessfulDeliveryTime
+    , dlsrLoggingEnabled
+    , dlsrS3KeyPrefix
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DescribeLoggingStatus = DescribeLoggingStatus
+    { _dlsClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeLoggingStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dlsClusterIdentifier' @::@ 'Text'
+--
+describeLoggingStatus :: Text -- ^ 'dlsClusterIdentifier'
+                      -> DescribeLoggingStatus
+describeLoggingStatus p1 = DescribeLoggingStatus
+    { _dlsClusterIdentifier = p1
+    }
+
+-- | The identifier of the cluster to get the logging status from. Example:
+-- examplecluster.
+dlsClusterIdentifier :: Lens' DescribeLoggingStatus Text
+dlsClusterIdentifier =
+    lens _dlsClusterIdentifier (\s a -> s { _dlsClusterIdentifier = a })
+
+data DescribeLoggingStatusResponse = DescribeLoggingStatusResponse
+    { _dlsrBucketName                 :: Maybe Text
+    , _dlsrLastFailureMessage         :: Maybe Text
+    , _dlsrLastFailureTime            :: Maybe RFC822
+    , _dlsrLastSuccessfulDeliveryTime :: Maybe RFC822
+    , _dlsrLoggingEnabled             :: Maybe Bool
+    , _dlsrS3KeyPrefix                :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeLoggingStatusResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dlsrBucketName' @::@ 'Maybe' 'Text'
+--
+-- * 'dlsrLastFailureMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'dlsrLastFailureTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dlsrLastSuccessfulDeliveryTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dlsrLoggingEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'dlsrS3KeyPrefix' @::@ 'Maybe' 'Text'
+--
+describeLoggingStatusResponse :: DescribeLoggingStatusResponse
+describeLoggingStatusResponse = DescribeLoggingStatusResponse
+    { _dlsrLoggingEnabled             = Nothing
+    , _dlsrBucketName                 = Nothing
+    , _dlsrS3KeyPrefix                = Nothing
+    , _dlsrLastSuccessfulDeliveryTime = Nothing
+    , _dlsrLastFailureTime            = Nothing
+    , _dlsrLastFailureMessage         = Nothing
+    }
+
+-- | The name of the S3 bucket where the log files are stored.
+dlsrBucketName :: Lens' DescribeLoggingStatusResponse (Maybe Text)
+dlsrBucketName = lens _dlsrBucketName (\s a -> s { _dlsrBucketName = a })
+
+-- | The message indicating that logs failed to be delivered.
+dlsrLastFailureMessage :: Lens' DescribeLoggingStatusResponse (Maybe Text)
+dlsrLastFailureMessage =
+    lens _dlsrLastFailureMessage (\s a -> s { _dlsrLastFailureMessage = a })
+
+-- | The last time when logs failed to be delivered.
+dlsrLastFailureTime :: Lens' DescribeLoggingStatusResponse (Maybe UTCTime)
+dlsrLastFailureTime =
+    lens _dlsrLastFailureTime (\s a -> s { _dlsrLastFailureTime = a })
+        . mapping _Time
+
+-- | The last time when logs were delivered.
+dlsrLastSuccessfulDeliveryTime :: Lens' DescribeLoggingStatusResponse (Maybe UTCTime)
+dlsrLastSuccessfulDeliveryTime =
+    lens _dlsrLastSuccessfulDeliveryTime
+        (\s a -> s { _dlsrLastSuccessfulDeliveryTime = a })
+            . mapping _Time
+
+-- | true if logging is on, false if logging is off.
+dlsrLoggingEnabled :: Lens' DescribeLoggingStatusResponse (Maybe Bool)
+dlsrLoggingEnabled =
+    lens _dlsrLoggingEnabled (\s a -> s { _dlsrLoggingEnabled = a })
+
+-- | The prefix applied to the log file names.
+dlsrS3KeyPrefix :: Lens' DescribeLoggingStatusResponse (Maybe Text)
+dlsrS3KeyPrefix = lens _dlsrS3KeyPrefix (\s a -> s { _dlsrS3KeyPrefix = a })
+
+instance ToPath DescribeLoggingStatus where
+    toPath = const "/"
+
+instance ToQuery DescribeLoggingStatus where
+    toQuery DescribeLoggingStatus{..} = mconcat
+        [ "ClusterIdentifier" =? _dlsClusterIdentifier
+        ]
+
+instance ToHeaders DescribeLoggingStatus
+
+instance AWSRequest DescribeLoggingStatus where
+    type Sv DescribeLoggingStatus = Redshift
+    type Rs DescribeLoggingStatus = DescribeLoggingStatusResponse
+
+    request  = post "DescribeLoggingStatus"
+    response = xmlResponse
+
+instance FromXML DescribeLoggingStatusResponse where
+    parseXML = withElement "DescribeLoggingStatusResult" $ \x -> DescribeLoggingStatusResponse
+        <$> x .@? "BucketName"
+        <*> x .@? "LastFailureMessage"
+        <*> x .@? "LastFailureTime"
+        <*> x .@? "LastSuccessfulDeliveryTime"
+        <*> x .@? "LoggingEnabled"
+        <*> x .@? "S3KeyPrefix"
diff --git a/gen/Network/AWS/Redshift/DescribeOrderableClusterOptions.hs b/gen/Network/AWS/Redshift/DescribeOrderableClusterOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeOrderableClusterOptions.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.Redshift.DescribeOrderableClusterOptions
+-- 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 orderable cluster options. Before you create a new
+-- cluster you can use this operation to find what options are available, such
+-- as the EC2 Availability Zones (AZ) in the specific AWS region that you can
+-- specify, and the node types you can request. The node types differ by
+-- available storage, memory, CPU and price. With the cost involved you might
+-- want to obtain a list of cluster options in the specific region and specify
+-- values when creating a cluster. For more information about managing
+-- clusters, go to Amazon Redshift Clusters in the Amazon Redshift Cluster
+-- Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeOrderableClusterOptions.html>
+module Network.AWS.Redshift.DescribeOrderableClusterOptions
+    (
+    -- * Request
+      DescribeOrderableClusterOptions
+    -- ** Request constructor
+    , describeOrderableClusterOptions
+    -- ** Request lenses
+    , docoClusterVersion
+    , docoMarker
+    , docoMaxRecords
+    , docoNodeType
+
+    -- * Response
+    , DescribeOrderableClusterOptionsResponse
+    -- ** Response constructor
+    , describeOrderableClusterOptionsResponse
+    -- ** Response lenses
+    , docorMarker
+    , docorOrderableClusterOptions
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeOrderableClusterOptions = DescribeOrderableClusterOptions
+    { _docoClusterVersion :: Maybe Text
+    , _docoMarker         :: Maybe Text
+    , _docoMaxRecords     :: Maybe Int
+    , _docoNodeType       :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeOrderableClusterOptions' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'docoClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'docoMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'docoMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'docoNodeType' @::@ 'Maybe' 'Text'
+--
+describeOrderableClusterOptions :: DescribeOrderableClusterOptions
+describeOrderableClusterOptions = DescribeOrderableClusterOptions
+    { _docoClusterVersion = Nothing
+    , _docoNodeType       = Nothing
+    , _docoMaxRecords     = Nothing
+    , _docoMarker         = Nothing
+    }
+
+-- | The version filter value. Specify this parameter to show only the
+-- available offerings matching the specified version. Default: All
+-- versions. Constraints: Must be one of the version returned from
+-- DescribeClusterVersions.
+docoClusterVersion :: Lens' DescribeOrderableClusterOptions (Maybe Text)
+docoClusterVersion =
+    lens _docoClusterVersion (\s a -> s { _docoClusterVersion = a })
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a
+-- DescribeOrderableClusterOptions request exceed the value specified in
+-- MaxRecords, AWS returns a value in the Marker field of the response. You
+-- can retrieve the next set of response records by providing the returned
+-- marker value in the Marker parameter and retrying the request.
+docoMarker :: Lens' DescribeOrderableClusterOptions (Maybe Text)
+docoMarker = lens _docoMarker (\s a -> s { _docoMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+docoMaxRecords :: Lens' DescribeOrderableClusterOptions (Maybe Int)
+docoMaxRecords = lens _docoMaxRecords (\s a -> s { _docoMaxRecords = a })
+
+-- | The node type filter value. Specify this parameter to show only the
+-- available offerings matching the specified node type.
+docoNodeType :: Lens' DescribeOrderableClusterOptions (Maybe Text)
+docoNodeType = lens _docoNodeType (\s a -> s { _docoNodeType = a })
+
+data DescribeOrderableClusterOptionsResponse = DescribeOrderableClusterOptionsResponse
+    { _docorMarker                  :: Maybe Text
+    , _docorOrderableClusterOptions :: List "OrderableClusterOption" OrderableClusterOption
+    } deriving (Eq, Show)
+
+-- | 'DescribeOrderableClusterOptionsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'docorMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'docorOrderableClusterOptions' @::@ ['OrderableClusterOption']
+--
+describeOrderableClusterOptionsResponse :: DescribeOrderableClusterOptionsResponse
+describeOrderableClusterOptionsResponse = DescribeOrderableClusterOptionsResponse
+    { _docorOrderableClusterOptions = mempty
+    , _docorMarker                  = Nothing
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+docorMarker :: Lens' DescribeOrderableClusterOptionsResponse (Maybe Text)
+docorMarker = lens _docorMarker (\s a -> s { _docorMarker = a })
+
+-- | An OrderableClusterOption structure containing information about
+-- orderable options for the Cluster.
+docorOrderableClusterOptions :: Lens' DescribeOrderableClusterOptionsResponse [OrderableClusterOption]
+docorOrderableClusterOptions =
+    lens _docorOrderableClusterOptions
+        (\s a -> s { _docorOrderableClusterOptions = a })
+            . _List
+
+instance ToPath DescribeOrderableClusterOptions where
+    toPath = const "/"
+
+instance ToQuery DescribeOrderableClusterOptions where
+    toQuery DescribeOrderableClusterOptions{..} = mconcat
+        [ "ClusterVersion" =? _docoClusterVersion
+        , "Marker"         =? _docoMarker
+        , "MaxRecords"     =? _docoMaxRecords
+        , "NodeType"       =? _docoNodeType
+        ]
+
+instance ToHeaders DescribeOrderableClusterOptions
+
+instance AWSRequest DescribeOrderableClusterOptions where
+    type Sv DescribeOrderableClusterOptions = Redshift
+    type Rs DescribeOrderableClusterOptions = DescribeOrderableClusterOptionsResponse
+
+    request  = post "DescribeOrderableClusterOptions"
+    response = xmlResponse
+
+instance FromXML DescribeOrderableClusterOptionsResponse where
+    parseXML = withElement "DescribeOrderableClusterOptionsResult" $ \x -> DescribeOrderableClusterOptionsResponse
+        <$> x .@? "Marker"
+        <*> x .@  "OrderableClusterOptions"
+
+instance AWSPager DescribeOrderableClusterOptions where
+    page rq rs
+        | stop (rq ^. docoMarker) = Nothing
+        | otherwise = (\x -> rq & docoMarker ?~ x)
+            <$> (rs ^. docorMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeReservedNodeOfferings.hs b/gen/Network/AWS/Redshift/DescribeReservedNodeOfferings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeReservedNodeOfferings.hs
@@ -0,0 +1,168 @@
+{-# 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.Redshift.DescribeReservedNodeOfferings
+-- 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 the available reserved node offerings by Amazon Redshift
+-- with their descriptions including the node type, the fixed and recurring
+-- costs of reserving the node and duration the node will be reserved for you.
+-- These descriptions help you determine which reserve node offering you want
+-- to purchase. You then use the unique offering ID in you call to
+-- PurchaseReservedNodeOffering to reserve one or more nodes for your Amazon
+-- Redshift cluster. For more information about managing parameter groups, go
+-- to Purchasing Reserved Nodes in the Amazon Redshift Cluster Management
+-- Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeReservedNodeOfferings.html>
+module Network.AWS.Redshift.DescribeReservedNodeOfferings
+    (
+    -- * Request
+      DescribeReservedNodeOfferings
+    -- ** Request constructor
+    , describeReservedNodeOfferings
+    -- ** Request lenses
+    , drnoMarker
+    , drnoMaxRecords
+    , drnoReservedNodeOfferingId
+
+    -- * Response
+    , DescribeReservedNodeOfferingsResponse
+    -- ** Response constructor
+    , describeReservedNodeOfferingsResponse
+    -- ** Response lenses
+    , drnorMarker
+    , drnorReservedNodeOfferings
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeReservedNodeOfferings = DescribeReservedNodeOfferings
+    { _drnoMarker                 :: Maybe Text
+    , _drnoMaxRecords             :: Maybe Int
+    , _drnoReservedNodeOfferingId :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeReservedNodeOfferings' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drnoMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'drnoMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'drnoReservedNodeOfferingId' @::@ 'Maybe' 'Text'
+--
+describeReservedNodeOfferings :: DescribeReservedNodeOfferings
+describeReservedNodeOfferings = DescribeReservedNodeOfferings
+    { _drnoReservedNodeOfferingId = Nothing
+    , _drnoMaxRecords             = Nothing
+    , _drnoMarker                 = Nothing
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeReservedNodeOfferings
+-- request exceed the value specified in MaxRecords, AWS returns a value in
+-- the Marker field of the response. You can retrieve the next set of
+-- response records by providing the returned marker value in the Marker
+-- parameter and retrying the request.
+drnoMarker :: Lens' DescribeReservedNodeOfferings (Maybe Text)
+drnoMarker = lens _drnoMarker (\s a -> s { _drnoMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+drnoMaxRecords :: Lens' DescribeReservedNodeOfferings (Maybe Int)
+drnoMaxRecords = lens _drnoMaxRecords (\s a -> s { _drnoMaxRecords = a })
+
+-- | The unique identifier for the offering.
+drnoReservedNodeOfferingId :: Lens' DescribeReservedNodeOfferings (Maybe Text)
+drnoReservedNodeOfferingId =
+    lens _drnoReservedNodeOfferingId
+        (\s a -> s { _drnoReservedNodeOfferingId = a })
+
+data DescribeReservedNodeOfferingsResponse = DescribeReservedNodeOfferingsResponse
+    { _drnorMarker                :: Maybe Text
+    , _drnorReservedNodeOfferings :: List "ReservedNodeOffering" ReservedNodeOffering
+    } deriving (Eq, Show)
+
+-- | 'DescribeReservedNodeOfferingsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drnorMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'drnorReservedNodeOfferings' @::@ ['ReservedNodeOffering']
+--
+describeReservedNodeOfferingsResponse :: DescribeReservedNodeOfferingsResponse
+describeReservedNodeOfferingsResponse = DescribeReservedNodeOfferingsResponse
+    { _drnorMarker                = Nothing
+    , _drnorReservedNodeOfferings = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+drnorMarker :: Lens' DescribeReservedNodeOfferingsResponse (Maybe Text)
+drnorMarker = lens _drnorMarker (\s a -> s { _drnorMarker = a })
+
+-- | A list of reserved node offerings.
+drnorReservedNodeOfferings :: Lens' DescribeReservedNodeOfferingsResponse [ReservedNodeOffering]
+drnorReservedNodeOfferings =
+    lens _drnorReservedNodeOfferings
+        (\s a -> s { _drnorReservedNodeOfferings = a })
+            . _List
+
+instance ToPath DescribeReservedNodeOfferings where
+    toPath = const "/"
+
+instance ToQuery DescribeReservedNodeOfferings where
+    toQuery DescribeReservedNodeOfferings{..} = mconcat
+        [ "Marker"                 =? _drnoMarker
+        , "MaxRecords"             =? _drnoMaxRecords
+        , "ReservedNodeOfferingId" =? _drnoReservedNodeOfferingId
+        ]
+
+instance ToHeaders DescribeReservedNodeOfferings
+
+instance AWSRequest DescribeReservedNodeOfferings where
+    type Sv DescribeReservedNodeOfferings = Redshift
+    type Rs DescribeReservedNodeOfferings = DescribeReservedNodeOfferingsResponse
+
+    request  = post "DescribeReservedNodeOfferings"
+    response = xmlResponse
+
+instance FromXML DescribeReservedNodeOfferingsResponse where
+    parseXML = withElement "DescribeReservedNodeOfferingsResult" $ \x -> DescribeReservedNodeOfferingsResponse
+        <$> x .@? "Marker"
+        <*> x .@  "ReservedNodeOfferings"
+
+instance AWSPager DescribeReservedNodeOfferings where
+    page rq rs
+        | stop (rq ^. drnoMarker) = Nothing
+        | otherwise = (\x -> rq & drnoMarker ?~ x)
+            <$> (rs ^. drnorMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeReservedNodes.hs b/gen/Network/AWS/Redshift/DescribeReservedNodes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeReservedNodes.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.Redshift.DescribeReservedNodes
+-- 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 the descriptions of the reserved nodes.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeReservedNodes.html>
+module Network.AWS.Redshift.DescribeReservedNodes
+    (
+    -- * Request
+      DescribeReservedNodes
+    -- ** Request constructor
+    , describeReservedNodes
+    -- ** Request lenses
+    , drnMarker
+    , drnMaxRecords
+    , drnReservedNodeId
+
+    -- * Response
+    , DescribeReservedNodesResponse
+    -- ** Response constructor
+    , describeReservedNodesResponse
+    -- ** Response lenses
+    , drnrMarker
+    , drnrReservedNodes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeReservedNodes = DescribeReservedNodes
+    { _drnMarker         :: Maybe Text
+    , _drnMaxRecords     :: Maybe Int
+    , _drnReservedNodeId :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeReservedNodes' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drnMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'drnMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'drnReservedNodeId' @::@ 'Maybe' 'Text'
+--
+describeReservedNodes :: DescribeReservedNodes
+describeReservedNodes = DescribeReservedNodes
+    { _drnReservedNodeId = Nothing
+    , _drnMaxRecords     = Nothing
+    , _drnMarker         = Nothing
+    }
+
+-- | An optional parameter that specifies the starting point to return a set
+-- of response records. When the results of a DescribeReservedNodes request
+-- exceed the value specified in MaxRecords, AWS returns a value in the
+-- Marker field of the response. You can retrieve the next set of response
+-- records by providing the returned marker value in the Marker parameter
+-- and retrying the request.
+drnMarker :: Lens' DescribeReservedNodes (Maybe Text)
+drnMarker = lens _drnMarker (\s a -> s { _drnMarker = a })
+
+-- | The maximum number of response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value. Default: 100 Constraints: minimum 20, maximum 100.
+drnMaxRecords :: Lens' DescribeReservedNodes (Maybe Int)
+drnMaxRecords = lens _drnMaxRecords (\s a -> s { _drnMaxRecords = a })
+
+-- | Identifier for the node reservation.
+drnReservedNodeId :: Lens' DescribeReservedNodes (Maybe Text)
+drnReservedNodeId =
+    lens _drnReservedNodeId (\s a -> s { _drnReservedNodeId = a })
+
+data DescribeReservedNodesResponse = DescribeReservedNodesResponse
+    { _drnrMarker        :: Maybe Text
+    , _drnrReservedNodes :: List "ReservedNode" ReservedNode
+    } deriving (Eq, Show)
+
+-- | 'DescribeReservedNodesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drnrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'drnrReservedNodes' @::@ ['ReservedNode']
+--
+describeReservedNodesResponse :: DescribeReservedNodesResponse
+describeReservedNodesResponse = DescribeReservedNodesResponse
+    { _drnrMarker        = Nothing
+    , _drnrReservedNodes = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+drnrMarker :: Lens' DescribeReservedNodesResponse (Maybe Text)
+drnrMarker = lens _drnrMarker (\s a -> s { _drnrMarker = a })
+
+-- | The list of reserved nodes.
+drnrReservedNodes :: Lens' DescribeReservedNodesResponse [ReservedNode]
+drnrReservedNodes =
+    lens _drnrReservedNodes (\s a -> s { _drnrReservedNodes = a })
+        . _List
+
+instance ToPath DescribeReservedNodes where
+    toPath = const "/"
+
+instance ToQuery DescribeReservedNodes where
+    toQuery DescribeReservedNodes{..} = mconcat
+        [ "Marker"         =? _drnMarker
+        , "MaxRecords"     =? _drnMaxRecords
+        , "ReservedNodeId" =? _drnReservedNodeId
+        ]
+
+instance ToHeaders DescribeReservedNodes
+
+instance AWSRequest DescribeReservedNodes where
+    type Sv DescribeReservedNodes = Redshift
+    type Rs DescribeReservedNodes = DescribeReservedNodesResponse
+
+    request  = post "DescribeReservedNodes"
+    response = xmlResponse
+
+instance FromXML DescribeReservedNodesResponse where
+    parseXML = withElement "DescribeReservedNodesResult" $ \x -> DescribeReservedNodesResponse
+        <$> x .@? "Marker"
+        <*> x .@  "ReservedNodes"
+
+instance AWSPager DescribeReservedNodes where
+    page rq rs
+        | stop (rq ^. drnMarker) = Nothing
+        | otherwise = (\x -> rq & drnMarker ?~ x)
+            <$> (rs ^. drnrMarker)
diff --git a/gen/Network/AWS/Redshift/DescribeResize.hs b/gen/Network/AWS/Redshift/DescribeResize.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeResize.hs
@@ -0,0 +1,264 @@
+{-# 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.Redshift.DescribeResize
+-- 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 information about the last resize operation for the specified
+-- cluster. If no resize operation has ever been initiated for the specified
+-- cluster, a HTTP 404 error is returned. If a resize operation was initiated
+-- and completed, the status of the resize remains as SUCCEEDED until the next
+-- resize. A resize operation can be requested using ModifyCluster and
+-- specifying a different number or type of nodes for the cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeResize.html>
+module Network.AWS.Redshift.DescribeResize
+    (
+    -- * Request
+      DescribeResize
+    -- ** Request constructor
+    , describeResize
+    -- ** Request lenses
+    , drClusterIdentifier
+
+    -- * Response
+    , DescribeResizeResponse
+    -- ** Response constructor
+    , describeResizeResponse
+    -- ** Response lenses
+    , drrAvgResizeRateInMegaBytesPerSecond
+    , drrElapsedTimeInSeconds
+    , drrEstimatedTimeToCompletionInSeconds
+    , drrImportTablesCompleted
+    , drrImportTablesInProgress
+    , drrImportTablesNotStarted
+    , drrProgressInMegaBytes
+    , drrStatus
+    , drrTargetClusterType
+    , drrTargetNodeType
+    , drrTargetNumberOfNodes
+    , drrTotalResizeDataInMegaBytes
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DescribeResize = DescribeResize
+    { _drClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DescribeResize' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drClusterIdentifier' @::@ 'Text'
+--
+describeResize :: Text -- ^ 'drClusterIdentifier'
+               -> DescribeResize
+describeResize p1 = DescribeResize
+    { _drClusterIdentifier = p1
+    }
+
+-- | The unique identifier of a cluster whose resize progress you are
+-- requesting. This parameter is case-sensitive. By default, resize
+-- operations for all clusters defined for an AWS account are returned.
+drClusterIdentifier :: Lens' DescribeResize Text
+drClusterIdentifier =
+    lens _drClusterIdentifier (\s a -> s { _drClusterIdentifier = a })
+
+data DescribeResizeResponse = DescribeResizeResponse
+    { _drrAvgResizeRateInMegaBytesPerSecond  :: Maybe Double
+    , _drrElapsedTimeInSeconds               :: Maybe Integer
+    , _drrEstimatedTimeToCompletionInSeconds :: Maybe Integer
+    , _drrImportTablesCompleted              :: List "ImportTablesCompleted" Text
+    , _drrImportTablesInProgress             :: List "ImportTablesInProgress" Text
+    , _drrImportTablesNotStarted             :: List "ImportTablesNotStarted" Text
+    , _drrProgressInMegaBytes                :: Maybe Integer
+    , _drrStatus                             :: Maybe Text
+    , _drrTargetClusterType                  :: Maybe Text
+    , _drrTargetNodeType                     :: Maybe Text
+    , _drrTargetNumberOfNodes                :: Maybe Int
+    , _drrTotalResizeDataInMegaBytes         :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeResizeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'drrAvgResizeRateInMegaBytesPerSecond' @::@ 'Maybe' 'Double'
+--
+-- * 'drrElapsedTimeInSeconds' @::@ 'Maybe' 'Integer'
+--
+-- * 'drrEstimatedTimeToCompletionInSeconds' @::@ 'Maybe' 'Integer'
+--
+-- * 'drrImportTablesCompleted' @::@ ['Text']
+--
+-- * 'drrImportTablesInProgress' @::@ ['Text']
+--
+-- * 'drrImportTablesNotStarted' @::@ ['Text']
+--
+-- * 'drrProgressInMegaBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'drrStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'drrTargetClusterType' @::@ 'Maybe' 'Text'
+--
+-- * 'drrTargetNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'drrTargetNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+-- * 'drrTotalResizeDataInMegaBytes' @::@ 'Maybe' 'Integer'
+--
+describeResizeResponse :: DescribeResizeResponse
+describeResizeResponse = DescribeResizeResponse
+    { _drrTargetNodeType                     = Nothing
+    , _drrTargetNumberOfNodes                = Nothing
+    , _drrTargetClusterType                  = Nothing
+    , _drrStatus                             = Nothing
+    , _drrImportTablesCompleted              = mempty
+    , _drrImportTablesInProgress             = mempty
+    , _drrImportTablesNotStarted             = mempty
+    , _drrAvgResizeRateInMegaBytesPerSecond  = Nothing
+    , _drrTotalResizeDataInMegaBytes         = Nothing
+    , _drrProgressInMegaBytes                = Nothing
+    , _drrElapsedTimeInSeconds               = Nothing
+    , _drrEstimatedTimeToCompletionInSeconds = Nothing
+    }
+
+-- | The average rate of the resize operation over the last few minutes,
+-- measured in megabytes per second. After the resize operation completes,
+-- this value shows the average rate of the entire resize operation.
+drrAvgResizeRateInMegaBytesPerSecond :: Lens' DescribeResizeResponse (Maybe Double)
+drrAvgResizeRateInMegaBytesPerSecond =
+    lens _drrAvgResizeRateInMegaBytesPerSecond
+        (\s a -> s { _drrAvgResizeRateInMegaBytesPerSecond = a })
+
+-- | The amount of seconds that have elapsed since the resize operation began.
+-- After the resize operation completes, this value shows the total actual
+-- time, in seconds, for the resize operation.
+drrElapsedTimeInSeconds :: Lens' DescribeResizeResponse (Maybe Integer)
+drrElapsedTimeInSeconds =
+    lens _drrElapsedTimeInSeconds (\s a -> s { _drrElapsedTimeInSeconds = a })
+
+-- | The estimated time remaining, in seconds, until the resize operation is
+-- complete. This value is calculated based on the average resize rate and
+-- the estimated amount of data remaining to be processed. Once the resize
+-- operation is complete, this value will be 0.
+drrEstimatedTimeToCompletionInSeconds :: Lens' DescribeResizeResponse (Maybe Integer)
+drrEstimatedTimeToCompletionInSeconds =
+    lens _drrEstimatedTimeToCompletionInSeconds
+        (\s a -> s { _drrEstimatedTimeToCompletionInSeconds = a })
+
+-- | The names of tables that have been completely imported . Valid Values:
+-- List of table names.
+drrImportTablesCompleted :: Lens' DescribeResizeResponse [Text]
+drrImportTablesCompleted =
+    lens _drrImportTablesCompleted
+        (\s a -> s { _drrImportTablesCompleted = a })
+            . _List
+
+-- | The names of tables that are being currently imported. Valid Values: List
+-- of table names.
+drrImportTablesInProgress :: Lens' DescribeResizeResponse [Text]
+drrImportTablesInProgress =
+    lens _drrImportTablesInProgress
+        (\s a -> s { _drrImportTablesInProgress = a })
+            . _List
+
+-- | The names of tables that have not been yet imported. Valid Values: List
+-- of table names.
+drrImportTablesNotStarted :: Lens' DescribeResizeResponse [Text]
+drrImportTablesNotStarted =
+    lens _drrImportTablesNotStarted
+        (\s a -> s { _drrImportTablesNotStarted = a })
+            . _List
+
+-- | While the resize operation is in progress, this value shows the current
+-- amount of data, in megabytes, that has been processed so far. When the
+-- resize operation is complete, this value shows the total amount of data,
+-- in megabytes, on the cluster, which may be more or less than
+-- TotalResizeDataInMegaBytes (the estimated total amount of data before
+-- resize).
+drrProgressInMegaBytes :: Lens' DescribeResizeResponse (Maybe Integer)
+drrProgressInMegaBytes =
+    lens _drrProgressInMegaBytes (\s a -> s { _drrProgressInMegaBytes = a })
+
+-- | The status of the resize operation. Valid Values: NONE | IN_PROGRESS |
+-- FAILED | SUCCEEDED.
+drrStatus :: Lens' DescribeResizeResponse (Maybe Text)
+drrStatus = lens _drrStatus (\s a -> s { _drrStatus = a })
+
+-- | The cluster type after the resize operation is complete. Valid Values:
+-- multi-node | single-node.
+drrTargetClusterType :: Lens' DescribeResizeResponse (Maybe Text)
+drrTargetClusterType =
+    lens _drrTargetClusterType (\s a -> s { _drrTargetClusterType = a })
+
+-- | The node type that the cluster will have after the resize operation is
+-- complete.
+drrTargetNodeType :: Lens' DescribeResizeResponse (Maybe Text)
+drrTargetNodeType =
+    lens _drrTargetNodeType (\s a -> s { _drrTargetNodeType = a })
+
+-- | The number of nodes that the cluster will have after the resize operation
+-- is complete.
+drrTargetNumberOfNodes :: Lens' DescribeResizeResponse (Maybe Int)
+drrTargetNumberOfNodes =
+    lens _drrTargetNumberOfNodes (\s a -> s { _drrTargetNumberOfNodes = a })
+
+-- | The estimated total amount of data, in megabytes, on the cluster before
+-- the resize operation began.
+drrTotalResizeDataInMegaBytes :: Lens' DescribeResizeResponse (Maybe Integer)
+drrTotalResizeDataInMegaBytes =
+    lens _drrTotalResizeDataInMegaBytes
+        (\s a -> s { _drrTotalResizeDataInMegaBytes = a })
+
+instance ToPath DescribeResize where
+    toPath = const "/"
+
+instance ToQuery DescribeResize where
+    toQuery DescribeResize{..} = mconcat
+        [ "ClusterIdentifier" =? _drClusterIdentifier
+        ]
+
+instance ToHeaders DescribeResize
+
+instance AWSRequest DescribeResize where
+    type Sv DescribeResize = Redshift
+    type Rs DescribeResize = DescribeResizeResponse
+
+    request  = post "DescribeResize"
+    response = xmlResponse
+
+instance FromXML DescribeResizeResponse where
+    parseXML = withElement "DescribeResizeResult" $ \x -> DescribeResizeResponse
+        <$> x .@? "AvgResizeRateInMegaBytesPerSecond"
+        <*> x .@? "ElapsedTimeInSeconds"
+        <*> x .@? "EstimatedTimeToCompletionInSeconds"
+        <*> x .@  "ImportTablesCompleted"
+        <*> x .@  "ImportTablesInProgress"
+        <*> x .@  "ImportTablesNotStarted"
+        <*> x .@? "ProgressInMegaBytes"
+        <*> x .@? "Status"
+        <*> x .@? "TargetClusterType"
+        <*> x .@? "TargetNodeType"
+        <*> x .@? "TargetNumberOfNodes"
+        <*> x .@? "TotalResizeDataInMegaBytes"
diff --git a/gen/Network/AWS/Redshift/DescribeTags.hs b/gen/Network/AWS/Redshift/DescribeTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DescribeTags.hs
@@ -0,0 +1,210 @@
+{-# 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.Redshift.DescribeTags
+-- 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 tags. You can return tags from a specific resource by
+-- specifying an ARN, or you can return all tags for a given type of resource,
+-- such as clusters, snapshots, and so on. The following are limitations for
+-- DescribeTags: You cannot specify an ARN and a resource-type value together
+-- in the same request. You cannot use the MaxRecords and Marker parameters
+-- together with the ARN parameter. The MaxRecords parameter can be a range
+-- from 10 to 50 results to return in a request. If you specify both tag keys
+-- and tag values in the same request, Amazon Redshift returns all resources
+-- that match any combination of the specified keys and values. For example,
+-- if you have owner and environment for tag keys, and admin and test for tag
+-- values, all resources that have any combination of those values are
+-- returned. If both tag keys and values are omitted from the request,
+-- resources are returned regardless of whether they have tag keys or values
+-- associated with them.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeTags.html>
+module Network.AWS.Redshift.DescribeTags
+    (
+    -- * Request
+      DescribeTags
+    -- ** Request constructor
+    , describeTags
+    -- ** Request lenses
+    , dtMarker
+    , dtMaxRecords
+    , dtResourceName
+    , dtResourceType
+    , dtTagKeys
+    , dtTagValues
+
+    -- * Response
+    , DescribeTagsResponse
+    -- ** Response constructor
+    , describeTagsResponse
+    -- ** Response lenses
+    , dtrMarker
+    , dtrTaggedResources
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data DescribeTags = DescribeTags
+    { _dtMarker       :: Maybe Text
+    , _dtMaxRecords   :: Maybe Int
+    , _dtResourceName :: Maybe Text
+    , _dtResourceType :: Maybe Text
+    , _dtTagKeys      :: List "TagKey" Text
+    , _dtTagValues    :: List "TagValue" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DescribeTags' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtMaxRecords' @::@ 'Maybe' 'Int'
+--
+-- * 'dtResourceName' @::@ 'Maybe' 'Text'
+--
+-- * 'dtResourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'dtTagKeys' @::@ ['Text']
+--
+-- * 'dtTagValues' @::@ ['Text']
+--
+describeTags :: DescribeTags
+describeTags = DescribeTags
+    { _dtResourceName = Nothing
+    , _dtResourceType = Nothing
+    , _dtMaxRecords   = Nothing
+    , _dtMarker       = Nothing
+    , _dtTagKeys      = mempty
+    , _dtTagValues    = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the marker parameter and retrying the command. If the
+-- marker field is empty, all response records have been retrieved for the
+-- request.
+dtMarker :: Lens' DescribeTags (Maybe Text)
+dtMarker = lens _dtMarker (\s a -> s { _dtMarker = a })
+
+-- | The maximum number or response records to return in each call. If the
+-- number of remaining response records exceeds the specified MaxRecords
+-- value, a value is returned in a marker field of the response. You can
+-- retrieve the next set of records by retrying the command with the
+-- returned marker value.
+dtMaxRecords :: Lens' DescribeTags (Maybe Int)
+dtMaxRecords = lens _dtMaxRecords (\s a -> s { _dtMaxRecords = a })
+
+-- | The Amazon Resource Name (ARN) for which you want to describe the tag or
+-- tags. For example, arn:aws:redshift:us-east-1:123456789:cluster:t1.
+dtResourceName :: Lens' DescribeTags (Maybe Text)
+dtResourceName = lens _dtResourceName (\s a -> s { _dtResourceName = a })
+
+-- | The type of resource with which you want to view tags. Valid resource
+-- types are: Cluster CIDR/IP EC2 security group Snapshot Cluster security
+-- group Subnet group HSM connection HSM certificate Parameter group For
+-- more information about Amazon Redshift resource types and constructing
+-- ARNs, go to Constructing an Amazon Redshift Amazon Resource Name (ARN) in
+-- the Amazon Redshift Cluster Management Guide.
+dtResourceType :: Lens' DescribeTags (Maybe Text)
+dtResourceType = lens _dtResourceType (\s a -> s { _dtResourceType = a })
+
+-- | A tag key or keys for which you want to return all matching resources
+-- that are associated with the specified key or keys. For example, suppose
+-- that you have resources tagged with keys called owner and environment. If
+-- you specify both of these tag keys in the request, Amazon Redshift
+-- returns a response with all resources that have either or both of these
+-- tag keys associated with them.
+dtTagKeys :: Lens' DescribeTags [Text]
+dtTagKeys = lens _dtTagKeys (\s a -> s { _dtTagKeys = a }) . _List
+
+-- | A tag value or values for which you want to return all matching resources
+-- that are associated with the specified value or values. For example,
+-- suppose that you have resources tagged with values called admin and test.
+-- If you specify both of these tag values in the request, Amazon Redshift
+-- returns a response with all resources that have either or both of these
+-- tag values associated with them.
+dtTagValues :: Lens' DescribeTags [Text]
+dtTagValues = lens _dtTagValues (\s a -> s { _dtTagValues = a }) . _List
+
+data DescribeTagsResponse = DescribeTagsResponse
+    { _dtrMarker          :: Maybe Text
+    , _dtrTaggedResources :: List "TaggedResource" TaggedResource
+    } deriving (Eq, Show)
+
+-- | 'DescribeTagsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dtrTaggedResources' @::@ ['TaggedResource']
+--
+describeTagsResponse :: DescribeTagsResponse
+describeTagsResponse = DescribeTagsResponse
+    { _dtrTaggedResources = mempty
+    , _dtrMarker          = Nothing
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dtrMarker :: Lens' DescribeTagsResponse (Maybe Text)
+dtrMarker = lens _dtrMarker (\s a -> s { _dtrMarker = a })
+
+-- | A list of tags with their associated resources.
+dtrTaggedResources :: Lens' DescribeTagsResponse [TaggedResource]
+dtrTaggedResources =
+    lens _dtrTaggedResources (\s a -> s { _dtrTaggedResources = a })
+        . _List
+
+instance ToPath DescribeTags where
+    toPath = const "/"
+
+instance ToQuery DescribeTags where
+    toQuery DescribeTags{..} = mconcat
+        [ "Marker"       =? _dtMarker
+        , "MaxRecords"   =? _dtMaxRecords
+        , "ResourceName" =? _dtResourceName
+        , "ResourceType" =? _dtResourceType
+        , "TagKeys"      =? _dtTagKeys
+        , "TagValues"    =? _dtTagValues
+        ]
+
+instance ToHeaders DescribeTags
+
+instance AWSRequest DescribeTags where
+    type Sv DescribeTags = Redshift
+    type Rs DescribeTags = DescribeTagsResponse
+
+    request  = post "DescribeTags"
+    response = xmlResponse
+
+instance FromXML DescribeTagsResponse where
+    parseXML = withElement "DescribeTagsResult" $ \x -> DescribeTagsResponse
+        <$> x .@? "Marker"
+        <*> x .@  "TaggedResources"
diff --git a/gen/Network/AWS/Redshift/DisableLogging.hs b/gen/Network/AWS/Redshift/DisableLogging.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DisableLogging.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.Redshift.DisableLogging
+-- 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)
+
+-- | Stops logging information, such as queries and connection attempts, for the
+-- specified Amazon Redshift cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DisableLogging.html>
+module Network.AWS.Redshift.DisableLogging
+    (
+    -- * Request
+      DisableLogging
+    -- ** Request constructor
+    , disableLogging
+    -- ** Request lenses
+    , dlClusterIdentifier
+
+    -- * Response
+    , DisableLoggingResponse
+    -- ** Response constructor
+    , disableLoggingResponse
+    -- ** Response lenses
+    , dlrBucketName
+    , dlrLastFailureMessage
+    , dlrLastFailureTime
+    , dlrLastSuccessfulDeliveryTime
+    , dlrLoggingEnabled
+    , dlrS3KeyPrefix
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DisableLogging = DisableLogging
+    { _dlClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DisableLogging' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dlClusterIdentifier' @::@ 'Text'
+--
+disableLogging :: Text -- ^ 'dlClusterIdentifier'
+               -> DisableLogging
+disableLogging p1 = DisableLogging
+    { _dlClusterIdentifier = p1
+    }
+
+-- | The identifier of the cluster on which logging is to be stopped. Example:
+-- examplecluster.
+dlClusterIdentifier :: Lens' DisableLogging Text
+dlClusterIdentifier =
+    lens _dlClusterIdentifier (\s a -> s { _dlClusterIdentifier = a })
+
+data DisableLoggingResponse = DisableLoggingResponse
+    { _dlrBucketName                 :: Maybe Text
+    , _dlrLastFailureMessage         :: Maybe Text
+    , _dlrLastFailureTime            :: Maybe RFC822
+    , _dlrLastSuccessfulDeliveryTime :: Maybe RFC822
+    , _dlrLoggingEnabled             :: Maybe Bool
+    , _dlrS3KeyPrefix                :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'DisableLoggingResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dlrBucketName' @::@ 'Maybe' 'Text'
+--
+-- * 'dlrLastFailureMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'dlrLastFailureTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dlrLastSuccessfulDeliveryTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'dlrLoggingEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'dlrS3KeyPrefix' @::@ 'Maybe' 'Text'
+--
+disableLoggingResponse :: DisableLoggingResponse
+disableLoggingResponse = DisableLoggingResponse
+    { _dlrLoggingEnabled             = Nothing
+    , _dlrBucketName                 = Nothing
+    , _dlrS3KeyPrefix                = Nothing
+    , _dlrLastSuccessfulDeliveryTime = Nothing
+    , _dlrLastFailureTime            = Nothing
+    , _dlrLastFailureMessage         = Nothing
+    }
+
+-- | The name of the S3 bucket where the log files are stored.
+dlrBucketName :: Lens' DisableLoggingResponse (Maybe Text)
+dlrBucketName = lens _dlrBucketName (\s a -> s { _dlrBucketName = a })
+
+-- | The message indicating that logs failed to be delivered.
+dlrLastFailureMessage :: Lens' DisableLoggingResponse (Maybe Text)
+dlrLastFailureMessage =
+    lens _dlrLastFailureMessage (\s a -> s { _dlrLastFailureMessage = a })
+
+-- | The last time when logs failed to be delivered.
+dlrLastFailureTime :: Lens' DisableLoggingResponse (Maybe UTCTime)
+dlrLastFailureTime =
+    lens _dlrLastFailureTime (\s a -> s { _dlrLastFailureTime = a })
+        . mapping _Time
+
+-- | The last time when logs were delivered.
+dlrLastSuccessfulDeliveryTime :: Lens' DisableLoggingResponse (Maybe UTCTime)
+dlrLastSuccessfulDeliveryTime =
+    lens _dlrLastSuccessfulDeliveryTime
+        (\s a -> s { _dlrLastSuccessfulDeliveryTime = a })
+            . mapping _Time
+
+-- | true if logging is on, false if logging is off.
+dlrLoggingEnabled :: Lens' DisableLoggingResponse (Maybe Bool)
+dlrLoggingEnabled =
+    lens _dlrLoggingEnabled (\s a -> s { _dlrLoggingEnabled = a })
+
+-- | The prefix applied to the log file names.
+dlrS3KeyPrefix :: Lens' DisableLoggingResponse (Maybe Text)
+dlrS3KeyPrefix = lens _dlrS3KeyPrefix (\s a -> s { _dlrS3KeyPrefix = a })
+
+instance ToPath DisableLogging where
+    toPath = const "/"
+
+instance ToQuery DisableLogging where
+    toQuery DisableLogging{..} = mconcat
+        [ "ClusterIdentifier" =? _dlClusterIdentifier
+        ]
+
+instance ToHeaders DisableLogging
+
+instance AWSRequest DisableLogging where
+    type Sv DisableLogging = Redshift
+    type Rs DisableLogging = DisableLoggingResponse
+
+    request  = post "DisableLogging"
+    response = xmlResponse
+
+instance FromXML DisableLoggingResponse where
+    parseXML = withElement "DisableLoggingResult" $ \x -> DisableLoggingResponse
+        <$> x .@? "BucketName"
+        <*> x .@? "LastFailureMessage"
+        <*> x .@? "LastFailureTime"
+        <*> x .@? "LastSuccessfulDeliveryTime"
+        <*> x .@? "LoggingEnabled"
+        <*> x .@? "S3KeyPrefix"
diff --git a/gen/Network/AWS/Redshift/DisableSnapshotCopy.hs b/gen/Network/AWS/Redshift/DisableSnapshotCopy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/DisableSnapshotCopy.hs
@@ -0,0 +1,110 @@
+{-# 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.Redshift.DisableSnapshotCopy
+-- 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 the automatic copying of snapshots from one region to another
+-- region for a specified cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_DisableSnapshotCopy.html>
+module Network.AWS.Redshift.DisableSnapshotCopy
+    (
+    -- * Request
+      DisableSnapshotCopy
+    -- ** Request constructor
+    , disableSnapshotCopy
+    -- ** Request lenses
+    , dscClusterIdentifier
+
+    -- * Response
+    , DisableSnapshotCopyResponse
+    -- ** Response constructor
+    , disableSnapshotCopyResponse
+    -- ** Response lenses
+    , dscrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype DisableSnapshotCopy = DisableSnapshotCopy
+    { _dscClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'DisableSnapshotCopy' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dscClusterIdentifier' @::@ 'Text'
+--
+disableSnapshotCopy :: Text -- ^ 'dscClusterIdentifier'
+                    -> DisableSnapshotCopy
+disableSnapshotCopy p1 = DisableSnapshotCopy
+    { _dscClusterIdentifier = p1
+    }
+
+-- | The unique identifier of the source cluster that you want to disable
+-- copying of snapshots to a destination region. Constraints: Must be the
+-- valid name of an existing cluster that has cross-region snapshot copy
+-- enabled.
+dscClusterIdentifier :: Lens' DisableSnapshotCopy Text
+dscClusterIdentifier =
+    lens _dscClusterIdentifier (\s a -> s { _dscClusterIdentifier = a })
+
+newtype DisableSnapshotCopyResponse = DisableSnapshotCopyResponse
+    { _dscrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'DisableSnapshotCopyResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dscrCluster' @::@ 'Maybe' 'Cluster'
+--
+disableSnapshotCopyResponse :: DisableSnapshotCopyResponse
+disableSnapshotCopyResponse = DisableSnapshotCopyResponse
+    { _dscrCluster = Nothing
+    }
+
+dscrCluster :: Lens' DisableSnapshotCopyResponse (Maybe Cluster)
+dscrCluster = lens _dscrCluster (\s a -> s { _dscrCluster = a })
+
+instance ToPath DisableSnapshotCopy where
+    toPath = const "/"
+
+instance ToQuery DisableSnapshotCopy where
+    toQuery DisableSnapshotCopy{..} = mconcat
+        [ "ClusterIdentifier" =? _dscClusterIdentifier
+        ]
+
+instance ToHeaders DisableSnapshotCopy
+
+instance AWSRequest DisableSnapshotCopy where
+    type Sv DisableSnapshotCopy = Redshift
+    type Rs DisableSnapshotCopy = DisableSnapshotCopyResponse
+
+    request  = post "DisableSnapshotCopy"
+    response = xmlResponse
+
+instance FromXML DisableSnapshotCopyResponse where
+    parseXML = withElement "DisableSnapshotCopyResult" $ \x -> DisableSnapshotCopyResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/EnableLogging.hs b/gen/Network/AWS/Redshift/EnableLogging.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/EnableLogging.hs
@@ -0,0 +1,192 @@
+{-# 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.Redshift.EnableLogging
+-- 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)
+
+-- | Starts logging information, such as queries and connection attempts, for
+-- the specified Amazon Redshift cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_EnableLogging.html>
+module Network.AWS.Redshift.EnableLogging
+    (
+    -- * Request
+      EnableLogging
+    -- ** Request constructor
+    , enableLogging
+    -- ** Request lenses
+    , elBucketName
+    , elClusterIdentifier
+    , elS3KeyPrefix
+
+    -- * Response
+    , EnableLoggingResponse
+    -- ** Response constructor
+    , enableLoggingResponse
+    -- ** Response lenses
+    , elrBucketName
+    , elrLastFailureMessage
+    , elrLastFailureTime
+    , elrLastSuccessfulDeliveryTime
+    , elrLoggingEnabled
+    , elrS3KeyPrefix
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data EnableLogging = EnableLogging
+    { _elBucketName        :: Text
+    , _elClusterIdentifier :: Text
+    , _elS3KeyPrefix       :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'EnableLogging' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'elBucketName' @::@ 'Text'
+--
+-- * 'elClusterIdentifier' @::@ 'Text'
+--
+-- * 'elS3KeyPrefix' @::@ 'Maybe' 'Text'
+--
+enableLogging :: Text -- ^ 'elClusterIdentifier'
+              -> Text -- ^ 'elBucketName'
+              -> EnableLogging
+enableLogging p1 p2 = EnableLogging
+    { _elClusterIdentifier = p1
+    , _elBucketName        = p2
+    , _elS3KeyPrefix       = Nothing
+    }
+
+-- | The name of an existing S3 bucket where the log files are to be stored.
+-- Constraints: Must be in the same region as the cluster The cluster must
+-- have read bucket and put object permissions.
+elBucketName :: Lens' EnableLogging Text
+elBucketName = lens _elBucketName (\s a -> s { _elBucketName = a })
+
+-- | The identifier of the cluster on which logging is to be started. Example:
+-- examplecluster.
+elClusterIdentifier :: Lens' EnableLogging Text
+elClusterIdentifier =
+    lens _elClusterIdentifier (\s a -> s { _elClusterIdentifier = a })
+
+-- | The prefix applied to the log file names. Constraints: Cannot exceed 512
+-- characters Cannot contain spaces( ), double quotes ("), single quotes
+-- ('), a backslash (\), or control characters. The hexadecimal codes for
+-- invalid characters are: x00 to x20 x22 x27 x5c x7f or larger.
+elS3KeyPrefix :: Lens' EnableLogging (Maybe Text)
+elS3KeyPrefix = lens _elS3KeyPrefix (\s a -> s { _elS3KeyPrefix = a })
+
+data EnableLoggingResponse = EnableLoggingResponse
+    { _elrBucketName                 :: Maybe Text
+    , _elrLastFailureMessage         :: Maybe Text
+    , _elrLastFailureTime            :: Maybe RFC822
+    , _elrLastSuccessfulDeliveryTime :: Maybe RFC822
+    , _elrLoggingEnabled             :: Maybe Bool
+    , _elrS3KeyPrefix                :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'EnableLoggingResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'elrBucketName' @::@ 'Maybe' 'Text'
+--
+-- * 'elrLastFailureMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'elrLastFailureTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'elrLastSuccessfulDeliveryTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'elrLoggingEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'elrS3KeyPrefix' @::@ 'Maybe' 'Text'
+--
+enableLoggingResponse :: EnableLoggingResponse
+enableLoggingResponse = EnableLoggingResponse
+    { _elrLoggingEnabled             = Nothing
+    , _elrBucketName                 = Nothing
+    , _elrS3KeyPrefix                = Nothing
+    , _elrLastSuccessfulDeliveryTime = Nothing
+    , _elrLastFailureTime            = Nothing
+    , _elrLastFailureMessage         = Nothing
+    }
+
+-- | The name of the S3 bucket where the log files are stored.
+elrBucketName :: Lens' EnableLoggingResponse (Maybe Text)
+elrBucketName = lens _elrBucketName (\s a -> s { _elrBucketName = a })
+
+-- | The message indicating that logs failed to be delivered.
+elrLastFailureMessage :: Lens' EnableLoggingResponse (Maybe Text)
+elrLastFailureMessage =
+    lens _elrLastFailureMessage (\s a -> s { _elrLastFailureMessage = a })
+
+-- | The last time when logs failed to be delivered.
+elrLastFailureTime :: Lens' EnableLoggingResponse (Maybe UTCTime)
+elrLastFailureTime =
+    lens _elrLastFailureTime (\s a -> s { _elrLastFailureTime = a })
+        . mapping _Time
+
+-- | The last time when logs were delivered.
+elrLastSuccessfulDeliveryTime :: Lens' EnableLoggingResponse (Maybe UTCTime)
+elrLastSuccessfulDeliveryTime =
+    lens _elrLastSuccessfulDeliveryTime
+        (\s a -> s { _elrLastSuccessfulDeliveryTime = a })
+            . mapping _Time
+
+-- | true if logging is on, false if logging is off.
+elrLoggingEnabled :: Lens' EnableLoggingResponse (Maybe Bool)
+elrLoggingEnabled =
+    lens _elrLoggingEnabled (\s a -> s { _elrLoggingEnabled = a })
+
+-- | The prefix applied to the log file names.
+elrS3KeyPrefix :: Lens' EnableLoggingResponse (Maybe Text)
+elrS3KeyPrefix = lens _elrS3KeyPrefix (\s a -> s { _elrS3KeyPrefix = a })
+
+instance ToPath EnableLogging where
+    toPath = const "/"
+
+instance ToQuery EnableLogging where
+    toQuery EnableLogging{..} = mconcat
+        [ "BucketName"        =? _elBucketName
+        , "ClusterIdentifier" =? _elClusterIdentifier
+        , "S3KeyPrefix"       =? _elS3KeyPrefix
+        ]
+
+instance ToHeaders EnableLogging
+
+instance AWSRequest EnableLogging where
+    type Sv EnableLogging = Redshift
+    type Rs EnableLogging = EnableLoggingResponse
+
+    request  = post "EnableLogging"
+    response = xmlResponse
+
+instance FromXML EnableLoggingResponse where
+    parseXML = withElement "EnableLoggingResult" $ \x -> EnableLoggingResponse
+        <$> x .@? "BucketName"
+        <*> x .@? "LastFailureMessage"
+        <*> x .@? "LastFailureTime"
+        <*> x .@? "LastSuccessfulDeliveryTime"
+        <*> x .@? "LoggingEnabled"
+        <*> x .@? "S3KeyPrefix"
diff --git a/gen/Network/AWS/Redshift/EnableSnapshotCopy.hs b/gen/Network/AWS/Redshift/EnableSnapshotCopy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/EnableSnapshotCopy.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Redshift.EnableSnapshotCopy
+-- 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)
+
+-- | Enables the automatic copy of snapshots from one region to another region
+-- for a specified cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_EnableSnapshotCopy.html>
+module Network.AWS.Redshift.EnableSnapshotCopy
+    (
+    -- * Request
+      EnableSnapshotCopy
+    -- ** Request constructor
+    , enableSnapshotCopy
+    -- ** Request lenses
+    , escClusterIdentifier
+    , escDestinationRegion
+    , escRetentionPeriod
+
+    -- * Response
+    , EnableSnapshotCopyResponse
+    -- ** Response constructor
+    , enableSnapshotCopyResponse
+    -- ** Response lenses
+    , escrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data EnableSnapshotCopy = EnableSnapshotCopy
+    { _escClusterIdentifier :: Text
+    , _escDestinationRegion :: Text
+    , _escRetentionPeriod   :: Maybe Int
+    } deriving (Eq, Ord, Show)
+
+-- | 'EnableSnapshotCopy' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'escClusterIdentifier' @::@ 'Text'
+--
+-- * 'escDestinationRegion' @::@ 'Text'
+--
+-- * 'escRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+enableSnapshotCopy :: Text -- ^ 'escClusterIdentifier'
+                   -> Text -- ^ 'escDestinationRegion'
+                   -> EnableSnapshotCopy
+enableSnapshotCopy p1 p2 = EnableSnapshotCopy
+    { _escClusterIdentifier = p1
+    , _escDestinationRegion = p2
+    , _escRetentionPeriod   = Nothing
+    }
+
+-- | The unique identifier of the source cluster to copy snapshots from.
+-- Constraints: Must be the valid name of an existing cluster that does not
+-- already have cross-region snapshot copy enabled.
+escClusterIdentifier :: Lens' EnableSnapshotCopy Text
+escClusterIdentifier =
+    lens _escClusterIdentifier (\s a -> s { _escClusterIdentifier = a })
+
+-- | The destination region that you want to copy snapshots to. Constraints:
+-- Must be the name of a valid region. For more information, see Regions and
+-- Endpoints in the Amazon Web Services General Reference.
+escDestinationRegion :: Lens' EnableSnapshotCopy Text
+escDestinationRegion =
+    lens _escDestinationRegion (\s a -> s { _escDestinationRegion = a })
+
+-- | The number of days to retain automated snapshots in the destination
+-- region after they are copied from the source region. Default: 7.
+-- Constraints: Must be at least 1 and no more than 35.
+escRetentionPeriod :: Lens' EnableSnapshotCopy (Maybe Int)
+escRetentionPeriod =
+    lens _escRetentionPeriod (\s a -> s { _escRetentionPeriod = a })
+
+newtype EnableSnapshotCopyResponse = EnableSnapshotCopyResponse
+    { _escrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'EnableSnapshotCopyResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'escrCluster' @::@ 'Maybe' 'Cluster'
+--
+enableSnapshotCopyResponse :: EnableSnapshotCopyResponse
+enableSnapshotCopyResponse = EnableSnapshotCopyResponse
+    { _escrCluster = Nothing
+    }
+
+escrCluster :: Lens' EnableSnapshotCopyResponse (Maybe Cluster)
+escrCluster = lens _escrCluster (\s a -> s { _escrCluster = a })
+
+instance ToPath EnableSnapshotCopy where
+    toPath = const "/"
+
+instance ToQuery EnableSnapshotCopy where
+    toQuery EnableSnapshotCopy{..} = mconcat
+        [ "ClusterIdentifier" =? _escClusterIdentifier
+        , "DestinationRegion" =? _escDestinationRegion
+        , "RetentionPeriod"   =? _escRetentionPeriod
+        ]
+
+instance ToHeaders EnableSnapshotCopy
+
+instance AWSRequest EnableSnapshotCopy where
+    type Sv EnableSnapshotCopy = Redshift
+    type Rs EnableSnapshotCopy = EnableSnapshotCopyResponse
+
+    request  = post "EnableSnapshotCopy"
+    response = xmlResponse
+
+instance FromXML EnableSnapshotCopyResponse where
+    parseXML = withElement "EnableSnapshotCopyResult" $ \x -> EnableSnapshotCopyResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/ModifyCluster.hs b/gen/Network/AWS/Redshift/ModifyCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ModifyCluster.hs
@@ -0,0 +1,344 @@
+{-# 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.Redshift.ModifyCluster
+-- 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)
+
+-- | Modifies the settings for a cluster. For example, you can add another
+-- security or parameter group, update the preferred maintenance window, or
+-- change the master user password. Resetting a cluster password or modifying
+-- the security groups associated with a cluster do not need a reboot.
+-- However, modifying a parameter group requires a reboot for parameters to
+-- take effect. For more information about managing clusters, go to Amazon
+-- Redshift Clusters in the Amazon Redshift Cluster Management Guide . You can
+-- also change node type and the number of nodes to scale up or down the
+-- cluster. When resizing a cluster, you must specify both the number of nodes
+-- and the node type even if one of the parameters does not change.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifyCluster.html>
+module Network.AWS.Redshift.ModifyCluster
+    (
+    -- * Request
+      ModifyCluster
+    -- ** Request constructor
+    , modifyCluster
+    -- ** Request lenses
+    , mcAllowVersionUpgrade
+    , mcAutomatedSnapshotRetentionPeriod
+    , mcClusterIdentifier
+    , mcClusterParameterGroupName
+    , mcClusterSecurityGroups
+    , mcClusterType
+    , mcClusterVersion
+    , mcHsmClientCertificateIdentifier
+    , mcHsmConfigurationIdentifier
+    , mcMasterUserPassword
+    , mcNewClusterIdentifier
+    , mcNodeType
+    , mcNumberOfNodes
+    , mcPreferredMaintenanceWindow
+    , mcVpcSecurityGroupIds
+
+    -- * Response
+    , ModifyClusterResponse
+    -- ** Response constructor
+    , modifyClusterResponse
+    -- ** Response lenses
+    , mcrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ModifyCluster = ModifyCluster
+    { _mcAllowVersionUpgrade              :: Maybe Bool
+    , _mcAutomatedSnapshotRetentionPeriod :: Maybe Int
+    , _mcClusterIdentifier                :: Text
+    , _mcClusterParameterGroupName        :: Maybe Text
+    , _mcClusterSecurityGroups            :: List "ClusterSecurityGroupName" Text
+    , _mcClusterType                      :: Maybe Text
+    , _mcClusterVersion                   :: Maybe Text
+    , _mcHsmClientCertificateIdentifier   :: Maybe Text
+    , _mcHsmConfigurationIdentifier       :: Maybe Text
+    , _mcMasterUserPassword               :: Maybe Text
+    , _mcNewClusterIdentifier             :: Maybe Text
+    , _mcNodeType                         :: Maybe Text
+    , _mcNumberOfNodes                    :: Maybe Int
+    , _mcPreferredMaintenanceWindow       :: Maybe Text
+    , _mcVpcSecurityGroupIds              :: List "VpcSecurityGroupId" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ModifyCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcAllowVersionUpgrade' @::@ 'Maybe' 'Bool'
+--
+-- * 'mcAutomatedSnapshotRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+-- * 'mcClusterIdentifier' @::@ 'Text'
+--
+-- * 'mcClusterParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'mcClusterSecurityGroups' @::@ ['Text']
+--
+-- * 'mcClusterType' @::@ 'Maybe' 'Text'
+--
+-- * 'mcClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'mcHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'mcHsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'mcMasterUserPassword' @::@ 'Maybe' 'Text'
+--
+-- * 'mcNewClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'mcNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'mcNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+-- * 'mcPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+--
+-- * 'mcVpcSecurityGroupIds' @::@ ['Text']
+--
+modifyCluster :: Text -- ^ 'mcClusterIdentifier'
+              -> ModifyCluster
+modifyCluster p1 = ModifyCluster
+    { _mcClusterIdentifier                = p1
+    , _mcClusterType                      = Nothing
+    , _mcNodeType                         = Nothing
+    , _mcNumberOfNodes                    = Nothing
+    , _mcClusterSecurityGroups            = mempty
+    , _mcVpcSecurityGroupIds              = mempty
+    , _mcMasterUserPassword               = Nothing
+    , _mcClusterParameterGroupName        = Nothing
+    , _mcAutomatedSnapshotRetentionPeriod = Nothing
+    , _mcPreferredMaintenanceWindow       = Nothing
+    , _mcClusterVersion                   = Nothing
+    , _mcAllowVersionUpgrade              = Nothing
+    , _mcHsmClientCertificateIdentifier   = Nothing
+    , _mcHsmConfigurationIdentifier       = Nothing
+    , _mcNewClusterIdentifier             = Nothing
+    }
+
+-- | If true, major version upgrades will be applied automatically to the
+-- cluster during the maintenance window. Default: false.
+mcAllowVersionUpgrade :: Lens' ModifyCluster (Maybe Bool)
+mcAllowVersionUpgrade =
+    lens _mcAllowVersionUpgrade (\s a -> s { _mcAllowVersionUpgrade = a })
+
+-- | The number of days that automated snapshots are retained. If the value is
+-- 0, automated snapshots are disabled. Even if automated snapshots are
+-- disabled, you can still create manual snapshots when you want with
+-- CreateClusterSnapshot. If you decrease the automated snapshot retention
+-- period from its current value, existing automated snapshots that fall
+-- outside of the new retention period will be immediately deleted. Default:
+-- Uses existing setting. Constraints: Must be a value from 0 to 35.
+mcAutomatedSnapshotRetentionPeriod :: Lens' ModifyCluster (Maybe Int)
+mcAutomatedSnapshotRetentionPeriod =
+    lens _mcAutomatedSnapshotRetentionPeriod
+        (\s a -> s { _mcAutomatedSnapshotRetentionPeriod = a })
+
+-- | The unique identifier of the cluster to be modified. Example:
+-- examplecluster.
+mcClusterIdentifier :: Lens' ModifyCluster Text
+mcClusterIdentifier =
+    lens _mcClusterIdentifier (\s a -> s { _mcClusterIdentifier = a })
+
+-- | The name of the cluster parameter group to apply to this cluster. This
+-- change is applied only after the cluster is rebooted. To reboot a cluster
+-- use RebootCluster. Default: Uses existing setting. Constraints: The
+-- cluster parameter group must be in the same parameter group family that
+-- matches the cluster version.
+mcClusterParameterGroupName :: Lens' ModifyCluster (Maybe Text)
+mcClusterParameterGroupName =
+    lens _mcClusterParameterGroupName
+        (\s a -> s { _mcClusterParameterGroupName = a })
+
+-- | A list of cluster security groups to be authorized on this cluster. This
+-- change is asynchronously applied as soon as possible. Security groups
+-- currently associated with the cluster, and not in the list of groups to
+-- apply, will be revoked from the cluster. Constraints: Must be 1 to 255
+-- alphanumeric characters or hyphens First character must be a letter
+-- Cannot end with a hyphen or contain two consecutive hyphens.
+mcClusterSecurityGroups :: Lens' ModifyCluster [Text]
+mcClusterSecurityGroups =
+    lens _mcClusterSecurityGroups (\s a -> s { _mcClusterSecurityGroups = a })
+        . _List
+
+-- | The new cluster type. When you submit your cluster resize request, your
+-- existing cluster goes into a read-only mode. After Amazon Redshift
+-- provisions a new cluster based on your resize requirements, there will be
+-- outage for a period while the old cluster is deleted and your connection
+-- is switched to the new cluster. You can use DescribeResize to track the
+-- progress of the resize request. Valid Values: multi-node | single-node.
+mcClusterType :: Lens' ModifyCluster (Maybe Text)
+mcClusterType = lens _mcClusterType (\s a -> s { _mcClusterType = a })
+
+-- | The new version number of the Amazon Redshift engine to upgrade to. For
+-- major version upgrades, if a non-default cluster parameter group is
+-- currently in use, a new cluster parameter group in the cluster parameter
+-- group family for the new version must be specified. The new cluster
+-- parameter group can be the default for that cluster parameter group
+-- family. For more information about managing parameter groups, go to
+-- Amazon Redshift Parameter Groups in the Amazon Redshift Cluster
+-- Management Guide. Example: 1.0.
+mcClusterVersion :: Lens' ModifyCluster (Maybe Text)
+mcClusterVersion = lens _mcClusterVersion (\s a -> s { _mcClusterVersion = a })
+
+-- | Specifies the name of the HSM client certificate the Amazon Redshift
+-- cluster uses to retrieve the data encryption keys stored in an HSM.
+mcHsmClientCertificateIdentifier :: Lens' ModifyCluster (Maybe Text)
+mcHsmClientCertificateIdentifier =
+    lens _mcHsmClientCertificateIdentifier
+        (\s a -> s { _mcHsmClientCertificateIdentifier = a })
+
+-- | Specifies the name of the HSM configuration that contains the information
+-- the Amazon Redshift cluster can use to retrieve and store keys in an HSM.
+mcHsmConfigurationIdentifier :: Lens' ModifyCluster (Maybe Text)
+mcHsmConfigurationIdentifier =
+    lens _mcHsmConfigurationIdentifier
+        (\s a -> s { _mcHsmConfigurationIdentifier = a })
+
+-- | The new password for the cluster master user. This change is
+-- asynchronously applied as soon as possible. Between the time of the
+-- request and the completion of the request, the MasterUserPassword element
+-- exists in the PendingModifiedValues element of the operation response.
+-- Operations never return the password, so this operation provides a way to
+-- regain access to the master user account for a cluster if the password is
+-- lost. Default: Uses existing setting. Constraints: Must be between 8 and
+-- 64 characters in length. Must contain at least one uppercase letter. Must
+-- contain at least one lowercase letter. Must contain one number. Can be
+-- any printable ASCII character (ASCII code 33 to 126) except ' (single
+-- quote), " (double quote), \, /, @, or space.
+mcMasterUserPassword :: Lens' ModifyCluster (Maybe Text)
+mcMasterUserPassword =
+    lens _mcMasterUserPassword (\s a -> s { _mcMasterUserPassword = a })
+
+-- | The new identifier for the cluster. Constraints: Must contain from 1 to
+-- 63 alphanumeric characters or hyphens. Alphabetic characters must be
+-- lowercase. First character must be a letter. Cannot end with a hyphen or
+-- contain two consecutive hyphens. Must be unique for all clusters within
+-- an AWS account. Example: examplecluster.
+mcNewClusterIdentifier :: Lens' ModifyCluster (Maybe Text)
+mcNewClusterIdentifier =
+    lens _mcNewClusterIdentifier (\s a -> s { _mcNewClusterIdentifier = a })
+
+-- | The new node type of the cluster. If you specify a new node type, you
+-- must also specify the number of nodes parameter. When you submit your
+-- request to resize a cluster, Amazon Redshift sets access permissions for
+-- the cluster to read-only. After Amazon Redshift provisions a new cluster
+-- according to your resize requirements, there will be a temporary outage
+-- while the old cluster is deleted and your connection is switched to the
+-- new cluster. When the new connection is complete, the original access
+-- permissions for the cluster are restored. You can use DescribeResize to
+-- track the progress of the resize request. Valid Values: dw1.xlarge |
+-- dw1.8xlarge | dw2.large | dw2.8xlarge.
+mcNodeType :: Lens' ModifyCluster (Maybe Text)
+mcNodeType = lens _mcNodeType (\s a -> s { _mcNodeType = a })
+
+-- | The new number of nodes of the cluster. If you specify a new number of
+-- nodes, you must also specify the node type parameter. When you submit
+-- your request to resize a cluster, Amazon Redshift sets access permissions
+-- for the cluster to read-only. After Amazon Redshift provisions a new
+-- cluster according to your resize requirements, there will be a temporary
+-- outage while the old cluster is deleted and your connection is switched
+-- to the new cluster. When the new connection is complete, the original
+-- access permissions for the cluster are restored. You can use
+-- DescribeResize to track the progress of the resize request. Valid Values:
+-- Integer greater than 0.
+mcNumberOfNodes :: Lens' ModifyCluster (Maybe Int)
+mcNumberOfNodes = lens _mcNumberOfNodes (\s a -> s { _mcNumberOfNodes = a })
+
+-- | The weekly time range (in UTC) during which system maintenance can occur,
+-- if necessary. If system maintenance is necessary during the window, it
+-- may result in an outage. This maintenance window change is made
+-- immediately. If the new maintenance window indicates the current time,
+-- there must be at least 120 minutes between the current time and end of
+-- the window in order to ensure that pending changes are applied. Default:
+-- Uses existing setting. Format: ddd:hh24:mi-ddd:hh24:mi, for example
+-- wed:07:30-wed:08:00. Valid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun
+-- Constraints: Must be at least 30 minutes.
+mcPreferredMaintenanceWindow :: Lens' ModifyCluster (Maybe Text)
+mcPreferredMaintenanceWindow =
+    lens _mcPreferredMaintenanceWindow
+        (\s a -> s { _mcPreferredMaintenanceWindow = a })
+
+-- | A list of virtual private cloud (VPC) security groups to be associated
+-- with the cluster.
+mcVpcSecurityGroupIds :: Lens' ModifyCluster [Text]
+mcVpcSecurityGroupIds =
+    lens _mcVpcSecurityGroupIds (\s a -> s { _mcVpcSecurityGroupIds = a })
+        . _List
+
+newtype ModifyClusterResponse = ModifyClusterResponse
+    { _mcrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'ModifyClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcrCluster' @::@ 'Maybe' 'Cluster'
+--
+modifyClusterResponse :: ModifyClusterResponse
+modifyClusterResponse = ModifyClusterResponse
+    { _mcrCluster = Nothing
+    }
+
+mcrCluster :: Lens' ModifyClusterResponse (Maybe Cluster)
+mcrCluster = lens _mcrCluster (\s a -> s { _mcrCluster = a })
+
+instance ToPath ModifyCluster where
+    toPath = const "/"
+
+instance ToQuery ModifyCluster where
+    toQuery ModifyCluster{..} = mconcat
+        [ "AllowVersionUpgrade"              =? _mcAllowVersionUpgrade
+        , "AutomatedSnapshotRetentionPeriod" =? _mcAutomatedSnapshotRetentionPeriod
+        , "ClusterIdentifier"                =? _mcClusterIdentifier
+        , "ClusterParameterGroupName"        =? _mcClusterParameterGroupName
+        , "ClusterSecurityGroups"            =? _mcClusterSecurityGroups
+        , "ClusterType"                      =? _mcClusterType
+        , "ClusterVersion"                   =? _mcClusterVersion
+        , "HsmClientCertificateIdentifier"   =? _mcHsmClientCertificateIdentifier
+        , "HsmConfigurationIdentifier"       =? _mcHsmConfigurationIdentifier
+        , "MasterUserPassword"               =? _mcMasterUserPassword
+        , "NewClusterIdentifier"             =? _mcNewClusterIdentifier
+        , "NodeType"                         =? _mcNodeType
+        , "NumberOfNodes"                    =? _mcNumberOfNodes
+        , "PreferredMaintenanceWindow"       =? _mcPreferredMaintenanceWindow
+        , "VpcSecurityGroupIds"              =? _mcVpcSecurityGroupIds
+        ]
+
+instance ToHeaders ModifyCluster
+
+instance AWSRequest ModifyCluster where
+    type Sv ModifyCluster = Redshift
+    type Rs ModifyCluster = ModifyClusterResponse
+
+    request  = post "ModifyCluster"
+    response = xmlResponse
+
+instance FromXML ModifyClusterResponse where
+    parseXML = withElement "ModifyClusterResult" $ \x -> ModifyClusterResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/ModifyClusterParameterGroup.hs b/gen/Network/AWS/Redshift/ModifyClusterParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ModifyClusterParameterGroup.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Redshift.ModifyClusterParameterGroup
+-- 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)
+
+-- | Modifies the parameters of a parameter group. For more information about
+-- managing parameter groups, go to Amazon Redshift Parameter Groups in the
+-- Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifyClusterParameterGroup.html>
+module Network.AWS.Redshift.ModifyClusterParameterGroup
+    (
+    -- * Request
+      ModifyClusterParameterGroup
+    -- ** Request constructor
+    , modifyClusterParameterGroup
+    -- ** Request lenses
+    , mcpgParameterGroupName
+    , mcpgParameters
+
+    -- * Response
+    , ModifyClusterParameterGroupResponse
+    -- ** Response constructor
+    , modifyClusterParameterGroupResponse
+    -- ** Response lenses
+    , mcpgrParameterGroupName
+    , mcpgrParameterGroupStatus
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ModifyClusterParameterGroup = ModifyClusterParameterGroup
+    { _mcpgParameterGroupName :: Text
+    , _mcpgParameters         :: List "Parameter" Parameter
+    } deriving (Eq, Show)
+
+-- | 'ModifyClusterParameterGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcpgParameterGroupName' @::@ 'Text'
+--
+-- * 'mcpgParameters' @::@ ['Parameter']
+--
+modifyClusterParameterGroup :: Text -- ^ 'mcpgParameterGroupName'
+                            -> ModifyClusterParameterGroup
+modifyClusterParameterGroup p1 = ModifyClusterParameterGroup
+    { _mcpgParameterGroupName = p1
+    , _mcpgParameters         = mempty
+    }
+
+-- | The name of the parameter group to be modified.
+mcpgParameterGroupName :: Lens' ModifyClusterParameterGroup Text
+mcpgParameterGroupName =
+    lens _mcpgParameterGroupName (\s a -> s { _mcpgParameterGroupName = a })
+
+-- | An array of parameters to be modified. A maximum of 20 parameters can be
+-- modified in a single request. For each parameter to be modified, you must
+-- supply at least the parameter name and parameter value; other name-value
+-- pairs of the parameter are optional. For the workload management (WLM)
+-- configuration, you must supply all the name-value pairs in the
+-- wlm_json_configuration parameter.
+mcpgParameters :: Lens' ModifyClusterParameterGroup [Parameter]
+mcpgParameters = lens _mcpgParameters (\s a -> s { _mcpgParameters = a }) . _List
+
+data ModifyClusterParameterGroupResponse = ModifyClusterParameterGroupResponse
+    { _mcpgrParameterGroupName   :: Maybe Text
+    , _mcpgrParameterGroupStatus :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ModifyClusterParameterGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcpgrParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'mcpgrParameterGroupStatus' @::@ 'Maybe' 'Text'
+--
+modifyClusterParameterGroupResponse :: ModifyClusterParameterGroupResponse
+modifyClusterParameterGroupResponse = ModifyClusterParameterGroupResponse
+    { _mcpgrParameterGroupName   = Nothing
+    , _mcpgrParameterGroupStatus = Nothing
+    }
+
+-- | The name of the cluster parameter group.
+mcpgrParameterGroupName :: Lens' ModifyClusterParameterGroupResponse (Maybe Text)
+mcpgrParameterGroupName =
+    lens _mcpgrParameterGroupName (\s a -> s { _mcpgrParameterGroupName = a })
+
+-- | The status of the parameter group. For example, if you made a change to a
+-- parameter group name-value pair, then the change could be pending a
+-- reboot of an associated cluster.
+mcpgrParameterGroupStatus :: Lens' ModifyClusterParameterGroupResponse (Maybe Text)
+mcpgrParameterGroupStatus =
+    lens _mcpgrParameterGroupStatus
+        (\s a -> s { _mcpgrParameterGroupStatus = a })
+
+instance ToPath ModifyClusterParameterGroup where
+    toPath = const "/"
+
+instance ToQuery ModifyClusterParameterGroup where
+    toQuery ModifyClusterParameterGroup{..} = mconcat
+        [ "ParameterGroupName" =? _mcpgParameterGroupName
+        , "Parameters"         =? _mcpgParameters
+        ]
+
+instance ToHeaders ModifyClusterParameterGroup
+
+instance AWSRequest ModifyClusterParameterGroup where
+    type Sv ModifyClusterParameterGroup = Redshift
+    type Rs ModifyClusterParameterGroup = ModifyClusterParameterGroupResponse
+
+    request  = post "ModifyClusterParameterGroup"
+    response = xmlResponse
+
+instance FromXML ModifyClusterParameterGroupResponse where
+    parseXML = withElement "ModifyClusterParameterGroupResult" $ \x -> ModifyClusterParameterGroupResponse
+        <$> x .@? "ParameterGroupName"
+        <*> x .@? "ParameterGroupStatus"
diff --git a/gen/Network/AWS/Redshift/ModifyClusterSubnetGroup.hs b/gen/Network/AWS/Redshift/ModifyClusterSubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ModifyClusterSubnetGroup.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.Redshift.ModifyClusterSubnetGroup
+-- 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)
+
+-- | Modifies a cluster subnet group to include the specified list of VPC
+-- subnets. The operation replaces the existing list of subnets with the new
+-- list of subnets.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifyClusterSubnetGroup.html>
+module Network.AWS.Redshift.ModifyClusterSubnetGroup
+    (
+    -- * Request
+      ModifyClusterSubnetGroup
+    -- ** Request constructor
+    , modifyClusterSubnetGroup
+    -- ** Request lenses
+    , mcsgClusterSubnetGroupName
+    , mcsgDescription
+    , mcsgSubnetIds
+
+    -- * Response
+    , ModifyClusterSubnetGroupResponse
+    -- ** Response constructor
+    , modifyClusterSubnetGroupResponse
+    -- ** Response lenses
+    , mcsgrClusterSubnetGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ModifyClusterSubnetGroup = ModifyClusterSubnetGroup
+    { _mcsgClusterSubnetGroupName :: Text
+    , _mcsgDescription            :: Maybe Text
+    , _mcsgSubnetIds              :: List "SubnetIdentifier" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ModifyClusterSubnetGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcsgClusterSubnetGroupName' @::@ 'Text'
+--
+-- * 'mcsgDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'mcsgSubnetIds' @::@ ['Text']
+--
+modifyClusterSubnetGroup :: Text -- ^ 'mcsgClusterSubnetGroupName'
+                         -> ModifyClusterSubnetGroup
+modifyClusterSubnetGroup p1 = ModifyClusterSubnetGroup
+    { _mcsgClusterSubnetGroupName = p1
+    , _mcsgDescription            = Nothing
+    , _mcsgSubnetIds              = mempty
+    }
+
+-- | The name of the subnet group to be modified.
+mcsgClusterSubnetGroupName :: Lens' ModifyClusterSubnetGroup Text
+mcsgClusterSubnetGroupName =
+    lens _mcsgClusterSubnetGroupName
+        (\s a -> s { _mcsgClusterSubnetGroupName = a })
+
+-- | A text description of the subnet group to be modified.
+mcsgDescription :: Lens' ModifyClusterSubnetGroup (Maybe Text)
+mcsgDescription = lens _mcsgDescription (\s a -> s { _mcsgDescription = a })
+
+-- | An array of VPC subnet IDs. A maximum of 20 subnets can be modified in a
+-- single request.
+mcsgSubnetIds :: Lens' ModifyClusterSubnetGroup [Text]
+mcsgSubnetIds = lens _mcsgSubnetIds (\s a -> s { _mcsgSubnetIds = a }) . _List
+
+newtype ModifyClusterSubnetGroupResponse = ModifyClusterSubnetGroupResponse
+    { _mcsgrClusterSubnetGroup :: Maybe ClusterSubnetGroup
+    } deriving (Eq, Show)
+
+-- | 'ModifyClusterSubnetGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mcsgrClusterSubnetGroup' @::@ 'Maybe' 'ClusterSubnetGroup'
+--
+modifyClusterSubnetGroupResponse :: ModifyClusterSubnetGroupResponse
+modifyClusterSubnetGroupResponse = ModifyClusterSubnetGroupResponse
+    { _mcsgrClusterSubnetGroup = Nothing
+    }
+
+mcsgrClusterSubnetGroup :: Lens' ModifyClusterSubnetGroupResponse (Maybe ClusterSubnetGroup)
+mcsgrClusterSubnetGroup =
+    lens _mcsgrClusterSubnetGroup (\s a -> s { _mcsgrClusterSubnetGroup = a })
+
+instance ToPath ModifyClusterSubnetGroup where
+    toPath = const "/"
+
+instance ToQuery ModifyClusterSubnetGroup where
+    toQuery ModifyClusterSubnetGroup{..} = mconcat
+        [ "ClusterSubnetGroupName" =? _mcsgClusterSubnetGroupName
+        , "Description"            =? _mcsgDescription
+        , "SubnetIds"              =? _mcsgSubnetIds
+        ]
+
+instance ToHeaders ModifyClusterSubnetGroup
+
+instance AWSRequest ModifyClusterSubnetGroup where
+    type Sv ModifyClusterSubnetGroup = Redshift
+    type Rs ModifyClusterSubnetGroup = ModifyClusterSubnetGroupResponse
+
+    request  = post "ModifyClusterSubnetGroup"
+    response = xmlResponse
+
+instance FromXML ModifyClusterSubnetGroupResponse where
+    parseXML = withElement "ModifyClusterSubnetGroupResult" $ \x -> ModifyClusterSubnetGroupResponse
+        <$> x .@? "ClusterSubnetGroup"
diff --git a/gen/Network/AWS/Redshift/ModifyEventSubscription.hs b/gen/Network/AWS/Redshift/ModifyEventSubscription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ModifyEventSubscription.hs
@@ -0,0 +1,185 @@
+{-# 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.Redshift.ModifyEventSubscription
+-- 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)
+
+-- | Modifies an existing Amazon Redshift event notification subscription.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifyEventSubscription.html>
+module Network.AWS.Redshift.ModifyEventSubscription
+    (
+    -- * Request
+      ModifyEventSubscription
+    -- ** Request constructor
+    , modifyEventSubscription
+    -- ** Request lenses
+    , mesEnabled
+    , mesEventCategories
+    , mesSeverity
+    , mesSnsTopicArn
+    , mesSourceIds
+    , mesSourceType
+    , mesSubscriptionName
+
+    -- * Response
+    , ModifyEventSubscriptionResponse
+    -- ** Response constructor
+    , modifyEventSubscriptionResponse
+    -- ** Response lenses
+    , mesrEventSubscription
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ModifyEventSubscription = ModifyEventSubscription
+    { _mesEnabled          :: Maybe Bool
+    , _mesEventCategories  :: List "EventCategory" Text
+    , _mesSeverity         :: Maybe Text
+    , _mesSnsTopicArn      :: Maybe Text
+    , _mesSourceIds        :: List "SourceId" Text
+    , _mesSourceType       :: Maybe Text
+    , _mesSubscriptionName :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ModifyEventSubscription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mesEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'mesEventCategories' @::@ ['Text']
+--
+-- * 'mesSeverity' @::@ 'Maybe' 'Text'
+--
+-- * 'mesSnsTopicArn' @::@ 'Maybe' 'Text'
+--
+-- * 'mesSourceIds' @::@ ['Text']
+--
+-- * 'mesSourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'mesSubscriptionName' @::@ 'Text'
+--
+modifyEventSubscription :: Text -- ^ 'mesSubscriptionName'
+                        -> ModifyEventSubscription
+modifyEventSubscription p1 = ModifyEventSubscription
+    { _mesSubscriptionName = p1
+    , _mesSnsTopicArn      = Nothing
+    , _mesSourceType       = Nothing
+    , _mesSourceIds        = mempty
+    , _mesEventCategories  = mempty
+    , _mesSeverity         = Nothing
+    , _mesEnabled          = Nothing
+    }
+
+-- | A Boolean value indicating if the subscription is enabled. true indicates
+-- the subscription is enabled.
+mesEnabled :: Lens' ModifyEventSubscription (Maybe Bool)
+mesEnabled = lens _mesEnabled (\s a -> s { _mesEnabled = a })
+
+-- | Specifies the Amazon Redshift event categories to be published by the
+-- event notification subscription. Values: Configuration, Management,
+-- Monitoring, Security.
+mesEventCategories :: Lens' ModifyEventSubscription [Text]
+mesEventCategories =
+    lens _mesEventCategories (\s a -> s { _mesEventCategories = a })
+        . _List
+
+-- | Specifies the Amazon Redshift event severity to be published by the event
+-- notification subscription. Values: ERROR, INFO.
+mesSeverity :: Lens' ModifyEventSubscription (Maybe Text)
+mesSeverity = lens _mesSeverity (\s a -> s { _mesSeverity = a })
+
+-- | The Amazon Resource Name (ARN) of the SNS topic to be used by the event
+-- notification subscription.
+mesSnsTopicArn :: Lens' ModifyEventSubscription (Maybe Text)
+mesSnsTopicArn = lens _mesSnsTopicArn (\s a -> s { _mesSnsTopicArn = a })
+
+-- | A list of one or more identifiers of Amazon Redshift source objects. All
+-- of the objects must be of the same type as was specified in the source
+-- type parameter. The event subscription will return only events generated
+-- by the specified objects. If not specified, then events are returned for
+-- all objects within the source type specified. Example: my-cluster-1,
+-- my-cluster-2 Example: my-snapshot-20131010.
+mesSourceIds :: Lens' ModifyEventSubscription [Text]
+mesSourceIds = lens _mesSourceIds (\s a -> s { _mesSourceIds = a }) . _List
+
+-- | The type of source that will be generating the events. For example, if
+-- you want to be notified of events generated by a cluster, you would set
+-- this parameter to cluster. If this value is not specified, events are
+-- returned for all Amazon Redshift objects in your AWS account. You must
+-- specify a source type in order to specify source IDs. Valid values:
+-- cluster, cluster-parameter-group, cluster-security-group, and
+-- cluster-snapshot.
+mesSourceType :: Lens' ModifyEventSubscription (Maybe Text)
+mesSourceType = lens _mesSourceType (\s a -> s { _mesSourceType = a })
+
+-- | The name of the modified Amazon Redshift event notification subscription.
+mesSubscriptionName :: Lens' ModifyEventSubscription Text
+mesSubscriptionName =
+    lens _mesSubscriptionName (\s a -> s { _mesSubscriptionName = a })
+
+newtype ModifyEventSubscriptionResponse = ModifyEventSubscriptionResponse
+    { _mesrEventSubscription :: Maybe EventSubscription
+    } deriving (Eq, Show)
+
+-- | 'ModifyEventSubscriptionResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mesrEventSubscription' @::@ 'Maybe' 'EventSubscription'
+--
+modifyEventSubscriptionResponse :: ModifyEventSubscriptionResponse
+modifyEventSubscriptionResponse = ModifyEventSubscriptionResponse
+    { _mesrEventSubscription = Nothing
+    }
+
+mesrEventSubscription :: Lens' ModifyEventSubscriptionResponse (Maybe EventSubscription)
+mesrEventSubscription =
+    lens _mesrEventSubscription (\s a -> s { _mesrEventSubscription = a })
+
+instance ToPath ModifyEventSubscription where
+    toPath = const "/"
+
+instance ToQuery ModifyEventSubscription where
+    toQuery ModifyEventSubscription{..} = mconcat
+        [ "Enabled"          =? _mesEnabled
+        , "EventCategories"  =? _mesEventCategories
+        , "Severity"         =? _mesSeverity
+        , "SnsTopicArn"      =? _mesSnsTopicArn
+        , "SourceIds"        =? _mesSourceIds
+        , "SourceType"       =? _mesSourceType
+        , "SubscriptionName" =? _mesSubscriptionName
+        ]
+
+instance ToHeaders ModifyEventSubscription
+
+instance AWSRequest ModifyEventSubscription where
+    type Sv ModifyEventSubscription = Redshift
+    type Rs ModifyEventSubscription = ModifyEventSubscriptionResponse
+
+    request  = post "ModifyEventSubscription"
+    response = xmlResponse
+
+instance FromXML ModifyEventSubscriptionResponse where
+    parseXML = withElement "ModifyEventSubscriptionResult" $ \x -> ModifyEventSubscriptionResponse
+        <$> x .@? "EventSubscription"
diff --git a/gen/Network/AWS/Redshift/ModifySnapshotCopyRetentionPeriod.hs b/gen/Network/AWS/Redshift/ModifySnapshotCopyRetentionPeriod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ModifySnapshotCopyRetentionPeriod.hs
@@ -0,0 +1,127 @@
+{-# 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.Redshift.ModifySnapshotCopyRetentionPeriod
+-- 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)
+
+-- | Modifies the number of days to retain automated snapshots in the
+-- destination region after they are copied from the source region.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ModifySnapshotCopyRetentionPeriod.html>
+module Network.AWS.Redshift.ModifySnapshotCopyRetentionPeriod
+    (
+    -- * Request
+      ModifySnapshotCopyRetentionPeriod
+    -- ** Request constructor
+    , modifySnapshotCopyRetentionPeriod
+    -- ** Request lenses
+    , mscrpClusterIdentifier
+    , mscrpRetentionPeriod
+
+    -- * Response
+    , ModifySnapshotCopyRetentionPeriodResponse
+    -- ** Response constructor
+    , modifySnapshotCopyRetentionPeriodResponse
+    -- ** Response lenses
+    , mscrprCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ModifySnapshotCopyRetentionPeriod = ModifySnapshotCopyRetentionPeriod
+    { _mscrpClusterIdentifier :: Text
+    , _mscrpRetentionPeriod   :: Int
+    } deriving (Eq, Ord, Show)
+
+-- | 'ModifySnapshotCopyRetentionPeriod' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mscrpClusterIdentifier' @::@ 'Text'
+--
+-- * 'mscrpRetentionPeriod' @::@ 'Int'
+--
+modifySnapshotCopyRetentionPeriod :: Text -- ^ 'mscrpClusterIdentifier'
+                                  -> Int -- ^ 'mscrpRetentionPeriod'
+                                  -> ModifySnapshotCopyRetentionPeriod
+modifySnapshotCopyRetentionPeriod p1 p2 = ModifySnapshotCopyRetentionPeriod
+    { _mscrpClusterIdentifier = p1
+    , _mscrpRetentionPeriod   = p2
+    }
+
+-- | The unique identifier of the cluster for which you want to change the
+-- retention period for automated snapshots that are copied to a destination
+-- region. Constraints: Must be the valid name of an existing cluster that
+-- has cross-region snapshot copy enabled.
+mscrpClusterIdentifier :: Lens' ModifySnapshotCopyRetentionPeriod Text
+mscrpClusterIdentifier =
+    lens _mscrpClusterIdentifier (\s a -> s { _mscrpClusterIdentifier = a })
+
+-- | The number of days to retain automated snapshots in the destination
+-- region after they are copied from the source region. If you decrease the
+-- retention period for automated snapshots that are copied to a destination
+-- region, Amazon Redshift will delete any existing automated snapshots that
+-- were copied to the destination region and that fall outside of the new
+-- retention period. Constraints: Must be at least 1 and no more than 35.
+mscrpRetentionPeriod :: Lens' ModifySnapshotCopyRetentionPeriod Int
+mscrpRetentionPeriod =
+    lens _mscrpRetentionPeriod (\s a -> s { _mscrpRetentionPeriod = a })
+
+newtype ModifySnapshotCopyRetentionPeriodResponse = ModifySnapshotCopyRetentionPeriodResponse
+    { _mscrprCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'ModifySnapshotCopyRetentionPeriodResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mscrprCluster' @::@ 'Maybe' 'Cluster'
+--
+modifySnapshotCopyRetentionPeriodResponse :: ModifySnapshotCopyRetentionPeriodResponse
+modifySnapshotCopyRetentionPeriodResponse = ModifySnapshotCopyRetentionPeriodResponse
+    { _mscrprCluster = Nothing
+    }
+
+mscrprCluster :: Lens' ModifySnapshotCopyRetentionPeriodResponse (Maybe Cluster)
+mscrprCluster = lens _mscrprCluster (\s a -> s { _mscrprCluster = a })
+
+instance ToPath ModifySnapshotCopyRetentionPeriod where
+    toPath = const "/"
+
+instance ToQuery ModifySnapshotCopyRetentionPeriod where
+    toQuery ModifySnapshotCopyRetentionPeriod{..} = mconcat
+        [ "ClusterIdentifier" =? _mscrpClusterIdentifier
+        , "RetentionPeriod"   =? _mscrpRetentionPeriod
+        ]
+
+instance ToHeaders ModifySnapshotCopyRetentionPeriod
+
+instance AWSRequest ModifySnapshotCopyRetentionPeriod where
+    type Sv ModifySnapshotCopyRetentionPeriod = Redshift
+    type Rs ModifySnapshotCopyRetentionPeriod = ModifySnapshotCopyRetentionPeriodResponse
+
+    request  = post "ModifySnapshotCopyRetentionPeriod"
+    response = xmlResponse
+
+instance FromXML ModifySnapshotCopyRetentionPeriodResponse where
+    parseXML = withElement "ModifySnapshotCopyRetentionPeriodResult" $ \x -> ModifySnapshotCopyRetentionPeriodResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/PurchaseReservedNodeOffering.hs b/gen/Network/AWS/Redshift/PurchaseReservedNodeOffering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/PurchaseReservedNodeOffering.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.Redshift.PurchaseReservedNodeOffering
+-- 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)
+
+-- | Allows you to purchase reserved nodes. Amazon Redshift offers a predefined
+-- set of reserved node offerings. You can purchase one of the offerings. You
+-- can call the DescribeReservedNodeOfferings API to obtain the available
+-- reserved node offerings. You can call this API by providing a specific
+-- reserved node offering and the number of nodes you want to reserve. For
+-- more information about managing parameter groups, go to Purchasing Reserved
+-- Nodes in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_PurchaseReservedNodeOffering.html>
+module Network.AWS.Redshift.PurchaseReservedNodeOffering
+    (
+    -- * Request
+      PurchaseReservedNodeOffering
+    -- ** Request constructor
+    , purchaseReservedNodeOffering
+    -- ** Request lenses
+    , prnoNodeCount
+    , prnoReservedNodeOfferingId
+
+    -- * Response
+    , PurchaseReservedNodeOfferingResponse
+    -- ** Response constructor
+    , purchaseReservedNodeOfferingResponse
+    -- ** Response lenses
+    , prnorReservedNode
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data PurchaseReservedNodeOffering = PurchaseReservedNodeOffering
+    { _prnoNodeCount              :: Maybe Int
+    , _prnoReservedNodeOfferingId :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'PurchaseReservedNodeOffering' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'prnoNodeCount' @::@ 'Maybe' 'Int'
+--
+-- * 'prnoReservedNodeOfferingId' @::@ 'Text'
+--
+purchaseReservedNodeOffering :: Text -- ^ 'prnoReservedNodeOfferingId'
+                             -> PurchaseReservedNodeOffering
+purchaseReservedNodeOffering p1 = PurchaseReservedNodeOffering
+    { _prnoReservedNodeOfferingId = p1
+    , _prnoNodeCount              = Nothing
+    }
+
+-- | The number of reserved nodes you want to purchase. Default: 1.
+prnoNodeCount :: Lens' PurchaseReservedNodeOffering (Maybe Int)
+prnoNodeCount = lens _prnoNodeCount (\s a -> s { _prnoNodeCount = a })
+
+-- | The unique identifier of the reserved node offering you want to purchase.
+prnoReservedNodeOfferingId :: Lens' PurchaseReservedNodeOffering Text
+prnoReservedNodeOfferingId =
+    lens _prnoReservedNodeOfferingId
+        (\s a -> s { _prnoReservedNodeOfferingId = a })
+
+newtype PurchaseReservedNodeOfferingResponse = PurchaseReservedNodeOfferingResponse
+    { _prnorReservedNode :: Maybe ReservedNode
+    } deriving (Eq, Show)
+
+-- | 'PurchaseReservedNodeOfferingResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'prnorReservedNode' @::@ 'Maybe' 'ReservedNode'
+--
+purchaseReservedNodeOfferingResponse :: PurchaseReservedNodeOfferingResponse
+purchaseReservedNodeOfferingResponse = PurchaseReservedNodeOfferingResponse
+    { _prnorReservedNode = Nothing
+    }
+
+prnorReservedNode :: Lens' PurchaseReservedNodeOfferingResponse (Maybe ReservedNode)
+prnorReservedNode =
+    lens _prnorReservedNode (\s a -> s { _prnorReservedNode = a })
+
+instance ToPath PurchaseReservedNodeOffering where
+    toPath = const "/"
+
+instance ToQuery PurchaseReservedNodeOffering where
+    toQuery PurchaseReservedNodeOffering{..} = mconcat
+        [ "NodeCount"              =? _prnoNodeCount
+        , "ReservedNodeOfferingId" =? _prnoReservedNodeOfferingId
+        ]
+
+instance ToHeaders PurchaseReservedNodeOffering
+
+instance AWSRequest PurchaseReservedNodeOffering where
+    type Sv PurchaseReservedNodeOffering = Redshift
+    type Rs PurchaseReservedNodeOffering = PurchaseReservedNodeOfferingResponse
+
+    request  = post "PurchaseReservedNodeOffering"
+    response = xmlResponse
+
+instance FromXML PurchaseReservedNodeOfferingResponse where
+    parseXML = withElement "PurchaseReservedNodeOfferingResult" $ \x -> PurchaseReservedNodeOfferingResponse
+        <$> x .@? "ReservedNode"
diff --git a/gen/Network/AWS/Redshift/RebootCluster.hs b/gen/Network/AWS/Redshift/RebootCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/RebootCluster.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.Redshift.RebootCluster
+-- 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)
+
+-- | Reboots a cluster. This action is taken as soon as possible. It results in
+-- a momentary outage to the cluster, during which the cluster status is set
+-- to rebooting. A cluster event is created when the reboot is completed. Any
+-- pending cluster modifications (see ModifyCluster) are applied at this
+-- reboot. For more information about managing clusters, go to Amazon Redshift
+-- Clusters in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_RebootCluster.html>
+module Network.AWS.Redshift.RebootCluster
+    (
+    -- * Request
+      RebootCluster
+    -- ** Request constructor
+    , rebootCluster
+    -- ** Request lenses
+    , rcClusterIdentifier
+
+    -- * Response
+    , RebootClusterResponse
+    -- ** Response constructor
+    , rebootClusterResponse
+    -- ** Response lenses
+    , rcrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype RebootCluster = RebootCluster
+    { _rcClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'RebootCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcClusterIdentifier' @::@ 'Text'
+--
+rebootCluster :: Text -- ^ 'rcClusterIdentifier'
+              -> RebootCluster
+rebootCluster p1 = RebootCluster
+    { _rcClusterIdentifier = p1
+    }
+
+-- | The cluster identifier.
+rcClusterIdentifier :: Lens' RebootCluster Text
+rcClusterIdentifier =
+    lens _rcClusterIdentifier (\s a -> s { _rcClusterIdentifier = a })
+
+newtype RebootClusterResponse = RebootClusterResponse
+    { _rcrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'RebootClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcrCluster' @::@ 'Maybe' 'Cluster'
+--
+rebootClusterResponse :: RebootClusterResponse
+rebootClusterResponse = RebootClusterResponse
+    { _rcrCluster = Nothing
+    }
+
+rcrCluster :: Lens' RebootClusterResponse (Maybe Cluster)
+rcrCluster = lens _rcrCluster (\s a -> s { _rcrCluster = a })
+
+instance ToPath RebootCluster where
+    toPath = const "/"
+
+instance ToQuery RebootCluster where
+    toQuery RebootCluster{..} = mconcat
+        [ "ClusterIdentifier" =? _rcClusterIdentifier
+        ]
+
+instance ToHeaders RebootCluster
+
+instance AWSRequest RebootCluster where
+    type Sv RebootCluster = Redshift
+    type Rs RebootCluster = RebootClusterResponse
+
+    request  = post "RebootCluster"
+    response = xmlResponse
+
+instance FromXML RebootClusterResponse where
+    parseXML = withElement "RebootClusterResult" $ \x -> RebootClusterResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/ResetClusterParameterGroup.hs b/gen/Network/AWS/Redshift/ResetClusterParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/ResetClusterParameterGroup.hs
@@ -0,0 +1,150 @@
+{-# 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.Redshift.ResetClusterParameterGroup
+-- 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)
+
+-- | Sets one or more parameters of the specified parameter group to their
+-- default values and sets the source values of the parameters to
+-- "engine-default". To reset the entire parameter group specify the
+-- ResetAllParameters parameter. For parameter changes to take effect you must
+-- reboot any associated clusters.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_ResetClusterParameterGroup.html>
+module Network.AWS.Redshift.ResetClusterParameterGroup
+    (
+    -- * Request
+      ResetClusterParameterGroup
+    -- ** Request constructor
+    , resetClusterParameterGroup
+    -- ** Request lenses
+    , rcpgParameterGroupName
+    , rcpgParameters
+    , rcpgResetAllParameters
+
+    -- * Response
+    , ResetClusterParameterGroupResponse
+    -- ** Response constructor
+    , resetClusterParameterGroupResponse
+    -- ** Response lenses
+    , rcpgrParameterGroupName
+    , rcpgrParameterGroupStatus
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data ResetClusterParameterGroup = ResetClusterParameterGroup
+    { _rcpgParameterGroupName :: Text
+    , _rcpgParameters         :: List "Parameter" Parameter
+    , _rcpgResetAllParameters :: Maybe Bool
+    } deriving (Eq, Show)
+
+-- | 'ResetClusterParameterGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcpgParameterGroupName' @::@ 'Text'
+--
+-- * 'rcpgParameters' @::@ ['Parameter']
+--
+-- * 'rcpgResetAllParameters' @::@ 'Maybe' 'Bool'
+--
+resetClusterParameterGroup :: Text -- ^ 'rcpgParameterGroupName'
+                           -> ResetClusterParameterGroup
+resetClusterParameterGroup p1 = ResetClusterParameterGroup
+    { _rcpgParameterGroupName = p1
+    , _rcpgResetAllParameters = Nothing
+    , _rcpgParameters         = mempty
+    }
+
+-- | The name of the cluster parameter group to be reset.
+rcpgParameterGroupName :: Lens' ResetClusterParameterGroup Text
+rcpgParameterGroupName =
+    lens _rcpgParameterGroupName (\s a -> s { _rcpgParameterGroupName = a })
+
+-- | An array of names of parameters to be reset. If ResetAllParameters option
+-- is not used, then at least one parameter name must be supplied.
+-- Constraints: A maximum of 20 parameters can be reset in a single request.
+rcpgParameters :: Lens' ResetClusterParameterGroup [Parameter]
+rcpgParameters = lens _rcpgParameters (\s a -> s { _rcpgParameters = a }) . _List
+
+-- | If true, all parameters in the specified parameter group will be reset to
+-- their default values. Default: true.
+rcpgResetAllParameters :: Lens' ResetClusterParameterGroup (Maybe Bool)
+rcpgResetAllParameters =
+    lens _rcpgResetAllParameters (\s a -> s { _rcpgResetAllParameters = a })
+
+data ResetClusterParameterGroupResponse = ResetClusterParameterGroupResponse
+    { _rcpgrParameterGroupName   :: Maybe Text
+    , _rcpgrParameterGroupStatus :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ResetClusterParameterGroupResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcpgrParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'rcpgrParameterGroupStatus' @::@ 'Maybe' 'Text'
+--
+resetClusterParameterGroupResponse :: ResetClusterParameterGroupResponse
+resetClusterParameterGroupResponse = ResetClusterParameterGroupResponse
+    { _rcpgrParameterGroupName   = Nothing
+    , _rcpgrParameterGroupStatus = Nothing
+    }
+
+-- | The name of the cluster parameter group.
+rcpgrParameterGroupName :: Lens' ResetClusterParameterGroupResponse (Maybe Text)
+rcpgrParameterGroupName =
+    lens _rcpgrParameterGroupName (\s a -> s { _rcpgrParameterGroupName = a })
+
+-- | The status of the parameter group. For example, if you made a change to a
+-- parameter group name-value pair, then the change could be pending a
+-- reboot of an associated cluster.
+rcpgrParameterGroupStatus :: Lens' ResetClusterParameterGroupResponse (Maybe Text)
+rcpgrParameterGroupStatus =
+    lens _rcpgrParameterGroupStatus
+        (\s a -> s { _rcpgrParameterGroupStatus = a })
+
+instance ToPath ResetClusterParameterGroup where
+    toPath = const "/"
+
+instance ToQuery ResetClusterParameterGroup where
+    toQuery ResetClusterParameterGroup{..} = mconcat
+        [ "ParameterGroupName" =? _rcpgParameterGroupName
+        , "Parameters"         =? _rcpgParameters
+        , "ResetAllParameters" =? _rcpgResetAllParameters
+        ]
+
+instance ToHeaders ResetClusterParameterGroup
+
+instance AWSRequest ResetClusterParameterGroup where
+    type Sv ResetClusterParameterGroup = Redshift
+    type Rs ResetClusterParameterGroup = ResetClusterParameterGroupResponse
+
+    request  = post "ResetClusterParameterGroup"
+    response = xmlResponse
+
+instance FromXML ResetClusterParameterGroupResponse where
+    parseXML = withElement "ResetClusterParameterGroupResult" $ \x -> ResetClusterParameterGroupResponse
+        <$> x .@? "ParameterGroupName"
+        <*> x .@? "ParameterGroupStatus"
diff --git a/gen/Network/AWS/Redshift/RestoreFromClusterSnapshot.hs b/gen/Network/AWS/Redshift/RestoreFromClusterSnapshot.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/RestoreFromClusterSnapshot.hs
@@ -0,0 +1,348 @@
+{-# 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.Redshift.RestoreFromClusterSnapshot
+-- 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 a new cluster from a snapshot. Amazon Redshift creates the
+-- resulting cluster with the same configuration as the original cluster from
+-- which the snapshot was created, except that the new cluster is created with
+-- the default cluster security and parameter group. After Amazon Redshift
+-- creates the cluster you can use the ModifyCluster API to associate a
+-- different security group and different parameter group with the restored
+-- cluster. If you restore a cluster into a VPC, you must provide a cluster
+-- subnet group where you want the cluster restored. For more information
+-- about working with snapshots, go to Amazon Redshift Snapshots in the Amazon
+-- Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_RestoreFromClusterSnapshot.html>
+module Network.AWS.Redshift.RestoreFromClusterSnapshot
+    (
+    -- * Request
+      RestoreFromClusterSnapshot
+    -- ** Request constructor
+    , restoreFromClusterSnapshot
+    -- ** Request lenses
+    , rfcsAllowVersionUpgrade
+    , rfcsAutomatedSnapshotRetentionPeriod
+    , rfcsAvailabilityZone
+    , rfcsClusterIdentifier
+    , rfcsClusterParameterGroupName
+    , rfcsClusterSecurityGroups
+    , rfcsClusterSubnetGroupName
+    , rfcsElasticIp
+    , rfcsHsmClientCertificateIdentifier
+    , rfcsHsmConfigurationIdentifier
+    , rfcsKmsKeyId
+    , rfcsOwnerAccount
+    , rfcsPort
+    , rfcsPreferredMaintenanceWindow
+    , rfcsPubliclyAccessible
+    , rfcsSnapshotClusterIdentifier
+    , rfcsSnapshotIdentifier
+    , rfcsVpcSecurityGroupIds
+
+    -- * Response
+    , RestoreFromClusterSnapshotResponse
+    -- ** Response constructor
+    , restoreFromClusterSnapshotResponse
+    -- ** Response lenses
+    , rfcsrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data RestoreFromClusterSnapshot = RestoreFromClusterSnapshot
+    { _rfcsAllowVersionUpgrade              :: Maybe Bool
+    , _rfcsAutomatedSnapshotRetentionPeriod :: Maybe Int
+    , _rfcsAvailabilityZone                 :: Maybe Text
+    , _rfcsClusterIdentifier                :: Text
+    , _rfcsClusterParameterGroupName        :: Maybe Text
+    , _rfcsClusterSecurityGroups            :: List "ClusterSecurityGroupName" Text
+    , _rfcsClusterSubnetGroupName           :: Maybe Text
+    , _rfcsElasticIp                        :: Maybe Text
+    , _rfcsHsmClientCertificateIdentifier   :: Maybe Text
+    , _rfcsHsmConfigurationIdentifier       :: Maybe Text
+    , _rfcsKmsKeyId                         :: Maybe Text
+    , _rfcsOwnerAccount                     :: Maybe Text
+    , _rfcsPort                             :: Maybe Int
+    , _rfcsPreferredMaintenanceWindow       :: Maybe Text
+    , _rfcsPubliclyAccessible               :: Maybe Bool
+    , _rfcsSnapshotClusterIdentifier        :: Maybe Text
+    , _rfcsSnapshotIdentifier               :: Text
+    , _rfcsVpcSecurityGroupIds              :: List "VpcSecurityGroupId" Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RestoreFromClusterSnapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rfcsAllowVersionUpgrade' @::@ 'Maybe' 'Bool'
+--
+-- * 'rfcsAutomatedSnapshotRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+-- * 'rfcsAvailabilityZone' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsClusterIdentifier' @::@ 'Text'
+--
+-- * 'rfcsClusterParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsClusterSecurityGroups' @::@ ['Text']
+--
+-- * 'rfcsClusterSubnetGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsElasticIp' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsHsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsKmsKeyId' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsOwnerAccount' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsPort' @::@ 'Maybe' 'Int'
+--
+-- * 'rfcsPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsPubliclyAccessible' @::@ 'Maybe' 'Bool'
+--
+-- * 'rfcsSnapshotClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'rfcsSnapshotIdentifier' @::@ 'Text'
+--
+-- * 'rfcsVpcSecurityGroupIds' @::@ ['Text']
+--
+restoreFromClusterSnapshot :: Text -- ^ 'rfcsClusterIdentifier'
+                           -> Text -- ^ 'rfcsSnapshotIdentifier'
+                           -> RestoreFromClusterSnapshot
+restoreFromClusterSnapshot p1 p2 = RestoreFromClusterSnapshot
+    { _rfcsClusterIdentifier                = p1
+    , _rfcsSnapshotIdentifier               = p2
+    , _rfcsSnapshotClusterIdentifier        = Nothing
+    , _rfcsPort                             = Nothing
+    , _rfcsAvailabilityZone                 = Nothing
+    , _rfcsAllowVersionUpgrade              = Nothing
+    , _rfcsClusterSubnetGroupName           = Nothing
+    , _rfcsPubliclyAccessible               = Nothing
+    , _rfcsOwnerAccount                     = Nothing
+    , _rfcsHsmClientCertificateIdentifier   = Nothing
+    , _rfcsHsmConfigurationIdentifier       = Nothing
+    , _rfcsElasticIp                        = Nothing
+    , _rfcsClusterParameterGroupName        = Nothing
+    , _rfcsClusterSecurityGroups            = mempty
+    , _rfcsVpcSecurityGroupIds              = mempty
+    , _rfcsPreferredMaintenanceWindow       = Nothing
+    , _rfcsAutomatedSnapshotRetentionPeriod = Nothing
+    , _rfcsKmsKeyId                         = Nothing
+    }
+
+-- | If true, major version upgrades can be applied during the maintenance
+-- window to the Amazon Redshift engine that is running on the cluster.
+-- Default: true.
+rfcsAllowVersionUpgrade :: Lens' RestoreFromClusterSnapshot (Maybe Bool)
+rfcsAllowVersionUpgrade =
+    lens _rfcsAllowVersionUpgrade (\s a -> s { _rfcsAllowVersionUpgrade = a })
+
+-- | The number of days that automated snapshots are retained. If the value is
+-- 0, automated snapshots are disabled. Even if automated snapshots are
+-- disabled, you can still create manual snapshots when you want with
+-- CreateClusterSnapshot. Default: The value selected for the cluster from
+-- which the snapshot was taken. Constraints: Must be a value from 0 to 35.
+rfcsAutomatedSnapshotRetentionPeriod :: Lens' RestoreFromClusterSnapshot (Maybe Int)
+rfcsAutomatedSnapshotRetentionPeriod =
+    lens _rfcsAutomatedSnapshotRetentionPeriod
+        (\s a -> s { _rfcsAutomatedSnapshotRetentionPeriod = a })
+
+-- | The Amazon EC2 Availability Zone in which to restore the cluster.
+-- Default: A random, system-chosen Availability Zone. Example: us-east-1a.
+rfcsAvailabilityZone :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsAvailabilityZone =
+    lens _rfcsAvailabilityZone (\s a -> s { _rfcsAvailabilityZone = a })
+
+-- | The identifier of the cluster that will be created from restoring the
+-- snapshot. Constraints: Must contain from 1 to 63 alphanumeric characters
+-- or hyphens. Alphabetic characters must be lowercase. First character must
+-- be a letter. Cannot end with a hyphen or contain two consecutive hyphens.
+-- Must be unique for all clusters within an AWS account.
+rfcsClusterIdentifier :: Lens' RestoreFromClusterSnapshot Text
+rfcsClusterIdentifier =
+    lens _rfcsClusterIdentifier (\s a -> s { _rfcsClusterIdentifier = a })
+
+-- | The name of the parameter group to be associated with this cluster.
+-- Default: The default Amazon Redshift cluster parameter group. For
+-- information about the default parameter group, go to Working with Amazon
+-- Redshift Parameter Groups. Constraints: Must be 1 to 255 alphanumeric
+-- characters or hyphens. First character must be a letter. Cannot end with
+-- a hyphen or contain two consecutive hyphens.
+rfcsClusterParameterGroupName :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsClusterParameterGroupName =
+    lens _rfcsClusterParameterGroupName
+        (\s a -> s { _rfcsClusterParameterGroupName = a })
+
+-- | A list of security groups to be associated with this cluster. Default:
+-- The default cluster security group for Amazon Redshift. Cluster security
+-- groups only apply to clusters outside of VPCs.
+rfcsClusterSecurityGroups :: Lens' RestoreFromClusterSnapshot [Text]
+rfcsClusterSecurityGroups =
+    lens _rfcsClusterSecurityGroups
+        (\s a -> s { _rfcsClusterSecurityGroups = a })
+            . _List
+
+-- | The name of the subnet group where you want to cluster restored. A
+-- snapshot of cluster in VPC can be restored only in VPC. Therefore, you
+-- must provide subnet group name where you want the cluster restored.
+rfcsClusterSubnetGroupName :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsClusterSubnetGroupName =
+    lens _rfcsClusterSubnetGroupName
+        (\s a -> s { _rfcsClusterSubnetGroupName = a })
+
+-- | The elastic IP (EIP) address for the cluster.
+rfcsElasticIp :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsElasticIp = lens _rfcsElasticIp (\s a -> s { _rfcsElasticIp = a })
+
+-- | Specifies the name of the HSM client certificate the Amazon Redshift
+-- cluster uses to retrieve the data encryption keys stored in an HSM.
+rfcsHsmClientCertificateIdentifier :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsHsmClientCertificateIdentifier =
+    lens _rfcsHsmClientCertificateIdentifier
+        (\s a -> s { _rfcsHsmClientCertificateIdentifier = a })
+
+-- | Specifies the name of the HSM configuration that contains the information
+-- the Amazon Redshift cluster can use to retrieve and store keys in an HSM.
+rfcsHsmConfigurationIdentifier :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsHsmConfigurationIdentifier =
+    lens _rfcsHsmConfigurationIdentifier
+        (\s a -> s { _rfcsHsmConfigurationIdentifier = a })
+
+-- | The AWS Key Management Service (KMS) key ID of the encryption key that
+-- you want to use to encrypt data in the cluster that you restore from a
+-- shared snapshot.
+rfcsKmsKeyId :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsKmsKeyId = lens _rfcsKmsKeyId (\s a -> s { _rfcsKmsKeyId = a })
+
+-- | The AWS customer account used to create or copy the snapshot. Required if
+-- you are restoring a snapshot you do not own, optional if you own the
+-- snapshot.
+rfcsOwnerAccount :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsOwnerAccount = lens _rfcsOwnerAccount (\s a -> s { _rfcsOwnerAccount = a })
+
+-- | The port number on which the cluster accepts connections. Default: The
+-- same port as the original cluster. Constraints: Must be between 1115 and
+-- 65535.
+rfcsPort :: Lens' RestoreFromClusterSnapshot (Maybe Int)
+rfcsPort = lens _rfcsPort (\s a -> s { _rfcsPort = a })
+
+-- | The weekly time range (in UTC) during which automated cluster maintenance
+-- can occur. Format: ddd:hh24:mi-ddd:hh24:mi Default: The value selected
+-- for the cluster from which the snapshot was taken. For more information
+-- about the time blocks for each region, see Maintenance Windows in Amazon
+-- Redshift Cluster Management Guide. Valid Days: Mon | Tue | Wed | Thu |
+-- Fri | Sat | Sun Constraints: Minimum 30-minute window.
+rfcsPreferredMaintenanceWindow :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsPreferredMaintenanceWindow =
+    lens _rfcsPreferredMaintenanceWindow
+        (\s a -> s { _rfcsPreferredMaintenanceWindow = a })
+
+-- | If true, the cluster can be accessed from a public network.
+rfcsPubliclyAccessible :: Lens' RestoreFromClusterSnapshot (Maybe Bool)
+rfcsPubliclyAccessible =
+    lens _rfcsPubliclyAccessible (\s a -> s { _rfcsPubliclyAccessible = a })
+
+-- | The name of the cluster the source snapshot was created from. This
+-- parameter is required if your IAM user has a policy containing a snapshot
+-- resource element that specifies anything other than * for the cluster
+-- name.
+rfcsSnapshotClusterIdentifier :: Lens' RestoreFromClusterSnapshot (Maybe Text)
+rfcsSnapshotClusterIdentifier =
+    lens _rfcsSnapshotClusterIdentifier
+        (\s a -> s { _rfcsSnapshotClusterIdentifier = a })
+
+-- | The name of the snapshot from which to create the new cluster. This
+-- parameter isn't case sensitive. Example: my-snapshot-id.
+rfcsSnapshotIdentifier :: Lens' RestoreFromClusterSnapshot Text
+rfcsSnapshotIdentifier =
+    lens _rfcsSnapshotIdentifier (\s a -> s { _rfcsSnapshotIdentifier = a })
+
+-- | A list of Virtual Private Cloud (VPC) security groups to be associated
+-- with the cluster. Default: The default VPC security group is associated
+-- with the cluster. VPC security groups only apply to clusters in VPCs.
+rfcsVpcSecurityGroupIds :: Lens' RestoreFromClusterSnapshot [Text]
+rfcsVpcSecurityGroupIds =
+    lens _rfcsVpcSecurityGroupIds (\s a -> s { _rfcsVpcSecurityGroupIds = a })
+        . _List
+
+newtype RestoreFromClusterSnapshotResponse = RestoreFromClusterSnapshotResponse
+    { _rfcsrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'RestoreFromClusterSnapshotResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rfcsrCluster' @::@ 'Maybe' 'Cluster'
+--
+restoreFromClusterSnapshotResponse :: RestoreFromClusterSnapshotResponse
+restoreFromClusterSnapshotResponse = RestoreFromClusterSnapshotResponse
+    { _rfcsrCluster = Nothing
+    }
+
+rfcsrCluster :: Lens' RestoreFromClusterSnapshotResponse (Maybe Cluster)
+rfcsrCluster = lens _rfcsrCluster (\s a -> s { _rfcsrCluster = a })
+
+instance ToPath RestoreFromClusterSnapshot where
+    toPath = const "/"
+
+instance ToQuery RestoreFromClusterSnapshot where
+    toQuery RestoreFromClusterSnapshot{..} = mconcat
+        [ "AllowVersionUpgrade"              =? _rfcsAllowVersionUpgrade
+        , "AutomatedSnapshotRetentionPeriod" =? _rfcsAutomatedSnapshotRetentionPeriod
+        , "AvailabilityZone"                 =? _rfcsAvailabilityZone
+        , "ClusterIdentifier"                =? _rfcsClusterIdentifier
+        , "ClusterParameterGroupName"        =? _rfcsClusterParameterGroupName
+        , "ClusterSecurityGroups"            =? _rfcsClusterSecurityGroups
+        , "ClusterSubnetGroupName"           =? _rfcsClusterSubnetGroupName
+        , "ElasticIp"                        =? _rfcsElasticIp
+        , "HsmClientCertificateIdentifier"   =? _rfcsHsmClientCertificateIdentifier
+        , "HsmConfigurationIdentifier"       =? _rfcsHsmConfigurationIdentifier
+        , "KmsKeyId"                         =? _rfcsKmsKeyId
+        , "OwnerAccount"                     =? _rfcsOwnerAccount
+        , "Port"                             =? _rfcsPort
+        , "PreferredMaintenanceWindow"       =? _rfcsPreferredMaintenanceWindow
+        , "PubliclyAccessible"               =? _rfcsPubliclyAccessible
+        , "SnapshotClusterIdentifier"        =? _rfcsSnapshotClusterIdentifier
+        , "SnapshotIdentifier"               =? _rfcsSnapshotIdentifier
+        , "VpcSecurityGroupIds"              =? _rfcsVpcSecurityGroupIds
+        ]
+
+instance ToHeaders RestoreFromClusterSnapshot
+
+instance AWSRequest RestoreFromClusterSnapshot where
+    type Sv RestoreFromClusterSnapshot = Redshift
+    type Rs RestoreFromClusterSnapshot = RestoreFromClusterSnapshotResponse
+
+    request  = post "RestoreFromClusterSnapshot"
+    response = xmlResponse
+
+instance FromXML RestoreFromClusterSnapshotResponse where
+    parseXML = withElement "RestoreFromClusterSnapshotResult" $ \x -> RestoreFromClusterSnapshotResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/RevokeClusterSecurityGroupIngress.hs b/gen/Network/AWS/Redshift/RevokeClusterSecurityGroupIngress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/RevokeClusterSecurityGroupIngress.hs
@@ -0,0 +1,156 @@
+{-# 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.Redshift.RevokeClusterSecurityGroupIngress
+-- 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)
+
+-- | Revokes an ingress rule in an Amazon Redshift security group for a
+-- previously authorized IP range or Amazon EC2 security group. To add an
+-- ingress rule, see AuthorizeClusterSecurityGroupIngress. For information
+-- about managing security groups, go to Amazon Redshift Cluster Security
+-- Groups in the Amazon Redshift Cluster Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_RevokeClusterSecurityGroupIngress.html>
+module Network.AWS.Redshift.RevokeClusterSecurityGroupIngress
+    (
+    -- * Request
+      RevokeClusterSecurityGroupIngress
+    -- ** Request constructor
+    , revokeClusterSecurityGroupIngress
+    -- ** Request lenses
+    , rcsgiCIDRIP
+    , rcsgiClusterSecurityGroupName
+    , rcsgiEC2SecurityGroupName
+    , rcsgiEC2SecurityGroupOwnerId
+
+    -- * Response
+    , RevokeClusterSecurityGroupIngressResponse
+    -- ** Response constructor
+    , revokeClusterSecurityGroupIngressResponse
+    -- ** Response lenses
+    , rcsgirClusterSecurityGroup
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data RevokeClusterSecurityGroupIngress = RevokeClusterSecurityGroupIngress
+    { _rcsgiCIDRIP                   :: Maybe Text
+    , _rcsgiClusterSecurityGroupName :: Text
+    , _rcsgiEC2SecurityGroupName     :: Maybe Text
+    , _rcsgiEC2SecurityGroupOwnerId  :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RevokeClusterSecurityGroupIngress' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcsgiCIDRIP' @::@ 'Maybe' 'Text'
+--
+-- * 'rcsgiClusterSecurityGroupName' @::@ 'Text'
+--
+-- * 'rcsgiEC2SecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'rcsgiEC2SecurityGroupOwnerId' @::@ 'Maybe' 'Text'
+--
+revokeClusterSecurityGroupIngress :: Text -- ^ 'rcsgiClusterSecurityGroupName'
+                                  -> RevokeClusterSecurityGroupIngress
+revokeClusterSecurityGroupIngress p1 = RevokeClusterSecurityGroupIngress
+    { _rcsgiClusterSecurityGroupName = p1
+    , _rcsgiCIDRIP                   = Nothing
+    , _rcsgiEC2SecurityGroupName     = Nothing
+    , _rcsgiEC2SecurityGroupOwnerId  = Nothing
+    }
+
+-- | The IP range for which to revoke access. This range must be a valid
+-- Classless Inter-Domain Routing (CIDR) block of IP addresses. If CIDRIP is
+-- specified, EC2SecurityGroupName and EC2SecurityGroupOwnerId cannot be
+-- provided.
+rcsgiCIDRIP :: Lens' RevokeClusterSecurityGroupIngress (Maybe Text)
+rcsgiCIDRIP = lens _rcsgiCIDRIP (\s a -> s { _rcsgiCIDRIP = a })
+
+-- | The name of the security Group from which to revoke the ingress rule.
+rcsgiClusterSecurityGroupName :: Lens' RevokeClusterSecurityGroupIngress Text
+rcsgiClusterSecurityGroupName =
+    lens _rcsgiClusterSecurityGroupName
+        (\s a -> s { _rcsgiClusterSecurityGroupName = a })
+
+-- | The name of the EC2 Security Group whose access is to be revoked. If
+-- EC2SecurityGroupName is specified, EC2SecurityGroupOwnerId must also be
+-- provided and CIDRIP cannot be provided.
+rcsgiEC2SecurityGroupName :: Lens' RevokeClusterSecurityGroupIngress (Maybe Text)
+rcsgiEC2SecurityGroupName =
+    lens _rcsgiEC2SecurityGroupName
+        (\s a -> s { _rcsgiEC2SecurityGroupName = a })
+
+-- | The AWS account number of the owner of the security group specified in
+-- the EC2SecurityGroupName parameter. The AWS access key ID is not an
+-- acceptable value. If EC2SecurityGroupOwnerId is specified,
+-- EC2SecurityGroupName must also be provided. and CIDRIP cannot be
+-- provided. Example: 111122223333.
+rcsgiEC2SecurityGroupOwnerId :: Lens' RevokeClusterSecurityGroupIngress (Maybe Text)
+rcsgiEC2SecurityGroupOwnerId =
+    lens _rcsgiEC2SecurityGroupOwnerId
+        (\s a -> s { _rcsgiEC2SecurityGroupOwnerId = a })
+
+newtype RevokeClusterSecurityGroupIngressResponse = RevokeClusterSecurityGroupIngressResponse
+    { _rcsgirClusterSecurityGroup :: Maybe ClusterSecurityGroup
+    } deriving (Eq, Show)
+
+-- | 'RevokeClusterSecurityGroupIngressResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcsgirClusterSecurityGroup' @::@ 'Maybe' 'ClusterSecurityGroup'
+--
+revokeClusterSecurityGroupIngressResponse :: RevokeClusterSecurityGroupIngressResponse
+revokeClusterSecurityGroupIngressResponse = RevokeClusterSecurityGroupIngressResponse
+    { _rcsgirClusterSecurityGroup = Nothing
+    }
+
+rcsgirClusterSecurityGroup :: Lens' RevokeClusterSecurityGroupIngressResponse (Maybe ClusterSecurityGroup)
+rcsgirClusterSecurityGroup =
+    lens _rcsgirClusterSecurityGroup
+        (\s a -> s { _rcsgirClusterSecurityGroup = a })
+
+instance ToPath RevokeClusterSecurityGroupIngress where
+    toPath = const "/"
+
+instance ToQuery RevokeClusterSecurityGroupIngress where
+    toQuery RevokeClusterSecurityGroupIngress{..} = mconcat
+        [ "CIDRIP"                   =? _rcsgiCIDRIP
+        , "ClusterSecurityGroupName" =? _rcsgiClusterSecurityGroupName
+        , "EC2SecurityGroupName"     =? _rcsgiEC2SecurityGroupName
+        , "EC2SecurityGroupOwnerId"  =? _rcsgiEC2SecurityGroupOwnerId
+        ]
+
+instance ToHeaders RevokeClusterSecurityGroupIngress
+
+instance AWSRequest RevokeClusterSecurityGroupIngress where
+    type Sv RevokeClusterSecurityGroupIngress = Redshift
+    type Rs RevokeClusterSecurityGroupIngress = RevokeClusterSecurityGroupIngressResponse
+
+    request  = post "RevokeClusterSecurityGroupIngress"
+    response = xmlResponse
+
+instance FromXML RevokeClusterSecurityGroupIngressResponse where
+    parseXML = withElement "RevokeClusterSecurityGroupIngressResult" $ \x -> RevokeClusterSecurityGroupIngressResponse
+        <$> x .@? "ClusterSecurityGroup"
diff --git a/gen/Network/AWS/Redshift/RevokeSnapshotAccess.hs b/gen/Network/AWS/Redshift/RevokeSnapshotAccess.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/RevokeSnapshotAccess.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.Redshift.RevokeSnapshotAccess
+-- 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)
+
+-- | Removes the ability of the specified AWS customer account to restore the
+-- specified snapshot. If the account is currently restoring the snapshot, the
+-- restore will run to completion. For more information about working with
+-- snapshots, go to Amazon Redshift Snapshots in the Amazon Redshift Cluster
+-- Management Guide.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_RevokeSnapshotAccess.html>
+module Network.AWS.Redshift.RevokeSnapshotAccess
+    (
+    -- * Request
+      RevokeSnapshotAccess
+    -- ** Request constructor
+    , revokeSnapshotAccess
+    -- ** Request lenses
+    , rsaAccountWithRestoreAccess
+    , rsaSnapshotClusterIdentifier
+    , rsaSnapshotIdentifier
+
+    -- * Response
+    , RevokeSnapshotAccessResponse
+    -- ** Response constructor
+    , revokeSnapshotAccessResponse
+    -- ** Response lenses
+    , rsarSnapshot
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+data RevokeSnapshotAccess = RevokeSnapshotAccess
+    { _rsaAccountWithRestoreAccess  :: Text
+    , _rsaSnapshotClusterIdentifier :: Maybe Text
+    , _rsaSnapshotIdentifier        :: Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RevokeSnapshotAccess' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rsaAccountWithRestoreAccess' @::@ 'Text'
+--
+-- * 'rsaSnapshotClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'rsaSnapshotIdentifier' @::@ 'Text'
+--
+revokeSnapshotAccess :: Text -- ^ 'rsaSnapshotIdentifier'
+                     -> Text -- ^ 'rsaAccountWithRestoreAccess'
+                     -> RevokeSnapshotAccess
+revokeSnapshotAccess p1 p2 = RevokeSnapshotAccess
+    { _rsaSnapshotIdentifier        = p1
+    , _rsaAccountWithRestoreAccess  = p2
+    , _rsaSnapshotClusterIdentifier = Nothing
+    }
+
+-- | The identifier of the AWS customer account that can no longer restore the
+-- specified snapshot.
+rsaAccountWithRestoreAccess :: Lens' RevokeSnapshotAccess Text
+rsaAccountWithRestoreAccess =
+    lens _rsaAccountWithRestoreAccess
+        (\s a -> s { _rsaAccountWithRestoreAccess = a })
+
+-- | The identifier of the cluster the snapshot was created from. This
+-- parameter is required if your IAM user has a policy containing a snapshot
+-- resource element that specifies anything other than * for the cluster
+-- name.
+rsaSnapshotClusterIdentifier :: Lens' RevokeSnapshotAccess (Maybe Text)
+rsaSnapshotClusterIdentifier =
+    lens _rsaSnapshotClusterIdentifier
+        (\s a -> s { _rsaSnapshotClusterIdentifier = a })
+
+-- | The identifier of the snapshot that the account can no longer access.
+rsaSnapshotIdentifier :: Lens' RevokeSnapshotAccess Text
+rsaSnapshotIdentifier =
+    lens _rsaSnapshotIdentifier (\s a -> s { _rsaSnapshotIdentifier = a })
+
+newtype RevokeSnapshotAccessResponse = RevokeSnapshotAccessResponse
+    { _rsarSnapshot :: Maybe Snapshot
+    } deriving (Eq, Show)
+
+-- | 'RevokeSnapshotAccessResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rsarSnapshot' @::@ 'Maybe' 'Snapshot'
+--
+revokeSnapshotAccessResponse :: RevokeSnapshotAccessResponse
+revokeSnapshotAccessResponse = RevokeSnapshotAccessResponse
+    { _rsarSnapshot = Nothing
+    }
+
+rsarSnapshot :: Lens' RevokeSnapshotAccessResponse (Maybe Snapshot)
+rsarSnapshot = lens _rsarSnapshot (\s a -> s { _rsarSnapshot = a })
+
+instance ToPath RevokeSnapshotAccess where
+    toPath = const "/"
+
+instance ToQuery RevokeSnapshotAccess where
+    toQuery RevokeSnapshotAccess{..} = mconcat
+        [ "AccountWithRestoreAccess"  =? _rsaAccountWithRestoreAccess
+        , "SnapshotClusterIdentifier" =? _rsaSnapshotClusterIdentifier
+        , "SnapshotIdentifier"        =? _rsaSnapshotIdentifier
+        ]
+
+instance ToHeaders RevokeSnapshotAccess
+
+instance AWSRequest RevokeSnapshotAccess where
+    type Sv RevokeSnapshotAccess = Redshift
+    type Rs RevokeSnapshotAccess = RevokeSnapshotAccessResponse
+
+    request  = post "RevokeSnapshotAccess"
+    response = xmlResponse
+
+instance FromXML RevokeSnapshotAccessResponse where
+    parseXML = withElement "RevokeSnapshotAccessResult" $ \x -> RevokeSnapshotAccessResponse
+        <$> x .@? "Snapshot"
diff --git a/gen/Network/AWS/Redshift/RotateEncryptionKey.hs b/gen/Network/AWS/Redshift/RotateEncryptionKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/RotateEncryptionKey.hs
@@ -0,0 +1,108 @@
+{-# 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.Redshift.RotateEncryptionKey
+-- 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)
+
+-- | Rotates the encryption keys for a cluster.
+--
+-- <http://docs.aws.amazon.com/redshift/latest/APIReference/API_RotateEncryptionKey.html>
+module Network.AWS.Redshift.RotateEncryptionKey
+    (
+    -- * Request
+      RotateEncryptionKey
+    -- ** Request constructor
+    , rotateEncryptionKey
+    -- ** Request lenses
+    , rekClusterIdentifier
+
+    -- * Response
+    , RotateEncryptionKeyResponse
+    -- ** Response constructor
+    , rotateEncryptionKeyResponse
+    -- ** Response lenses
+    , rekrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.Redshift.Types
+import qualified GHC.Exts
+
+newtype RotateEncryptionKey = RotateEncryptionKey
+    { _rekClusterIdentifier :: Text
+    } deriving (Eq, Ord, Show, Monoid, IsString)
+
+-- | 'RotateEncryptionKey' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rekClusterIdentifier' @::@ 'Text'
+--
+rotateEncryptionKey :: Text -- ^ 'rekClusterIdentifier'
+                    -> RotateEncryptionKey
+rotateEncryptionKey p1 = RotateEncryptionKey
+    { _rekClusterIdentifier = p1
+    }
+
+-- | The unique identifier of the cluster that you want to rotate the
+-- encryption keys for. Constraints: Must be the name of valid cluster that
+-- has encryption enabled.
+rekClusterIdentifier :: Lens' RotateEncryptionKey Text
+rekClusterIdentifier =
+    lens _rekClusterIdentifier (\s a -> s { _rekClusterIdentifier = a })
+
+newtype RotateEncryptionKeyResponse = RotateEncryptionKeyResponse
+    { _rekrCluster :: Maybe Cluster
+    } deriving (Eq, Show)
+
+-- | 'RotateEncryptionKeyResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rekrCluster' @::@ 'Maybe' 'Cluster'
+--
+rotateEncryptionKeyResponse :: RotateEncryptionKeyResponse
+rotateEncryptionKeyResponse = RotateEncryptionKeyResponse
+    { _rekrCluster = Nothing
+    }
+
+rekrCluster :: Lens' RotateEncryptionKeyResponse (Maybe Cluster)
+rekrCluster = lens _rekrCluster (\s a -> s { _rekrCluster = a })
+
+instance ToPath RotateEncryptionKey where
+    toPath = const "/"
+
+instance ToQuery RotateEncryptionKey where
+    toQuery RotateEncryptionKey{..} = mconcat
+        [ "ClusterIdentifier" =? _rekClusterIdentifier
+        ]
+
+instance ToHeaders RotateEncryptionKey
+
+instance AWSRequest RotateEncryptionKey where
+    type Sv RotateEncryptionKey = Redshift
+    type Rs RotateEncryptionKey = RotateEncryptionKeyResponse
+
+    request  = post "RotateEncryptionKey"
+    response = xmlResponse
+
+instance FromXML RotateEncryptionKeyResponse where
+    parseXML = withElement "RotateEncryptionKeyResult" $ \x -> RotateEncryptionKeyResponse
+        <$> x .@? "Cluster"
diff --git a/gen/Network/AWS/Redshift/Types.hs b/gen/Network/AWS/Redshift/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Redshift/Types.hs
@@ -0,0 +1,3347 @@
+{-# 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.Redshift.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.Redshift.Types
+    (
+    -- * Service
+      Redshift
+    -- ** Error
+    , RESTError
+    -- ** XML
+    , ns
+
+    -- * Snapshot
+    , Snapshot
+    , snapshot
+    , sAccountsWithRestoreAccess
+    , sActualIncrementalBackupSizeInMegaBytes
+    , sAvailabilityZone
+    , sBackupProgressInMegaBytes
+    , sClusterCreateTime
+    , sClusterIdentifier
+    , sClusterVersion
+    , sCurrentBackupRateInMegaBytesPerSecond
+    , sDBName
+    , sElapsedTimeInSeconds
+    , sEncrypted
+    , sEncryptedWithHSM
+    , sEstimatedSecondsToCompletion
+    , sKmsKeyId
+    , sMasterUsername
+    , sNodeType
+    , sNumberOfNodes
+    , sOwnerAccount
+    , sPort
+    , sSnapshotCreateTime
+    , sSnapshotIdentifier
+    , sSnapshotType
+    , sSourceRegion
+    , sStatus
+    , sTags
+    , sTotalBackupSizeInMegaBytes
+    , sVpcId
+
+    -- * ClusterParameterGroup
+    , ClusterParameterGroup
+    , clusterParameterGroup
+    , cpgDescription
+    , cpgParameterGroupFamily
+    , cpgParameterGroupName
+    , cpgTags
+
+    -- * RestoreStatus
+    , RestoreStatus
+    , restoreStatus
+    , rsCurrentRestoreRateInMegaBytesPerSecond
+    , rsElapsedTimeInSeconds
+    , rsEstimatedTimeToCompletionInSeconds
+    , rsProgressInMegaBytes
+    , rsSnapshotSizeInMegaBytes
+    , rsStatus
+
+    -- * Event
+    , Event
+    , event
+    , eDate
+    , eEventCategories
+    , eEventId
+    , eMessage
+    , eSeverity
+    , eSourceIdentifier
+    , eSourceType
+
+    -- * ClusterSnapshotCopyStatus
+    , ClusterSnapshotCopyStatus
+    , clusterSnapshotCopyStatus
+    , cscsDestinationRegion
+    , cscsRetentionPeriod
+
+    -- * Tag
+    , Tag
+    , tag
+    , tagKey
+    , tagValue
+
+    -- * HsmClientCertificate
+    , HsmClientCertificate
+    , hsmClientCertificate
+    , hccHsmClientCertificateIdentifier
+    , hccHsmClientCertificatePublicKey
+    , hccTags
+
+    -- * Cluster
+    , Cluster
+    , cluster
+    , cAllowVersionUpgrade
+    , cAutomatedSnapshotRetentionPeriod
+    , cAvailabilityZone
+    , cClusterCreateTime
+    , cClusterIdentifier
+    , cClusterNodes
+    , cClusterParameterGroups
+    , cClusterPublicKey
+    , cClusterRevisionNumber
+    , cClusterSecurityGroups
+    , cClusterSnapshotCopyStatus
+    , cClusterStatus
+    , cClusterSubnetGroupName
+    , cClusterVersion
+    , cDBName
+    , cElasticIpStatus
+    , cEncrypted
+    , cEndpoint
+    , cHsmStatus
+    , cKmsKeyId
+    , cMasterUsername
+    , cModifyStatus
+    , cNodeType
+    , cNumberOfNodes
+    , cPendingModifiedValues
+    , cPreferredMaintenanceWindow
+    , cPubliclyAccessible
+    , cRestoreStatus
+    , cTags
+    , cVpcId
+    , cVpcSecurityGroups
+
+    -- * ClusterNode
+    , ClusterNode
+    , clusterNode
+    , cnNodeRole
+    , cnPrivateIPAddress
+    , cnPublicIPAddress
+
+    -- * EC2SecurityGroup
+    , EC2SecurityGroup
+    , ec2SecurityGroup
+    , ecsgEC2SecurityGroupName
+    , ecsgEC2SecurityGroupOwnerId
+    , ecsgStatus
+    , ecsgTags
+
+    -- * OrderableClusterOption
+    , OrderableClusterOption
+    , orderableClusterOption
+    , ocoAvailabilityZones
+    , ocoClusterType
+    , ocoClusterVersion
+    , ocoNodeType
+
+    -- * SourceType
+    , SourceType (..)
+
+    -- * ClusterParameterGroupStatus
+    , ClusterParameterGroupStatus
+    , clusterParameterGroupStatus
+    , cpgsParameterApplyStatus
+    , cpgsParameterGroupName
+
+    -- * Subnet
+    , Subnet
+    , subnet
+    , sSubnetAvailabilityZone
+    , sSubnetIdentifier
+    , sSubnetStatus
+
+    -- * ClusterSecurityGroup
+    , ClusterSecurityGroup
+    , clusterSecurityGroup
+    , csgClusterSecurityGroupName
+    , csgDescription
+    , csgEC2SecurityGroups
+    , csgIPRanges
+    , csgTags
+
+    -- * DefaultClusterParameters
+    , DefaultClusterParameters
+    , defaultClusterParameters
+    , dcpMarker
+    , dcpParameterGroupFamily
+    , dcpParameters
+
+    -- * ClusterSubnetGroup
+    , ClusterSubnetGroup
+    , clusterSubnetGroup
+    , csg1ClusterSubnetGroupName
+    , csg1Description
+    , csg1SubnetGroupStatus
+    , csg1Subnets
+    , csg1Tags
+    , csg1VpcId
+
+    -- * EventInfoMap
+    , EventInfoMap
+    , eventInfoMap
+    , eimEventCategories
+    , eimEventDescription
+    , eimEventId
+    , eimSeverity
+
+    -- * ClusterSecurityGroupMembership
+    , ClusterSecurityGroupMembership
+    , clusterSecurityGroupMembership
+    , csgmClusterSecurityGroupName
+    , csgmStatus
+
+    -- * ReservedNodeOffering
+    , ReservedNodeOffering
+    , reservedNodeOffering
+    , rnoCurrencyCode
+    , rnoDuration
+    , rnoFixedPrice
+    , rnoNodeType
+    , rnoOfferingType
+    , rnoRecurringCharges
+    , rnoReservedNodeOfferingId
+    , rnoUsagePrice
+
+    -- * ReservedNode
+    , ReservedNode
+    , reservedNode
+    , rnCurrencyCode
+    , rnDuration
+    , rnFixedPrice
+    , rnNodeCount
+    , rnNodeType
+    , rnOfferingType
+    , rnRecurringCharges
+    , rnReservedNodeId
+    , rnReservedNodeOfferingId
+    , rnStartTime
+    , rnState
+    , rnUsagePrice
+
+    -- * LoggingStatus
+    , LoggingStatus
+    , loggingStatus
+    , lsBucketName
+    , lsLastFailureMessage
+    , lsLastFailureTime
+    , lsLastSuccessfulDeliveryTime
+    , lsLoggingEnabled
+    , lsS3KeyPrefix
+
+    -- * AccountWithRestoreAccess
+    , AccountWithRestoreAccess
+    , accountWithRestoreAccess
+    , awraAccountId
+
+    -- * AvailabilityZone
+    , AvailabilityZone
+    , availabilityZone
+    , azName
+
+    -- * EventSubscription
+    , EventSubscription
+    , eventSubscription
+    , esCustSubscriptionId
+    , esCustomerAwsId
+    , esEnabled
+    , esEventCategoriesList
+    , esSeverity
+    , esSnsTopicArn
+    , esSourceIdsList
+    , esSourceType
+    , esStatus
+    , esSubscriptionCreationTime
+    , esTags
+
+    -- * HsmStatus
+    , HsmStatus
+    , hsmStatus
+    , hsHsmClientCertificateIdentifier
+    , hsHsmConfigurationIdentifier
+    , hsStatus
+
+    -- * ClusterParameterGroupNameMessage
+    , ClusterParameterGroupNameMessage
+    , clusterParameterGroupNameMessage
+    , cpgnmParameterGroupName
+    , cpgnmParameterGroupStatus
+
+    -- * ElasticIpStatus
+    , ElasticIpStatus
+    , elasticIpStatus
+    , eisElasticIp
+    , eisStatus
+
+    -- * ClusterVersion
+    , ClusterVersion
+    , clusterVersion
+    , cvClusterParameterGroupFamily
+    , cvClusterVersion
+    , cvDescription
+
+    -- * RecurringCharge
+    , RecurringCharge
+    , recurringCharge
+    , rcRecurringChargeAmount
+    , rcRecurringChargeFrequency
+
+    -- * Endpoint
+    , Endpoint
+    , endpoint
+    , eAddress
+    , ePort
+
+    -- * IPRange
+    , IPRange
+    , iprange
+    , iprCIDRIP
+    , iprStatus
+    , iprTags
+
+    -- * TaggedResource
+    , TaggedResource
+    , taggedResource
+    , trResourceName
+    , trResourceType
+    , trTag
+
+    -- * EventCategoriesMap
+    , EventCategoriesMap
+    , eventCategoriesMap
+    , ecmEvents
+    , ecmSourceType
+
+    -- * HsmConfiguration
+    , HsmConfiguration
+    , hsmConfiguration
+    , hcDescription
+    , hcHsmConfigurationIdentifier
+    , hcHsmIpAddress
+    , hcHsmPartitionName
+    , hcTags
+
+    -- * PendingModifiedValues
+    , PendingModifiedValues
+    , pendingModifiedValues
+    , pmvAutomatedSnapshotRetentionPeriod
+    , pmvClusterIdentifier
+    , pmvClusterType
+    , pmvClusterVersion
+    , pmvMasterUserPassword
+    , pmvNodeType
+    , pmvNumberOfNodes
+
+    -- * VpcSecurityGroupMembership
+    , VpcSecurityGroupMembership
+    , vpcSecurityGroupMembership
+    , vsgmStatus
+    , vsgmVpcSecurityGroupId
+
+    -- * Parameter
+    , Parameter
+    , parameter
+    , pAllowedValues
+    , pDataType
+    , pDescription
+    , pIsModifiable
+    , pMinimumEngineVersion
+    , pParameterName
+    , pParameterValue
+    , pSource
+    ) where
+
+import Network.AWS.Error
+import Network.AWS.Prelude
+import Network.AWS.Signing.V4
+import qualified GHC.Exts
+
+-- | Version @2012-12-01@ of the Amazon Redshift service.
+data Redshift
+
+instance AWSService Redshift where
+    type Sg Redshift = V4
+    type Er Redshift = RESTError
+
+    service = Service
+        { _svcEndpoint     = regional
+        , _svcAbbrev       = "Redshift"
+        , _svcPrefix       = "redshift"
+        , _svcVersion      = "2012-12-01"
+        , _svcTargetPrefix = Nothing
+        , _svcJSONVersion  = Nothing
+        }
+
+    handle = restError statusSuccess
+
+ns :: Text
+ns = "http://redshift.amazonaws.com/doc/2012-12-01/"
+
+data Snapshot = Snapshot
+    { _sAccountsWithRestoreAccess              :: List "AccountWithRestoreAccess" AccountWithRestoreAccess
+    , _sActualIncrementalBackupSizeInMegaBytes :: Maybe Double
+    , _sAvailabilityZone                       :: Maybe Text
+    , _sBackupProgressInMegaBytes              :: Maybe Double
+    , _sClusterCreateTime                      :: Maybe RFC822
+    , _sClusterIdentifier                      :: Maybe Text
+    , _sClusterVersion                         :: Maybe Text
+    , _sCurrentBackupRateInMegaBytesPerSecond  :: Maybe Double
+    , _sDBName                                 :: Maybe Text
+    , _sElapsedTimeInSeconds                   :: Maybe Integer
+    , _sEncrypted                              :: Maybe Bool
+    , _sEncryptedWithHSM                       :: Maybe Bool
+    , _sEstimatedSecondsToCompletion           :: Maybe Integer
+    , _sKmsKeyId                               :: Maybe Text
+    , _sMasterUsername                         :: Maybe Text
+    , _sNodeType                               :: Maybe Text
+    , _sNumberOfNodes                          :: Maybe Int
+    , _sOwnerAccount                           :: Maybe Text
+    , _sPort                                   :: Maybe Int
+    , _sSnapshotCreateTime                     :: Maybe RFC822
+    , _sSnapshotIdentifier                     :: Maybe Text
+    , _sSnapshotType                           :: Maybe Text
+    , _sSourceRegion                           :: Maybe Text
+    , _sStatus                                 :: Maybe Text
+    , _sTags                                   :: List "Tag" Tag
+    , _sTotalBackupSizeInMegaBytes             :: Maybe Double
+    , _sVpcId                                  :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'Snapshot' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sAccountsWithRestoreAccess' @::@ ['AccountWithRestoreAccess']
+--
+-- * 'sActualIncrementalBackupSizeInMegaBytes' @::@ 'Maybe' 'Double'
+--
+-- * 'sAvailabilityZone' @::@ 'Maybe' 'Text'
+--
+-- * 'sBackupProgressInMegaBytes' @::@ 'Maybe' 'Double'
+--
+-- * 'sClusterCreateTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'sClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'sClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'sCurrentBackupRateInMegaBytesPerSecond' @::@ 'Maybe' 'Double'
+--
+-- * 'sDBName' @::@ 'Maybe' 'Text'
+--
+-- * 'sElapsedTimeInSeconds' @::@ 'Maybe' 'Integer'
+--
+-- * 'sEncrypted' @::@ 'Maybe' 'Bool'
+--
+-- * 'sEncryptedWithHSM' @::@ 'Maybe' 'Bool'
+--
+-- * 'sEstimatedSecondsToCompletion' @::@ 'Maybe' 'Integer'
+--
+-- * 'sKmsKeyId' @::@ 'Maybe' 'Text'
+--
+-- * 'sMasterUsername' @::@ 'Maybe' 'Text'
+--
+-- * 'sNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'sNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+-- * 'sOwnerAccount' @::@ 'Maybe' 'Text'
+--
+-- * 'sPort' @::@ 'Maybe' 'Int'
+--
+-- * 'sSnapshotCreateTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'sSnapshotIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'sSnapshotType' @::@ 'Maybe' 'Text'
+--
+-- * 'sSourceRegion' @::@ 'Maybe' 'Text'
+--
+-- * 'sStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'sTags' @::@ ['Tag']
+--
+-- * 'sTotalBackupSizeInMegaBytes' @::@ 'Maybe' 'Double'
+--
+-- * 'sVpcId' @::@ 'Maybe' 'Text'
+--
+snapshot :: Snapshot
+snapshot = Snapshot
+    { _sSnapshotIdentifier                     = Nothing
+    , _sClusterIdentifier                      = Nothing
+    , _sSnapshotCreateTime                     = Nothing
+    , _sStatus                                 = Nothing
+    , _sPort                                   = Nothing
+    , _sAvailabilityZone                       = Nothing
+    , _sClusterCreateTime                      = Nothing
+    , _sMasterUsername                         = Nothing
+    , _sClusterVersion                         = Nothing
+    , _sSnapshotType                           = Nothing
+    , _sNodeType                               = Nothing
+    , _sNumberOfNodes                          = Nothing
+    , _sDBName                                 = Nothing
+    , _sVpcId                                  = Nothing
+    , _sEncrypted                              = Nothing
+    , _sKmsKeyId                               = Nothing
+    , _sEncryptedWithHSM                       = Nothing
+    , _sAccountsWithRestoreAccess              = mempty
+    , _sOwnerAccount                           = Nothing
+    , _sTotalBackupSizeInMegaBytes             = Nothing
+    , _sActualIncrementalBackupSizeInMegaBytes = Nothing
+    , _sBackupProgressInMegaBytes              = Nothing
+    , _sCurrentBackupRateInMegaBytesPerSecond  = Nothing
+    , _sEstimatedSecondsToCompletion           = Nothing
+    , _sElapsedTimeInSeconds                   = Nothing
+    , _sSourceRegion                           = Nothing
+    , _sTags                                   = mempty
+    }
+
+-- | A list of the AWS customer accounts authorized to restore the snapshot.
+-- Returns null if no accounts are authorized. Visible only to the snapshot
+-- owner.
+sAccountsWithRestoreAccess :: Lens' Snapshot [AccountWithRestoreAccess]
+sAccountsWithRestoreAccess =
+    lens _sAccountsWithRestoreAccess
+        (\s a -> s { _sAccountsWithRestoreAccess = a })
+            . _List
+
+-- | The size of the incremental backup.
+sActualIncrementalBackupSizeInMegaBytes :: Lens' Snapshot (Maybe Double)
+sActualIncrementalBackupSizeInMegaBytes =
+    lens _sActualIncrementalBackupSizeInMegaBytes
+        (\s a -> s { _sActualIncrementalBackupSizeInMegaBytes = a })
+
+-- | The Availability Zone in which the cluster was created.
+sAvailabilityZone :: Lens' Snapshot (Maybe Text)
+sAvailabilityZone =
+    lens _sAvailabilityZone (\s a -> s { _sAvailabilityZone = a })
+
+-- | The number of megabytes that have been transferred to the snapshot
+-- backup.
+sBackupProgressInMegaBytes :: Lens' Snapshot (Maybe Double)
+sBackupProgressInMegaBytes =
+    lens _sBackupProgressInMegaBytes
+        (\s a -> s { _sBackupProgressInMegaBytes = a })
+
+-- | The time (UTC) when the cluster was originally created.
+sClusterCreateTime :: Lens' Snapshot (Maybe UTCTime)
+sClusterCreateTime =
+    lens _sClusterCreateTime (\s a -> s { _sClusterCreateTime = a })
+        . mapping _Time
+
+-- | The identifier of the cluster for which the snapshot was taken.
+sClusterIdentifier :: Lens' Snapshot (Maybe Text)
+sClusterIdentifier =
+    lens _sClusterIdentifier (\s a -> s { _sClusterIdentifier = a })
+
+-- | The version ID of the Amazon Redshift engine that is running on the
+-- cluster.
+sClusterVersion :: Lens' Snapshot (Maybe Text)
+sClusterVersion = lens _sClusterVersion (\s a -> s { _sClusterVersion = a })
+
+-- | The number of megabytes per second being transferred to the snapshot
+-- backup. Returns 0 for a completed backup.
+sCurrentBackupRateInMegaBytesPerSecond :: Lens' Snapshot (Maybe Double)
+sCurrentBackupRateInMegaBytesPerSecond =
+    lens _sCurrentBackupRateInMegaBytesPerSecond
+        (\s a -> s { _sCurrentBackupRateInMegaBytesPerSecond = a })
+
+-- | The name of the database that was created when the cluster was created.
+sDBName :: Lens' Snapshot (Maybe Text)
+sDBName = lens _sDBName (\s a -> s { _sDBName = a })
+
+-- | The amount of time an in-progress snapshot backup has been running, or
+-- the amount of time it took a completed backup to finish.
+sElapsedTimeInSeconds :: Lens' Snapshot (Maybe Integer)
+sElapsedTimeInSeconds =
+    lens _sElapsedTimeInSeconds (\s a -> s { _sElapsedTimeInSeconds = a })
+
+-- | If true, the data in the snapshot is encrypted at rest.
+sEncrypted :: Lens' Snapshot (Maybe Bool)
+sEncrypted = lens _sEncrypted (\s a -> s { _sEncrypted = a })
+
+-- | A boolean that indicates whether the snapshot data is encrypted using the
+-- HSM keys of the source cluster. true indicates that the data is encrypted
+-- using HSM keys.
+sEncryptedWithHSM :: Lens' Snapshot (Maybe Bool)
+sEncryptedWithHSM =
+    lens _sEncryptedWithHSM (\s a -> s { _sEncryptedWithHSM = a })
+
+-- | The estimate of the time remaining before the snapshot backup will
+-- complete. Returns 0 for a completed backup.
+sEstimatedSecondsToCompletion :: Lens' Snapshot (Maybe Integer)
+sEstimatedSecondsToCompletion =
+    lens _sEstimatedSecondsToCompletion
+        (\s a -> s { _sEstimatedSecondsToCompletion = a })
+
+-- | The AWS Key Management Service (KMS) key ID of the encryption key that
+-- was used to encrypt data in the cluster from which the snapshot was
+-- taken.
+sKmsKeyId :: Lens' Snapshot (Maybe Text)
+sKmsKeyId = lens _sKmsKeyId (\s a -> s { _sKmsKeyId = a })
+
+-- | The master user name for the cluster.
+sMasterUsername :: Lens' Snapshot (Maybe Text)
+sMasterUsername = lens _sMasterUsername (\s a -> s { _sMasterUsername = a })
+
+-- | The node type of the nodes in the cluster.
+sNodeType :: Lens' Snapshot (Maybe Text)
+sNodeType = lens _sNodeType (\s a -> s { _sNodeType = a })
+
+-- | The number of nodes in the cluster.
+sNumberOfNodes :: Lens' Snapshot (Maybe Int)
+sNumberOfNodes = lens _sNumberOfNodes (\s a -> s { _sNumberOfNodes = a })
+
+-- | For manual snapshots, the AWS customer account used to create or copy the
+-- snapshot. For automatic snapshots, the owner of the cluster. The owner
+-- can perform all snapshot actions, such as sharing a manual snapshot.
+sOwnerAccount :: Lens' Snapshot (Maybe Text)
+sOwnerAccount = lens _sOwnerAccount (\s a -> s { _sOwnerAccount = a })
+
+-- | The port that the cluster is listening on.
+sPort :: Lens' Snapshot (Maybe Int)
+sPort = lens _sPort (\s a -> s { _sPort = a })
+
+-- | The time (UTC) when Amazon Redshift began the snapshot. A snapshot
+-- contains a copy of the cluster data as of this exact time.
+sSnapshotCreateTime :: Lens' Snapshot (Maybe UTCTime)
+sSnapshotCreateTime =
+    lens _sSnapshotCreateTime (\s a -> s { _sSnapshotCreateTime = a })
+        . mapping _Time
+
+-- | The snapshot identifier that is provided in the request.
+sSnapshotIdentifier :: Lens' Snapshot (Maybe Text)
+sSnapshotIdentifier =
+    lens _sSnapshotIdentifier (\s a -> s { _sSnapshotIdentifier = a })
+
+-- | The snapshot type. Snapshots created using CreateClusterSnapshot and
+-- CopyClusterSnapshot will be of type "manual".
+sSnapshotType :: Lens' Snapshot (Maybe Text)
+sSnapshotType = lens _sSnapshotType (\s a -> s { _sSnapshotType = a })
+
+-- | The source region from which the snapshot was copied.
+sSourceRegion :: Lens' Snapshot (Maybe Text)
+sSourceRegion = lens _sSourceRegion (\s a -> s { _sSourceRegion = a })
+
+-- | The snapshot status. The value of the status depends on the API operation
+-- used. CreateClusterSnapshot and CopyClusterSnapshot returns status as
+-- "creating". DescribeClusterSnapshots returns status as "creating",
+-- "available", "final snapshot", or "failed". DeleteClusterSnapshot returns
+-- status as "deleted".
+sStatus :: Lens' Snapshot (Maybe Text)
+sStatus = lens _sStatus (\s a -> s { _sStatus = a })
+
+-- | The list of tags for the cluster snapshot.
+sTags :: Lens' Snapshot [Tag]
+sTags = lens _sTags (\s a -> s { _sTags = a }) . _List
+
+-- | The size of the complete set of backup data that would be used to restore
+-- the cluster.
+sTotalBackupSizeInMegaBytes :: Lens' Snapshot (Maybe Double)
+sTotalBackupSizeInMegaBytes =
+    lens _sTotalBackupSizeInMegaBytes
+        (\s a -> s { _sTotalBackupSizeInMegaBytes = a })
+
+-- | The VPC identifier of the cluster if the snapshot is from a cluster in a
+-- VPC. Otherwise, this field is not in the output.
+sVpcId :: Lens' Snapshot (Maybe Text)
+sVpcId = lens _sVpcId (\s a -> s { _sVpcId = a })
+
+instance FromXML Snapshot where
+    parseXML x = Snapshot
+        <$> x .@  "AccountsWithRestoreAccess"
+        <*> x .@? "ActualIncrementalBackupSizeInMegaBytes"
+        <*> x .@? "AvailabilityZone"
+        <*> x .@? "BackupProgressInMegaBytes"
+        <*> x .@? "ClusterCreateTime"
+        <*> x .@? "ClusterIdentifier"
+        <*> x .@? "ClusterVersion"
+        <*> x .@? "CurrentBackupRateInMegaBytesPerSecond"
+        <*> x .@? "DBName"
+        <*> x .@? "ElapsedTimeInSeconds"
+        <*> x .@? "Encrypted"
+        <*> x .@? "EncryptedWithHSM"
+        <*> x .@? "EstimatedSecondsToCompletion"
+        <*> x .@? "KmsKeyId"
+        <*> x .@? "MasterUsername"
+        <*> x .@? "NodeType"
+        <*> x .@? "NumberOfNodes"
+        <*> x .@? "OwnerAccount"
+        <*> x .@? "Port"
+        <*> x .@? "SnapshotCreateTime"
+        <*> x .@? "SnapshotIdentifier"
+        <*> x .@? "SnapshotType"
+        <*> x .@? "SourceRegion"
+        <*> x .@? "Status"
+        <*> x .@  "Tags"
+        <*> x .@? "TotalBackupSizeInMegaBytes"
+        <*> x .@? "VpcId"
+
+instance ToQuery Snapshot where
+    toQuery Snapshot{..} = mconcat
+        [ "AccountsWithRestoreAccess"              =? _sAccountsWithRestoreAccess
+        , "ActualIncrementalBackupSizeInMegaBytes" =? _sActualIncrementalBackupSizeInMegaBytes
+        , "AvailabilityZone"                       =? _sAvailabilityZone
+        , "BackupProgressInMegaBytes"              =? _sBackupProgressInMegaBytes
+        , "ClusterCreateTime"                      =? _sClusterCreateTime
+        , "ClusterIdentifier"                      =? _sClusterIdentifier
+        , "ClusterVersion"                         =? _sClusterVersion
+        , "CurrentBackupRateInMegaBytesPerSecond"  =? _sCurrentBackupRateInMegaBytesPerSecond
+        , "DBName"                                 =? _sDBName
+        , "ElapsedTimeInSeconds"                   =? _sElapsedTimeInSeconds
+        , "Encrypted"                              =? _sEncrypted
+        , "EncryptedWithHSM"                       =? _sEncryptedWithHSM
+        , "EstimatedSecondsToCompletion"           =? _sEstimatedSecondsToCompletion
+        , "KmsKeyId"                               =? _sKmsKeyId
+        , "MasterUsername"                         =? _sMasterUsername
+        , "NodeType"                               =? _sNodeType
+        , "NumberOfNodes"                          =? _sNumberOfNodes
+        , "OwnerAccount"                           =? _sOwnerAccount
+        , "Port"                                   =? _sPort
+        , "SnapshotCreateTime"                     =? _sSnapshotCreateTime
+        , "SnapshotIdentifier"                     =? _sSnapshotIdentifier
+        , "SnapshotType"                           =? _sSnapshotType
+        , "SourceRegion"                           =? _sSourceRegion
+        , "Status"                                 =? _sStatus
+        , "Tags"                                   =? _sTags
+        , "TotalBackupSizeInMegaBytes"             =? _sTotalBackupSizeInMegaBytes
+        , "VpcId"                                  =? _sVpcId
+        ]
+
+data ClusterParameterGroup = ClusterParameterGroup
+    { _cpgDescription          :: Maybe Text
+    , _cpgParameterGroupFamily :: Maybe Text
+    , _cpgParameterGroupName   :: Maybe Text
+    , _cpgTags                 :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'ClusterParameterGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cpgDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'cpgParameterGroupFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'cpgParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'cpgTags' @::@ ['Tag']
+--
+clusterParameterGroup :: ClusterParameterGroup
+clusterParameterGroup = ClusterParameterGroup
+    { _cpgParameterGroupName   = Nothing
+    , _cpgParameterGroupFamily = Nothing
+    , _cpgDescription          = Nothing
+    , _cpgTags                 = mempty
+    }
+
+-- | The description of the parameter group.
+cpgDescription :: Lens' ClusterParameterGroup (Maybe Text)
+cpgDescription = lens _cpgDescription (\s a -> s { _cpgDescription = a })
+
+-- | The name of the cluster parameter group family that this cluster
+-- parameter group is compatible with.
+cpgParameterGroupFamily :: Lens' ClusterParameterGroup (Maybe Text)
+cpgParameterGroupFamily =
+    lens _cpgParameterGroupFamily (\s a -> s { _cpgParameterGroupFamily = a })
+
+-- | The name of the cluster parameter group.
+cpgParameterGroupName :: Lens' ClusterParameterGroup (Maybe Text)
+cpgParameterGroupName =
+    lens _cpgParameterGroupName (\s a -> s { _cpgParameterGroupName = a })
+
+-- | The list of tags for the cluster parameter group.
+cpgTags :: Lens' ClusterParameterGroup [Tag]
+cpgTags = lens _cpgTags (\s a -> s { _cpgTags = a }) . _List
+
+instance FromXML ClusterParameterGroup where
+    parseXML x = ClusterParameterGroup
+        <$> x .@? "Description"
+        <*> x .@? "ParameterGroupFamily"
+        <*> x .@? "ParameterGroupName"
+        <*> x .@  "Tags"
+
+instance ToQuery ClusterParameterGroup where
+    toQuery ClusterParameterGroup{..} = mconcat
+        [ "Description"          =? _cpgDescription
+        , "ParameterGroupFamily" =? _cpgParameterGroupFamily
+        , "ParameterGroupName"   =? _cpgParameterGroupName
+        , "Tags"                 =? _cpgTags
+        ]
+
+data RestoreStatus = RestoreStatus
+    { _rsCurrentRestoreRateInMegaBytesPerSecond :: Maybe Double
+    , _rsElapsedTimeInSeconds                   :: Maybe Integer
+    , _rsEstimatedTimeToCompletionInSeconds     :: Maybe Integer
+    , _rsProgressInMegaBytes                    :: Maybe Integer
+    , _rsSnapshotSizeInMegaBytes                :: Maybe Integer
+    , _rsStatus                                 :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RestoreStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rsCurrentRestoreRateInMegaBytesPerSecond' @::@ 'Maybe' 'Double'
+--
+-- * 'rsElapsedTimeInSeconds' @::@ 'Maybe' 'Integer'
+--
+-- * 'rsEstimatedTimeToCompletionInSeconds' @::@ 'Maybe' 'Integer'
+--
+-- * 'rsProgressInMegaBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'rsSnapshotSizeInMegaBytes' @::@ 'Maybe' 'Integer'
+--
+-- * 'rsStatus' @::@ 'Maybe' 'Text'
+--
+restoreStatus :: RestoreStatus
+restoreStatus = RestoreStatus
+    { _rsStatus                                 = Nothing
+    , _rsCurrentRestoreRateInMegaBytesPerSecond = Nothing
+    , _rsSnapshotSizeInMegaBytes                = Nothing
+    , _rsProgressInMegaBytes                    = Nothing
+    , _rsElapsedTimeInSeconds                   = Nothing
+    , _rsEstimatedTimeToCompletionInSeconds     = Nothing
+    }
+
+-- | The number of megabytes per second being transferred from the backup
+-- storage. Returns the average rate for a completed backup.
+rsCurrentRestoreRateInMegaBytesPerSecond :: Lens' RestoreStatus (Maybe Double)
+rsCurrentRestoreRateInMegaBytesPerSecond =
+    lens _rsCurrentRestoreRateInMegaBytesPerSecond
+        (\s a -> s { _rsCurrentRestoreRateInMegaBytesPerSecond = a })
+
+-- | The amount of time an in-progress restore has been running, or the amount
+-- of time it took a completed restore to finish.
+rsElapsedTimeInSeconds :: Lens' RestoreStatus (Maybe Integer)
+rsElapsedTimeInSeconds =
+    lens _rsElapsedTimeInSeconds (\s a -> s { _rsElapsedTimeInSeconds = a })
+
+-- | The estimate of the time remaining before the restore will complete.
+-- Returns 0 for a completed restore.
+rsEstimatedTimeToCompletionInSeconds :: Lens' RestoreStatus (Maybe Integer)
+rsEstimatedTimeToCompletionInSeconds =
+    lens _rsEstimatedTimeToCompletionInSeconds
+        (\s a -> s { _rsEstimatedTimeToCompletionInSeconds = a })
+
+-- | The number of megabytes that have been transferred from snapshot storage.
+rsProgressInMegaBytes :: Lens' RestoreStatus (Maybe Integer)
+rsProgressInMegaBytes =
+    lens _rsProgressInMegaBytes (\s a -> s { _rsProgressInMegaBytes = a })
+
+-- | The size of the set of snapshot data used to restore the cluster.
+rsSnapshotSizeInMegaBytes :: Lens' RestoreStatus (Maybe Integer)
+rsSnapshotSizeInMegaBytes =
+    lens _rsSnapshotSizeInMegaBytes
+        (\s a -> s { _rsSnapshotSizeInMegaBytes = a })
+
+-- | The status of the restore action. Returns starting, restoring, completed,
+-- or failed.
+rsStatus :: Lens' RestoreStatus (Maybe Text)
+rsStatus = lens _rsStatus (\s a -> s { _rsStatus = a })
+
+instance FromXML RestoreStatus where
+    parseXML x = RestoreStatus
+        <$> x .@? "CurrentRestoreRateInMegaBytesPerSecond"
+        <*> x .@? "ElapsedTimeInSeconds"
+        <*> x .@? "EstimatedTimeToCompletionInSeconds"
+        <*> x .@? "ProgressInMegaBytes"
+        <*> x .@? "SnapshotSizeInMegaBytes"
+        <*> x .@? "Status"
+
+instance ToQuery RestoreStatus where
+    toQuery RestoreStatus{..} = mconcat
+        [ "CurrentRestoreRateInMegaBytesPerSecond" =? _rsCurrentRestoreRateInMegaBytesPerSecond
+        , "ElapsedTimeInSeconds"                   =? _rsElapsedTimeInSeconds
+        , "EstimatedTimeToCompletionInSeconds"     =? _rsEstimatedTimeToCompletionInSeconds
+        , "ProgressInMegaBytes"                    =? _rsProgressInMegaBytes
+        , "SnapshotSizeInMegaBytes"                =? _rsSnapshotSizeInMegaBytes
+        , "Status"                                 =? _rsStatus
+        ]
+
+data Event = Event
+    { _eDate             :: Maybe RFC822
+    , _eEventCategories  :: List "EventCategory" Text
+    , _eEventId          :: Maybe Text
+    , _eMessage          :: Maybe Text
+    , _eSeverity         :: Maybe Text
+    , _eSourceIdentifier :: Maybe Text
+    , _eSourceType       :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'Event' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'eDate' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'eEventCategories' @::@ ['Text']
+--
+-- * 'eEventId' @::@ 'Maybe' 'Text'
+--
+-- * 'eMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'eSeverity' @::@ 'Maybe' 'Text'
+--
+-- * 'eSourceIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'eSourceType' @::@ 'Maybe' 'Text'
+--
+event :: Event
+event = Event
+    { _eSourceIdentifier = Nothing
+    , _eSourceType       = Nothing
+    , _eMessage          = Nothing
+    , _eEventCategories  = mempty
+    , _eSeverity         = Nothing
+    , _eDate             = Nothing
+    , _eEventId          = Nothing
+    }
+
+-- | The date and time of the event.
+eDate :: Lens' Event (Maybe UTCTime)
+eDate = lens _eDate (\s a -> s { _eDate = a }) . mapping _Time
+
+-- | A list of the event categories.
+eEventCategories :: Lens' Event [Text]
+eEventCategories = lens _eEventCategories (\s a -> s { _eEventCategories = a }) . _List
+
+-- | The identifier of the event.
+eEventId :: Lens' Event (Maybe Text)
+eEventId = lens _eEventId (\s a -> s { _eEventId = a })
+
+-- | The text of this event.
+eMessage :: Lens' Event (Maybe Text)
+eMessage = lens _eMessage (\s a -> s { _eMessage = a })
+
+-- | The severity of the event. Values: ERROR, INFO.
+eSeverity :: Lens' Event (Maybe Text)
+eSeverity = lens _eSeverity (\s a -> s { _eSeverity = a })
+
+-- | The identifier for the source of the event.
+eSourceIdentifier :: Lens' Event (Maybe Text)
+eSourceIdentifier =
+    lens _eSourceIdentifier (\s a -> s { _eSourceIdentifier = a })
+
+-- | The source type for this event.
+eSourceType :: Lens' Event (Maybe Text)
+eSourceType = lens _eSourceType (\s a -> s { _eSourceType = a })
+
+instance FromXML Event where
+    parseXML x = Event
+        <$> x .@? "Date"
+        <*> x .@  "EventCategories"
+        <*> x .@? "EventId"
+        <*> x .@? "Message"
+        <*> x .@? "Severity"
+        <*> x .@? "SourceIdentifier"
+        <*> x .@? "SourceType"
+
+instance ToQuery Event where
+    toQuery Event{..} = mconcat
+        [ "Date"             =? _eDate
+        , "EventCategories"  =? _eEventCategories
+        , "EventId"          =? _eEventId
+        , "Message"          =? _eMessage
+        , "Severity"         =? _eSeverity
+        , "SourceIdentifier" =? _eSourceIdentifier
+        , "SourceType"       =? _eSourceType
+        ]
+
+data ClusterSnapshotCopyStatus = ClusterSnapshotCopyStatus
+    { _cscsDestinationRegion :: Maybe Text
+    , _cscsRetentionPeriod   :: Maybe Integer
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterSnapshotCopyStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cscsDestinationRegion' @::@ 'Maybe' 'Text'
+--
+-- * 'cscsRetentionPeriod' @::@ 'Maybe' 'Integer'
+--
+clusterSnapshotCopyStatus :: ClusterSnapshotCopyStatus
+clusterSnapshotCopyStatus = ClusterSnapshotCopyStatus
+    { _cscsDestinationRegion = Nothing
+    , _cscsRetentionPeriod   = Nothing
+    }
+
+-- | The destination region that snapshots are automatically copied to when
+-- cross-region snapshot copy is enabled.
+cscsDestinationRegion :: Lens' ClusterSnapshotCopyStatus (Maybe Text)
+cscsDestinationRegion =
+    lens _cscsDestinationRegion (\s a -> s { _cscsDestinationRegion = a })
+
+-- | The number of days that automated snapshots are retained in the
+-- destination region after they are copied from a source region.
+cscsRetentionPeriod :: Lens' ClusterSnapshotCopyStatus (Maybe Integer)
+cscsRetentionPeriod =
+    lens _cscsRetentionPeriod (\s a -> s { _cscsRetentionPeriod = a })
+
+instance FromXML ClusterSnapshotCopyStatus where
+    parseXML x = ClusterSnapshotCopyStatus
+        <$> x .@? "DestinationRegion"
+        <*> x .@? "RetentionPeriod"
+
+instance ToQuery ClusterSnapshotCopyStatus where
+    toQuery ClusterSnapshotCopyStatus{..} = mconcat
+        [ "DestinationRegion" =? _cscsDestinationRegion
+        , "RetentionPeriod"   =? _cscsRetentionPeriod
+        ]
+
+data Tag = Tag
+    { _tagKey   :: Maybe Text
+    , _tagValue :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'Tag' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'tagKey' @::@ 'Maybe' 'Text'
+--
+-- * 'tagValue' @::@ 'Maybe' 'Text'
+--
+tag :: Tag
+tag = Tag
+    { _tagKey   = Nothing
+    , _tagValue = Nothing
+    }
+
+-- | The key, or name, for the resource tag.
+tagKey :: Lens' Tag (Maybe Text)
+tagKey = lens _tagKey (\s a -> s { _tagKey = a })
+
+-- | The value for the resource tag.
+tagValue :: Lens' Tag (Maybe Text)
+tagValue = lens _tagValue (\s a -> s { _tagValue = a })
+
+instance FromXML Tag where
+    parseXML x = Tag
+        <$> x .@? "Key"
+        <*> x .@? "Value"
+
+instance ToQuery Tag where
+    toQuery Tag{..} = mconcat
+        [ "Key"   =? _tagKey
+        , "Value" =? _tagValue
+        ]
+
+data HsmClientCertificate = HsmClientCertificate
+    { _hccHsmClientCertificateIdentifier :: Maybe Text
+    , _hccHsmClientCertificatePublicKey  :: Maybe Text
+    , _hccTags                           :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'HsmClientCertificate' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'hccHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'hccHsmClientCertificatePublicKey' @::@ 'Maybe' 'Text'
+--
+-- * 'hccTags' @::@ ['Tag']
+--
+hsmClientCertificate :: HsmClientCertificate
+hsmClientCertificate = HsmClientCertificate
+    { _hccHsmClientCertificateIdentifier = Nothing
+    , _hccHsmClientCertificatePublicKey  = Nothing
+    , _hccTags                           = mempty
+    }
+
+-- | The identifier of the HSM client certificate.
+hccHsmClientCertificateIdentifier :: Lens' HsmClientCertificate (Maybe Text)
+hccHsmClientCertificateIdentifier =
+    lens _hccHsmClientCertificateIdentifier
+        (\s a -> s { _hccHsmClientCertificateIdentifier = a })
+
+-- | The public key that the Amazon Redshift cluster will use to connect to
+-- the HSM. You must register the public key in the HSM.
+hccHsmClientCertificatePublicKey :: Lens' HsmClientCertificate (Maybe Text)
+hccHsmClientCertificatePublicKey =
+    lens _hccHsmClientCertificatePublicKey
+        (\s a -> s { _hccHsmClientCertificatePublicKey = a })
+
+-- | The list of tags for the HSM client certificate.
+hccTags :: Lens' HsmClientCertificate [Tag]
+hccTags = lens _hccTags (\s a -> s { _hccTags = a }) . _List
+
+instance FromXML HsmClientCertificate where
+    parseXML x = HsmClientCertificate
+        <$> x .@? "HsmClientCertificateIdentifier"
+        <*> x .@? "HsmClientCertificatePublicKey"
+        <*> x .@  "Tags"
+
+instance ToQuery HsmClientCertificate where
+    toQuery HsmClientCertificate{..} = mconcat
+        [ "HsmClientCertificateIdentifier" =? _hccHsmClientCertificateIdentifier
+        , "HsmClientCertificatePublicKey"  =? _hccHsmClientCertificatePublicKey
+        , "Tags"                           =? _hccTags
+        ]
+
+data Cluster = Cluster
+    { _cAllowVersionUpgrade              :: Maybe Bool
+    , _cAutomatedSnapshotRetentionPeriod :: Maybe Int
+    , _cAvailabilityZone                 :: Maybe Text
+    , _cClusterCreateTime                :: Maybe RFC822
+    , _cClusterIdentifier                :: Maybe Text
+    , _cClusterNodes                     :: List "ClusterNodes" ClusterNode
+    , _cClusterParameterGroups           :: List "ClusterParameterGroup" ClusterParameterGroupStatus
+    , _cClusterPublicKey                 :: Maybe Text
+    , _cClusterRevisionNumber            :: Maybe Text
+    , _cClusterSecurityGroups            :: List "ClusterSecurityGroup" ClusterSecurityGroupMembership
+    , _cClusterSnapshotCopyStatus        :: Maybe ClusterSnapshotCopyStatus
+    , _cClusterStatus                    :: Maybe Text
+    , _cClusterSubnetGroupName           :: Maybe Text
+    , _cClusterVersion                   :: Maybe Text
+    , _cDBName                           :: Maybe Text
+    , _cElasticIpStatus                  :: Maybe ElasticIpStatus
+    , _cEncrypted                        :: Maybe Bool
+    , _cEndpoint                         :: Maybe Endpoint
+    , _cHsmStatus                        :: Maybe HsmStatus
+    , _cKmsKeyId                         :: Maybe Text
+    , _cMasterUsername                   :: Maybe Text
+    , _cModifyStatus                     :: Maybe Text
+    , _cNodeType                         :: Maybe Text
+    , _cNumberOfNodes                    :: Maybe Int
+    , _cPendingModifiedValues            :: Maybe PendingModifiedValues
+    , _cPreferredMaintenanceWindow       :: Maybe Text
+    , _cPubliclyAccessible               :: Maybe Bool
+    , _cRestoreStatus                    :: Maybe RestoreStatus
+    , _cTags                             :: List "Tag" Tag
+    , _cVpcId                            :: Maybe Text
+    , _cVpcSecurityGroups                :: List "VpcSecurityGroup" VpcSecurityGroupMembership
+    } deriving (Eq, Show)
+
+-- | 'Cluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cAllowVersionUpgrade' @::@ 'Maybe' 'Bool'
+--
+-- * 'cAutomatedSnapshotRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+-- * 'cAvailabilityZone' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterCreateTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'cClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterNodes' @::@ ['ClusterNode']
+--
+-- * 'cClusterParameterGroups' @::@ ['ClusterParameterGroupStatus']
+--
+-- * 'cClusterPublicKey' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterRevisionNumber' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterSecurityGroups' @::@ ['ClusterSecurityGroupMembership']
+--
+-- * 'cClusterSnapshotCopyStatus' @::@ 'Maybe' 'ClusterSnapshotCopyStatus'
+--
+-- * 'cClusterStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterSubnetGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'cDBName' @::@ 'Maybe' 'Text'
+--
+-- * 'cElasticIpStatus' @::@ 'Maybe' 'ElasticIpStatus'
+--
+-- * 'cEncrypted' @::@ 'Maybe' 'Bool'
+--
+-- * 'cEndpoint' @::@ 'Maybe' 'Endpoint'
+--
+-- * 'cHsmStatus' @::@ 'Maybe' 'HsmStatus'
+--
+-- * 'cKmsKeyId' @::@ 'Maybe' 'Text'
+--
+-- * 'cMasterUsername' @::@ 'Maybe' 'Text'
+--
+-- * 'cModifyStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'cNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'cNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+-- * 'cPendingModifiedValues' @::@ 'Maybe' 'PendingModifiedValues'
+--
+-- * 'cPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+--
+-- * 'cPubliclyAccessible' @::@ 'Maybe' 'Bool'
+--
+-- * 'cRestoreStatus' @::@ 'Maybe' 'RestoreStatus'
+--
+-- * 'cTags' @::@ ['Tag']
+--
+-- * 'cVpcId' @::@ 'Maybe' 'Text'
+--
+-- * 'cVpcSecurityGroups' @::@ ['VpcSecurityGroupMembership']
+--
+cluster :: Cluster
+cluster = Cluster
+    { _cClusterIdentifier                = Nothing
+    , _cNodeType                         = Nothing
+    , _cClusterStatus                    = Nothing
+    , _cModifyStatus                     = Nothing
+    , _cMasterUsername                   = Nothing
+    , _cDBName                           = Nothing
+    , _cEndpoint                         = Nothing
+    , _cClusterCreateTime                = Nothing
+    , _cAutomatedSnapshotRetentionPeriod = Nothing
+    , _cClusterSecurityGroups            = mempty
+    , _cVpcSecurityGroups                = mempty
+    , _cClusterParameterGroups           = mempty
+    , _cClusterSubnetGroupName           = Nothing
+    , _cVpcId                            = Nothing
+    , _cAvailabilityZone                 = Nothing
+    , _cPreferredMaintenanceWindow       = Nothing
+    , _cPendingModifiedValues            = Nothing
+    , _cClusterVersion                   = Nothing
+    , _cAllowVersionUpgrade              = Nothing
+    , _cNumberOfNodes                    = Nothing
+    , _cPubliclyAccessible               = Nothing
+    , _cEncrypted                        = Nothing
+    , _cRestoreStatus                    = Nothing
+    , _cHsmStatus                        = Nothing
+    , _cClusterSnapshotCopyStatus        = Nothing
+    , _cClusterPublicKey                 = Nothing
+    , _cClusterNodes                     = mempty
+    , _cElasticIpStatus                  = Nothing
+    , _cClusterRevisionNumber            = Nothing
+    , _cTags                             = mempty
+    , _cKmsKeyId                         = Nothing
+    }
+
+-- | If true, major version upgrades will be applied automatically to the
+-- cluster during the maintenance window.
+cAllowVersionUpgrade :: Lens' Cluster (Maybe Bool)
+cAllowVersionUpgrade =
+    lens _cAllowVersionUpgrade (\s a -> s { _cAllowVersionUpgrade = a })
+
+-- | The number of days that automatic cluster snapshots are retained.
+cAutomatedSnapshotRetentionPeriod :: Lens' Cluster (Maybe Int)
+cAutomatedSnapshotRetentionPeriod =
+    lens _cAutomatedSnapshotRetentionPeriod
+        (\s a -> s { _cAutomatedSnapshotRetentionPeriod = a })
+
+-- | The name of the Availability Zone in which the cluster is located.
+cAvailabilityZone :: Lens' Cluster (Maybe Text)
+cAvailabilityZone =
+    lens _cAvailabilityZone (\s a -> s { _cAvailabilityZone = a })
+
+-- | The date and time that the cluster was created.
+cClusterCreateTime :: Lens' Cluster (Maybe UTCTime)
+cClusterCreateTime =
+    lens _cClusterCreateTime (\s a -> s { _cClusterCreateTime = a })
+        . mapping _Time
+
+-- | The unique identifier of the cluster.
+cClusterIdentifier :: Lens' Cluster (Maybe Text)
+cClusterIdentifier =
+    lens _cClusterIdentifier (\s a -> s { _cClusterIdentifier = a })
+
+-- | The nodes in a cluster.
+cClusterNodes :: Lens' Cluster [ClusterNode]
+cClusterNodes = lens _cClusterNodes (\s a -> s { _cClusterNodes = a }) . _List
+
+-- | The list of cluster parameter groups that are associated with this
+-- cluster.
+cClusterParameterGroups :: Lens' Cluster [ClusterParameterGroupStatus]
+cClusterParameterGroups =
+    lens _cClusterParameterGroups (\s a -> s { _cClusterParameterGroups = a })
+        . _List
+
+-- | The public key for the cluster.
+cClusterPublicKey :: Lens' Cluster (Maybe Text)
+cClusterPublicKey =
+    lens _cClusterPublicKey (\s a -> s { _cClusterPublicKey = a })
+
+-- | The specific revision number of the database in the cluster.
+cClusterRevisionNumber :: Lens' Cluster (Maybe Text)
+cClusterRevisionNumber =
+    lens _cClusterRevisionNumber (\s a -> s { _cClusterRevisionNumber = a })
+
+-- | A list of cluster security group that are associated with the cluster.
+-- Each security group is represented by an element that contains
+-- ClusterSecurityGroup.Name and ClusterSecurityGroup.Status subelements.
+-- Cluster security groups are used when the cluster is not created in a
+-- VPC. Clusters that are created in a VPC use VPC security groups, which
+-- are listed by the VpcSecurityGroups parameter.
+cClusterSecurityGroups :: Lens' Cluster [ClusterSecurityGroupMembership]
+cClusterSecurityGroups =
+    lens _cClusterSecurityGroups (\s a -> s { _cClusterSecurityGroups = a })
+        . _List
+
+-- | Returns the destination region and retention period that are configured
+-- for cross-region snapshot copy.
+cClusterSnapshotCopyStatus :: Lens' Cluster (Maybe ClusterSnapshotCopyStatus)
+cClusterSnapshotCopyStatus =
+    lens _cClusterSnapshotCopyStatus
+        (\s a -> s { _cClusterSnapshotCopyStatus = a })
+
+-- | The current state of this cluster. Possible values include available,
+-- creating, deleting, rebooting, renaming, and resizing.
+cClusterStatus :: Lens' Cluster (Maybe Text)
+cClusterStatus = lens _cClusterStatus (\s a -> s { _cClusterStatus = a })
+
+-- | The name of the subnet group that is associated with the cluster. This
+-- parameter is valid only when the cluster is in a VPC.
+cClusterSubnetGroupName :: Lens' Cluster (Maybe Text)
+cClusterSubnetGroupName =
+    lens _cClusterSubnetGroupName (\s a -> s { _cClusterSubnetGroupName = a })
+
+-- | The version ID of the Amazon Redshift engine that is running on the
+-- cluster.
+cClusterVersion :: Lens' Cluster (Maybe Text)
+cClusterVersion = lens _cClusterVersion (\s a -> s { _cClusterVersion = a })
+
+-- | The name of the initial database that was created when the cluster was
+-- created. This same name is returned for the life of the cluster. If an
+-- initial database was not specified, a database named "dev" was created by
+-- default.
+cDBName :: Lens' Cluster (Maybe Text)
+cDBName = lens _cDBName (\s a -> s { _cDBName = a })
+
+-- | Describes the status of the elastic IP (EIP) address.
+cElasticIpStatus :: Lens' Cluster (Maybe ElasticIpStatus)
+cElasticIpStatus = lens _cElasticIpStatus (\s a -> s { _cElasticIpStatus = a })
+
+-- | If true, data in the cluster is encrypted at rest.
+cEncrypted :: Lens' Cluster (Maybe Bool)
+cEncrypted = lens _cEncrypted (\s a -> s { _cEncrypted = a })
+
+-- | The connection endpoint.
+cEndpoint :: Lens' Cluster (Maybe Endpoint)
+cEndpoint = lens _cEndpoint (\s a -> s { _cEndpoint = a })
+
+-- | Reports whether the Amazon Redshift cluster has finished applying any HSM
+-- settings changes specified in a modify cluster command. Values: active,
+-- applying.
+cHsmStatus :: Lens' Cluster (Maybe HsmStatus)
+cHsmStatus = lens _cHsmStatus (\s a -> s { _cHsmStatus = a })
+
+-- | The AWS Key Management Service (KMS) key ID of the encryption key used to
+-- encrypt data in the cluster.
+cKmsKeyId :: Lens' Cluster (Maybe Text)
+cKmsKeyId = lens _cKmsKeyId (\s a -> s { _cKmsKeyId = a })
+
+-- | The master user name for the cluster. This name is used to connect to the
+-- database that is specified in DBName.
+cMasterUsername :: Lens' Cluster (Maybe Text)
+cMasterUsername = lens _cMasterUsername (\s a -> s { _cMasterUsername = a })
+
+-- | The status of a modify operation, if any, initiated for the cluster.
+cModifyStatus :: Lens' Cluster (Maybe Text)
+cModifyStatus = lens _cModifyStatus (\s a -> s { _cModifyStatus = a })
+
+-- | The node type for the nodes in the cluster.
+cNodeType :: Lens' Cluster (Maybe Text)
+cNodeType = lens _cNodeType (\s a -> s { _cNodeType = a })
+
+-- | The number of compute nodes in the cluster.
+cNumberOfNodes :: Lens' Cluster (Maybe Int)
+cNumberOfNodes = lens _cNumberOfNodes (\s a -> s { _cNumberOfNodes = a })
+
+-- | If present, changes to the cluster are pending. Specific pending changes
+-- are identified by subelements.
+cPendingModifiedValues :: Lens' Cluster (Maybe PendingModifiedValues)
+cPendingModifiedValues =
+    lens _cPendingModifiedValues (\s a -> s { _cPendingModifiedValues = a })
+
+-- | The weekly time range (in UTC) during which system maintenance can occur.
+cPreferredMaintenanceWindow :: Lens' Cluster (Maybe Text)
+cPreferredMaintenanceWindow =
+    lens _cPreferredMaintenanceWindow
+        (\s a -> s { _cPreferredMaintenanceWindow = a })
+
+-- | If true, the cluster can be accessed from a public network.
+cPubliclyAccessible :: Lens' Cluster (Maybe Bool)
+cPubliclyAccessible =
+    lens _cPubliclyAccessible (\s a -> s { _cPubliclyAccessible = a })
+
+-- | Describes the status of a cluster restore action. Returns null if the
+-- cluster was not created by restoring a snapshot.
+cRestoreStatus :: Lens' Cluster (Maybe RestoreStatus)
+cRestoreStatus = lens _cRestoreStatus (\s a -> s { _cRestoreStatus = a })
+
+-- | The list of tags for the cluster.
+cTags :: Lens' Cluster [Tag]
+cTags = lens _cTags (\s a -> s { _cTags = a }) . _List
+
+-- | The identifier of the VPC the cluster is in, if the cluster is in a VPC.
+cVpcId :: Lens' Cluster (Maybe Text)
+cVpcId = lens _cVpcId (\s a -> s { _cVpcId = a })
+
+-- | A list of Virtual Private Cloud (VPC) security groups that are associated
+-- with the cluster. This parameter is returned only if the cluster is in a
+-- VPC.
+cVpcSecurityGroups :: Lens' Cluster [VpcSecurityGroupMembership]
+cVpcSecurityGroups =
+    lens _cVpcSecurityGroups (\s a -> s { _cVpcSecurityGroups = a })
+        . _List
+
+instance FromXML Cluster where
+    parseXML x = Cluster
+        <$> x .@? "AllowVersionUpgrade"
+        <*> x .@? "AutomatedSnapshotRetentionPeriod"
+        <*> x .@? "AvailabilityZone"
+        <*> x .@? "ClusterCreateTime"
+        <*> x .@? "ClusterIdentifier"
+        <*> x .@  "ClusterNodes"
+        <*> x .@  "ClusterParameterGroups"
+        <*> x .@? "ClusterPublicKey"
+        <*> x .@? "ClusterRevisionNumber"
+        <*> x .@  "ClusterSecurityGroups"
+        <*> x .@? "ClusterSnapshotCopyStatus"
+        <*> x .@? "ClusterStatus"
+        <*> x .@? "ClusterSubnetGroupName"
+        <*> x .@? "ClusterVersion"
+        <*> x .@? "DBName"
+        <*> x .@? "ElasticIpStatus"
+        <*> x .@? "Encrypted"
+        <*> x .@? "Endpoint"
+        <*> x .@? "HsmStatus"
+        <*> x .@? "KmsKeyId"
+        <*> x .@? "MasterUsername"
+        <*> x .@? "ModifyStatus"
+        <*> x .@? "NodeType"
+        <*> x .@? "NumberOfNodes"
+        <*> x .@? "PendingModifiedValues"
+        <*> x .@? "PreferredMaintenanceWindow"
+        <*> x .@? "PubliclyAccessible"
+        <*> x .@? "RestoreStatus"
+        <*> x .@  "Tags"
+        <*> x .@? "VpcId"
+        <*> x .@  "VpcSecurityGroups"
+
+instance ToQuery Cluster where
+    toQuery Cluster{..} = mconcat
+        [ "AllowVersionUpgrade"              =? _cAllowVersionUpgrade
+        , "AutomatedSnapshotRetentionPeriod" =? _cAutomatedSnapshotRetentionPeriod
+        , "AvailabilityZone"                 =? _cAvailabilityZone
+        , "ClusterCreateTime"                =? _cClusterCreateTime
+        , "ClusterIdentifier"                =? _cClusterIdentifier
+        , "ClusterNodes"                     =? _cClusterNodes
+        , "ClusterParameterGroups"           =? _cClusterParameterGroups
+        , "ClusterPublicKey"                 =? _cClusterPublicKey
+        , "ClusterRevisionNumber"            =? _cClusterRevisionNumber
+        , "ClusterSecurityGroups"            =? _cClusterSecurityGroups
+        , "ClusterSnapshotCopyStatus"        =? _cClusterSnapshotCopyStatus
+        , "ClusterStatus"                    =? _cClusterStatus
+        , "ClusterSubnetGroupName"           =? _cClusterSubnetGroupName
+        , "ClusterVersion"                   =? _cClusterVersion
+        , "DBName"                           =? _cDBName
+        , "ElasticIpStatus"                  =? _cElasticIpStatus
+        , "Encrypted"                        =? _cEncrypted
+        , "Endpoint"                         =? _cEndpoint
+        , "HsmStatus"                        =? _cHsmStatus
+        , "KmsKeyId"                         =? _cKmsKeyId
+        , "MasterUsername"                   =? _cMasterUsername
+        , "ModifyStatus"                     =? _cModifyStatus
+        , "NodeType"                         =? _cNodeType
+        , "NumberOfNodes"                    =? _cNumberOfNodes
+        , "PendingModifiedValues"            =? _cPendingModifiedValues
+        , "PreferredMaintenanceWindow"       =? _cPreferredMaintenanceWindow
+        , "PubliclyAccessible"               =? _cPubliclyAccessible
+        , "RestoreStatus"                    =? _cRestoreStatus
+        , "Tags"                             =? _cTags
+        , "VpcId"                            =? _cVpcId
+        , "VpcSecurityGroups"                =? _cVpcSecurityGroups
+        ]
+
+data ClusterNode = ClusterNode
+    { _cnNodeRole         :: Maybe Text
+    , _cnPrivateIPAddress :: Maybe Text
+    , _cnPublicIPAddress  :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterNode' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cnNodeRole' @::@ 'Maybe' 'Text'
+--
+-- * 'cnPrivateIPAddress' @::@ 'Maybe' 'Text'
+--
+-- * 'cnPublicIPAddress' @::@ 'Maybe' 'Text'
+--
+clusterNode :: ClusterNode
+clusterNode = ClusterNode
+    { _cnNodeRole         = Nothing
+    , _cnPrivateIPAddress = Nothing
+    , _cnPublicIPAddress  = Nothing
+    }
+
+-- | Whether the node is a leader node or a compute node.
+cnNodeRole :: Lens' ClusterNode (Maybe Text)
+cnNodeRole = lens _cnNodeRole (\s a -> s { _cnNodeRole = a })
+
+-- | The private IP address of a node within a cluster.
+cnPrivateIPAddress :: Lens' ClusterNode (Maybe Text)
+cnPrivateIPAddress =
+    lens _cnPrivateIPAddress (\s a -> s { _cnPrivateIPAddress = a })
+
+-- | The public IP address of a node within a cluster.
+cnPublicIPAddress :: Lens' ClusterNode (Maybe Text)
+cnPublicIPAddress =
+    lens _cnPublicIPAddress (\s a -> s { _cnPublicIPAddress = a })
+
+instance FromXML ClusterNode where
+    parseXML x = ClusterNode
+        <$> x .@? "NodeRole"
+        <*> x .@? "PrivateIPAddress"
+        <*> x .@? "PublicIPAddress"
+
+instance ToQuery ClusterNode where
+    toQuery ClusterNode{..} = mconcat
+        [ "NodeRole"         =? _cnNodeRole
+        , "PrivateIPAddress" =? _cnPrivateIPAddress
+        , "PublicIPAddress"  =? _cnPublicIPAddress
+        ]
+
+data EC2SecurityGroup = EC2SecurityGroup
+    { _ecsgEC2SecurityGroupName    :: Maybe Text
+    , _ecsgEC2SecurityGroupOwnerId :: Maybe Text
+    , _ecsgStatus                  :: Maybe Text
+    , _ecsgTags                    :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'EC2SecurityGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ecsgEC2SecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'ecsgEC2SecurityGroupOwnerId' @::@ 'Maybe' 'Text'
+--
+-- * 'ecsgStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'ecsgTags' @::@ ['Tag']
+--
+ec2SecurityGroup :: EC2SecurityGroup
+ec2SecurityGroup = EC2SecurityGroup
+    { _ecsgStatus                  = Nothing
+    , _ecsgEC2SecurityGroupName    = Nothing
+    , _ecsgEC2SecurityGroupOwnerId = Nothing
+    , _ecsgTags                    = mempty
+    }
+
+-- | The name of the EC2 Security Group.
+ecsgEC2SecurityGroupName :: Lens' EC2SecurityGroup (Maybe Text)
+ecsgEC2SecurityGroupName =
+    lens _ecsgEC2SecurityGroupName
+        (\s a -> s { _ecsgEC2SecurityGroupName = a })
+
+-- | The AWS ID of the owner of the EC2 security group specified in the
+-- EC2SecurityGroupName field.
+ecsgEC2SecurityGroupOwnerId :: Lens' EC2SecurityGroup (Maybe Text)
+ecsgEC2SecurityGroupOwnerId =
+    lens _ecsgEC2SecurityGroupOwnerId
+        (\s a -> s { _ecsgEC2SecurityGroupOwnerId = a })
+
+-- | The status of the EC2 security group.
+ecsgStatus :: Lens' EC2SecurityGroup (Maybe Text)
+ecsgStatus = lens _ecsgStatus (\s a -> s { _ecsgStatus = a })
+
+-- | The list of tags for the EC2 security group.
+ecsgTags :: Lens' EC2SecurityGroup [Tag]
+ecsgTags = lens _ecsgTags (\s a -> s { _ecsgTags = a }) . _List
+
+instance FromXML EC2SecurityGroup where
+    parseXML x = EC2SecurityGroup
+        <$> x .@? "EC2SecurityGroupName"
+        <*> x .@? "EC2SecurityGroupOwnerId"
+        <*> x .@? "Status"
+        <*> x .@  "Tags"
+
+instance ToQuery EC2SecurityGroup where
+    toQuery EC2SecurityGroup{..} = mconcat
+        [ "EC2SecurityGroupName"    =? _ecsgEC2SecurityGroupName
+        , "EC2SecurityGroupOwnerId" =? _ecsgEC2SecurityGroupOwnerId
+        , "Status"                  =? _ecsgStatus
+        , "Tags"                    =? _ecsgTags
+        ]
+
+data OrderableClusterOption = OrderableClusterOption
+    { _ocoAvailabilityZones :: List "AvailabilityZone" AvailabilityZone
+    , _ocoClusterType       :: Maybe Text
+    , _ocoClusterVersion    :: Maybe Text
+    , _ocoNodeType          :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'OrderableClusterOption' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ocoAvailabilityZones' @::@ ['AvailabilityZone']
+--
+-- * 'ocoClusterType' @::@ 'Maybe' 'Text'
+--
+-- * 'ocoClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'ocoNodeType' @::@ 'Maybe' 'Text'
+--
+orderableClusterOption :: OrderableClusterOption
+orderableClusterOption = OrderableClusterOption
+    { _ocoClusterVersion    = Nothing
+    , _ocoClusterType       = Nothing
+    , _ocoNodeType          = Nothing
+    , _ocoAvailabilityZones = mempty
+    }
+
+-- | A list of availability zones for the orderable cluster.
+ocoAvailabilityZones :: Lens' OrderableClusterOption [AvailabilityZone]
+ocoAvailabilityZones =
+    lens _ocoAvailabilityZones (\s a -> s { _ocoAvailabilityZones = a })
+        . _List
+
+-- | The cluster type, for example multi-node.
+ocoClusterType :: Lens' OrderableClusterOption (Maybe Text)
+ocoClusterType = lens _ocoClusterType (\s a -> s { _ocoClusterType = a })
+
+-- | The version of the orderable cluster.
+ocoClusterVersion :: Lens' OrderableClusterOption (Maybe Text)
+ocoClusterVersion =
+    lens _ocoClusterVersion (\s a -> s { _ocoClusterVersion = a })
+
+-- | The node type for the orderable cluster.
+ocoNodeType :: Lens' OrderableClusterOption (Maybe Text)
+ocoNodeType = lens _ocoNodeType (\s a -> s { _ocoNodeType = a })
+
+instance FromXML OrderableClusterOption where
+    parseXML x = OrderableClusterOption
+        <$> x .@  "AvailabilityZones"
+        <*> x .@? "ClusterType"
+        <*> x .@? "ClusterVersion"
+        <*> x .@? "NodeType"
+
+instance ToQuery OrderableClusterOption where
+    toQuery OrderableClusterOption{..} = mconcat
+        [ "AvailabilityZones" =? _ocoAvailabilityZones
+        , "ClusterType"       =? _ocoClusterType
+        , "ClusterVersion"    =? _ocoClusterVersion
+        , "NodeType"          =? _ocoNodeType
+        ]
+
+data SourceType
+    = STCluster               -- ^ cluster
+    | STClusterParameterGroup -- ^ cluster-parameter-group
+    | STClusterSecurityGroup  -- ^ cluster-security-group
+    | STClusterSnapshot       -- ^ cluster-snapshot
+      deriving (Eq, Ord, Show, Generic, Enum)
+
+instance Hashable SourceType
+
+instance FromText SourceType where
+    parser = match "cluster"                 STCluster
+         <|> match "cluster-parameter-group" STClusterParameterGroup
+         <|> match "cluster-security-group"  STClusterSecurityGroup
+         <|> match "cluster-snapshot"        STClusterSnapshot
+
+instance ToText SourceType where
+    toText = \case
+        STCluster               -> "cluster"
+        STClusterParameterGroup -> "cluster-parameter-group"
+        STClusterSecurityGroup  -> "cluster-security-group"
+        STClusterSnapshot       -> "cluster-snapshot"
+
+instance FromXML SourceType where
+    parseXML = parseXMLText "SourceType"
+
+instance ToQuery SourceType where
+    toQuery = toQuery . toText
+
+data ClusterParameterGroupStatus = ClusterParameterGroupStatus
+    { _cpgsParameterApplyStatus :: Maybe Text
+    , _cpgsParameterGroupName   :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterParameterGroupStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cpgsParameterApplyStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'cpgsParameterGroupName' @::@ 'Maybe' 'Text'
+--
+clusterParameterGroupStatus :: ClusterParameterGroupStatus
+clusterParameterGroupStatus = ClusterParameterGroupStatus
+    { _cpgsParameterGroupName   = Nothing
+    , _cpgsParameterApplyStatus = Nothing
+    }
+
+-- | The status of parameter updates.
+cpgsParameterApplyStatus :: Lens' ClusterParameterGroupStatus (Maybe Text)
+cpgsParameterApplyStatus =
+    lens _cpgsParameterApplyStatus
+        (\s a -> s { _cpgsParameterApplyStatus = a })
+
+-- | The name of the cluster parameter group.
+cpgsParameterGroupName :: Lens' ClusterParameterGroupStatus (Maybe Text)
+cpgsParameterGroupName =
+    lens _cpgsParameterGroupName (\s a -> s { _cpgsParameterGroupName = a })
+
+instance FromXML ClusterParameterGroupStatus where
+    parseXML x = ClusterParameterGroupStatus
+        <$> x .@? "ParameterApplyStatus"
+        <*> x .@? "ParameterGroupName"
+
+instance ToQuery ClusterParameterGroupStatus where
+    toQuery ClusterParameterGroupStatus{..} = mconcat
+        [ "ParameterApplyStatus" =? _cpgsParameterApplyStatus
+        , "ParameterGroupName"   =? _cpgsParameterGroupName
+        ]
+
+data Subnet = Subnet
+    { _sSubnetAvailabilityZone :: Maybe AvailabilityZone
+    , _sSubnetIdentifier       :: Maybe Text
+    , _sSubnetStatus           :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'Subnet' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'sSubnetAvailabilityZone' @::@ 'Maybe' 'AvailabilityZone'
+--
+-- * 'sSubnetIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'sSubnetStatus' @::@ 'Maybe' 'Text'
+--
+subnet :: Subnet
+subnet = Subnet
+    { _sSubnetIdentifier       = Nothing
+    , _sSubnetAvailabilityZone = Nothing
+    , _sSubnetStatus           = Nothing
+    }
+
+sSubnetAvailabilityZone :: Lens' Subnet (Maybe AvailabilityZone)
+sSubnetAvailabilityZone =
+    lens _sSubnetAvailabilityZone (\s a -> s { _sSubnetAvailabilityZone = a })
+
+-- | The identifier of the subnet.
+sSubnetIdentifier :: Lens' Subnet (Maybe Text)
+sSubnetIdentifier =
+    lens _sSubnetIdentifier (\s a -> s { _sSubnetIdentifier = a })
+
+-- | The status of the subnet.
+sSubnetStatus :: Lens' Subnet (Maybe Text)
+sSubnetStatus = lens _sSubnetStatus (\s a -> s { _sSubnetStatus = a })
+
+instance FromXML Subnet where
+    parseXML x = Subnet
+        <$> x .@? "SubnetAvailabilityZone"
+        <*> x .@? "SubnetIdentifier"
+        <*> x .@? "SubnetStatus"
+
+instance ToQuery Subnet where
+    toQuery Subnet{..} = mconcat
+        [ "SubnetAvailabilityZone" =? _sSubnetAvailabilityZone
+        , "SubnetIdentifier"       =? _sSubnetIdentifier
+        , "SubnetStatus"           =? _sSubnetStatus
+        ]
+
+data ClusterSecurityGroup = ClusterSecurityGroup
+    { _csgClusterSecurityGroupName :: Maybe Text
+    , _csgDescription              :: Maybe Text
+    , _csgEC2SecurityGroups        :: List "EC2SecurityGroup" EC2SecurityGroup
+    , _csgIPRanges                 :: List "IPRange" IPRange
+    , _csgTags                     :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'ClusterSecurityGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csgClusterSecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'csgDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'csgEC2SecurityGroups' @::@ ['EC2SecurityGroup']
+--
+-- * 'csgIPRanges' @::@ ['IPRange']
+--
+-- * 'csgTags' @::@ ['Tag']
+--
+clusterSecurityGroup :: ClusterSecurityGroup
+clusterSecurityGroup = ClusterSecurityGroup
+    { _csgClusterSecurityGroupName = Nothing
+    , _csgDescription              = Nothing
+    , _csgEC2SecurityGroups        = mempty
+    , _csgIPRanges                 = mempty
+    , _csgTags                     = mempty
+    }
+
+-- | The name of the cluster security group to which the operation was
+-- applied.
+csgClusterSecurityGroupName :: Lens' ClusterSecurityGroup (Maybe Text)
+csgClusterSecurityGroupName =
+    lens _csgClusterSecurityGroupName
+        (\s a -> s { _csgClusterSecurityGroupName = a })
+
+-- | A description of the security group.
+csgDescription :: Lens' ClusterSecurityGroup (Maybe Text)
+csgDescription = lens _csgDescription (\s a -> s { _csgDescription = a })
+
+-- | A list of EC2 security groups that are permitted to access clusters
+-- associated with this cluster security group.
+csgEC2SecurityGroups :: Lens' ClusterSecurityGroup [EC2SecurityGroup]
+csgEC2SecurityGroups =
+    lens _csgEC2SecurityGroups (\s a -> s { _csgEC2SecurityGroups = a })
+        . _List
+
+-- | A list of IP ranges (CIDR blocks) that are permitted to access clusters
+-- associated with this cluster security group.
+csgIPRanges :: Lens' ClusterSecurityGroup [IPRange]
+csgIPRanges = lens _csgIPRanges (\s a -> s { _csgIPRanges = a }) . _List
+
+-- | The list of tags for the cluster security group.
+csgTags :: Lens' ClusterSecurityGroup [Tag]
+csgTags = lens _csgTags (\s a -> s { _csgTags = a }) . _List
+
+instance FromXML ClusterSecurityGroup where
+    parseXML x = ClusterSecurityGroup
+        <$> x .@? "ClusterSecurityGroupName"
+        <*> x .@? "Description"
+        <*> x .@  "EC2SecurityGroups"
+        <*> x .@  "IPRanges"
+        <*> x .@  "Tags"
+
+instance ToQuery ClusterSecurityGroup where
+    toQuery ClusterSecurityGroup{..} = mconcat
+        [ "ClusterSecurityGroupName" =? _csgClusterSecurityGroupName
+        , "Description"              =? _csgDescription
+        , "EC2SecurityGroups"        =? _csgEC2SecurityGroups
+        , "IPRanges"                 =? _csgIPRanges
+        , "Tags"                     =? _csgTags
+        ]
+
+data DefaultClusterParameters = DefaultClusterParameters
+    { _dcpMarker               :: Maybe Text
+    , _dcpParameterGroupFamily :: Maybe Text
+    , _dcpParameters           :: List "Parameter" Parameter
+    } deriving (Eq, Show)
+
+-- | 'DefaultClusterParameters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcpMarker' @::@ 'Maybe' 'Text'
+--
+-- * 'dcpParameterGroupFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'dcpParameters' @::@ ['Parameter']
+--
+defaultClusterParameters :: DefaultClusterParameters
+defaultClusterParameters = DefaultClusterParameters
+    { _dcpParameterGroupFamily = Nothing
+    , _dcpMarker               = Nothing
+    , _dcpParameters           = mempty
+    }
+
+-- | A value that indicates the starting point for the next set of response
+-- records in a subsequent request. If a value is returned in a response,
+-- you can retrieve the next set of records by providing this returned
+-- marker value in the Marker parameter and retrying the command. If the
+-- Marker field is empty, all response records have been retrieved for the
+-- request.
+dcpMarker :: Lens' DefaultClusterParameters (Maybe Text)
+dcpMarker = lens _dcpMarker (\s a -> s { _dcpMarker = a })
+
+-- | The name of the cluster parameter group family to which the engine
+-- default parameters apply.
+dcpParameterGroupFamily :: Lens' DefaultClusterParameters (Maybe Text)
+dcpParameterGroupFamily =
+    lens _dcpParameterGroupFamily (\s a -> s { _dcpParameterGroupFamily = a })
+
+-- | The list of cluster default parameters.
+dcpParameters :: Lens' DefaultClusterParameters [Parameter]
+dcpParameters = lens _dcpParameters (\s a -> s { _dcpParameters = a }) . _List
+
+instance FromXML DefaultClusterParameters where
+    parseXML x = DefaultClusterParameters
+        <$> x .@? "Marker"
+        <*> x .@? "ParameterGroupFamily"
+        <*> x .@  "Parameters"
+
+instance ToQuery DefaultClusterParameters where
+    toQuery DefaultClusterParameters{..} = mconcat
+        [ "Marker"               =? _dcpMarker
+        , "ParameterGroupFamily" =? _dcpParameterGroupFamily
+        , "Parameters"           =? _dcpParameters
+        ]
+
+data ClusterSubnetGroup = ClusterSubnetGroup
+    { _csg1ClusterSubnetGroupName :: Maybe Text
+    , _csg1Description            :: Maybe Text
+    , _csg1SubnetGroupStatus      :: Maybe Text
+    , _csg1Subnets                :: List "Subnet" Subnet
+    , _csg1Tags                   :: List "Tag" Tag
+    , _csg1VpcId                  :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'ClusterSubnetGroup' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csg1ClusterSubnetGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'csg1Description' @::@ 'Maybe' 'Text'
+--
+-- * 'csg1SubnetGroupStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'csg1Subnets' @::@ ['Subnet']
+--
+-- * 'csg1Tags' @::@ ['Tag']
+--
+-- * 'csg1VpcId' @::@ 'Maybe' 'Text'
+--
+clusterSubnetGroup :: ClusterSubnetGroup
+clusterSubnetGroup = ClusterSubnetGroup
+    { _csg1ClusterSubnetGroupName = Nothing
+    , _csg1Description            = Nothing
+    , _csg1VpcId                  = Nothing
+    , _csg1SubnetGroupStatus      = Nothing
+    , _csg1Subnets                = mempty
+    , _csg1Tags                   = mempty
+    }
+
+-- | The name of the cluster subnet group.
+csg1ClusterSubnetGroupName :: Lens' ClusterSubnetGroup (Maybe Text)
+csg1ClusterSubnetGroupName =
+    lens _csg1ClusterSubnetGroupName
+        (\s a -> s { _csg1ClusterSubnetGroupName = a })
+
+-- | The description of the cluster subnet group.
+csg1Description :: Lens' ClusterSubnetGroup (Maybe Text)
+csg1Description = lens _csg1Description (\s a -> s { _csg1Description = a })
+
+-- | The status of the cluster subnet group. Possible values are Complete,
+-- Incomplete and Invalid.
+csg1SubnetGroupStatus :: Lens' ClusterSubnetGroup (Maybe Text)
+csg1SubnetGroupStatus =
+    lens _csg1SubnetGroupStatus (\s a -> s { _csg1SubnetGroupStatus = a })
+
+-- | A list of the VPC Subnet elements.
+csg1Subnets :: Lens' ClusterSubnetGroup [Subnet]
+csg1Subnets = lens _csg1Subnets (\s a -> s { _csg1Subnets = a }) . _List
+
+-- | The list of tags for the cluster subnet group.
+csg1Tags :: Lens' ClusterSubnetGroup [Tag]
+csg1Tags = lens _csg1Tags (\s a -> s { _csg1Tags = a }) . _List
+
+-- | The VPC ID of the cluster subnet group.
+csg1VpcId :: Lens' ClusterSubnetGroup (Maybe Text)
+csg1VpcId = lens _csg1VpcId (\s a -> s { _csg1VpcId = a })
+
+instance FromXML ClusterSubnetGroup where
+    parseXML x = ClusterSubnetGroup
+        <$> x .@? "ClusterSubnetGroupName"
+        <*> x .@? "Description"
+        <*> x .@? "SubnetGroupStatus"
+        <*> x .@  "Subnets"
+        <*> x .@  "Tags"
+        <*> x .@? "VpcId"
+
+instance ToQuery ClusterSubnetGroup where
+    toQuery ClusterSubnetGroup{..} = mconcat
+        [ "ClusterSubnetGroupName" =? _csg1ClusterSubnetGroupName
+        , "Description"            =? _csg1Description
+        , "SubnetGroupStatus"      =? _csg1SubnetGroupStatus
+        , "Subnets"                =? _csg1Subnets
+        , "Tags"                   =? _csg1Tags
+        , "VpcId"                  =? _csg1VpcId
+        ]
+
+data EventInfoMap = EventInfoMap
+    { _eimEventCategories  :: List "EventCategory" Text
+    , _eimEventDescription :: Maybe Text
+    , _eimEventId          :: Maybe Text
+    , _eimSeverity         :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'EventInfoMap' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'eimEventCategories' @::@ ['Text']
+--
+-- * 'eimEventDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'eimEventId' @::@ 'Maybe' 'Text'
+--
+-- * 'eimSeverity' @::@ 'Maybe' 'Text'
+--
+eventInfoMap :: EventInfoMap
+eventInfoMap = EventInfoMap
+    { _eimEventId          = Nothing
+    , _eimEventCategories  = mempty
+    , _eimEventDescription = Nothing
+    , _eimSeverity         = Nothing
+    }
+
+-- | The category of an Amazon Redshift event.
+eimEventCategories :: Lens' EventInfoMap [Text]
+eimEventCategories =
+    lens _eimEventCategories (\s a -> s { _eimEventCategories = a })
+        . _List
+
+-- | The description of an Amazon Redshift event.
+eimEventDescription :: Lens' EventInfoMap (Maybe Text)
+eimEventDescription =
+    lens _eimEventDescription (\s a -> s { _eimEventDescription = a })
+
+-- | The identifier of an Amazon Redshift event.
+eimEventId :: Lens' EventInfoMap (Maybe Text)
+eimEventId = lens _eimEventId (\s a -> s { _eimEventId = a })
+
+-- | The severity of the event. Values: ERROR, INFO.
+eimSeverity :: Lens' EventInfoMap (Maybe Text)
+eimSeverity = lens _eimSeverity (\s a -> s { _eimSeverity = a })
+
+instance FromXML EventInfoMap where
+    parseXML x = EventInfoMap
+        <$> x .@  "EventCategories"
+        <*> x .@? "EventDescription"
+        <*> x .@? "EventId"
+        <*> x .@? "Severity"
+
+instance ToQuery EventInfoMap where
+    toQuery EventInfoMap{..} = mconcat
+        [ "EventCategories"  =? _eimEventCategories
+        , "EventDescription" =? _eimEventDescription
+        , "EventId"          =? _eimEventId
+        , "Severity"         =? _eimSeverity
+        ]
+
+data ClusterSecurityGroupMembership = ClusterSecurityGroupMembership
+    { _csgmClusterSecurityGroupName :: Maybe Text
+    , _csgmStatus                   :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterSecurityGroupMembership' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'csgmClusterSecurityGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'csgmStatus' @::@ 'Maybe' 'Text'
+--
+clusterSecurityGroupMembership :: ClusterSecurityGroupMembership
+clusterSecurityGroupMembership = ClusterSecurityGroupMembership
+    { _csgmClusterSecurityGroupName = Nothing
+    , _csgmStatus                   = Nothing
+    }
+
+-- | The name of the cluster security group.
+csgmClusterSecurityGroupName :: Lens' ClusterSecurityGroupMembership (Maybe Text)
+csgmClusterSecurityGroupName =
+    lens _csgmClusterSecurityGroupName
+        (\s a -> s { _csgmClusterSecurityGroupName = a })
+
+-- | The status of the cluster security group.
+csgmStatus :: Lens' ClusterSecurityGroupMembership (Maybe Text)
+csgmStatus = lens _csgmStatus (\s a -> s { _csgmStatus = a })
+
+instance FromXML ClusterSecurityGroupMembership where
+    parseXML x = ClusterSecurityGroupMembership
+        <$> x .@? "ClusterSecurityGroupName"
+        <*> x .@? "Status"
+
+instance ToQuery ClusterSecurityGroupMembership where
+    toQuery ClusterSecurityGroupMembership{..} = mconcat
+        [ "ClusterSecurityGroupName" =? _csgmClusterSecurityGroupName
+        , "Status"                   =? _csgmStatus
+        ]
+
+data ReservedNodeOffering = ReservedNodeOffering
+    { _rnoCurrencyCode           :: Maybe Text
+    , _rnoDuration               :: Maybe Int
+    , _rnoFixedPrice             :: Maybe Double
+    , _rnoNodeType               :: Maybe Text
+    , _rnoOfferingType           :: Maybe Text
+    , _rnoRecurringCharges       :: List "RecurringCharge" RecurringCharge
+    , _rnoReservedNodeOfferingId :: Maybe Text
+    , _rnoUsagePrice             :: Maybe Double
+    } deriving (Eq, Show)
+
+-- | 'ReservedNodeOffering' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rnoCurrencyCode' @::@ 'Maybe' 'Text'
+--
+-- * 'rnoDuration' @::@ 'Maybe' 'Int'
+--
+-- * 'rnoFixedPrice' @::@ 'Maybe' 'Double'
+--
+-- * 'rnoNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'rnoOfferingType' @::@ 'Maybe' 'Text'
+--
+-- * 'rnoRecurringCharges' @::@ ['RecurringCharge']
+--
+-- * 'rnoReservedNodeOfferingId' @::@ 'Maybe' 'Text'
+--
+-- * 'rnoUsagePrice' @::@ 'Maybe' 'Double'
+--
+reservedNodeOffering :: ReservedNodeOffering
+reservedNodeOffering = ReservedNodeOffering
+    { _rnoReservedNodeOfferingId = Nothing
+    , _rnoNodeType               = Nothing
+    , _rnoDuration               = Nothing
+    , _rnoFixedPrice             = Nothing
+    , _rnoUsagePrice             = Nothing
+    , _rnoCurrencyCode           = Nothing
+    , _rnoOfferingType           = Nothing
+    , _rnoRecurringCharges       = mempty
+    }
+
+-- | The currency code for the compute nodes offering.
+rnoCurrencyCode :: Lens' ReservedNodeOffering (Maybe Text)
+rnoCurrencyCode = lens _rnoCurrencyCode (\s a -> s { _rnoCurrencyCode = a })
+
+-- | The duration, in seconds, for which the offering will reserve the node.
+rnoDuration :: Lens' ReservedNodeOffering (Maybe Int)
+rnoDuration = lens _rnoDuration (\s a -> s { _rnoDuration = a })
+
+-- | The upfront fixed charge you will pay to purchase the specific reserved
+-- node offering.
+rnoFixedPrice :: Lens' ReservedNodeOffering (Maybe Double)
+rnoFixedPrice = lens _rnoFixedPrice (\s a -> s { _rnoFixedPrice = a })
+
+-- | The node type offered by the reserved node offering.
+rnoNodeType :: Lens' ReservedNodeOffering (Maybe Text)
+rnoNodeType = lens _rnoNodeType (\s a -> s { _rnoNodeType = a })
+
+-- | The anticipated utilization of the reserved node, as defined in the
+-- reserved node offering.
+rnoOfferingType :: Lens' ReservedNodeOffering (Maybe Text)
+rnoOfferingType = lens _rnoOfferingType (\s a -> s { _rnoOfferingType = a })
+
+-- | The charge to your account regardless of whether you are creating any
+-- clusters using the node offering. Recurring charges are only in effect
+-- for heavy-utilization reserved nodes.
+rnoRecurringCharges :: Lens' ReservedNodeOffering [RecurringCharge]
+rnoRecurringCharges =
+    lens _rnoRecurringCharges (\s a -> s { _rnoRecurringCharges = a })
+        . _List
+
+-- | The offering identifier.
+rnoReservedNodeOfferingId :: Lens' ReservedNodeOffering (Maybe Text)
+rnoReservedNodeOfferingId =
+    lens _rnoReservedNodeOfferingId
+        (\s a -> s { _rnoReservedNodeOfferingId = a })
+
+-- | The rate you are charged for each hour the cluster that is using the
+-- offering is running.
+rnoUsagePrice :: Lens' ReservedNodeOffering (Maybe Double)
+rnoUsagePrice = lens _rnoUsagePrice (\s a -> s { _rnoUsagePrice = a })
+
+instance FromXML ReservedNodeOffering where
+    parseXML x = ReservedNodeOffering
+        <$> x .@? "CurrencyCode"
+        <*> x .@? "Duration"
+        <*> x .@? "FixedPrice"
+        <*> x .@? "NodeType"
+        <*> x .@? "OfferingType"
+        <*> x .@  "RecurringCharges"
+        <*> x .@? "ReservedNodeOfferingId"
+        <*> x .@? "UsagePrice"
+
+instance ToQuery ReservedNodeOffering where
+    toQuery ReservedNodeOffering{..} = mconcat
+        [ "CurrencyCode"           =? _rnoCurrencyCode
+        , "Duration"               =? _rnoDuration
+        , "FixedPrice"             =? _rnoFixedPrice
+        , "NodeType"               =? _rnoNodeType
+        , "OfferingType"           =? _rnoOfferingType
+        , "RecurringCharges"       =? _rnoRecurringCharges
+        , "ReservedNodeOfferingId" =? _rnoReservedNodeOfferingId
+        , "UsagePrice"             =? _rnoUsagePrice
+        ]
+
+data ReservedNode = ReservedNode
+    { _rnCurrencyCode           :: Maybe Text
+    , _rnDuration               :: Maybe Int
+    , _rnFixedPrice             :: Maybe Double
+    , _rnNodeCount              :: Maybe Int
+    , _rnNodeType               :: Maybe Text
+    , _rnOfferingType           :: Maybe Text
+    , _rnRecurringCharges       :: List "RecurringCharge" RecurringCharge
+    , _rnReservedNodeId         :: Maybe Text
+    , _rnReservedNodeOfferingId :: Maybe Text
+    , _rnStartTime              :: Maybe RFC822
+    , _rnState                  :: Maybe Text
+    , _rnUsagePrice             :: Maybe Double
+    } deriving (Eq, Show)
+
+-- | 'ReservedNode' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rnCurrencyCode' @::@ 'Maybe' 'Text'
+--
+-- * 'rnDuration' @::@ 'Maybe' 'Int'
+--
+-- * 'rnFixedPrice' @::@ 'Maybe' 'Double'
+--
+-- * 'rnNodeCount' @::@ 'Maybe' 'Int'
+--
+-- * 'rnNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'rnOfferingType' @::@ 'Maybe' 'Text'
+--
+-- * 'rnRecurringCharges' @::@ ['RecurringCharge']
+--
+-- * 'rnReservedNodeId' @::@ 'Maybe' 'Text'
+--
+-- * 'rnReservedNodeOfferingId' @::@ 'Maybe' 'Text'
+--
+-- * 'rnStartTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'rnState' @::@ 'Maybe' 'Text'
+--
+-- * 'rnUsagePrice' @::@ 'Maybe' 'Double'
+--
+reservedNode :: ReservedNode
+reservedNode = ReservedNode
+    { _rnReservedNodeId         = Nothing
+    , _rnReservedNodeOfferingId = Nothing
+    , _rnNodeType               = Nothing
+    , _rnStartTime              = Nothing
+    , _rnDuration               = Nothing
+    , _rnFixedPrice             = Nothing
+    , _rnUsagePrice             = Nothing
+    , _rnCurrencyCode           = Nothing
+    , _rnNodeCount              = Nothing
+    , _rnState                  = Nothing
+    , _rnOfferingType           = Nothing
+    , _rnRecurringCharges       = mempty
+    }
+
+-- | The currency code for the reserved cluster.
+rnCurrencyCode :: Lens' ReservedNode (Maybe Text)
+rnCurrencyCode = lens _rnCurrencyCode (\s a -> s { _rnCurrencyCode = a })
+
+-- | The duration of the node reservation in seconds.
+rnDuration :: Lens' ReservedNode (Maybe Int)
+rnDuration = lens _rnDuration (\s a -> s { _rnDuration = a })
+
+-- | The fixed cost Amazon Redshift charged you for this reserved node.
+rnFixedPrice :: Lens' ReservedNode (Maybe Double)
+rnFixedPrice = lens _rnFixedPrice (\s a -> s { _rnFixedPrice = a })
+
+-- | The number of reserved compute nodes.
+rnNodeCount :: Lens' ReservedNode (Maybe Int)
+rnNodeCount = lens _rnNodeCount (\s a -> s { _rnNodeCount = a })
+
+-- | The node type of the reserved node.
+rnNodeType :: Lens' ReservedNode (Maybe Text)
+rnNodeType = lens _rnNodeType (\s a -> s { _rnNodeType = a })
+
+-- | The anticipated utilization of the reserved node, as defined in the
+-- reserved node offering.
+rnOfferingType :: Lens' ReservedNode (Maybe Text)
+rnOfferingType = lens _rnOfferingType (\s a -> s { _rnOfferingType = a })
+
+-- | The recurring charges for the reserved node.
+rnRecurringCharges :: Lens' ReservedNode [RecurringCharge]
+rnRecurringCharges =
+    lens _rnRecurringCharges (\s a -> s { _rnRecurringCharges = a })
+        . _List
+
+-- | The unique identifier for the reservation.
+rnReservedNodeId :: Lens' ReservedNode (Maybe Text)
+rnReservedNodeId = lens _rnReservedNodeId (\s a -> s { _rnReservedNodeId = a })
+
+-- | The identifier for the reserved node offering.
+rnReservedNodeOfferingId :: Lens' ReservedNode (Maybe Text)
+rnReservedNodeOfferingId =
+    lens _rnReservedNodeOfferingId
+        (\s a -> s { _rnReservedNodeOfferingId = a })
+
+-- | The time the reservation started. You purchase a reserved node offering
+-- for a duration. This is the start time of that duration.
+rnStartTime :: Lens' ReservedNode (Maybe UTCTime)
+rnStartTime = lens _rnStartTime (\s a -> s { _rnStartTime = a }) . mapping _Time
+
+-- | The state of the reserved compute node. Possible Values:
+-- pending-payment-This reserved node has recently been purchased, and the
+-- sale has been approved, but payment has not yet been confirmed.
+-- active-This reserved node is owned by the caller and is available for
+-- use. payment-failed-Payment failed for the purchase attempt.
+rnState :: Lens' ReservedNode (Maybe Text)
+rnState = lens _rnState (\s a -> s { _rnState = a })
+
+-- | The hourly rate Amazon Redshift charge you for this reserved node.
+rnUsagePrice :: Lens' ReservedNode (Maybe Double)
+rnUsagePrice = lens _rnUsagePrice (\s a -> s { _rnUsagePrice = a })
+
+instance FromXML ReservedNode where
+    parseXML x = ReservedNode
+        <$> x .@? "CurrencyCode"
+        <*> x .@? "Duration"
+        <*> x .@? "FixedPrice"
+        <*> x .@? "NodeCount"
+        <*> x .@? "NodeType"
+        <*> x .@? "OfferingType"
+        <*> x .@  "RecurringCharges"
+        <*> x .@? "ReservedNodeId"
+        <*> x .@? "ReservedNodeOfferingId"
+        <*> x .@? "StartTime"
+        <*> x .@? "State"
+        <*> x .@? "UsagePrice"
+
+instance ToQuery ReservedNode where
+    toQuery ReservedNode{..} = mconcat
+        [ "CurrencyCode"           =? _rnCurrencyCode
+        , "Duration"               =? _rnDuration
+        , "FixedPrice"             =? _rnFixedPrice
+        , "NodeCount"              =? _rnNodeCount
+        , "NodeType"               =? _rnNodeType
+        , "OfferingType"           =? _rnOfferingType
+        , "RecurringCharges"       =? _rnRecurringCharges
+        , "ReservedNodeId"         =? _rnReservedNodeId
+        , "ReservedNodeOfferingId" =? _rnReservedNodeOfferingId
+        , "StartTime"              =? _rnStartTime
+        , "State"                  =? _rnState
+        , "UsagePrice"             =? _rnUsagePrice
+        ]
+
+data LoggingStatus = LoggingStatus
+    { _lsBucketName                 :: Maybe Text
+    , _lsLastFailureMessage         :: Maybe Text
+    , _lsLastFailureTime            :: Maybe RFC822
+    , _lsLastSuccessfulDeliveryTime :: Maybe RFC822
+    , _lsLoggingEnabled             :: Maybe Bool
+    , _lsS3KeyPrefix                :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'LoggingStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lsBucketName' @::@ 'Maybe' 'Text'
+--
+-- * 'lsLastFailureMessage' @::@ 'Maybe' 'Text'
+--
+-- * 'lsLastFailureTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'lsLastSuccessfulDeliveryTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'lsLoggingEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'lsS3KeyPrefix' @::@ 'Maybe' 'Text'
+--
+loggingStatus :: LoggingStatus
+loggingStatus = LoggingStatus
+    { _lsLoggingEnabled             = Nothing
+    , _lsBucketName                 = Nothing
+    , _lsS3KeyPrefix                = Nothing
+    , _lsLastSuccessfulDeliveryTime = Nothing
+    , _lsLastFailureTime            = Nothing
+    , _lsLastFailureMessage         = Nothing
+    }
+
+-- | The name of the S3 bucket where the log files are stored.
+lsBucketName :: Lens' LoggingStatus (Maybe Text)
+lsBucketName = lens _lsBucketName (\s a -> s { _lsBucketName = a })
+
+-- | The message indicating that logs failed to be delivered.
+lsLastFailureMessage :: Lens' LoggingStatus (Maybe Text)
+lsLastFailureMessage =
+    lens _lsLastFailureMessage (\s a -> s { _lsLastFailureMessage = a })
+
+-- | The last time when logs failed to be delivered.
+lsLastFailureTime :: Lens' LoggingStatus (Maybe UTCTime)
+lsLastFailureTime =
+    lens _lsLastFailureTime (\s a -> s { _lsLastFailureTime = a })
+        . mapping _Time
+
+-- | The last time when logs were delivered.
+lsLastSuccessfulDeliveryTime :: Lens' LoggingStatus (Maybe UTCTime)
+lsLastSuccessfulDeliveryTime =
+    lens _lsLastSuccessfulDeliveryTime
+        (\s a -> s { _lsLastSuccessfulDeliveryTime = a })
+            . mapping _Time
+
+-- | true if logging is on, false if logging is off.
+lsLoggingEnabled :: Lens' LoggingStatus (Maybe Bool)
+lsLoggingEnabled = lens _lsLoggingEnabled (\s a -> s { _lsLoggingEnabled = a })
+
+-- | The prefix applied to the log file names.
+lsS3KeyPrefix :: Lens' LoggingStatus (Maybe Text)
+lsS3KeyPrefix = lens _lsS3KeyPrefix (\s a -> s { _lsS3KeyPrefix = a })
+
+instance FromXML LoggingStatus where
+    parseXML x = LoggingStatus
+        <$> x .@? "BucketName"
+        <*> x .@? "LastFailureMessage"
+        <*> x .@? "LastFailureTime"
+        <*> x .@? "LastSuccessfulDeliveryTime"
+        <*> x .@? "LoggingEnabled"
+        <*> x .@? "S3KeyPrefix"
+
+instance ToQuery LoggingStatus where
+    toQuery LoggingStatus{..} = mconcat
+        [ "BucketName"                 =? _lsBucketName
+        , "LastFailureMessage"         =? _lsLastFailureMessage
+        , "LastFailureTime"            =? _lsLastFailureTime
+        , "LastSuccessfulDeliveryTime" =? _lsLastSuccessfulDeliveryTime
+        , "LoggingEnabled"             =? _lsLoggingEnabled
+        , "S3KeyPrefix"                =? _lsS3KeyPrefix
+        ]
+
+newtype AccountWithRestoreAccess = AccountWithRestoreAccess
+    { _awraAccountId :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'AccountWithRestoreAccess' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'awraAccountId' @::@ 'Maybe' 'Text'
+--
+accountWithRestoreAccess :: AccountWithRestoreAccess
+accountWithRestoreAccess = AccountWithRestoreAccess
+    { _awraAccountId = Nothing
+    }
+
+-- | The identifier of an AWS customer account authorized to restore a
+-- snapshot.
+awraAccountId :: Lens' AccountWithRestoreAccess (Maybe Text)
+awraAccountId = lens _awraAccountId (\s a -> s { _awraAccountId = a })
+
+instance FromXML AccountWithRestoreAccess where
+    parseXML x = AccountWithRestoreAccess
+        <$> x .@? "AccountId"
+
+instance ToQuery AccountWithRestoreAccess where
+    toQuery AccountWithRestoreAccess{..} = mconcat
+        [ "AccountId" =? _awraAccountId
+        ]
+
+newtype AvailabilityZone = AvailabilityZone
+    { _azName :: Maybe Text
+    } deriving (Eq, Ord, Show, Monoid)
+
+-- | 'AvailabilityZone' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'azName' @::@ 'Maybe' 'Text'
+--
+availabilityZone :: AvailabilityZone
+availabilityZone = AvailabilityZone
+    { _azName = Nothing
+    }
+
+-- | The name of the availability zone.
+azName :: Lens' AvailabilityZone (Maybe Text)
+azName = lens _azName (\s a -> s { _azName = a })
+
+instance FromXML AvailabilityZone where
+    parseXML x = AvailabilityZone
+        <$> x .@? "Name"
+
+instance ToQuery AvailabilityZone where
+    toQuery AvailabilityZone{..} = mconcat
+        [ "Name" =? _azName
+        ]
+
+data EventSubscription = EventSubscription
+    { _esCustSubscriptionId       :: Maybe Text
+    , _esCustomerAwsId            :: Maybe Text
+    , _esEnabled                  :: Maybe Bool
+    , _esEventCategoriesList      :: List "EventCategory" Text
+    , _esSeverity                 :: Maybe Text
+    , _esSnsTopicArn              :: Maybe Text
+    , _esSourceIdsList            :: List "SourceId" Text
+    , _esSourceType               :: Maybe Text
+    , _esStatus                   :: Maybe Text
+    , _esSubscriptionCreationTime :: Maybe RFC822
+    , _esTags                     :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'EventSubscription' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'esCustSubscriptionId' @::@ 'Maybe' 'Text'
+--
+-- * 'esCustomerAwsId' @::@ 'Maybe' 'Text'
+--
+-- * 'esEnabled' @::@ 'Maybe' 'Bool'
+--
+-- * 'esEventCategoriesList' @::@ ['Text']
+--
+-- * 'esSeverity' @::@ 'Maybe' 'Text'
+--
+-- * 'esSnsTopicArn' @::@ 'Maybe' 'Text'
+--
+-- * 'esSourceIdsList' @::@ ['Text']
+--
+-- * 'esSourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'esStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'esSubscriptionCreationTime' @::@ 'Maybe' 'UTCTime'
+--
+-- * 'esTags' @::@ ['Tag']
+--
+eventSubscription :: EventSubscription
+eventSubscription = EventSubscription
+    { _esCustomerAwsId            = Nothing
+    , _esCustSubscriptionId       = Nothing
+    , _esSnsTopicArn              = Nothing
+    , _esStatus                   = Nothing
+    , _esSubscriptionCreationTime = Nothing
+    , _esSourceType               = Nothing
+    , _esSourceIdsList            = mempty
+    , _esEventCategoriesList      = mempty
+    , _esSeverity                 = Nothing
+    , _esEnabled                  = Nothing
+    , _esTags                     = mempty
+    }
+
+-- | The name of the Amazon Redshift event notification subscription.
+esCustSubscriptionId :: Lens' EventSubscription (Maybe Text)
+esCustSubscriptionId =
+    lens _esCustSubscriptionId (\s a -> s { _esCustSubscriptionId = a })
+
+-- | The AWS customer account associated with the Amazon Redshift event
+-- notification subscription.
+esCustomerAwsId :: Lens' EventSubscription (Maybe Text)
+esCustomerAwsId = lens _esCustomerAwsId (\s a -> s { _esCustomerAwsId = a })
+
+-- | A Boolean value indicating whether the subscription is enabled. true
+-- indicates the subscription is enabled.
+esEnabled :: Lens' EventSubscription (Maybe Bool)
+esEnabled = lens _esEnabled (\s a -> s { _esEnabled = a })
+
+-- | The list of Amazon Redshift event categories specified in the event
+-- notification subscription. Values: Configuration, Management, Monitoring,
+-- Security.
+esEventCategoriesList :: Lens' EventSubscription [Text]
+esEventCategoriesList =
+    lens _esEventCategoriesList (\s a -> s { _esEventCategoriesList = a })
+        . _List
+
+-- | The event severity specified in the Amazon Redshift event notification
+-- subscription. Values: ERROR, INFO.
+esSeverity :: Lens' EventSubscription (Maybe Text)
+esSeverity = lens _esSeverity (\s a -> s { _esSeverity = a })
+
+-- | The Amazon Resource Name (ARN) of the Amazon SNS topic used by the event
+-- notification subscription.
+esSnsTopicArn :: Lens' EventSubscription (Maybe Text)
+esSnsTopicArn = lens _esSnsTopicArn (\s a -> s { _esSnsTopicArn = a })
+
+-- | A list of the sources that publish events to the Amazon Redshift event
+-- notification subscription.
+esSourceIdsList :: Lens' EventSubscription [Text]
+esSourceIdsList = lens _esSourceIdsList (\s a -> s { _esSourceIdsList = a }) . _List
+
+-- | The source type of the events returned the Amazon Redshift event
+-- notification, such as cluster, or cluster-snapshot.
+esSourceType :: Lens' EventSubscription (Maybe Text)
+esSourceType = lens _esSourceType (\s a -> s { _esSourceType = a })
+
+-- | The status of the Amazon Redshift event notification subscription.
+-- Constraints: Can be one of the following: active | no-permission |
+-- topic-not-exist The status "no-permission" indicates that Amazon Redshift
+-- no longer has permission to post to the Amazon SNS topic. The status
+-- "topic-not-exist" indicates that the topic was deleted after the
+-- subscription was created.
+esStatus :: Lens' EventSubscription (Maybe Text)
+esStatus = lens _esStatus (\s a -> s { _esStatus = a })
+
+-- | The date and time the Amazon Redshift event notification subscription was
+-- created.
+esSubscriptionCreationTime :: Lens' EventSubscription (Maybe UTCTime)
+esSubscriptionCreationTime =
+    lens _esSubscriptionCreationTime
+        (\s a -> s { _esSubscriptionCreationTime = a })
+            . mapping _Time
+
+-- | The list of tags for the event subscription.
+esTags :: Lens' EventSubscription [Tag]
+esTags = lens _esTags (\s a -> s { _esTags = a }) . _List
+
+instance FromXML EventSubscription where
+    parseXML x = EventSubscription
+        <$> x .@? "CustSubscriptionId"
+        <*> x .@? "CustomerAwsId"
+        <*> x .@? "Enabled"
+        <*> x .@  "EventCategoriesList"
+        <*> x .@? "Severity"
+        <*> x .@? "SnsTopicArn"
+        <*> x .@  "SourceIdsList"
+        <*> x .@? "SourceType"
+        <*> x .@? "Status"
+        <*> x .@? "SubscriptionCreationTime"
+        <*> x .@  "Tags"
+
+instance ToQuery EventSubscription where
+    toQuery EventSubscription{..} = mconcat
+        [ "CustSubscriptionId"       =? _esCustSubscriptionId
+        , "CustomerAwsId"            =? _esCustomerAwsId
+        , "Enabled"                  =? _esEnabled
+        , "EventCategoriesList"      =? _esEventCategoriesList
+        , "Severity"                 =? _esSeverity
+        , "SnsTopicArn"              =? _esSnsTopicArn
+        , "SourceIdsList"            =? _esSourceIdsList
+        , "SourceType"               =? _esSourceType
+        , "Status"                   =? _esStatus
+        , "SubscriptionCreationTime" =? _esSubscriptionCreationTime
+        , "Tags"                     =? _esTags
+        ]
+
+data HsmStatus = HsmStatus
+    { _hsHsmClientCertificateIdentifier :: Maybe Text
+    , _hsHsmConfigurationIdentifier     :: Maybe Text
+    , _hsStatus                         :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'HsmStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'hsHsmClientCertificateIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'hsHsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'hsStatus' @::@ 'Maybe' 'Text'
+--
+hsmStatus :: HsmStatus
+hsmStatus = HsmStatus
+    { _hsHsmClientCertificateIdentifier = Nothing
+    , _hsHsmConfigurationIdentifier     = Nothing
+    , _hsStatus                         = Nothing
+    }
+
+-- | Specifies the name of the HSM client certificate the Amazon Redshift
+-- cluster uses to retrieve the data encryption keys stored in an HSM.
+hsHsmClientCertificateIdentifier :: Lens' HsmStatus (Maybe Text)
+hsHsmClientCertificateIdentifier =
+    lens _hsHsmClientCertificateIdentifier
+        (\s a -> s { _hsHsmClientCertificateIdentifier = a })
+
+-- | Specifies the name of the HSM configuration that contains the information
+-- the Amazon Redshift cluster can use to retrieve and store keys in an HSM.
+hsHsmConfigurationIdentifier :: Lens' HsmStatus (Maybe Text)
+hsHsmConfigurationIdentifier =
+    lens _hsHsmConfigurationIdentifier
+        (\s a -> s { _hsHsmConfigurationIdentifier = a })
+
+-- | Reports whether the Amazon Redshift cluster has finished applying any HSM
+-- settings changes specified in a modify cluster command. Values: active,
+-- applying.
+hsStatus :: Lens' HsmStatus (Maybe Text)
+hsStatus = lens _hsStatus (\s a -> s { _hsStatus = a })
+
+instance FromXML HsmStatus where
+    parseXML x = HsmStatus
+        <$> x .@? "HsmClientCertificateIdentifier"
+        <*> x .@? "HsmConfigurationIdentifier"
+        <*> x .@? "Status"
+
+instance ToQuery HsmStatus where
+    toQuery HsmStatus{..} = mconcat
+        [ "HsmClientCertificateIdentifier" =? _hsHsmClientCertificateIdentifier
+        , "HsmConfigurationIdentifier"     =? _hsHsmConfigurationIdentifier
+        , "Status"                         =? _hsStatus
+        ]
+
+data ClusterParameterGroupNameMessage = ClusterParameterGroupNameMessage
+    { _cpgnmParameterGroupName   :: Maybe Text
+    , _cpgnmParameterGroupStatus :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterParameterGroupNameMessage' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cpgnmParameterGroupName' @::@ 'Maybe' 'Text'
+--
+-- * 'cpgnmParameterGroupStatus' @::@ 'Maybe' 'Text'
+--
+clusterParameterGroupNameMessage :: ClusterParameterGroupNameMessage
+clusterParameterGroupNameMessage = ClusterParameterGroupNameMessage
+    { _cpgnmParameterGroupName   = Nothing
+    , _cpgnmParameterGroupStatus = Nothing
+    }
+
+-- | The name of the cluster parameter group.
+cpgnmParameterGroupName :: Lens' ClusterParameterGroupNameMessage (Maybe Text)
+cpgnmParameterGroupName =
+    lens _cpgnmParameterGroupName (\s a -> s { _cpgnmParameterGroupName = a })
+
+-- | The status of the parameter group. For example, if you made a change to a
+-- parameter group name-value pair, then the change could be pending a
+-- reboot of an associated cluster.
+cpgnmParameterGroupStatus :: Lens' ClusterParameterGroupNameMessage (Maybe Text)
+cpgnmParameterGroupStatus =
+    lens _cpgnmParameterGroupStatus
+        (\s a -> s { _cpgnmParameterGroupStatus = a })
+
+instance FromXML ClusterParameterGroupNameMessage where
+    parseXML x = ClusterParameterGroupNameMessage
+        <$> x .@? "ParameterGroupName"
+        <*> x .@? "ParameterGroupStatus"
+
+instance ToQuery ClusterParameterGroupNameMessage where
+    toQuery ClusterParameterGroupNameMessage{..} = mconcat
+        [ "ParameterGroupName"   =? _cpgnmParameterGroupName
+        , "ParameterGroupStatus" =? _cpgnmParameterGroupStatus
+        ]
+
+data ElasticIpStatus = ElasticIpStatus
+    { _eisElasticIp :: Maybe Text
+    , _eisStatus    :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ElasticIpStatus' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'eisElasticIp' @::@ 'Maybe' 'Text'
+--
+-- * 'eisStatus' @::@ 'Maybe' 'Text'
+--
+elasticIpStatus :: ElasticIpStatus
+elasticIpStatus = ElasticIpStatus
+    { _eisElasticIp = Nothing
+    , _eisStatus    = Nothing
+    }
+
+-- | The elastic IP (EIP) address for the cluster.
+eisElasticIp :: Lens' ElasticIpStatus (Maybe Text)
+eisElasticIp = lens _eisElasticIp (\s a -> s { _eisElasticIp = a })
+
+-- | Describes the status of the elastic IP (EIP) address.
+eisStatus :: Lens' ElasticIpStatus (Maybe Text)
+eisStatus = lens _eisStatus (\s a -> s { _eisStatus = a })
+
+instance FromXML ElasticIpStatus where
+    parseXML x = ElasticIpStatus
+        <$> x .@? "ElasticIp"
+        <*> x .@? "Status"
+
+instance ToQuery ElasticIpStatus where
+    toQuery ElasticIpStatus{..} = mconcat
+        [ "ElasticIp" =? _eisElasticIp
+        , "Status"    =? _eisStatus
+        ]
+
+data ClusterVersion = ClusterVersion
+    { _cvClusterParameterGroupFamily :: Maybe Text
+    , _cvClusterVersion              :: Maybe Text
+    , _cvDescription                 :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'ClusterVersion' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cvClusterParameterGroupFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'cvClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'cvDescription' @::@ 'Maybe' 'Text'
+--
+clusterVersion :: ClusterVersion
+clusterVersion = ClusterVersion
+    { _cvClusterVersion              = Nothing
+    , _cvClusterParameterGroupFamily = Nothing
+    , _cvDescription                 = Nothing
+    }
+
+-- | The name of the cluster parameter group family for the cluster.
+cvClusterParameterGroupFamily :: Lens' ClusterVersion (Maybe Text)
+cvClusterParameterGroupFamily =
+    lens _cvClusterParameterGroupFamily
+        (\s a -> s { _cvClusterParameterGroupFamily = a })
+
+-- | The version number used by the cluster.
+cvClusterVersion :: Lens' ClusterVersion (Maybe Text)
+cvClusterVersion = lens _cvClusterVersion (\s a -> s { _cvClusterVersion = a })
+
+-- | The description of the cluster version.
+cvDescription :: Lens' ClusterVersion (Maybe Text)
+cvDescription = lens _cvDescription (\s a -> s { _cvDescription = a })
+
+instance FromXML ClusterVersion where
+    parseXML x = ClusterVersion
+        <$> x .@? "ClusterParameterGroupFamily"
+        <*> x .@? "ClusterVersion"
+        <*> x .@? "Description"
+
+instance ToQuery ClusterVersion where
+    toQuery ClusterVersion{..} = mconcat
+        [ "ClusterParameterGroupFamily" =? _cvClusterParameterGroupFamily
+        , "ClusterVersion"              =? _cvClusterVersion
+        , "Description"                 =? _cvDescription
+        ]
+
+data RecurringCharge = RecurringCharge
+    { _rcRecurringChargeAmount    :: Maybe Double
+    , _rcRecurringChargeFrequency :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'RecurringCharge' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcRecurringChargeAmount' @::@ 'Maybe' 'Double'
+--
+-- * 'rcRecurringChargeFrequency' @::@ 'Maybe' 'Text'
+--
+recurringCharge :: RecurringCharge
+recurringCharge = RecurringCharge
+    { _rcRecurringChargeAmount    = Nothing
+    , _rcRecurringChargeFrequency = Nothing
+    }
+
+-- | The amount charged per the period of time specified by the recurring
+-- charge frequency.
+rcRecurringChargeAmount :: Lens' RecurringCharge (Maybe Double)
+rcRecurringChargeAmount =
+    lens _rcRecurringChargeAmount (\s a -> s { _rcRecurringChargeAmount = a })
+
+-- | The frequency at which the recurring charge amount is applied.
+rcRecurringChargeFrequency :: Lens' RecurringCharge (Maybe Text)
+rcRecurringChargeFrequency =
+    lens _rcRecurringChargeFrequency
+        (\s a -> s { _rcRecurringChargeFrequency = a })
+
+instance FromXML RecurringCharge where
+    parseXML x = RecurringCharge
+        <$> x .@? "RecurringChargeAmount"
+        <*> x .@? "RecurringChargeFrequency"
+
+instance ToQuery RecurringCharge where
+    toQuery RecurringCharge{..} = mconcat
+        [ "RecurringChargeAmount"    =? _rcRecurringChargeAmount
+        , "RecurringChargeFrequency" =? _rcRecurringChargeFrequency
+        ]
+
+data Endpoint = Endpoint
+    { _eAddress :: Maybe Text
+    , _ePort    :: Maybe Int
+    } deriving (Eq, Ord, Show)
+
+-- | 'Endpoint' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'eAddress' @::@ 'Maybe' 'Text'
+--
+-- * 'ePort' @::@ 'Maybe' 'Int'
+--
+endpoint :: Endpoint
+endpoint = Endpoint
+    { _eAddress = Nothing
+    , _ePort    = Nothing
+    }
+
+-- | The DNS address of the Cluster.
+eAddress :: Lens' Endpoint (Maybe Text)
+eAddress = lens _eAddress (\s a -> s { _eAddress = a })
+
+-- | The port that the database engine is listening on.
+ePort :: Lens' Endpoint (Maybe Int)
+ePort = lens _ePort (\s a -> s { _ePort = a })
+
+instance FromXML Endpoint where
+    parseXML x = Endpoint
+        <$> x .@? "Address"
+        <*> x .@? "Port"
+
+instance ToQuery Endpoint where
+    toQuery Endpoint{..} = mconcat
+        [ "Address" =? _eAddress
+        , "Port"    =? _ePort
+        ]
+
+data IPRange = IPRange
+    { _iprCIDRIP :: Maybe Text
+    , _iprStatus :: Maybe Text
+    , _iprTags   :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'IPRange' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'iprCIDRIP' @::@ 'Maybe' 'Text'
+--
+-- * 'iprStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'iprTags' @::@ ['Tag']
+--
+iprange :: IPRange
+iprange = IPRange
+    { _iprStatus = Nothing
+    , _iprCIDRIP = Nothing
+    , _iprTags   = mempty
+    }
+
+-- | The IP range in Classless Inter-Domain Routing (CIDR) notation.
+iprCIDRIP :: Lens' IPRange (Maybe Text)
+iprCIDRIP = lens _iprCIDRIP (\s a -> s { _iprCIDRIP = a })
+
+-- | The status of the IP range, for example, "authorized".
+iprStatus :: Lens' IPRange (Maybe Text)
+iprStatus = lens _iprStatus (\s a -> s { _iprStatus = a })
+
+-- | The list of tags for the IP range.
+iprTags :: Lens' IPRange [Tag]
+iprTags = lens _iprTags (\s a -> s { _iprTags = a }) . _List
+
+instance FromXML IPRange where
+    parseXML x = IPRange
+        <$> x .@? "CIDRIP"
+        <*> x .@? "Status"
+        <*> x .@  "Tags"
+
+instance ToQuery IPRange where
+    toQuery IPRange{..} = mconcat
+        [ "CIDRIP" =? _iprCIDRIP
+        , "Status" =? _iprStatus
+        , "Tags"   =? _iprTags
+        ]
+
+data TaggedResource = TaggedResource
+    { _trResourceName :: Maybe Text
+    , _trResourceType :: Maybe Text
+    , _trTag          :: Maybe Tag
+    } deriving (Eq, Show)
+
+-- | 'TaggedResource' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'trResourceName' @::@ 'Maybe' 'Text'
+--
+-- * 'trResourceType' @::@ 'Maybe' 'Text'
+--
+-- * 'trTag' @::@ 'Maybe' 'Tag'
+--
+taggedResource :: TaggedResource
+taggedResource = TaggedResource
+    { _trTag          = Nothing
+    , _trResourceName = Nothing
+    , _trResourceType = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) with which the tag is associated. For
+-- example, arn:aws:redshift:us-east-1:123456789:cluster:t1.
+trResourceName :: Lens' TaggedResource (Maybe Text)
+trResourceName = lens _trResourceName (\s a -> s { _trResourceName = a })
+
+-- | The type of resource with which the tag is associated. Valid resource
+-- types are: Cluster CIDR/IP EC2 security group Snapshot Cluster security
+-- group Subnet group HSM connection HSM certificate Parameter group For
+-- more information about Amazon Redshift resource types and constructing
+-- ARNs, go to Constructing an Amazon Redshift Amazon Resource Name (ARN) in
+-- the Amazon Redshift Cluster Management Guide.
+trResourceType :: Lens' TaggedResource (Maybe Text)
+trResourceType = lens _trResourceType (\s a -> s { _trResourceType = a })
+
+-- | The tag for the resource.
+trTag :: Lens' TaggedResource (Maybe Tag)
+trTag = lens _trTag (\s a -> s { _trTag = a })
+
+instance FromXML TaggedResource where
+    parseXML x = TaggedResource
+        <$> x .@? "ResourceName"
+        <*> x .@? "ResourceType"
+        <*> x .@? "Tag"
+
+instance ToQuery TaggedResource where
+    toQuery TaggedResource{..} = mconcat
+        [ "ResourceName" =? _trResourceName
+        , "ResourceType" =? _trResourceType
+        , "Tag"          =? _trTag
+        ]
+
+data EventCategoriesMap = EventCategoriesMap
+    { _ecmEvents     :: List "EventInfoMap" EventInfoMap
+    , _ecmSourceType :: Maybe Text
+    } deriving (Eq, Show)
+
+-- | 'EventCategoriesMap' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ecmEvents' @::@ ['EventInfoMap']
+--
+-- * 'ecmSourceType' @::@ 'Maybe' 'Text'
+--
+eventCategoriesMap :: EventCategoriesMap
+eventCategoriesMap = EventCategoriesMap
+    { _ecmSourceType = Nothing
+    , _ecmEvents     = mempty
+    }
+
+-- | The events in the event category.
+ecmEvents :: Lens' EventCategoriesMap [EventInfoMap]
+ecmEvents = lens _ecmEvents (\s a -> s { _ecmEvents = a }) . _List
+
+-- | The Amazon Redshift source type, such as cluster or cluster-snapshot,
+-- that the returned categories belong to.
+ecmSourceType :: Lens' EventCategoriesMap (Maybe Text)
+ecmSourceType = lens _ecmSourceType (\s a -> s { _ecmSourceType = a })
+
+instance FromXML EventCategoriesMap where
+    parseXML x = EventCategoriesMap
+        <$> x .@  "Events"
+        <*> x .@? "SourceType"
+
+instance ToQuery EventCategoriesMap where
+    toQuery EventCategoriesMap{..} = mconcat
+        [ "Events"     =? _ecmEvents
+        , "SourceType" =? _ecmSourceType
+        ]
+
+data HsmConfiguration = HsmConfiguration
+    { _hcDescription                :: Maybe Text
+    , _hcHsmConfigurationIdentifier :: Maybe Text
+    , _hcHsmIpAddress               :: Maybe Text
+    , _hcHsmPartitionName           :: Maybe Text
+    , _hcTags                       :: List "Tag" Tag
+    } deriving (Eq, Show)
+
+-- | 'HsmConfiguration' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'hcDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'hcHsmConfigurationIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'hcHsmIpAddress' @::@ 'Maybe' 'Text'
+--
+-- * 'hcHsmPartitionName' @::@ 'Maybe' 'Text'
+--
+-- * 'hcTags' @::@ ['Tag']
+--
+hsmConfiguration :: HsmConfiguration
+hsmConfiguration = HsmConfiguration
+    { _hcHsmConfigurationIdentifier = Nothing
+    , _hcDescription                = Nothing
+    , _hcHsmIpAddress               = Nothing
+    , _hcHsmPartitionName           = Nothing
+    , _hcTags                       = mempty
+    }
+
+-- | A text description of the HSM configuration.
+hcDescription :: Lens' HsmConfiguration (Maybe Text)
+hcDescription = lens _hcDescription (\s a -> s { _hcDescription = a })
+
+-- | The name of the Amazon Redshift HSM configuration.
+hcHsmConfigurationIdentifier :: Lens' HsmConfiguration (Maybe Text)
+hcHsmConfigurationIdentifier =
+    lens _hcHsmConfigurationIdentifier
+        (\s a -> s { _hcHsmConfigurationIdentifier = a })
+
+-- | The IP address that the Amazon Redshift cluster must use to access the
+-- HSM.
+hcHsmIpAddress :: Lens' HsmConfiguration (Maybe Text)
+hcHsmIpAddress = lens _hcHsmIpAddress (\s a -> s { _hcHsmIpAddress = a })
+
+-- | The name of the partition in the HSM where the Amazon Redshift clusters
+-- will store their database encryption keys.
+hcHsmPartitionName :: Lens' HsmConfiguration (Maybe Text)
+hcHsmPartitionName =
+    lens _hcHsmPartitionName (\s a -> s { _hcHsmPartitionName = a })
+
+-- | The list of tags for the HSM configuration.
+hcTags :: Lens' HsmConfiguration [Tag]
+hcTags = lens _hcTags (\s a -> s { _hcTags = a }) . _List
+
+instance FromXML HsmConfiguration where
+    parseXML x = HsmConfiguration
+        <$> x .@? "Description"
+        <*> x .@? "HsmConfigurationIdentifier"
+        <*> x .@? "HsmIpAddress"
+        <*> x .@? "HsmPartitionName"
+        <*> x .@  "Tags"
+
+instance ToQuery HsmConfiguration where
+    toQuery HsmConfiguration{..} = mconcat
+        [ "Description"                =? _hcDescription
+        , "HsmConfigurationIdentifier" =? _hcHsmConfigurationIdentifier
+        , "HsmIpAddress"               =? _hcHsmIpAddress
+        , "HsmPartitionName"           =? _hcHsmPartitionName
+        , "Tags"                       =? _hcTags
+        ]
+
+data PendingModifiedValues = PendingModifiedValues
+    { _pmvAutomatedSnapshotRetentionPeriod :: Maybe Int
+    , _pmvClusterIdentifier                :: Maybe Text
+    , _pmvClusterType                      :: Maybe Text
+    , _pmvClusterVersion                   :: Maybe Text
+    , _pmvMasterUserPassword               :: Maybe Text
+    , _pmvNodeType                         :: Maybe Text
+    , _pmvNumberOfNodes                    :: Maybe Int
+    } deriving (Eq, Ord, Show)
+
+-- | 'PendingModifiedValues' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'pmvAutomatedSnapshotRetentionPeriod' @::@ 'Maybe' 'Int'
+--
+-- * 'pmvClusterIdentifier' @::@ 'Maybe' 'Text'
+--
+-- * 'pmvClusterType' @::@ 'Maybe' 'Text'
+--
+-- * 'pmvClusterVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'pmvMasterUserPassword' @::@ 'Maybe' 'Text'
+--
+-- * 'pmvNodeType' @::@ 'Maybe' 'Text'
+--
+-- * 'pmvNumberOfNodes' @::@ 'Maybe' 'Int'
+--
+pendingModifiedValues :: PendingModifiedValues
+pendingModifiedValues = PendingModifiedValues
+    { _pmvMasterUserPassword               = Nothing
+    , _pmvNodeType                         = Nothing
+    , _pmvNumberOfNodes                    = Nothing
+    , _pmvClusterType                      = Nothing
+    , _pmvClusterVersion                   = Nothing
+    , _pmvAutomatedSnapshotRetentionPeriod = Nothing
+    , _pmvClusterIdentifier                = Nothing
+    }
+
+-- | The pending or in-progress change of the automated snapshot retention
+-- period.
+pmvAutomatedSnapshotRetentionPeriod :: Lens' PendingModifiedValues (Maybe Int)
+pmvAutomatedSnapshotRetentionPeriod =
+    lens _pmvAutomatedSnapshotRetentionPeriod
+        (\s a -> s { _pmvAutomatedSnapshotRetentionPeriod = a })
+
+-- | The pending or in-progress change of the new identifier for the cluster.
+pmvClusterIdentifier :: Lens' PendingModifiedValues (Maybe Text)
+pmvClusterIdentifier =
+    lens _pmvClusterIdentifier (\s a -> s { _pmvClusterIdentifier = a })
+
+-- | The pending or in-progress change of the cluster type.
+pmvClusterType :: Lens' PendingModifiedValues (Maybe Text)
+pmvClusterType = lens _pmvClusterType (\s a -> s { _pmvClusterType = a })
+
+-- | The pending or in-progress change of the service version.
+pmvClusterVersion :: Lens' PendingModifiedValues (Maybe Text)
+pmvClusterVersion =
+    lens _pmvClusterVersion (\s a -> s { _pmvClusterVersion = a })
+
+-- | The pending or in-progress change of the master user password for the
+-- cluster.
+pmvMasterUserPassword :: Lens' PendingModifiedValues (Maybe Text)
+pmvMasterUserPassword =
+    lens _pmvMasterUserPassword (\s a -> s { _pmvMasterUserPassword = a })
+
+-- | The pending or in-progress change of the cluster's node type.
+pmvNodeType :: Lens' PendingModifiedValues (Maybe Text)
+pmvNodeType = lens _pmvNodeType (\s a -> s { _pmvNodeType = a })
+
+-- | The pending or in-progress change of the number of nodes in the cluster.
+pmvNumberOfNodes :: Lens' PendingModifiedValues (Maybe Int)
+pmvNumberOfNodes = lens _pmvNumberOfNodes (\s a -> s { _pmvNumberOfNodes = a })
+
+instance FromXML PendingModifiedValues where
+    parseXML x = PendingModifiedValues
+        <$> x .@? "AutomatedSnapshotRetentionPeriod"
+        <*> x .@? "ClusterIdentifier"
+        <*> x .@? "ClusterType"
+        <*> x .@? "ClusterVersion"
+        <*> x .@? "MasterUserPassword"
+        <*> x .@? "NodeType"
+        <*> x .@? "NumberOfNodes"
+
+instance ToQuery PendingModifiedValues where
+    toQuery PendingModifiedValues{..} = mconcat
+        [ "AutomatedSnapshotRetentionPeriod" =? _pmvAutomatedSnapshotRetentionPeriod
+        , "ClusterIdentifier"                =? _pmvClusterIdentifier
+        , "ClusterType"                      =? _pmvClusterType
+        , "ClusterVersion"                   =? _pmvClusterVersion
+        , "MasterUserPassword"               =? _pmvMasterUserPassword
+        , "NodeType"                         =? _pmvNodeType
+        , "NumberOfNodes"                    =? _pmvNumberOfNodes
+        ]
+
+data VpcSecurityGroupMembership = VpcSecurityGroupMembership
+    { _vsgmStatus             :: Maybe Text
+    , _vsgmVpcSecurityGroupId :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'VpcSecurityGroupMembership' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vsgmStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'vsgmVpcSecurityGroupId' @::@ 'Maybe' 'Text'
+--
+vpcSecurityGroupMembership :: VpcSecurityGroupMembership
+vpcSecurityGroupMembership = VpcSecurityGroupMembership
+    { _vsgmVpcSecurityGroupId = Nothing
+    , _vsgmStatus             = Nothing
+    }
+
+vsgmStatus :: Lens' VpcSecurityGroupMembership (Maybe Text)
+vsgmStatus = lens _vsgmStatus (\s a -> s { _vsgmStatus = a })
+
+vsgmVpcSecurityGroupId :: Lens' VpcSecurityGroupMembership (Maybe Text)
+vsgmVpcSecurityGroupId =
+    lens _vsgmVpcSecurityGroupId (\s a -> s { _vsgmVpcSecurityGroupId = a })
+
+instance FromXML VpcSecurityGroupMembership where
+    parseXML x = VpcSecurityGroupMembership
+        <$> x .@? "Status"
+        <*> x .@? "VpcSecurityGroupId"
+
+instance ToQuery VpcSecurityGroupMembership where
+    toQuery VpcSecurityGroupMembership{..} = mconcat
+        [ "Status"             =? _vsgmStatus
+        , "VpcSecurityGroupId" =? _vsgmVpcSecurityGroupId
+        ]
+
+data Parameter = Parameter
+    { _pAllowedValues        :: Maybe Text
+    , _pDataType             :: Maybe Text
+    , _pDescription          :: Maybe Text
+    , _pIsModifiable         :: Maybe Bool
+    , _pMinimumEngineVersion :: Maybe Text
+    , _pParameterName        :: Maybe Text
+    , _pParameterValue       :: Maybe Text
+    , _pSource               :: Maybe Text
+    } deriving (Eq, Ord, Show)
+
+-- | 'Parameter' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'pAllowedValues' @::@ 'Maybe' 'Text'
+--
+-- * 'pDataType' @::@ 'Maybe' 'Text'
+--
+-- * 'pDescription' @::@ 'Maybe' 'Text'
+--
+-- * 'pIsModifiable' @::@ 'Maybe' 'Bool'
+--
+-- * 'pMinimumEngineVersion' @::@ 'Maybe' 'Text'
+--
+-- * 'pParameterName' @::@ 'Maybe' 'Text'
+--
+-- * 'pParameterValue' @::@ 'Maybe' 'Text'
+--
+-- * 'pSource' @::@ 'Maybe' 'Text'
+--
+parameter :: Parameter
+parameter = Parameter
+    { _pParameterName        = Nothing
+    , _pParameterValue       = Nothing
+    , _pDescription          = Nothing
+    , _pSource               = Nothing
+    , _pDataType             = Nothing
+    , _pAllowedValues        = Nothing
+    , _pIsModifiable         = Nothing
+    , _pMinimumEngineVersion = Nothing
+    }
+
+-- | The valid range of values for the parameter.
+pAllowedValues :: Lens' Parameter (Maybe Text)
+pAllowedValues = lens _pAllowedValues (\s a -> s { _pAllowedValues = a })
+
+-- | The data type of the parameter.
+pDataType :: Lens' Parameter (Maybe Text)
+pDataType = lens _pDataType (\s a -> s { _pDataType = a })
+
+-- | A description of the parameter.
+pDescription :: Lens' Parameter (Maybe Text)
+pDescription = lens _pDescription (\s a -> s { _pDescription = a })
+
+-- | If true, the parameter can be modified. Some parameters have security or
+-- operational implications that prevent them from being changed.
+pIsModifiable :: Lens' Parameter (Maybe Bool)
+pIsModifiable = lens _pIsModifiable (\s a -> s { _pIsModifiable = a })
+
+-- | The earliest engine version to which the parameter can apply.
+pMinimumEngineVersion :: Lens' Parameter (Maybe Text)
+pMinimumEngineVersion =
+    lens _pMinimumEngineVersion (\s a -> s { _pMinimumEngineVersion = a })
+
+-- | The name of the parameter.
+pParameterName :: Lens' Parameter (Maybe Text)
+pParameterName = lens _pParameterName (\s a -> s { _pParameterName = a })
+
+-- | The value of the parameter.
+pParameterValue :: Lens' Parameter (Maybe Text)
+pParameterValue = lens _pParameterValue (\s a -> s { _pParameterValue = a })
+
+-- | The source of the parameter value, such as "engine-default" or "user".
+pSource :: Lens' Parameter (Maybe Text)
+pSource = lens _pSource (\s a -> s { _pSource = a })
+
+instance FromXML Parameter where
+    parseXML x = Parameter
+        <$> x .@? "AllowedValues"
+        <*> x .@? "DataType"
+        <*> x .@? "Description"
+        <*> x .@? "IsModifiable"
+        <*> x .@? "MinimumEngineVersion"
+        <*> x .@? "ParameterName"
+        <*> x .@? "ParameterValue"
+        <*> x .@? "Source"
+
+instance ToQuery Parameter where
+    toQuery Parameter{..} = mconcat
+        [ "AllowedValues"        =? _pAllowedValues
+        , "DataType"             =? _pDataType
+        , "Description"          =? _pDescription
+        , "IsModifiable"         =? _pIsModifiable
+        , "MinimumEngineVersion" =? _pMinimumEngineVersion
+        , "ParameterName"        =? _pParameterName
+        , "ParameterValue"       =? _pParameterValue
+        , "Source"               =? _pSource
+        ]
