diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,27 +1,44 @@
 # Amazon ElastiCache SDK
 
-> _Warning:_ This is an experimental preview release which is still under heavy development and not intended for public consumption, _caveat emptor_!
-
+* [Version](#version)
 * [Description](#description)
 * [Contribute](#contribute)
 * [Licence](#licence)
 
+
+## Version
+
+`1.0.0`
+
+
 ## Description
 
-ElastiCache is a web service that makes it easy to deploy, operate, and scale
-an in-memory cache in the cloud. The service improves the performance of web
-applications by allowing you to retrieve information from fast, managed,
-in-memory caches, instead of relying entirely on slower disk-based databases.
-Amazon ElastiCache automatically detects and replaces failed nodes, reducing
-the overhead associated with self-managed infrastructures and provides a
-resilient system that mitigates the risk of overloaded databases, which slow
-website and application load times. Through integration with Amazon
-CloudWatch, Amazon ElastiCache provides enhanced visibility into key
-performance metrics associated with your Memcached or Redis nodes.
+Amazon ElastiCache
 
+Amazon ElastiCache is a web service that makes it easier to set up,
+operate, and scale a distributed cache in the cloud.
+
+With ElastiCache, customers gain all of the benefits of a
+high-performance, in-memory cache with far less of the administrative
+burden of launching and managing a distributed cache. The service makes
+setup, scaling, and cluster failure handling much simpler than in a
+self-managed cache deployment.
+
+In addition, through integration with Amazon CloudWatch, customers get
+enhanced visibility into the key performance statistics associated with
+their cache and can receive alarms if a part of their cache runs hot.
+
 Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-elasticache)
 and the [AWS API Reference](http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/Welcome.html).
 
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information and sending requests.
+
+Use of lenses is required for constructing and manipulating types.
+This is due to the amount of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
 
 ## Contribute
 
diff --git a/amazonka-elasticache.cabal b/amazonka-elasticache.cabal
--- a/amazonka-elasticache.cabal
+++ b/amazonka-elasticache.cabal
@@ -1,34 +1,46 @@
 name:                  amazonka-elasticache
-version:               0.3.6
+version:               1.0.0
 synopsis:              Amazon ElastiCache 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
+copyright:             Copyright (c) 2013-2015 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 extra-source-files:    README.md
 cabal-version:         >= 1.10
 
 description:
-    ElastiCache is a web service that makes it easy to deploy, operate, and scale
-    an in-memory cache in the cloud. The service improves the performance of web
-    applications by allowing you to retrieve information from fast, managed,
-    in-memory caches, instead of relying entirely on slower disk-based databases.
-    Amazon ElastiCache automatically detects and replaces failed nodes, reducing
-    the overhead associated with self-managed infrastructures and provides a
-    resilient system that mitigates the risk of overloaded databases, which slow
-    website and application load times. Through integration with Amazon
-    CloudWatch, Amazon ElastiCache provides enhanced visibility into key
-    performance metrics associated with your Memcached or Redis nodes.
+    Amazon ElastiCache
 
+    Amazon ElastiCache is a web service that makes it easier to set up,
+    operate, and scale a distributed cache in the cloud.
+
+    With ElastiCache, customers gain all of the benefits of a
+    high-performance, in-memory cache with far less of the administrative
+    burden of launching and managing a distributed cache. The service makes
+    setup, scaling, and cluster failure handling much simpler than in a
+    self-managed cache deployment.
+
+    In addition, through integration with Amazon CloudWatch, customers get
+    enhanced visibility into the key performance statistics associated with
+    their cache and can receive alarms if a part of their cache runs hot.
     .
-    /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/Welcome.html AWS API Reference>
+    The types from this library are intended to be used with
+    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
+    mechanisms for specifying AuthN/AuthZ information and sending requests.
     .
-    /Warning:/ This is an experimental preview release which is still under
-    heavy development and not intended for public consumption, caveat emptor!
+    Use of lenses is required for constructing and manipulating types.
+    This is due to the amount of nesting of AWS types and transparency regarding
+    de/serialisation into more palatable Haskell values.
+    The provided lenses should be compatible with any of the major lens libraries
+    such as <http://hackage.haskell.org/package/lens lens> or
+    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+    .
+    See "Network.AWS.ElastiCache" and the <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/Welcome.html AWS API Reference>
+    to get started.
 
 source-repository head
     type:     git
@@ -83,7 +95,37 @@
         , Network.AWS.ElastiCache.Waiters
 
     other-modules:
+          Network.AWS.ElastiCache.Types.Product
+        , Network.AWS.ElastiCache.Types.Sum
 
     build-depends:
-          amazonka-core == 0.3.6.*
+          amazonka-core == 1.0.0.*
         , base          >= 4.7     && < 5
+
+test-suite amazonka-elasticache-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This is not comprehensive if modules have manually been added.
+    -- It exists to ensure cabal 'somewhat' detects test module changes.
+    other-modules:
+          Test.AWS.ElastiCache
+        , Test.AWS.Gen.ElastiCache
+        , Test.AWS.ElastiCache.Internal
+
+    build-depends:
+          amazonka-core == 1.0.0
+        , amazonka-test == 1.0.0
+        , amazonka-elasticache == 1.0.0
+        , base
+        , bytestring
+        , lens
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/gen/Network/AWS/ElastiCache.hs b/gen/Network/AWS/ElastiCache.hs
--- a/gen/Network/AWS/ElastiCache.hs
+++ b/gen/Network/AWS/ElastiCache.hs
@@ -1,103 +1,670 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | ElastiCache is a web service that makes it easy to deploy, operate, and scale
--- an in-memory cache in the cloud. The service improves the performance of web
--- applications by allowing you to retrieve information from fast, managed,
--- in-memory caches, instead of relying entirely on slower disk-based databases.
--- Amazon ElastiCache automatically detects and replaces failed nodes, reducing
--- the overhead associated with self-managed infrastructures and provides a
--- resilient system that mitigates the risk of overloaded databases, which slow
--- website and application load times. Through integration with Amazon
--- CloudWatch, Amazon ElastiCache provides enhanced visibility into key
--- performance metrics associated with your Memcached or Redis nodes.
+-- Amazon ElastiCache
+--
+-- Amazon ElastiCache is a web service that makes it easier to set up,
+-- operate, and scale a distributed cache in the cloud.
+--
+-- With ElastiCache, customers gain all of the benefits of a
+-- high-performance, in-memory cache with far less of the administrative
+-- burden of launching and managing a distributed cache. The service makes
+-- setup, scaling, and cluster failure handling much simpler than in a
+-- self-managed cache deployment.
+--
+-- In addition, through integration with Amazon CloudWatch, customers get
+-- enhanced visibility into the key performance statistics associated with
+-- their cache and can receive alarms if a part of their cache runs hot.
+--
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/Welcome.html AWS API Reference>
 module Network.AWS.ElastiCache
-    ( module Network.AWS.ElastiCache.AddTagsToResource
-    , module Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
-    , module Network.AWS.ElastiCache.CopySnapshot
-    , module Network.AWS.ElastiCache.CreateCacheCluster
-    , module Network.AWS.ElastiCache.CreateCacheParameterGroup
-    , module Network.AWS.ElastiCache.CreateCacheSecurityGroup
-    , module Network.AWS.ElastiCache.CreateCacheSubnetGroup
+    (
+    -- * Service
+      ElastiCache
+
+    -- * Errors
+    -- $errors
+
+    -- ** CacheSubnetGroupAlreadyExistsFault
+    , _CacheSubnetGroupAlreadyExistsFault
+
+    -- ** CacheSubnetGroupInUse
+    , _CacheSubnetGroupInUse
+
+    -- ** CacheSecurityGroupNotFoundFault
+    , _CacheSecurityGroupNotFoundFault
+
+    -- ** ReservedCacheNodeAlreadyExistsFault
+    , _ReservedCacheNodeAlreadyExistsFault
+
+    -- ** AuthorizationAlreadyExistsFault
+    , _AuthorizationAlreadyExistsFault
+
+    -- ** ReservedCacheNodeQuotaExceededFault
+    , _ReservedCacheNodeQuotaExceededFault
+
+    -- ** CacheSubnetGroupQuotaExceededFault
+    , _CacheSubnetGroupQuotaExceededFault
+
+    -- ** ReplicationGroupNotFoundFault
+    , _ReplicationGroupNotFoundFault
+
+    -- ** ReservedCacheNodesOfferingNotFoundFault
+    , _ReservedCacheNodesOfferingNotFoundFault
+
+    -- ** TagQuotaPerResourceExceeded
+    , _TagQuotaPerResourceExceeded
+
+    -- ** InvalidSubnet
+    , _InvalidSubnet
+
+    -- ** SnapshotNotFoundFault
+    , _SnapshotNotFoundFault
+
+    -- ** InsufficientCacheClusterCapacityFault
+    , _InsufficientCacheClusterCapacityFault
+
+    -- ** InvalidSnapshotStateFault
+    , _InvalidSnapshotStateFault
+
+    -- ** SnapshotAlreadyExistsFault
+    , _SnapshotAlreadyExistsFault
+
+    -- ** TagNotFoundFault
+    , _TagNotFoundFault
+
+    -- ** SnapshotQuotaExceededFault
+    , _SnapshotQuotaExceededFault
+
+    -- ** CacheParameterGroupAlreadyExistsFault
+    , _CacheParameterGroupAlreadyExistsFault
+
+    -- ** NodeQuotaForClusterExceededFault
+    , _NodeQuotaForClusterExceededFault
+
+    -- ** SnapshotFeatureNotSupportedFault
+    , _SnapshotFeatureNotSupportedFault
+
+    -- ** CacheSubnetGroupNotFoundFault
+    , _CacheSubnetGroupNotFoundFault
+
+    -- ** ReservedCacheNodeNotFoundFault
+    , _ReservedCacheNodeNotFoundFault
+
+    -- ** InvalidParameterValueException
+    , _InvalidParameterValueException
+
+    -- ** InvalidVPCNetworkStateFault
+    , _InvalidVPCNetworkStateFault
+
+    -- ** CacheClusterNotFoundFault
+    , _CacheClusterNotFoundFault
+
+    -- ** InvalidReplicationGroupStateFault
+    , _InvalidReplicationGroupStateFault
+
+    -- ** ReplicationGroupAlreadyExistsFault
+    , _ReplicationGroupAlreadyExistsFault
+
+    -- ** SubnetInUse
+    , _SubnetInUse
+
+    -- ** CacheClusterAlreadyExistsFault
+    , _CacheClusterAlreadyExistsFault
+
+    -- ** ClusterQuotaForCustomerExceededFault
+    , _ClusterQuotaForCustomerExceededFault
+
+    -- ** AuthorizationNotFoundFault
+    , _AuthorizationNotFoundFault
+
+    -- ** CacheSecurityGroupQuotaExceededFault
+    , _CacheSecurityGroupQuotaExceededFault
+
+    -- ** InvalidCacheClusterStateFault
+    , _InvalidCacheClusterStateFault
+
+    -- ** CacheParameterGroupQuotaExceededFault
+    , _CacheParameterGroupQuotaExceededFault
+
+    -- ** NodeQuotaForCustomerExceededFault
+    , _NodeQuotaForCustomerExceededFault
+
+    -- ** CacheSubnetQuotaExceededFault
+    , _CacheSubnetQuotaExceededFault
+
+    -- ** CacheParameterGroupNotFoundFault
+    , _CacheParameterGroupNotFoundFault
+
+    -- ** InvalidParameterCombinationException
+    , _InvalidParameterCombinationException
+
+    -- ** InvalidARNFault
+    , _InvalidARNFault
+
+    -- ** InvalidCacheParameterGroupStateFault
+    , _InvalidCacheParameterGroupStateFault
+
+    -- ** CacheSecurityGroupAlreadyExistsFault
+    , _CacheSecurityGroupAlreadyExistsFault
+
+    -- ** InvalidCacheSecurityGroupStateFault
+    , _InvalidCacheSecurityGroupStateFault
+
+    -- * Waiters
+    -- $waiters
+
+    -- ** CacheClusterAvailable
+    , cacheClusterAvailable
+
+    -- ** CacheClusterDeleted
+    , cacheClusterDeleted
+
+    -- ** ReplicationGroupDeleted
+    , replicationGroupDeleted
+
+    -- ** ReplicationGroupAvailable
+    , replicationGroupAvailable
+
+    -- * Operations
+    -- $operations
+
+    -- ** DeleteCacheSecurityGroup
+    , module Network.AWS.ElastiCache.DeleteCacheSecurityGroup
+
+    -- ** CreateReplicationGroup
     , module Network.AWS.ElastiCache.CreateReplicationGroup
-    , module Network.AWS.ElastiCache.CreateSnapshot
+
+    -- ** DeleteCacheCluster
     , module Network.AWS.ElastiCache.DeleteCacheCluster
-    , module Network.AWS.ElastiCache.DeleteCacheParameterGroup
-    , module Network.AWS.ElastiCache.DeleteCacheSecurityGroup
-    , module Network.AWS.ElastiCache.DeleteCacheSubnetGroup
+
+    -- ** RebootCacheCluster
+    , module Network.AWS.ElastiCache.RebootCacheCluster
+
+    -- ** RevokeCacheSecurityGroupIngress
+    , module Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
+
+    -- ** DescribeEvents (Paginated)
+    , module Network.AWS.ElastiCache.DescribeEvents
+
+    -- ** DescribeEngineDefaultParameters (Paginated)
+    , module Network.AWS.ElastiCache.DescribeEngineDefaultParameters
+
+    -- ** ModifyCacheParameterGroup
+    , module Network.AWS.ElastiCache.ModifyCacheParameterGroup
+
+    -- ** CreateCacheCluster
+    , module Network.AWS.ElastiCache.CreateCacheCluster
+
+    -- ** ListTagsForResource
+    , module Network.AWS.ElastiCache.ListTagsForResource
+
+    -- ** DeleteReplicationGroup
     , module Network.AWS.ElastiCache.DeleteReplicationGroup
-    , module Network.AWS.ElastiCache.DeleteSnapshot
+
+    -- ** PurchaseReservedCacheNodesOffering
+    , module Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
+
+    -- ** DescribeCacheClusters (Paginated)
     , module Network.AWS.ElastiCache.DescribeCacheClusters
-    , module Network.AWS.ElastiCache.DescribeCacheEngineVersions
-    , module Network.AWS.ElastiCache.DescribeCacheParameterGroups
+
+    -- ** ModifyReplicationGroup
+    , module Network.AWS.ElastiCache.ModifyReplicationGroup
+
+    -- ** RemoveTagsFromResource
+    , module Network.AWS.ElastiCache.RemoveTagsFromResource
+
+    -- ** DescribeCacheParameters (Paginated)
     , module Network.AWS.ElastiCache.DescribeCacheParameters
-    , module Network.AWS.ElastiCache.DescribeCacheSecurityGroups
+
+    -- ** DescribeCacheSubnetGroups (Paginated)
     , module Network.AWS.ElastiCache.DescribeCacheSubnetGroups
-    , module Network.AWS.ElastiCache.DescribeEngineDefaultParameters
-    , module Network.AWS.ElastiCache.DescribeEvents
+
+    -- ** CreateCacheSecurityGroup
+    , module Network.AWS.ElastiCache.CreateCacheSecurityGroup
+
+    -- ** AddTagsToResource
+    , module Network.AWS.ElastiCache.AddTagsToResource
+
+    -- ** AuthorizeCacheSecurityGroupIngress
+    , module Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
+
+    -- ** CopySnapshot
+    , module Network.AWS.ElastiCache.CopySnapshot
+
+    -- ** CreateCacheSubnetGroup
+    , module Network.AWS.ElastiCache.CreateCacheSubnetGroup
+
+    -- ** DescribeCacheParameterGroups (Paginated)
+    , module Network.AWS.ElastiCache.DescribeCacheParameterGroups
+
+    -- ** ResetCacheParameterGroup
+    , module Network.AWS.ElastiCache.ResetCacheParameterGroup
+
+    -- ** DescribeSnapshots (Paginated)
+    , module Network.AWS.ElastiCache.DescribeSnapshots
+
+    -- ** DescribeReservedCacheNodesOfferings (Paginated)
+    , module Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
+
+    -- ** DeleteSnapshot
+    , module Network.AWS.ElastiCache.DeleteSnapshot
+
+    -- ** DescribeReplicationGroups (Paginated)
     , module Network.AWS.ElastiCache.DescribeReplicationGroups
+
+    -- ** ModifyCacheSubnetGroup
+    , module Network.AWS.ElastiCache.ModifyCacheSubnetGroup
+
+    -- ** CreateSnapshot
+    , module Network.AWS.ElastiCache.CreateSnapshot
+
+    -- ** DescribeCacheSecurityGroups (Paginated)
+    , module Network.AWS.ElastiCache.DescribeCacheSecurityGroups
+
+    -- ** DeleteCacheParameterGroup
+    , module Network.AWS.ElastiCache.DeleteCacheParameterGroup
+
+    -- ** DescribeReservedCacheNodes (Paginated)
     , module Network.AWS.ElastiCache.DescribeReservedCacheNodes
-    , module Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
-    , module Network.AWS.ElastiCache.DescribeSnapshots
-    , module Network.AWS.ElastiCache.ListTagsForResource
+
+    -- ** DescribeCacheEngineVersions (Paginated)
+    , module Network.AWS.ElastiCache.DescribeCacheEngineVersions
+
+    -- ** ModifyCacheCluster
     , module Network.AWS.ElastiCache.ModifyCacheCluster
-    , module Network.AWS.ElastiCache.ModifyCacheParameterGroup
-    , module Network.AWS.ElastiCache.ModifyCacheSubnetGroup
-    , module Network.AWS.ElastiCache.ModifyReplicationGroup
-    , module Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
-    , module Network.AWS.ElastiCache.RebootCacheCluster
-    , module Network.AWS.ElastiCache.RemoveTagsFromResource
-    , module Network.AWS.ElastiCache.ResetCacheParameterGroup
-    , module Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
-    , module Network.AWS.ElastiCache.Types
-    , module Network.AWS.ElastiCache.Waiters
+
+    -- ** CreateCacheParameterGroup
+    , module Network.AWS.ElastiCache.CreateCacheParameterGroup
+
+    -- ** DeleteCacheSubnetGroup
+    , module Network.AWS.ElastiCache.DeleteCacheSubnetGroup
+
+    -- * Types
+
+    -- ** AZMode
+    , AZMode (..)
+
+    -- ** AutomaticFailoverStatus
+    , AutomaticFailoverStatus (..)
+
+    -- ** PendingAutomaticFailoverStatus
+    , PendingAutomaticFailoverStatus (..)
+
+    -- ** SourceType
+    , SourceType (..)
+
+    -- ** AvailabilityZone
+    , AvailabilityZone
+    , availabilityZone
+    , azName
+
+    -- ** CacheCluster
+    , CacheCluster
+    , cacheCluster
+    , ccCacheNodeType
+    , ccEngineVersion
+    , ccCacheNodes
+    , ccCacheClusterCreateTime
+    , ccAutoMinorVersionUpgrade
+    , ccSecurityGroups
+    , ccNotificationConfiguration
+    , ccSnapshotWindow
+    , ccCacheClusterId
+    , ccConfigurationEndpoint
+    , ccEngine
+    , ccCacheSecurityGroups
+    , ccClientDownloadLandingPage
+    , ccPreferredMaintenanceWindow
+    , ccCacheSubnetGroupName
+    , ccCacheClusterStatus
+    , ccPreferredAvailabilityZone
+    , ccCacheParameterGroup
+    , ccSnapshotRetentionLimit
+    , ccReplicationGroupId
+    , ccPendingModifiedValues
+    , ccNumCacheNodes
+
+    -- ** CacheEngineVersion
+    , CacheEngineVersion
+    , cacheEngineVersion
+    , cevCacheEngineDescription
+    , cevCacheParameterGroupFamily
+    , cevEngineVersion
+    , cevCacheEngineVersionDescription
+    , cevEngine
+
+    -- ** CacheNode
+    , CacheNode
+    , cacheNode
+    , cnSourceCacheNodeId
+    , cnParameterGroupStatus
+    , cnCacheNodeCreateTime
+    , cnCustomerAvailabilityZone
+    , cnCacheNodeId
+    , cnCacheNodeStatus
+    , cnEndpoint
+
+    -- ** CacheNodeTypeSpecificParameter
+    , CacheNodeTypeSpecificParameter
+    , cacheNodeTypeSpecificParameter
+    , cntspCacheNodeTypeSpecificValues
+    , cntspMinimumEngineVersion
+    , cntspSource
+    , cntspIsModifiable
+    , cntspAllowedValues
+    , cntspDataType
+    , cntspParameterName
+    , cntspDescription
+
+    -- ** CacheNodeTypeSpecificValue
+    , CacheNodeTypeSpecificValue
+    , cacheNodeTypeSpecificValue
+    , cntsvCacheNodeType
+    , cntsvValue
+
+    -- ** CacheParameterGroup
+    , CacheParameterGroup
+    , cacheParameterGroup
+    , cpgCacheParameterGroupFamily
+    , cpgCacheParameterGroupName
+    , cpgDescription
+
+    -- ** CacheParameterGroupNameMessage
+    , CacheParameterGroupNameMessage
+    , cacheParameterGroupNameMessage
+    , cpgnmCacheParameterGroupName
+
+    -- ** CacheParameterGroupStatus
+    , CacheParameterGroupStatus
+    , cacheParameterGroupStatus
+    , cpgsCacheParameterGroupName
+    , cpgsCacheNodeIdsToReboot
+    , cpgsParameterApplyStatus
+
+    -- ** CacheSecurityGroup
+    , CacheSecurityGroup
+    , cacheSecurityGroup
+    , csgCacheSecurityGroupName
+    , csgOwnerId
+    , csgEC2SecurityGroups
+    , csgDescription
+
+    -- ** CacheSecurityGroupMembership
+    , CacheSecurityGroupMembership
+    , cacheSecurityGroupMembership
+    , csgmStatus
+    , csgmCacheSecurityGroupName
+
+    -- ** CacheSubnetGroup
+    , CacheSubnetGroup
+    , cacheSubnetGroup
+    , csgVPCId
+    , csgSubnets
+    , csgCacheSubnetGroupName
+    , csgCacheSubnetGroupDescription
+
+    -- ** EC2SecurityGroup
+    , EC2SecurityGroup
+    , ec2SecurityGroup
+    , esgStatus
+    , esgEC2SecurityGroupOwnerId
+    , esgEC2SecurityGroupName
+
+    -- ** Endpoint
+    , Endpoint
+    , endpoint
+    , eAddress
+    , ePort
+
+    -- ** EngineDefaults
+    , EngineDefaults
+    , engineDefaults
+    , edCacheParameterGroupFamily
+    , edCacheNodeTypeSpecificParameters
+    , edParameters
+    , edMarker
+
+    -- ** Event
+    , Event
+    , event
+    , eSourceType
+    , eSourceIdentifier
+    , eDate
+    , eMessage
+
+    -- ** NodeGroup
+    , NodeGroup
+    , nodeGroup
+    , ngStatus
+    , ngPrimaryEndpoint
+    , ngNodeGroupMembers
+    , ngNodeGroupId
+
+    -- ** NodeGroupMember
+    , NodeGroupMember
+    , nodeGroupMember
+    , ngmCacheClusterId
+    , ngmCacheNodeId
+    , ngmPreferredAvailabilityZone
+    , ngmCurrentRole
+    , ngmReadEndpoint
+
+    -- ** NodeSnapshot
+    , NodeSnapshot
+    , nodeSnapshot
+    , nsCacheNodeCreateTime
+    , nsCacheNodeId
+    , nsSnapshotCreateTime
+    , nsCacheSize
+
+    -- ** NotificationConfiguration
+    , NotificationConfiguration
+    , notificationConfiguration
+    , ncTopicStatus
+    , ncTopicARN
+
+    -- ** Parameter
+    , Parameter
+    , parameter
+    , pParameterValue
+    , pMinimumEngineVersion
+    , pSource
+    , pIsModifiable
+    , pAllowedValues
+    , pDataType
+    , pParameterName
+    , pDescription
+
+    -- ** ParameterNameValue
+    , ParameterNameValue
+    , parameterNameValue
+    , pnvParameterValue
+    , pnvParameterName
+
+    -- ** PendingModifiedValues
+    , PendingModifiedValues
+    , pendingModifiedValues
+    , pmvEngineVersion
+    , pmvCacheNodeIdsToRemove
+    , pmvNumCacheNodes
+
+    -- ** RecurringCharge
+    , RecurringCharge
+    , recurringCharge
+    , rcRecurringChargeFrequency
+    , rcRecurringChargeAmount
+
+    -- ** ReplicationGroup
+    , ReplicationGroup
+    , replicationGroup
+    , rgNodeGroups
+    , rgStatus
+    , rgSnapshottingClusterId
+    , rgMemberClusters
+    , rgReplicationGroupId
+    , rgPendingModifiedValues
+    , rgDescription
+    , rgAutomaticFailover
+
+    -- ** ReplicationGroupPendingModifiedValues
+    , ReplicationGroupPendingModifiedValues
+    , replicationGroupPendingModifiedValues
+    , rgpmvPrimaryClusterId
+    , rgpmvAutomaticFailoverStatus
+
+    -- ** ReservedCacheNode
+    , ReservedCacheNode
+    , reservedCacheNode
+    , rcnCacheNodeType
+    , rcnState
+    , rcnProductDescription
+    , rcnStartTime
+    , rcnCacheNodeCount
+    , rcnReservedCacheNodeId
+    , rcnOfferingType
+    , rcnUsagePrice
+    , rcnRecurringCharges
+    , rcnFixedPrice
+    , rcnDuration
+    , rcnReservedCacheNodesOfferingId
+
+    -- ** ReservedCacheNodesOffering
+    , ReservedCacheNodesOffering
+    , reservedCacheNodesOffering
+    , rcnoCacheNodeType
+    , rcnoProductDescription
+    , rcnoOfferingType
+    , rcnoUsagePrice
+    , rcnoRecurringCharges
+    , rcnoFixedPrice
+    , rcnoDuration
+    , rcnoReservedCacheNodesOfferingId
+
+    -- ** SecurityGroupMembership
+    , SecurityGroupMembership
+    , securityGroupMembership
+    , sgmStatus
+    , sgmSecurityGroupId
+
+    -- ** Snapshot
+    , Snapshot
+    , snapshot
+    , sCacheNodeType
+    , sEngineVersion
+    , sCacheClusterCreateTime
+    , sAutoMinorVersionUpgrade
+    , sCacheParameterGroupName
+    , sSnapshotStatus
+    , sSnapshotWindow
+    , sVPCId
+    , sCacheClusterId
+    , sEngine
+    , sPreferredMaintenanceWindow
+    , sTopicARN
+    , sCacheSubnetGroupName
+    , sNodeSnapshots
+    , sPreferredAvailabilityZone
+    , sSnapshotRetentionLimit
+    , sSnapshotName
+    , sSnapshotSource
+    , sNumCacheNodes
+    , sPort
+
+    -- ** Subnet
+    , Subnet
+    , subnet
+    , sSubnetIdentifier
+    , sSubnetAvailabilityZone
+
+    -- ** Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
+
+    -- ** TagListMessage
+    , TagListMessage
+    , tagListMessage
+    , tlmTagList
     ) where
 
-import Network.AWS.ElastiCache.AddTagsToResource
-import Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
-import Network.AWS.ElastiCache.CopySnapshot
-import Network.AWS.ElastiCache.CreateCacheCluster
-import Network.AWS.ElastiCache.CreateCacheParameterGroup
-import Network.AWS.ElastiCache.CreateCacheSecurityGroup
-import Network.AWS.ElastiCache.CreateCacheSubnetGroup
-import Network.AWS.ElastiCache.CreateReplicationGroup
-import Network.AWS.ElastiCache.CreateSnapshot
-import Network.AWS.ElastiCache.DeleteCacheCluster
-import Network.AWS.ElastiCache.DeleteCacheParameterGroup
-import Network.AWS.ElastiCache.DeleteCacheSecurityGroup
-import Network.AWS.ElastiCache.DeleteCacheSubnetGroup
-import Network.AWS.ElastiCache.DeleteReplicationGroup
-import Network.AWS.ElastiCache.DeleteSnapshot
-import Network.AWS.ElastiCache.DescribeCacheClusters
-import Network.AWS.ElastiCache.DescribeCacheEngineVersions
-import Network.AWS.ElastiCache.DescribeCacheParameterGroups
-import Network.AWS.ElastiCache.DescribeCacheParameters
-import Network.AWS.ElastiCache.DescribeCacheSecurityGroups
-import Network.AWS.ElastiCache.DescribeCacheSubnetGroups
-import Network.AWS.ElastiCache.DescribeEngineDefaultParameters
-import Network.AWS.ElastiCache.DescribeEvents
-import Network.AWS.ElastiCache.DescribeReplicationGroups
-import Network.AWS.ElastiCache.DescribeReservedCacheNodes
-import Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
-import Network.AWS.ElastiCache.DescribeSnapshots
-import Network.AWS.ElastiCache.ListTagsForResource
-import Network.AWS.ElastiCache.ModifyCacheCluster
-import Network.AWS.ElastiCache.ModifyCacheParameterGroup
-import Network.AWS.ElastiCache.ModifyCacheSubnetGroup
-import Network.AWS.ElastiCache.ModifyReplicationGroup
-import Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
-import Network.AWS.ElastiCache.RebootCacheCluster
-import Network.AWS.ElastiCache.RemoveTagsFromResource
-import Network.AWS.ElastiCache.ResetCacheParameterGroup
-import Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
-import Network.AWS.ElastiCache.Types
-import Network.AWS.ElastiCache.Waiters
+import           Network.AWS.ElastiCache.AddTagsToResource
+import           Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
+import           Network.AWS.ElastiCache.CopySnapshot
+import           Network.AWS.ElastiCache.CreateCacheCluster
+import           Network.AWS.ElastiCache.CreateCacheParameterGroup
+import           Network.AWS.ElastiCache.CreateCacheSecurityGroup
+import           Network.AWS.ElastiCache.CreateCacheSubnetGroup
+import           Network.AWS.ElastiCache.CreateReplicationGroup
+import           Network.AWS.ElastiCache.CreateSnapshot
+import           Network.AWS.ElastiCache.DeleteCacheCluster
+import           Network.AWS.ElastiCache.DeleteCacheParameterGroup
+import           Network.AWS.ElastiCache.DeleteCacheSecurityGroup
+import           Network.AWS.ElastiCache.DeleteCacheSubnetGroup
+import           Network.AWS.ElastiCache.DeleteReplicationGroup
+import           Network.AWS.ElastiCache.DeleteSnapshot
+import           Network.AWS.ElastiCache.DescribeCacheClusters
+import           Network.AWS.ElastiCache.DescribeCacheEngineVersions
+import           Network.AWS.ElastiCache.DescribeCacheParameterGroups
+import           Network.AWS.ElastiCache.DescribeCacheParameters
+import           Network.AWS.ElastiCache.DescribeCacheSecurityGroups
+import           Network.AWS.ElastiCache.DescribeCacheSubnetGroups
+import           Network.AWS.ElastiCache.DescribeEngineDefaultParameters
+import           Network.AWS.ElastiCache.DescribeEvents
+import           Network.AWS.ElastiCache.DescribeReplicationGroups
+import           Network.AWS.ElastiCache.DescribeReservedCacheNodes
+import           Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
+import           Network.AWS.ElastiCache.DescribeSnapshots
+import           Network.AWS.ElastiCache.ListTagsForResource
+import           Network.AWS.ElastiCache.ModifyCacheCluster
+import           Network.AWS.ElastiCache.ModifyCacheParameterGroup
+import           Network.AWS.ElastiCache.ModifyCacheSubnetGroup
+import           Network.AWS.ElastiCache.ModifyReplicationGroup
+import           Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
+import           Network.AWS.ElastiCache.RebootCacheCluster
+import           Network.AWS.ElastiCache.RemoveTagsFromResource
+import           Network.AWS.ElastiCache.ResetCacheParameterGroup
+import           Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Waiters
+
+{- $errors
+Error matchers are designed for use with the functions provided by
+<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+This allows catching (and rethrowing) service specific errors returned
+by 'ElastiCache'.
+-}
+
+{- $operations
+Some AWS operations return results that are incomplete and require subsequent
+requests in order to obtain the entire result set. The process of sending
+subsequent requests to continue where a previous request left off is called
+pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+1000 objects at a time, and you must send subsequent requests with the
+appropriate Marker in order to retrieve the next page of results.
+
+Operations that have an 'AWSPager' instance can transparently perform subsequent
+requests, correctly setting Markers and other request facets to iterate through
+the entire result set of a truncated API operation. Operations which support
+this have an additional note in the documentation.
+
+Many operations have the ability to filter results on the server side. See the
+individual operation parameters for details.
+-}
+
+{- $waiters
+Waiters poll by repeatedly sending a request until some remote success condition
+configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+determines how many attempts should be made, in addition to delay and retry strategies.
+-}
diff --git a/gen/Network/AWS/ElastiCache/AddTagsToResource.hs b/gen/Network/AWS/ElastiCache/AddTagsToResource.hs
--- a/gen/Network/AWS/ElastiCache/AddTagsToResource.hs
+++ b/gen/Network/AWS/ElastiCache/AddTagsToResource.hs
@@ -1,134 +1,111 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.AddTagsToResource
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /AddTagsToResource/ action adds up to 10 cost allocation tags to the named
--- resource. A /cost allocation tag/ is a key-value pair where the key and value
--- are case-sensitive. Cost allocation tags can be used to categorize and track
--- your AWS costs.
+-- The /AddTagsToResource/ action adds up to 10 cost allocation tags to the
+-- named resource. A /cost allocation tag/ is a key-value pair where the
+-- key and value are case-sensitive. Cost allocation tags can be used to
+-- categorize and track your AWS costs.
 --
 -- When you apply tags to your ElastiCache resources, AWS generates a cost
--- allocation report as a comma-separated value (CSV) file with your usage and
--- costs aggregated by your tags. You can apply tags that represent business
--- categories (such as cost centers, application names, or owners) to organize
--- your costs across multiple services. For more information, see <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Tagging.html Using CostAllocation Tags in Amazon ElastiCache>.
+-- allocation report as a comma-separated value (CSV) file with your usage
+-- and costs aggregated by your tags. You can apply tags that represent
+-- business categories (such as cost centers, application names, or owners)
+-- to organize your costs across multiple services. For more information,
+-- see
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Tagging.html Using Cost Allocation Tags in Amazon ElastiCache>.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_AddTagsToResource.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_AddTagsToResource.html AWS API Reference> for AddTagsToResource.
 module Network.AWS.ElastiCache.AddTagsToResource
     (
-    -- * Request
-      AddTagsToResource
-    -- ** Request constructor
-    , addTagsToResource
-    -- ** Request lenses
+    -- * Creating a Request
+      addTagsToResource
+    , AddTagsToResource
+    -- * Request Lenses
     , attrResourceName
     , attrTags
 
-    -- * Response
-    , AddTagsToResourceResponse
-    -- ** Response constructor
-    , addTagsToResourceResponse
-    -- ** Response lenses
-    , attrrTagList
+    -- * Destructuring the Response
+    , tagListMessage
+    , TagListMessage
+    -- * Response Lenses
+    , tlmTagList
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data AddTagsToResource = AddTagsToResource
-    { _attrResourceName :: Text
-    , _attrTags         :: List "member" Tag
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'AddTagsToResource' constructor.
+-- | Represents the input of an /AddTagsToResource/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'addTagsToResource' smart constructor.
+data AddTagsToResource = AddTagsToResource'
+    { _attrResourceName :: !Text
+    , _attrTags         :: ![Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddTagsToResource' with the minimum fields required to make a request.
 --
--- * 'attrResourceName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'attrTags' @::@ ['Tag']
+-- * 'attrResourceName'
 --
-addTagsToResource :: Text -- ^ 'attrResourceName'
-                  -> AddTagsToResource
-addTagsToResource p1 = AddTagsToResource
-    { _attrResourceName = p1
-    , _attrTags         = mempty
+-- * 'attrTags'
+addTagsToResource
+    :: Text -- ^ 'attrResourceName'
+    -> AddTagsToResource
+addTagsToResource pResourceName_ =
+    AddTagsToResource'
+    { _attrResourceName = pResourceName_
+    , _attrTags = mempty
     }
 
--- | The name of the resource to which the tags are to be added, for example 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
+-- | The name of the resource to which the tags are to be added, for example
+-- 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
 attrResourceName :: Lens' AddTagsToResource Text
-attrResourceName = lens _attrResourceName (\s a -> s { _attrResourceName = a })
+attrResourceName = lens _attrResourceName (\ s a -> s{_attrResourceName = a});
 
 -- | A list of cost allocation tags to be added to this resource. A tag is a
 -- key-value pair. A tag key must be accompanied by a tag value.
 attrTags :: Lens' AddTagsToResource [Tag]
-attrTags = lens _attrTags (\s a -> s { _attrTags = a }) . _List
-
-newtype AddTagsToResourceResponse = AddTagsToResourceResponse
-    { _attrrTagList :: List "member" Tag
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList AddTagsToResourceResponse where
-    type Item AddTagsToResourceResponse = Tag
-
-    fromList = AddTagsToResourceResponse . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _attrrTagList
+attrTags = lens _attrTags (\ s a -> s{_attrTags = a}) . _Coerce;
 
--- | 'AddTagsToResourceResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'attrrTagList' @::@ ['Tag']
---
-addTagsToResourceResponse :: AddTagsToResourceResponse
-addTagsToResourceResponse = AddTagsToResourceResponse
-    { _attrrTagList = mempty
-    }
+instance AWSRequest AddTagsToResource where
+        type Sv AddTagsToResource = ElastiCache
+        type Rs AddTagsToResource = TagListMessage
+        request = postQuery
+        response
+          = receiveXMLWrapper "AddTagsToResourceResult"
+              (\ s h x -> parseXML x)
 
--- | A list of cost allocation tags as key-value pairs.
-attrrTagList :: Lens' AddTagsToResourceResponse [Tag]
-attrrTagList = lens _attrrTagList (\s a -> s { _attrrTagList = a }) . _List
+instance ToHeaders AddTagsToResource where
+        toHeaders = const mempty
 
 instance ToPath AddTagsToResource where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery AddTagsToResource where
-    toQuery AddTagsToResource{..} = mconcat
-        [ "ResourceName" =? _attrResourceName
-        , "Tags"         =? _attrTags
-        ]
-
-instance ToHeaders AddTagsToResource
-
-instance AWSRequest AddTagsToResource where
-    type Sv AddTagsToResource = ElastiCache
-    type Rs AddTagsToResource = AddTagsToResourceResponse
-
-    request  = post "AddTagsToResource"
-    response = xmlResponse
-
-instance FromXML AddTagsToResourceResponse where
-    parseXML = withElement "AddTagsToResourceResult" $ \x -> AddTagsToResourceResponse
-        <$> x .@? "TagList" .!@ mempty
+        toQuery AddTagsToResource'{..}
+          = mconcat
+              ["Action" =: ("AddTagsToResource" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "ResourceName" =: _attrResourceName,
+               "Tags" =: toQueryList "Tag" _attrTags]
diff --git a/gen/Network/AWS/ElastiCache/AuthorizeCacheSecurityGroupIngress.hs b/gen/Network/AWS/ElastiCache/AuthorizeCacheSecurityGroupIngress.hs
--- a/gen/Network/AWS/ElastiCache/AuthorizeCacheSecurityGroupIngress.hs
+++ b/gen/Network/AWS/ElastiCache/AuthorizeCacheSecurityGroupIngress.hs
@@ -1,146 +1,162 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /AuthorizeCacheSecurityGroupIngress/ action allows network ingress to a
--- cache security group. Applications using ElastiCache must be running on
--- Amazon EC2, and Amazon EC2 security groups are used as the authorization
--- mechanism.
+-- The /AuthorizeCacheSecurityGroupIngress/ action allows network ingress
+-- to a cache security group. Applications using ElastiCache must be
+-- running on Amazon EC2, and Amazon EC2 security groups are used as the
+-- authorization mechanism.
 --
--- You cannot authorize ingress from an Amazon EC2 security group in one region
--- to an ElastiCache cluster in another region.
+-- You cannot authorize ingress from an Amazon EC2 security group in one
+-- region to an ElastiCache cluster in another region.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_AuthorizeCacheSecurityGroupIngress.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_AuthorizeCacheSecurityGroupIngress.html AWS API Reference> for AuthorizeCacheSecurityGroupIngress.
 module Network.AWS.ElastiCache.AuthorizeCacheSecurityGroupIngress
     (
-    -- * Request
-      AuthorizeCacheSecurityGroupIngress
-    -- ** Request constructor
-    , authorizeCacheSecurityGroupIngress
-    -- ** Request lenses
+    -- * Creating a Request
+      authorizeCacheSecurityGroupIngress
+    , AuthorizeCacheSecurityGroupIngress
+    -- * Request Lenses
     , acsgiCacheSecurityGroupName
     , acsgiEC2SecurityGroupName
     , acsgiEC2SecurityGroupOwnerId
 
-    -- * Response
-    , AuthorizeCacheSecurityGroupIngressResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , authorizeCacheSecurityGroupIngressResponse
-    -- ** Response lenses
-    , acsgirCacheSecurityGroup
+    , AuthorizeCacheSecurityGroupIngressResponse
+    -- * Response Lenses
+    , acsgirsCacheSecurityGroup
+    , acsgirsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data AuthorizeCacheSecurityGroupIngress = AuthorizeCacheSecurityGroupIngress
-    { _acsgiCacheSecurityGroupName  :: Text
-    , _acsgiEC2SecurityGroupName    :: Text
-    , _acsgiEC2SecurityGroupOwnerId :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'AuthorizeCacheSecurityGroupIngress' constructor.
+-- | Represents the input of an /AuthorizeCacheSecurityGroupIngress/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'authorizeCacheSecurityGroupIngress' smart constructor.
+data AuthorizeCacheSecurityGroupIngress = AuthorizeCacheSecurityGroupIngress'
+    { _acsgiCacheSecurityGroupName  :: !Text
+    , _acsgiEC2SecurityGroupName    :: !Text
+    , _acsgiEC2SecurityGroupOwnerId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AuthorizeCacheSecurityGroupIngress' with the minimum fields required to make a request.
 --
--- * 'acsgiCacheSecurityGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'acsgiEC2SecurityGroupName' @::@ 'Text'
+-- * 'acsgiCacheSecurityGroupName'
 --
--- * 'acsgiEC2SecurityGroupOwnerId' @::@ 'Text'
+-- * 'acsgiEC2SecurityGroupName'
 --
-authorizeCacheSecurityGroupIngress :: Text -- ^ 'acsgiCacheSecurityGroupName'
-                                   -> Text -- ^ 'acsgiEC2SecurityGroupName'
-                                   -> Text -- ^ 'acsgiEC2SecurityGroupOwnerId'
-                                   -> AuthorizeCacheSecurityGroupIngress
-authorizeCacheSecurityGroupIngress p1 p2 p3 = AuthorizeCacheSecurityGroupIngress
-    { _acsgiCacheSecurityGroupName  = p1
-    , _acsgiEC2SecurityGroupName    = p2
-    , _acsgiEC2SecurityGroupOwnerId = p3
+-- * 'acsgiEC2SecurityGroupOwnerId'
+authorizeCacheSecurityGroupIngress
+    :: Text -- ^ 'acsgiCacheSecurityGroupName'
+    -> Text -- ^ 'acsgiEC2SecurityGroupName'
+    -> Text -- ^ 'acsgiEC2SecurityGroupOwnerId'
+    -> AuthorizeCacheSecurityGroupIngress
+authorizeCacheSecurityGroupIngress pCacheSecurityGroupName_ pEC2SecurityGroupName_ pEC2SecurityGroupOwnerId_ =
+    AuthorizeCacheSecurityGroupIngress'
+    { _acsgiCacheSecurityGroupName = pCacheSecurityGroupName_
+    , _acsgiEC2SecurityGroupName = pEC2SecurityGroupName_
+    , _acsgiEC2SecurityGroupOwnerId = pEC2SecurityGroupOwnerId_
     }
 
 -- | The cache security group which will allow network ingress.
 acsgiCacheSecurityGroupName :: Lens' AuthorizeCacheSecurityGroupIngress Text
-acsgiCacheSecurityGroupName =
-    lens _acsgiCacheSecurityGroupName
-        (\s a -> s { _acsgiCacheSecurityGroupName = a })
+acsgiCacheSecurityGroupName = lens _acsgiCacheSecurityGroupName (\ s a -> s{_acsgiCacheSecurityGroupName = a});
 
 -- | The Amazon EC2 security group to be authorized for ingress to the cache
 -- security group.
 acsgiEC2SecurityGroupName :: Lens' AuthorizeCacheSecurityGroupIngress Text
-acsgiEC2SecurityGroupName =
-    lens _acsgiEC2SecurityGroupName
-        (\s a -> s { _acsgiEC2SecurityGroupName = a })
+acsgiEC2SecurityGroupName = lens _acsgiEC2SecurityGroupName (\ s a -> s{_acsgiEC2SecurityGroupName = a});
 
--- | The AWS account number of the Amazon EC2 security group owner. Note that this
--- is not the same thing as an AWS access key ID - you must provide a valid AWS
--- account number for this parameter.
+-- | The AWS account number of the Amazon EC2 security group owner. Note that
+-- this is not the same thing as an AWS access key ID - you must provide a
+-- valid AWS account number for this parameter.
 acsgiEC2SecurityGroupOwnerId :: Lens' AuthorizeCacheSecurityGroupIngress Text
-acsgiEC2SecurityGroupOwnerId =
-    lens _acsgiEC2SecurityGroupOwnerId
-        (\s a -> s { _acsgiEC2SecurityGroupOwnerId = a })
-
-newtype AuthorizeCacheSecurityGroupIngressResponse = AuthorizeCacheSecurityGroupIngressResponse
-    { _acsgirCacheSecurityGroup :: Maybe CacheSecurityGroup
-    } deriving (Eq, Read, Show)
+acsgiEC2SecurityGroupOwnerId = lens _acsgiEC2SecurityGroupOwnerId (\ s a -> s{_acsgiEC2SecurityGroupOwnerId = a});
 
--- | 'AuthorizeCacheSecurityGroupIngressResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'acsgirCacheSecurityGroup' @::@ 'Maybe' 'CacheSecurityGroup'
---
-authorizeCacheSecurityGroupIngressResponse :: AuthorizeCacheSecurityGroupIngressResponse
-authorizeCacheSecurityGroupIngressResponse = AuthorizeCacheSecurityGroupIngressResponse
-    { _acsgirCacheSecurityGroup = Nothing
-    }
+instance AWSRequest
+         AuthorizeCacheSecurityGroupIngress where
+        type Sv AuthorizeCacheSecurityGroupIngress =
+             ElastiCache
+        type Rs AuthorizeCacheSecurityGroupIngress =
+             AuthorizeCacheSecurityGroupIngressResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "AuthorizeCacheSecurityGroupIngressResult"
+              (\ s h x ->
+                 AuthorizeCacheSecurityGroupIngressResponse' <$>
+                   (x .@? "CacheSecurityGroup") <*> (pure (fromEnum s)))
 
-acsgirCacheSecurityGroup :: Lens' AuthorizeCacheSecurityGroupIngressResponse (Maybe CacheSecurityGroup)
-acsgirCacheSecurityGroup =
-    lens _acsgirCacheSecurityGroup
-        (\s a -> s { _acsgirCacheSecurityGroup = a })
+instance ToHeaders AuthorizeCacheSecurityGroupIngress
+         where
+        toHeaders = const mempty
 
-instance ToPath AuthorizeCacheSecurityGroupIngress where
-    toPath = const "/"
+instance ToPath AuthorizeCacheSecurityGroupIngress
+         where
+        toPath = const "/"
 
-instance ToQuery AuthorizeCacheSecurityGroupIngress where
-    toQuery AuthorizeCacheSecurityGroupIngress{..} = mconcat
-        [ "CacheSecurityGroupName"  =? _acsgiCacheSecurityGroupName
-        , "EC2SecurityGroupName"    =? _acsgiEC2SecurityGroupName
-        , "EC2SecurityGroupOwnerId" =? _acsgiEC2SecurityGroupOwnerId
-        ]
+instance ToQuery AuthorizeCacheSecurityGroupIngress
+         where
+        toQuery AuthorizeCacheSecurityGroupIngress'{..}
+          = mconcat
+              ["Action" =:
+                 ("AuthorizeCacheSecurityGroupIngress" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSecurityGroupName" =:
+                 _acsgiCacheSecurityGroupName,
+               "EC2SecurityGroupName" =: _acsgiEC2SecurityGroupName,
+               "EC2SecurityGroupOwnerId" =:
+                 _acsgiEC2SecurityGroupOwnerId]
 
-instance ToHeaders AuthorizeCacheSecurityGroupIngress
+-- | /See:/ 'authorizeCacheSecurityGroupIngressResponse' smart constructor.
+data AuthorizeCacheSecurityGroupIngressResponse = AuthorizeCacheSecurityGroupIngressResponse'
+    { _acsgirsCacheSecurityGroup :: !(Maybe CacheSecurityGroup)
+    , _acsgirsStatus             :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest AuthorizeCacheSecurityGroupIngress where
-    type Sv AuthorizeCacheSecurityGroupIngress = ElastiCache
-    type Rs AuthorizeCacheSecurityGroupIngress = AuthorizeCacheSecurityGroupIngressResponse
+-- | Creates a value of 'AuthorizeCacheSecurityGroupIngressResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'acsgirsCacheSecurityGroup'
+--
+-- * 'acsgirsStatus'
+authorizeCacheSecurityGroupIngressResponse
+    :: Int -- ^ 'acsgirsStatus'
+    -> AuthorizeCacheSecurityGroupIngressResponse
+authorizeCacheSecurityGroupIngressResponse pStatus_ =
+    AuthorizeCacheSecurityGroupIngressResponse'
+    { _acsgirsCacheSecurityGroup = Nothing
+    , _acsgirsStatus = pStatus_
+    }
 
-    request  = post "AuthorizeCacheSecurityGroupIngress"
-    response = xmlResponse
+-- | Undocumented member.
+acsgirsCacheSecurityGroup :: Lens' AuthorizeCacheSecurityGroupIngressResponse (Maybe CacheSecurityGroup)
+acsgirsCacheSecurityGroup = lens _acsgirsCacheSecurityGroup (\ s a -> s{_acsgirsCacheSecurityGroup = a});
 
-instance FromXML AuthorizeCacheSecurityGroupIngressResponse where
-    parseXML = withElement "AuthorizeCacheSecurityGroupIngressResult" $ \x -> AuthorizeCacheSecurityGroupIngressResponse
-        <$> x .@? "CacheSecurityGroup"
+-- | The response status code.
+acsgirsStatus :: Lens' AuthorizeCacheSecurityGroupIngressResponse Int
+acsgirsStatus = lens _acsgirsStatus (\ s a -> s{_acsgirsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CopySnapshot.hs b/gen/Network/AWS/ElastiCache/CopySnapshot.hs
--- a/gen/Network/AWS/ElastiCache/CopySnapshot.hs
+++ b/gen/Network/AWS/ElastiCache/CopySnapshot.hs
@@ -1,120 +1,132 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CopySnapshot
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CopySnapshot/ action makes a copy of an existing snapshot.
+-- The /CopySnapshot/ action makes a copy of an existing snapshot.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CopySnapshot.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CopySnapshot.html AWS API Reference> for CopySnapshot.
 module Network.AWS.ElastiCache.CopySnapshot
     (
-    -- * Request
-      CopySnapshot
-    -- ** Request constructor
-    , copySnapshot
-    -- ** Request lenses
+    -- * Creating a Request
+      copySnapshot
+    , CopySnapshot
+    -- * Request Lenses
     , csSourceSnapshotName
     , csTargetSnapshotName
 
-    -- * Response
-    , CopySnapshotResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , copySnapshotResponse
-    -- ** Response lenses
-    , csrSnapshot
+    , CopySnapshotResponse
+    -- * Response Lenses
+    , csrsSnapshot
+    , csrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CopySnapshot = CopySnapshot
-    { _csSourceSnapshotName :: Text
-    , _csTargetSnapshotName :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CopySnapshot' constructor.
+-- | Represents the input of a /CopySnapshotMessage/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'copySnapshot' smart constructor.
+data CopySnapshot = CopySnapshot'
+    { _csSourceSnapshotName :: !Text
+    , _csTargetSnapshotName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CopySnapshot' with the minimum fields required to make a request.
 --
--- * 'csSourceSnapshotName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'csTargetSnapshotName' @::@ 'Text'
+-- * 'csSourceSnapshotName'
 --
-copySnapshot :: Text -- ^ 'csSourceSnapshotName'
-             -> Text -- ^ 'csTargetSnapshotName'
-             -> CopySnapshot
-copySnapshot p1 p2 = CopySnapshot
-    { _csSourceSnapshotName = p1
-    , _csTargetSnapshotName = p2
+-- * 'csTargetSnapshotName'
+copySnapshot
+    :: Text -- ^ 'csSourceSnapshotName'
+    -> Text -- ^ 'csTargetSnapshotName'
+    -> CopySnapshot
+copySnapshot pSourceSnapshotName_ pTargetSnapshotName_ =
+    CopySnapshot'
+    { _csSourceSnapshotName = pSourceSnapshotName_
+    , _csTargetSnapshotName = pTargetSnapshotName_
     }
 
 -- | The name of an existing snapshot from which to copy.
 csSourceSnapshotName :: Lens' CopySnapshot Text
-csSourceSnapshotName =
-    lens _csSourceSnapshotName (\s a -> s { _csSourceSnapshotName = a })
+csSourceSnapshotName = lens _csSourceSnapshotName (\ s a -> s{_csSourceSnapshotName = a});
 
 -- | A name for the copied snapshot.
 csTargetSnapshotName :: Lens' CopySnapshot Text
-csTargetSnapshotName =
-    lens _csTargetSnapshotName (\s a -> s { _csTargetSnapshotName = a })
-
-newtype CopySnapshotResponse = CopySnapshotResponse
-    { _csrSnapshot :: Maybe Snapshot
-    } deriving (Eq, Read, Show)
+csTargetSnapshotName = lens _csTargetSnapshotName (\ s a -> s{_csTargetSnapshotName = a});
 
--- | 'CopySnapshotResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csrSnapshot' @::@ 'Maybe' 'Snapshot'
---
-copySnapshotResponse :: CopySnapshotResponse
-copySnapshotResponse = CopySnapshotResponse
-    { _csrSnapshot = Nothing
-    }
+instance AWSRequest CopySnapshot where
+        type Sv CopySnapshot = ElastiCache
+        type Rs CopySnapshot = CopySnapshotResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CopySnapshotResult"
+              (\ s h x ->
+                 CopySnapshotResponse' <$>
+                   (x .@? "Snapshot") <*> (pure (fromEnum s)))
 
-csrSnapshot :: Lens' CopySnapshotResponse (Maybe Snapshot)
-csrSnapshot = lens _csrSnapshot (\s a -> s { _csrSnapshot = a })
+instance ToHeaders CopySnapshot where
+        toHeaders = const mempty
 
 instance ToPath CopySnapshot where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CopySnapshot where
-    toQuery CopySnapshot{..} = mconcat
-        [ "SourceSnapshotName" =? _csSourceSnapshotName
-        , "TargetSnapshotName" =? _csTargetSnapshotName
-        ]
+        toQuery CopySnapshot'{..}
+          = mconcat
+              ["Action" =: ("CopySnapshot" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "SourceSnapshotName" =: _csSourceSnapshotName,
+               "TargetSnapshotName" =: _csTargetSnapshotName]
 
-instance ToHeaders CopySnapshot
+-- | /See:/ 'copySnapshotResponse' smart constructor.
+data CopySnapshotResponse = CopySnapshotResponse'
+    { _csrsSnapshot :: !(Maybe Snapshot)
+    , _csrsStatus   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CopySnapshot where
-    type Sv CopySnapshot = ElastiCache
-    type Rs CopySnapshot = CopySnapshotResponse
+-- | Creates a value of 'CopySnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csrsSnapshot'
+--
+-- * 'csrsStatus'
+copySnapshotResponse
+    :: Int -- ^ 'csrsStatus'
+    -> CopySnapshotResponse
+copySnapshotResponse pStatus_ =
+    CopySnapshotResponse'
+    { _csrsSnapshot = Nothing
+    , _csrsStatus = pStatus_
+    }
 
-    request  = post "CopySnapshot"
-    response = xmlResponse
+-- | Undocumented member.
+csrsSnapshot :: Lens' CopySnapshotResponse (Maybe Snapshot)
+csrsSnapshot = lens _csrsSnapshot (\ s a -> s{_csrsSnapshot = a});
 
-instance FromXML CopySnapshotResponse where
-    parseXML = withElement "CopySnapshotResult" $ \x -> CopySnapshotResponse
-        <$> x .@? "Snapshot"
+-- | The response status code.
+csrsStatus :: Lens' CopySnapshotResponse Int
+csrsStatus = lens _csrsStatus (\ s a -> s{_csrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateCacheCluster.hs b/gen/Network/AWS/ElastiCache/CreateCacheCluster.hs
--- a/gen/Network/AWS/ElastiCache/CreateCacheCluster.hs
+++ b/gen/Network/AWS/ElastiCache/CreateCacheCluster.hs
@@ -1,457 +1,508 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateCacheCluster
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateCacheCluster/ action creates a cache cluster. All nodes in the cache
--- cluster run the same protocol-compliant cache engine software, either
--- Memcached or Redis.
+-- The /CreateCacheCluster/ action creates a cache cluster. All nodes in
+-- the cache cluster run the same protocol-compliant cache engine software,
+-- either Memcached or Redis.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheCluster.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheCluster.html AWS API Reference> for CreateCacheCluster.
 module Network.AWS.ElastiCache.CreateCacheCluster
     (
-    -- * Request
-      CreateCacheCluster
-    -- ** Request constructor
-    , createCacheCluster
-    -- ** Request lenses
-    , cccAZMode
-    , cccAutoMinorVersionUpgrade
-    , cccCacheClusterId
+    -- * Creating a Request
+      createCacheCluster
+    , CreateCacheCluster
+    -- * Request Lenses
     , cccCacheNodeType
+    , cccEngineVersion
+    , cccSecurityGroupIds
+    , cccAutoMinorVersionUpgrade
+    , cccSnapshotARNs
     , cccCacheParameterGroupName
-    , cccCacheSecurityGroupNames
-    , cccCacheSubnetGroupName
+    , cccSnapshotWindow
     , cccEngine
-    , cccEngineVersion
-    , cccNotificationTopicArn
-    , cccNumCacheNodes
-    , cccPort
-    , cccPreferredAvailabilityZone
     , cccPreferredAvailabilityZones
     , cccPreferredMaintenanceWindow
-    , cccReplicationGroupId
-    , cccSecurityGroupIds
-    , cccSnapshotArns
-    , cccSnapshotName
+    , cccCacheSubnetGroupName
+    , cccPreferredAvailabilityZone
     , cccSnapshotRetentionLimit
-    , cccSnapshotWindow
+    , cccAZMode
+    , cccSnapshotName
+    , cccReplicationGroupId
+    , cccNotificationTopicARN
     , cccTags
+    , cccNumCacheNodes
+    , cccCacheSecurityGroupNames
+    , cccPort
+    , cccCacheClusterId
 
-    -- * Response
-    , CreateCacheClusterResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createCacheClusterResponse
-    -- ** Response lenses
-    , cccrCacheCluster
+    , CreateCacheClusterResponse
+    -- * Response Lenses
+    , cccrsCacheCluster
+    , cccrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateCacheCluster = CreateCacheCluster
-    { _cccAZMode                     :: Maybe AZMode
-    , _cccAutoMinorVersionUpgrade    :: Maybe Bool
-    , _cccCacheClusterId             :: Text
-    , _cccCacheNodeType              :: Maybe Text
-    , _cccCacheParameterGroupName    :: Maybe Text
-    , _cccCacheSecurityGroupNames    :: List "member" Text
-    , _cccCacheSubnetGroupName       :: Maybe Text
-    , _cccEngine                     :: Maybe Text
-    , _cccEngineVersion              :: Maybe Text
-    , _cccNotificationTopicArn       :: Maybe Text
-    , _cccNumCacheNodes              :: Maybe Int
-    , _cccPort                       :: Maybe Int
-    , _cccPreferredAvailabilityZone  :: Maybe Text
-    , _cccPreferredAvailabilityZones :: List "member" Text
-    , _cccPreferredMaintenanceWindow :: Maybe Text
-    , _cccReplicationGroupId         :: Maybe Text
-    , _cccSecurityGroupIds           :: List "member" Text
-    , _cccSnapshotArns               :: List "member" Text
-    , _cccSnapshotName               :: Maybe Text
-    , _cccSnapshotRetentionLimit     :: Maybe Int
-    , _cccSnapshotWindow             :: Maybe Text
-    , _cccTags                       :: List "member" Tag
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateCacheCluster' constructor.
+-- | Represents the input of a /CreateCacheCluster/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createCacheCluster' smart constructor.
+data CreateCacheCluster = CreateCacheCluster'
+    { _cccCacheNodeType              :: !(Maybe Text)
+    , _cccEngineVersion              :: !(Maybe Text)
+    , _cccSecurityGroupIds           :: !(Maybe [Text])
+    , _cccAutoMinorVersionUpgrade    :: !(Maybe Bool)
+    , _cccSnapshotARNs               :: !(Maybe [Text])
+    , _cccCacheParameterGroupName    :: !(Maybe Text)
+    , _cccSnapshotWindow             :: !(Maybe Text)
+    , _cccEngine                     :: !(Maybe Text)
+    , _cccPreferredAvailabilityZones :: !(Maybe [Text])
+    , _cccPreferredMaintenanceWindow :: !(Maybe Text)
+    , _cccCacheSubnetGroupName       :: !(Maybe Text)
+    , _cccPreferredAvailabilityZone  :: !(Maybe Text)
+    , _cccSnapshotRetentionLimit     :: !(Maybe Int)
+    , _cccAZMode                     :: !(Maybe AZMode)
+    , _cccSnapshotName               :: !(Maybe Text)
+    , _cccReplicationGroupId         :: !(Maybe Text)
+    , _cccNotificationTopicARN       :: !(Maybe Text)
+    , _cccTags                       :: !(Maybe [Tag])
+    , _cccNumCacheNodes              :: !(Maybe Int)
+    , _cccCacheSecurityGroupNames    :: !(Maybe [Text])
+    , _cccPort                       :: !(Maybe Int)
+    , _cccCacheClusterId             :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCacheCluster' with the minimum fields required to make a request.
 --
--- * 'cccAZMode' @::@ 'Maybe' 'AZMode'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'cccAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
+-- * 'cccCacheNodeType'
 --
--- * 'cccCacheClusterId' @::@ 'Text'
+-- * 'cccEngineVersion'
 --
--- * 'cccCacheNodeType' @::@ 'Maybe' 'Text'
+-- * 'cccSecurityGroupIds'
 --
--- * 'cccCacheParameterGroupName' @::@ 'Maybe' 'Text'
+-- * 'cccAutoMinorVersionUpgrade'
 --
--- * 'cccCacheSecurityGroupNames' @::@ ['Text']
+-- * 'cccSnapshotARNs'
 --
--- * 'cccCacheSubnetGroupName' @::@ 'Maybe' 'Text'
+-- * 'cccCacheParameterGroupName'
 --
--- * 'cccEngine' @::@ 'Maybe' 'Text'
+-- * 'cccSnapshotWindow'
 --
--- * 'cccEngineVersion' @::@ 'Maybe' 'Text'
+-- * 'cccEngine'
 --
--- * 'cccNotificationTopicArn' @::@ 'Maybe' 'Text'
+-- * 'cccPreferredAvailabilityZones'
 --
--- * 'cccNumCacheNodes' @::@ 'Maybe' 'Int'
+-- * 'cccPreferredMaintenanceWindow'
 --
--- * 'cccPort' @::@ 'Maybe' 'Int'
+-- * 'cccCacheSubnetGroupName'
 --
--- * 'cccPreferredAvailabilityZone' @::@ 'Maybe' 'Text'
+-- * 'cccPreferredAvailabilityZone'
 --
--- * 'cccPreferredAvailabilityZones' @::@ ['Text']
+-- * 'cccSnapshotRetentionLimit'
 --
--- * 'cccPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+-- * 'cccAZMode'
 --
--- * 'cccReplicationGroupId' @::@ 'Maybe' 'Text'
+-- * 'cccSnapshotName'
 --
--- * 'cccSecurityGroupIds' @::@ ['Text']
+-- * 'cccReplicationGroupId'
 --
--- * 'cccSnapshotArns' @::@ ['Text']
+-- * 'cccNotificationTopicARN'
 --
--- * 'cccSnapshotName' @::@ 'Maybe' 'Text'
+-- * 'cccTags'
 --
--- * 'cccSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
+-- * 'cccNumCacheNodes'
 --
--- * 'cccSnapshotWindow' @::@ 'Maybe' 'Text'
+-- * 'cccCacheSecurityGroupNames'
 --
--- * 'cccTags' @::@ ['Tag']
+-- * 'cccPort'
 --
-createCacheCluster :: Text -- ^ 'cccCacheClusterId'
-                   -> CreateCacheCluster
-createCacheCluster p1 = CreateCacheCluster
-    { _cccCacheClusterId             = p1
-    , _cccReplicationGroupId         = Nothing
-    , _cccAZMode                     = Nothing
-    , _cccPreferredAvailabilityZone  = Nothing
-    , _cccPreferredAvailabilityZones = mempty
-    , _cccNumCacheNodes              = Nothing
-    , _cccCacheNodeType              = Nothing
-    , _cccEngine                     = Nothing
-    , _cccEngineVersion              = Nothing
-    , _cccCacheParameterGroupName    = Nothing
-    , _cccCacheSubnetGroupName       = Nothing
-    , _cccCacheSecurityGroupNames    = mempty
-    , _cccSecurityGroupIds           = mempty
-    , _cccTags                       = mempty
-    , _cccSnapshotArns               = mempty
-    , _cccSnapshotName               = Nothing
+-- * 'cccCacheClusterId'
+createCacheCluster
+    :: Text -- ^ 'cccCacheClusterId'
+    -> CreateCacheCluster
+createCacheCluster pCacheClusterId_ =
+    CreateCacheCluster'
+    { _cccCacheNodeType = Nothing
+    , _cccEngineVersion = Nothing
+    , _cccSecurityGroupIds = Nothing
+    , _cccAutoMinorVersionUpgrade = Nothing
+    , _cccSnapshotARNs = Nothing
+    , _cccCacheParameterGroupName = Nothing
+    , _cccSnapshotWindow = Nothing
+    , _cccEngine = Nothing
+    , _cccPreferredAvailabilityZones = Nothing
     , _cccPreferredMaintenanceWindow = Nothing
-    , _cccPort                       = Nothing
-    , _cccNotificationTopicArn       = Nothing
-    , _cccAutoMinorVersionUpgrade    = Nothing
-    , _cccSnapshotRetentionLimit     = Nothing
-    , _cccSnapshotWindow             = Nothing
+    , _cccCacheSubnetGroupName = Nothing
+    , _cccPreferredAvailabilityZone = Nothing
+    , _cccSnapshotRetentionLimit = Nothing
+    , _cccAZMode = Nothing
+    , _cccSnapshotName = Nothing
+    , _cccReplicationGroupId = Nothing
+    , _cccNotificationTopicARN = Nothing
+    , _cccTags = Nothing
+    , _cccNumCacheNodes = Nothing
+    , _cccCacheSecurityGroupNames = Nothing
+    , _cccPort = Nothing
+    , _cccCacheClusterId = pCacheClusterId_
     }
 
--- | Specifies whether the nodes in this Memcached node group are created in a
--- single Availability Zone or created across multiple Availability Zones in the
--- cluster's region.
---
--- This parameter is only supported for Memcached cache clusters.
---
--- If the 'AZMode' and 'PreferredAvailabilityZones' are not specified, ElastiCache
--- assumes 'single-az' mode.
-cccAZMode :: Lens' CreateCacheCluster (Maybe AZMode)
-cccAZMode = lens _cccAZMode (\s a -> s { _cccAZMode = a })
-
--- | This parameter is currently disabled.
-cccAutoMinorVersionUpgrade :: Lens' CreateCacheCluster (Maybe Bool)
-cccAutoMinorVersionUpgrade =
-    lens _cccAutoMinorVersionUpgrade
-        (\s a -> s { _cccAutoMinorVersionUpgrade = a })
-
--- | The node group identifier. This parameter is stored as a lowercase string.
---
--- Constraints:
---
--- A name must contain from 1 to 20 alphanumeric characters or hyphens. The
--- first character must be a letter. A name cannot end with a hyphen or contain
--- two consecutive hyphens.
-cccCacheClusterId :: Lens' CreateCacheCluster Text
-cccCacheClusterId =
-    lens _cccCacheClusterId (\s a -> s { _cccCacheClusterId = a })
-
 -- | The compute and memory capacity of the nodes in the node group.
 --
 -- Valid node types are as follows:
 --
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
 --
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
 cccCacheNodeType :: Lens' CreateCacheCluster (Maybe Text)
-cccCacheNodeType = lens _cccCacheNodeType (\s a -> s { _cccCacheNodeType = a })
+cccCacheNodeType = lens _cccCacheNodeType (\ s a -> s{_cccCacheNodeType = a});
 
--- | The name of the parameter group to associate with this cache cluster. If this
--- argument is omitted, the default parameter group for the specified engine is
--- used.
-cccCacheParameterGroupName :: Lens' CreateCacheCluster (Maybe Text)
-cccCacheParameterGroupName =
-    lens _cccCacheParameterGroupName
-        (\s a -> s { _cccCacheParameterGroupName = a })
+-- | The version number of the cache engine to be used for this cache
+-- cluster. To view the supported cache engine versions, use the
+-- /DescribeCacheEngineVersions/ action.
+cccEngineVersion :: Lens' CreateCacheCluster (Maybe Text)
+cccEngineVersion = lens _cccEngineVersion (\ s a -> s{_cccEngineVersion = a});
 
--- | A list of security group names to associate with this cache cluster.
+-- | One or more VPC security groups associated with the cache cluster.
 --
--- Use this parameter only when you are creating a cache cluster outside of an
+-- Use this parameter only when you are creating a cache cluster in an
 -- Amazon Virtual Private Cloud (VPC).
-cccCacheSecurityGroupNames :: Lens' CreateCacheCluster [Text]
-cccCacheSecurityGroupNames =
-    lens _cccCacheSecurityGroupNames
-        (\s a -> s { _cccCacheSecurityGroupNames = a })
-            . _List
+cccSecurityGroupIds :: Lens' CreateCacheCluster [Text]
+cccSecurityGroupIds = lens _cccSecurityGroupIds (\ s a -> s{_cccSecurityGroupIds = a}) . _Default . _Coerce;
 
--- | The name of the subnet group to be used for the cache cluster.
---
--- Use this parameter only when you are creating a cache cluster in an Amazon
--- Virtual Private Cloud (VPC).
-cccCacheSubnetGroupName :: Lens' CreateCacheCluster (Maybe Text)
-cccCacheSubnetGroupName =
-    lens _cccCacheSubnetGroupName (\s a -> s { _cccCacheSubnetGroupName = a })
+-- | This parameter is currently disabled.
+cccAutoMinorVersionUpgrade :: Lens' CreateCacheCluster (Maybe Bool)
+cccAutoMinorVersionUpgrade = lens _cccAutoMinorVersionUpgrade (\ s a -> s{_cccAutoMinorVersionUpgrade = a});
 
--- | The name of the cache engine to be used for this cache cluster.
+-- | A single-element string list containing an Amazon Resource Name (ARN)
+-- that uniquely identifies a Redis RDB snapshot file stored in Amazon S3.
+-- The snapshot file will be used to populate the node group. The Amazon S3
+-- object name in the ARN cannot contain any commas.
 --
--- Valid values for this parameter are:
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
 --
--- 'memcached' | 'redis'
-cccEngine :: Lens' CreateCacheCluster (Maybe Text)
-cccEngine = lens _cccEngine (\s a -> s { _cccEngine = a })
+-- Example of an Amazon S3 ARN: 'arn:aws:s3:::my_bucket\/snapshot1.rdb'
+cccSnapshotARNs :: Lens' CreateCacheCluster [Text]
+cccSnapshotARNs = lens _cccSnapshotARNs (\ s a -> s{_cccSnapshotARNs = a}) . _Default . _Coerce;
 
--- | The version number of the cache engine to be used for this cache cluster. To
--- view the supported cache engine versions, use the /DescribeCacheEngineVersions/
--- action.
-cccEngineVersion :: Lens' CreateCacheCluster (Maybe Text)
-cccEngineVersion = lens _cccEngineVersion (\s a -> s { _cccEngineVersion = a })
+-- | The name of the parameter group to associate with this cache cluster. If
+-- this argument is omitted, the default parameter group for the specified
+-- engine is used.
+cccCacheParameterGroupName :: Lens' CreateCacheCluster (Maybe Text)
+cccCacheParameterGroupName = lens _cccCacheParameterGroupName (\ s a -> s{_cccCacheParameterGroupName = a});
 
--- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
--- (SNS) topic to which notifications will be sent.
+-- | The daily time range (in UTC) during which ElastiCache will begin taking
+-- a daily snapshot of your node group.
 --
--- The Amazon SNS topic owner must be the same as the cache cluster owner.
-cccNotificationTopicArn :: Lens' CreateCacheCluster (Maybe Text)
-cccNotificationTopicArn =
-    lens _cccNotificationTopicArn (\s a -> s { _cccNotificationTopicArn = a })
-
--- | The initial number of cache nodes that the cache cluster will have.
+-- Example: '05:00-09:00'
 --
--- For clusters running Redis, this value must be 1. For clusters running
--- Memcached, this value must be between 1 and 20.
+-- If you do not specify this parameter, then ElastiCache will
+-- automatically choose an appropriate time range.
 --
--- If you need more than 20 nodes for your Memcached cluster, please fill out
--- the ElastiCache Limit Increase Request form at <http://aws.amazon.com/contact-us/elasticache-node-limit-request/ http://aws.amazon.com/contact-us/elasticache-node-limit-request/>.
-cccNumCacheNodes :: Lens' CreateCacheCluster (Maybe Int)
-cccNumCacheNodes = lens _cccNumCacheNodes (\s a -> s { _cccNumCacheNodes = a })
-
--- | The port number on which each of the cache nodes will accept connections.
-cccPort :: Lens' CreateCacheCluster (Maybe Int)
-cccPort = lens _cccPort (\s a -> s { _cccPort = a })
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
+cccSnapshotWindow :: Lens' CreateCacheCluster (Maybe Text)
+cccSnapshotWindow = lens _cccSnapshotWindow (\ s a -> s{_cccSnapshotWindow = a});
 
--- | The EC2 Availability Zone in which the cache cluster will be created.
+-- | The name of the cache engine to be used for this cache cluster.
 --
--- All nodes belonging to this Memcached cache cluster are placed in the
--- preferred Availability Zone. If you want to create your nodes across multiple
--- Availability Zones, use 'PreferredAvailabilityZones'.
+-- Valid values for this parameter are:
 --
--- Default: System chosen Availability Zone.
-cccPreferredAvailabilityZone :: Lens' CreateCacheCluster (Maybe Text)
-cccPreferredAvailabilityZone =
-    lens _cccPreferredAvailabilityZone
-        (\s a -> s { _cccPreferredAvailabilityZone = a })
+-- 'memcached' | 'redis'
+cccEngine :: Lens' CreateCacheCluster (Maybe Text)
+cccEngine = lens _cccEngine (\ s a -> s{_cccEngine = a});
 
--- | A list of the Availability Zones in which cache nodes will be created. The
--- order of the zones in the list is not important.
+-- | A list of the Availability Zones in which cache nodes will be created.
+-- The order of the zones in the list is not important.
 --
 -- This option is only supported on Memcached.
 --
--- If you are creating your cache cluster in an Amazon VPC (recommended) you
--- can only locate nodes in Availability Zones that are associated with the
--- subnets in the selected subnet group.
+-- If you are creating your cache cluster in an Amazon VPC (recommended)
+-- you can only locate nodes in Availability Zones that are associated with
+-- the subnets in the selected subnet group.
 --
--- The number of Availability Zones listed must equal the value of 'NumCacheNodes'
--- .
+-- The number of Availability Zones listed must equal the value of
+-- 'NumCacheNodes'.
 --
--- If you want all the nodes in the same Availability Zone, use 'PreferredAvailabilityZone' instead, or repeat the Availability Zone multiple times in the list.
+-- If you want all the nodes in the same Availability Zone, use
+-- 'PreferredAvailabilityZone' instead, or repeat the Availability Zone
+-- multiple times in the list.
 --
 -- Default: System chosen Availability Zones.
 --
--- Example: One Memcached node in each of three different Availability Zones: 'PreferredAvailabilityZones.member.1=us-west-2a&PreferredAvailabilityZones.member.2=us-west-2b&PreferredAvailabilityZones.member.3=us-west-2c'
+-- Example: One Memcached node in each of three different Availability
+-- Zones:
+-- 'PreferredAvailabilityZones.member.1=us-west-2a&PreferredAvailabilityZones.member.2=us-west-2b&PreferredAvailabilityZones.member.3=us-west-2c'
 --
--- Example: All three Memcached nodes in one Availability Zone: 'PreferredAvailabilityZones.member.1=us-west-2a&PreferredAvailabilityZones.member.2=us-west-2a&PreferredAvailabilityZones.member.3=us-west-2a'
+-- Example: All three Memcached nodes in one Availability Zone:
+-- 'PreferredAvailabilityZones.member.1=us-west-2a&PreferredAvailabilityZones.member.2=us-west-2a&PreferredAvailabilityZones.member.3=us-west-2a'
 cccPreferredAvailabilityZones :: Lens' CreateCacheCluster [Text]
-cccPreferredAvailabilityZones =
-    lens _cccPreferredAvailabilityZones
-        (\s a -> s { _cccPreferredAvailabilityZones = a })
-            . _List
+cccPreferredAvailabilityZones = lens _cccPreferredAvailabilityZones (\ s a -> s{_cccPreferredAvailabilityZones = a}) . _Default . _Coerce;
 
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
 --
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
+--
+-- Example: 'sun:05:00-sun:09:00'
 cccPreferredMaintenanceWindow :: Lens' CreateCacheCluster (Maybe Text)
-cccPreferredMaintenanceWindow =
-    lens _cccPreferredMaintenanceWindow
-        (\s a -> s { _cccPreferredMaintenanceWindow = a })
+cccPreferredMaintenanceWindow = lens _cccPreferredMaintenanceWindow (\ s a -> s{_cccPreferredMaintenanceWindow = a});
 
--- | The ID of the replication group to which this cache cluster should belong. If
--- this parameter is specified, the cache cluster will be added to the specified
--- replication group as a read replica; otherwise, the cache cluster will be a
--- standalone primary that is not part of any replication group.
+-- | The name of the subnet group to be used for the cache cluster.
 --
--- If the specified replication group is Multi-AZ enabled and the availability
--- zone is not specified, the cache cluster will be created in availability
--- zones that provide the best spread of read replicas across availability zones.
+-- Use this parameter only when you are creating a cache cluster in an
+-- Amazon Virtual Private Cloud (VPC).
+cccCacheSubnetGroupName :: Lens' CreateCacheCluster (Maybe Text)
+cccCacheSubnetGroupName = lens _cccCacheSubnetGroupName (\ s a -> s{_cccCacheSubnetGroupName = a});
+
+-- | The EC2 Availability Zone in which the cache cluster will be created.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
-cccReplicationGroupId :: Lens' CreateCacheCluster (Maybe Text)
-cccReplicationGroupId =
-    lens _cccReplicationGroupId (\s a -> s { _cccReplicationGroupId = a })
+-- All nodes belonging to this Memcached cache cluster are placed in the
+-- preferred Availability Zone. If you want to create your nodes across
+-- multiple Availability Zones, use 'PreferredAvailabilityZones'.
+--
+-- Default: System chosen Availability Zone.
+cccPreferredAvailabilityZone :: Lens' CreateCacheCluster (Maybe Text)
+cccPreferredAvailabilityZone = lens _cccPreferredAvailabilityZone (\ s a -> s{_cccPreferredAvailabilityZone = a});
 
--- | One or more VPC security groups associated with the cache cluster.
+-- | The number of days for which ElastiCache will retain automatic snapshots
+-- before deleting them. For example, if you set 'SnapshotRetentionLimit'
+-- to 5, then a snapshot that was taken today will be retained for 5 days
+-- before being deleted.
 --
--- Use this parameter only when you are creating a cache cluster in an Amazon
--- Virtual Private Cloud (VPC).
-cccSecurityGroupIds :: Lens' CreateCacheCluster [Text]
-cccSecurityGroupIds =
-    lens _cccSecurityGroupIds (\s a -> s { _cccSecurityGroupIds = a })
-        . _List
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
+--
+-- Default: 0 (i.e., automatic backups are disabled for this cache
+-- cluster).
+cccSnapshotRetentionLimit :: Lens' CreateCacheCluster (Maybe Int)
+cccSnapshotRetentionLimit = lens _cccSnapshotRetentionLimit (\ s a -> s{_cccSnapshotRetentionLimit = a});
 
--- | A single-element string list containing an Amazon Resource Name (ARN) that
--- uniquely identifies a Redis RDB snapshot file stored in Amazon S3. The
--- snapshot file will be used to populate the node group. The Amazon S3 object
--- name in the ARN cannot contain any commas.
+-- | Specifies whether the nodes in this Memcached node group are created in
+-- a single Availability Zone or created across multiple Availability Zones
+-- in the cluster\'s region.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- This parameter is only supported for Memcached cache clusters.
 --
--- Example of an Amazon S3 ARN: 'arn:aws:s3:::my_bucket/snapshot1.rdb'
-cccSnapshotArns :: Lens' CreateCacheCluster [Text]
-cccSnapshotArns = lens _cccSnapshotArns (\s a -> s { _cccSnapshotArns = a }) . _List
+-- If the 'AZMode' and 'PreferredAvailabilityZones' are not specified,
+-- ElastiCache assumes 'single-az' mode.
+cccAZMode :: Lens' CreateCacheCluster (Maybe AZMode)
+cccAZMode = lens _cccAZMode (\ s a -> s{_cccAZMode = a});
 
--- | The name of a snapshot from which to restore data into the new node group.
--- The snapshot status changes to 'restoring' while the new node group is being
--- created.
+-- | The name of a snapshot from which to restore data into the new node
+-- group. The snapshot status changes to 'restoring' while the new node
+-- group is being created.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
 cccSnapshotName :: Lens' CreateCacheCluster (Maybe Text)
-cccSnapshotName = lens _cccSnapshotName (\s a -> s { _cccSnapshotName = a })
+cccSnapshotName = lens _cccSnapshotName (\ s a -> s{_cccSnapshotName = a});
 
--- | The number of days for which ElastiCache will retain automatic snapshots
--- before deleting them. For example, if you set 'SnapshotRetentionLimit' to 5,
--- then a snapshot that was taken today will be retained for 5 days before being
--- deleted.
+-- | The ID of the replication group to which this cache cluster should
+-- belong. If this parameter is specified, the cache cluster will be added
+-- to the specified replication group as a read replica; otherwise, the
+-- cache cluster will be a standalone primary that is not part of any
+-- replication group.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- If the specified replication group is Multi-AZ enabled and the
+-- availability zone is not specified, the cache cluster will be created in
+-- availability zones that provide the best spread of read replicas across
+-- availability zones.
 --
--- Default: 0 (i.e., automatic backups are disabled for this cache cluster).
-cccSnapshotRetentionLimit :: Lens' CreateCacheCluster (Maybe Int)
-cccSnapshotRetentionLimit =
-    lens _cccSnapshotRetentionLimit
-        (\s a -> s { _cccSnapshotRetentionLimit = a })
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
+cccReplicationGroupId :: Lens' CreateCacheCluster (Maybe Text)
+cccReplicationGroupId = lens _cccReplicationGroupId (\ s a -> s{_cccReplicationGroupId = a});
 
--- | The daily time range (in UTC) during which ElastiCache will begin taking a
--- daily snapshot of your node group.
---
--- Example: '05:00-09:00'
---
--- If you do not specify this parameter, then ElastiCache will automatically
--- choose an appropriate time range.
+-- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
+-- (SNS) topic to which notifications will be sent.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
-cccSnapshotWindow :: Lens' CreateCacheCluster (Maybe Text)
-cccSnapshotWindow =
-    lens _cccSnapshotWindow (\s a -> s { _cccSnapshotWindow = a })
+-- The Amazon SNS topic owner must be the same as the cache cluster owner.
+cccNotificationTopicARN :: Lens' CreateCacheCluster (Maybe Text)
+cccNotificationTopicARN = lens _cccNotificationTopicARN (\ s a -> s{_cccNotificationTopicARN = a});
 
 -- | A list of cost allocation tags to be added to this resource. A tag is a
 -- key-value pair. A tag key must be accompanied by a tag value.
 cccTags :: Lens' CreateCacheCluster [Tag]
-cccTags = lens _cccTags (\s a -> s { _cccTags = a }) . _List
+cccTags = lens _cccTags (\ s a -> s{_cccTags = a}) . _Default . _Coerce;
 
-newtype CreateCacheClusterResponse = CreateCacheClusterResponse
-    { _cccrCacheCluster :: Maybe CacheCluster
-    } deriving (Eq, Read, Show)
+-- | The initial number of cache nodes that the cache cluster will have.
+--
+-- For clusters running Redis, this value must be 1. For clusters running
+-- Memcached, this value must be between 1 and 20.
+--
+-- If you need more than 20 nodes for your Memcached cluster, please fill
+-- out the ElastiCache Limit Increase Request form at
+-- <http://aws.amazon.com/contact-us/elasticache-node-limit-request/>.
+cccNumCacheNodes :: Lens' CreateCacheCluster (Maybe Int)
+cccNumCacheNodes = lens _cccNumCacheNodes (\ s a -> s{_cccNumCacheNodes = a});
 
--- | 'CreateCacheClusterResponse' constructor.
+-- | A list of security group names to associate with this cache cluster.
 --
--- The fields accessible through corresponding lenses are:
+-- Use this parameter only when you are creating a cache cluster outside of
+-- an Amazon Virtual Private Cloud (VPC).
+cccCacheSecurityGroupNames :: Lens' CreateCacheCluster [Text]
+cccCacheSecurityGroupNames = lens _cccCacheSecurityGroupNames (\ s a -> s{_cccCacheSecurityGroupNames = a}) . _Default . _Coerce;
+
+-- | The port number on which each of the cache nodes will accept
+-- connections.
+cccPort :: Lens' CreateCacheCluster (Maybe Int)
+cccPort = lens _cccPort (\ s a -> s{_cccPort = a});
+
+-- | The node group identifier. This parameter is stored as a lowercase
+-- string.
 --
--- * 'cccrCacheCluster' @::@ 'Maybe' 'CacheCluster'
+-- Constraints:
 --
-createCacheClusterResponse :: CreateCacheClusterResponse
-createCacheClusterResponse = CreateCacheClusterResponse
-    { _cccrCacheCluster = Nothing
-    }
+-- -   A name must contain from 1 to 20 alphanumeric characters or hyphens.
+-- -   The first character must be a letter.
+-- -   A name cannot end with a hyphen or contain two consecutive hyphens.
+cccCacheClusterId :: Lens' CreateCacheCluster Text
+cccCacheClusterId = lens _cccCacheClusterId (\ s a -> s{_cccCacheClusterId = a});
 
-cccrCacheCluster :: Lens' CreateCacheClusterResponse (Maybe CacheCluster)
-cccrCacheCluster = lens _cccrCacheCluster (\s a -> s { _cccrCacheCluster = a })
+instance AWSRequest CreateCacheCluster where
+        type Sv CreateCacheCluster = ElastiCache
+        type Rs CreateCacheCluster =
+             CreateCacheClusterResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateCacheClusterResult"
+              (\ s h x ->
+                 CreateCacheClusterResponse' <$>
+                   (x .@? "CacheCluster") <*> (pure (fromEnum s)))
 
+instance ToHeaders CreateCacheCluster where
+        toHeaders = const mempty
+
 instance ToPath CreateCacheCluster where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateCacheCluster where
-    toQuery CreateCacheCluster{..} = mconcat
-        [ "AZMode"                     =? _cccAZMode
-        , "AutoMinorVersionUpgrade"    =? _cccAutoMinorVersionUpgrade
-        , "CacheClusterId"             =? _cccCacheClusterId
-        , "CacheNodeType"              =? _cccCacheNodeType
-        , "CacheParameterGroupName"    =? _cccCacheParameterGroupName
-        , "CacheSecurityGroupNames"    =? _cccCacheSecurityGroupNames
-        , "CacheSubnetGroupName"       =? _cccCacheSubnetGroupName
-        , "Engine"                     =? _cccEngine
-        , "EngineVersion"              =? _cccEngineVersion
-        , "NotificationTopicArn"       =? _cccNotificationTopicArn
-        , "NumCacheNodes"              =? _cccNumCacheNodes
-        , "Port"                       =? _cccPort
-        , "PreferredAvailabilityZone"  =? _cccPreferredAvailabilityZone
-        , "PreferredAvailabilityZones" =? _cccPreferredAvailabilityZones
-        , "PreferredMaintenanceWindow" =? _cccPreferredMaintenanceWindow
-        , "ReplicationGroupId"         =? _cccReplicationGroupId
-        , "SecurityGroupIds"           =? _cccSecurityGroupIds
-        , "SnapshotArns"               =? _cccSnapshotArns
-        , "SnapshotName"               =? _cccSnapshotName
-        , "SnapshotRetentionLimit"     =? _cccSnapshotRetentionLimit
-        , "SnapshotWindow"             =? _cccSnapshotWindow
-        , "Tags"                       =? _cccTags
-        ]
+        toQuery CreateCacheCluster'{..}
+          = mconcat
+              ["Action" =: ("CreateCacheCluster" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheNodeType" =: _cccCacheNodeType,
+               "EngineVersion" =: _cccEngineVersion,
+               "SecurityGroupIds" =:
+                 toQuery
+                   (toQueryList "SecurityGroupId" <$>
+                      _cccSecurityGroupIds),
+               "AutoMinorVersionUpgrade" =:
+                 _cccAutoMinorVersionUpgrade,
+               "SnapshotArns" =:
+                 toQuery
+                   (toQueryList "SnapshotArn" <$> _cccSnapshotARNs),
+               "CacheParameterGroupName" =:
+                 _cccCacheParameterGroupName,
+               "SnapshotWindow" =: _cccSnapshotWindow,
+               "Engine" =: _cccEngine,
+               "PreferredAvailabilityZones" =:
+                 toQuery
+                   (toQueryList "PreferredAvailabilityZone" <$>
+                      _cccPreferredAvailabilityZones),
+               "PreferredMaintenanceWindow" =:
+                 _cccPreferredMaintenanceWindow,
+               "CacheSubnetGroupName" =: _cccCacheSubnetGroupName,
+               "PreferredAvailabilityZone" =:
+                 _cccPreferredAvailabilityZone,
+               "SnapshotRetentionLimit" =:
+                 _cccSnapshotRetentionLimit,
+               "AZMode" =: _cccAZMode,
+               "SnapshotName" =: _cccSnapshotName,
+               "ReplicationGroupId" =: _cccReplicationGroupId,
+               "NotificationTopicArn" =: _cccNotificationTopicARN,
+               "Tags" =: toQuery (toQueryList "Tag" <$> _cccTags),
+               "NumCacheNodes" =: _cccNumCacheNodes,
+               "CacheSecurityGroupNames" =:
+                 toQuery
+                   (toQueryList "CacheSecurityGroupName" <$>
+                      _cccCacheSecurityGroupNames),
+               "Port" =: _cccPort,
+               "CacheClusterId" =: _cccCacheClusterId]
 
-instance ToHeaders CreateCacheCluster
+-- | /See:/ 'createCacheClusterResponse' smart constructor.
+data CreateCacheClusterResponse = CreateCacheClusterResponse'
+    { _cccrsCacheCluster :: !(Maybe CacheCluster)
+    , _cccrsStatus       :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateCacheCluster where
-    type Sv CreateCacheCluster = ElastiCache
-    type Rs CreateCacheCluster = CreateCacheClusterResponse
+-- | Creates a value of 'CreateCacheClusterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cccrsCacheCluster'
+--
+-- * 'cccrsStatus'
+createCacheClusterResponse
+    :: Int -- ^ 'cccrsStatus'
+    -> CreateCacheClusterResponse
+createCacheClusterResponse pStatus_ =
+    CreateCacheClusterResponse'
+    { _cccrsCacheCluster = Nothing
+    , _cccrsStatus = pStatus_
+    }
 
-    request  = post "CreateCacheCluster"
-    response = xmlResponse
+-- | Undocumented member.
+cccrsCacheCluster :: Lens' CreateCacheClusterResponse (Maybe CacheCluster)
+cccrsCacheCluster = lens _cccrsCacheCluster (\ s a -> s{_cccrsCacheCluster = a});
 
-instance FromXML CreateCacheClusterResponse where
-    parseXML = withElement "CreateCacheClusterResult" $ \x -> CreateCacheClusterResponse
-        <$> x .@? "CacheCluster"
+-- | The response status code.
+cccrsStatus :: Lens' CreateCacheClusterResponse Int
+cccrsStatus = lens _cccrsStatus (\ s a -> s{_cccrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateCacheParameterGroup.hs b/gen/Network/AWS/ElastiCache/CreateCacheParameterGroup.hs
--- a/gen/Network/AWS/ElastiCache/CreateCacheParameterGroup.hs
+++ b/gen/Network/AWS/ElastiCache/CreateCacheParameterGroup.hs
@@ -1,140 +1,153 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateCacheParameterGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateCacheParameterGroup/ action creates a new cache parameter group. A
--- cache parameter group is a collection of parameters that you apply to all of
--- the nodes in a cache cluster.
+-- The /CreateCacheParameterGroup/ action creates a new cache parameter
+-- group. A cache parameter group is a collection of parameters that you
+-- apply to all of the nodes in a cache cluster.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheParameterGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheParameterGroup.html AWS API Reference> for CreateCacheParameterGroup.
 module Network.AWS.ElastiCache.CreateCacheParameterGroup
     (
-    -- * Request
-      CreateCacheParameterGroup
-    -- ** Request constructor
-    , createCacheParameterGroup
-    -- ** Request lenses
-    , ccpgCacheParameterGroupFamily
+    -- * Creating a Request
+      createCacheParameterGroup
+    , CreateCacheParameterGroup
+    -- * Request Lenses
     , ccpgCacheParameterGroupName
+    , ccpgCacheParameterGroupFamily
     , ccpgDescription
 
-    -- * Response
-    , CreateCacheParameterGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createCacheParameterGroupResponse
-    -- ** Response lenses
-    , ccpgrCacheParameterGroup
+    , CreateCacheParameterGroupResponse
+    -- * Response Lenses
+    , ccpgrsCacheParameterGroup
+    , ccpgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateCacheParameterGroup = CreateCacheParameterGroup
-    { _ccpgCacheParameterGroupFamily :: Text
-    , _ccpgCacheParameterGroupName   :: Text
-    , _ccpgDescription               :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateCacheParameterGroup' constructor.
+-- | Represents the input of a /CreateCacheParameterGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createCacheParameterGroup' smart constructor.
+data CreateCacheParameterGroup = CreateCacheParameterGroup'
+    { _ccpgCacheParameterGroupName   :: !Text
+    , _ccpgCacheParameterGroupFamily :: !Text
+    , _ccpgDescription               :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCacheParameterGroup' with the minimum fields required to make a request.
 --
--- * 'ccpgCacheParameterGroupFamily' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'ccpgCacheParameterGroupName' @::@ 'Text'
+-- * 'ccpgCacheParameterGroupName'
 --
--- * 'ccpgDescription' @::@ 'Text'
+-- * 'ccpgCacheParameterGroupFamily'
 --
-createCacheParameterGroup :: Text -- ^ 'ccpgCacheParameterGroupName'
-                          -> Text -- ^ 'ccpgCacheParameterGroupFamily'
-                          -> Text -- ^ 'ccpgDescription'
-                          -> CreateCacheParameterGroup
-createCacheParameterGroup p1 p2 p3 = CreateCacheParameterGroup
-    { _ccpgCacheParameterGroupName   = p1
-    , _ccpgCacheParameterGroupFamily = p2
-    , _ccpgDescription               = p3
+-- * 'ccpgDescription'
+createCacheParameterGroup
+    :: Text -- ^ 'ccpgCacheParameterGroupName'
+    -> Text -- ^ 'ccpgCacheParameterGroupFamily'
+    -> Text -- ^ 'ccpgDescription'
+    -> CreateCacheParameterGroup
+createCacheParameterGroup pCacheParameterGroupName_ pCacheParameterGroupFamily_ pDescription_ =
+    CreateCacheParameterGroup'
+    { _ccpgCacheParameterGroupName = pCacheParameterGroupName_
+    , _ccpgCacheParameterGroupFamily = pCacheParameterGroupFamily_
+    , _ccpgDescription = pDescription_
     }
 
--- | The name of the cache parameter group family the cache parameter group can be
--- used with.
+-- | A user-specified name for the cache parameter group.
+ccpgCacheParameterGroupName :: Lens' CreateCacheParameterGroup Text
+ccpgCacheParameterGroupName = lens _ccpgCacheParameterGroupName (\ s a -> s{_ccpgCacheParameterGroupName = a});
+
+-- | The name of the cache parameter group family the cache parameter group
+-- can be used with.
 --
 -- Valid values are: 'memcached1.4' | 'redis2.6' | 'redis2.8'
 ccpgCacheParameterGroupFamily :: Lens' CreateCacheParameterGroup Text
-ccpgCacheParameterGroupFamily =
-    lens _ccpgCacheParameterGroupFamily
-        (\s a -> s { _ccpgCacheParameterGroupFamily = a })
-
--- | A user-specified name for the cache parameter group.
-ccpgCacheParameterGroupName :: Lens' CreateCacheParameterGroup Text
-ccpgCacheParameterGroupName =
-    lens _ccpgCacheParameterGroupName
-        (\s a -> s { _ccpgCacheParameterGroupName = a })
+ccpgCacheParameterGroupFamily = lens _ccpgCacheParameterGroupFamily (\ s a -> s{_ccpgCacheParameterGroupFamily = a});
 
 -- | A user-specified description for the cache parameter group.
 ccpgDescription :: Lens' CreateCacheParameterGroup Text
-ccpgDescription = lens _ccpgDescription (\s a -> s { _ccpgDescription = a })
-
-newtype CreateCacheParameterGroupResponse = CreateCacheParameterGroupResponse
-    { _ccpgrCacheParameterGroup :: Maybe CacheParameterGroup
-    } deriving (Eq, Read, Show)
+ccpgDescription = lens _ccpgDescription (\ s a -> s{_ccpgDescription = a});
 
--- | 'CreateCacheParameterGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ccpgrCacheParameterGroup' @::@ 'Maybe' 'CacheParameterGroup'
---
-createCacheParameterGroupResponse :: CreateCacheParameterGroupResponse
-createCacheParameterGroupResponse = CreateCacheParameterGroupResponse
-    { _ccpgrCacheParameterGroup = Nothing
-    }
+instance AWSRequest CreateCacheParameterGroup where
+        type Sv CreateCacheParameterGroup = ElastiCache
+        type Rs CreateCacheParameterGroup =
+             CreateCacheParameterGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateCacheParameterGroupResult"
+              (\ s h x ->
+                 CreateCacheParameterGroupResponse' <$>
+                   (x .@? "CacheParameterGroup") <*>
+                     (pure (fromEnum s)))
 
-ccpgrCacheParameterGroup :: Lens' CreateCacheParameterGroupResponse (Maybe CacheParameterGroup)
-ccpgrCacheParameterGroup =
-    lens _ccpgrCacheParameterGroup
-        (\s a -> s { _ccpgrCacheParameterGroup = a })
+instance ToHeaders CreateCacheParameterGroup where
+        toHeaders = const mempty
 
 instance ToPath CreateCacheParameterGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateCacheParameterGroup where
-    toQuery CreateCacheParameterGroup{..} = mconcat
-        [ "CacheParameterGroupFamily" =? _ccpgCacheParameterGroupFamily
-        , "CacheParameterGroupName"   =? _ccpgCacheParameterGroupName
-        , "Description"               =? _ccpgDescription
-        ]
+        toQuery CreateCacheParameterGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("CreateCacheParameterGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheParameterGroupName" =:
+                 _ccpgCacheParameterGroupName,
+               "CacheParameterGroupFamily" =:
+                 _ccpgCacheParameterGroupFamily,
+               "Description" =: _ccpgDescription]
 
-instance ToHeaders CreateCacheParameterGroup
+-- | /See:/ 'createCacheParameterGroupResponse' smart constructor.
+data CreateCacheParameterGroupResponse = CreateCacheParameterGroupResponse'
+    { _ccpgrsCacheParameterGroup :: !(Maybe CacheParameterGroup)
+    , _ccpgrsStatus              :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateCacheParameterGroup where
-    type Sv CreateCacheParameterGroup = ElastiCache
-    type Rs CreateCacheParameterGroup = CreateCacheParameterGroupResponse
+-- | Creates a value of 'CreateCacheParameterGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccpgrsCacheParameterGroup'
+--
+-- * 'ccpgrsStatus'
+createCacheParameterGroupResponse
+    :: Int -- ^ 'ccpgrsStatus'
+    -> CreateCacheParameterGroupResponse
+createCacheParameterGroupResponse pStatus_ =
+    CreateCacheParameterGroupResponse'
+    { _ccpgrsCacheParameterGroup = Nothing
+    , _ccpgrsStatus = pStatus_
+    }
 
-    request  = post "CreateCacheParameterGroup"
-    response = xmlResponse
+-- | Undocumented member.
+ccpgrsCacheParameterGroup :: Lens' CreateCacheParameterGroupResponse (Maybe CacheParameterGroup)
+ccpgrsCacheParameterGroup = lens _ccpgrsCacheParameterGroup (\ s a -> s{_ccpgrsCacheParameterGroup = a});
 
-instance FromXML CreateCacheParameterGroupResponse where
-    parseXML = withElement "CreateCacheParameterGroupResult" $ \x -> CreateCacheParameterGroupResponse
-        <$> x .@? "CacheParameterGroup"
+-- | The response status code.
+ccpgrsStatus :: Lens' CreateCacheParameterGroupResponse Int
+ccpgrsStatus = lens _ccpgrsStatus (\ s a -> s{_ccpgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateCacheSecurityGroup.hs b/gen/Network/AWS/ElastiCache/CreateCacheSecurityGroup.hs
--- a/gen/Network/AWS/ElastiCache/CreateCacheSecurityGroup.hs
+++ b/gen/Network/AWS/ElastiCache/CreateCacheSecurityGroup.hs
@@ -1,133 +1,149 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateCacheSecurityGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateCacheSecurityGroup/ action creates a new cache security group. Use a
--- cache security group to control access to one or more cache clusters.
+-- The /CreateCacheSecurityGroup/ action creates a new cache security
+-- group. Use a cache security group to control access to one or more cache
+-- clusters.
 --
--- Cache security groups are only used when you are creating a cache cluster
--- outside of an Amazon Virtual Private Cloud (VPC). If you are creating a cache
--- cluster inside of a VPC, use a cache subnet group instead. For more
--- information, see <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html CreateCacheSubnetGroup>.
+-- Cache security groups are only used when you are creating a cache
+-- cluster outside of an Amazon Virtual Private Cloud (VPC). If you are
+-- creating a cache cluster inside of a VPC, use a cache subnet group
+-- instead. For more information, see
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html CreateCacheSubnetGroup>.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSecurityGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSecurityGroup.html AWS API Reference> for CreateCacheSecurityGroup.
 module Network.AWS.ElastiCache.CreateCacheSecurityGroup
     (
-    -- * Request
-      CreateCacheSecurityGroup
-    -- ** Request constructor
-    , createCacheSecurityGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      createCacheSecurityGroup
+    , CreateCacheSecurityGroup
+    -- * Request Lenses
     , ccsgCacheSecurityGroupName
     , ccsgDescription
 
-    -- * Response
-    , CreateCacheSecurityGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createCacheSecurityGroupResponse
-    -- ** Response lenses
-    , ccsgrCacheSecurityGroup
+    , CreateCacheSecurityGroupResponse
+    -- * Response Lenses
+    , ccsgrsCacheSecurityGroup
+    , ccsgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateCacheSecurityGroup = CreateCacheSecurityGroup
-    { _ccsgCacheSecurityGroupName :: Text
-    , _ccsgDescription            :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateCacheSecurityGroup' constructor.
+-- | Represents the input of a /CreateCacheSecurityGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createCacheSecurityGroup' smart constructor.
+data CreateCacheSecurityGroup = CreateCacheSecurityGroup'
+    { _ccsgCacheSecurityGroupName :: !Text
+    , _ccsgDescription            :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCacheSecurityGroup' with the minimum fields required to make a request.
 --
--- * 'ccsgCacheSecurityGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'ccsgDescription' @::@ 'Text'
+-- * 'ccsgCacheSecurityGroupName'
 --
-createCacheSecurityGroup :: Text -- ^ 'ccsgCacheSecurityGroupName'
-                         -> Text -- ^ 'ccsgDescription'
-                         -> CreateCacheSecurityGroup
-createCacheSecurityGroup p1 p2 = CreateCacheSecurityGroup
-    { _ccsgCacheSecurityGroupName = p1
-    , _ccsgDescription            = p2
+-- * 'ccsgDescription'
+createCacheSecurityGroup
+    :: Text -- ^ 'ccsgCacheSecurityGroupName'
+    -> Text -- ^ 'ccsgDescription'
+    -> CreateCacheSecurityGroup
+createCacheSecurityGroup pCacheSecurityGroupName_ pDescription_ =
+    CreateCacheSecurityGroup'
+    { _ccsgCacheSecurityGroupName = pCacheSecurityGroupName_
+    , _ccsgDescription = pDescription_
     }
 
 -- | A name for the cache security group. This value is stored as a lowercase
 -- string.
 --
--- Constraints: Must contain no more than 255 alphanumeric characters. Cannot
--- be the word "Default".
+-- Constraints: Must contain no more than 255 alphanumeric characters.
+-- Cannot be the word \"Default\".
 --
 -- Example: 'mysecuritygroup'
 ccsgCacheSecurityGroupName :: Lens' CreateCacheSecurityGroup Text
-ccsgCacheSecurityGroupName =
-    lens _ccsgCacheSecurityGroupName
-        (\s a -> s { _ccsgCacheSecurityGroupName = a })
+ccsgCacheSecurityGroupName = lens _ccsgCacheSecurityGroupName (\ s a -> s{_ccsgCacheSecurityGroupName = a});
 
 -- | A description for the cache security group.
 ccsgDescription :: Lens' CreateCacheSecurityGroup Text
-ccsgDescription = lens _ccsgDescription (\s a -> s { _ccsgDescription = a })
-
-newtype CreateCacheSecurityGroupResponse = CreateCacheSecurityGroupResponse
-    { _ccsgrCacheSecurityGroup :: Maybe CacheSecurityGroup
-    } deriving (Eq, Read, Show)
+ccsgDescription = lens _ccsgDescription (\ s a -> s{_ccsgDescription = a});
 
--- | 'CreateCacheSecurityGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ccsgrCacheSecurityGroup' @::@ 'Maybe' 'CacheSecurityGroup'
---
-createCacheSecurityGroupResponse :: CreateCacheSecurityGroupResponse
-createCacheSecurityGroupResponse = CreateCacheSecurityGroupResponse
-    { _ccsgrCacheSecurityGroup = Nothing
-    }
+instance AWSRequest CreateCacheSecurityGroup where
+        type Sv CreateCacheSecurityGroup = ElastiCache
+        type Rs CreateCacheSecurityGroup =
+             CreateCacheSecurityGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateCacheSecurityGroupResult"
+              (\ s h x ->
+                 CreateCacheSecurityGroupResponse' <$>
+                   (x .@? "CacheSecurityGroup") <*> (pure (fromEnum s)))
 
-ccsgrCacheSecurityGroup :: Lens' CreateCacheSecurityGroupResponse (Maybe CacheSecurityGroup)
-ccsgrCacheSecurityGroup =
-    lens _ccsgrCacheSecurityGroup (\s a -> s { _ccsgrCacheSecurityGroup = a })
+instance ToHeaders CreateCacheSecurityGroup where
+        toHeaders = const mempty
 
 instance ToPath CreateCacheSecurityGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateCacheSecurityGroup where
-    toQuery CreateCacheSecurityGroup{..} = mconcat
-        [ "CacheSecurityGroupName" =? _ccsgCacheSecurityGroupName
-        , "Description"            =? _ccsgDescription
-        ]
+        toQuery CreateCacheSecurityGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("CreateCacheSecurityGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSecurityGroupName" =:
+                 _ccsgCacheSecurityGroupName,
+               "Description" =: _ccsgDescription]
 
-instance ToHeaders CreateCacheSecurityGroup
+-- | /See:/ 'createCacheSecurityGroupResponse' smart constructor.
+data CreateCacheSecurityGroupResponse = CreateCacheSecurityGroupResponse'
+    { _ccsgrsCacheSecurityGroup :: !(Maybe CacheSecurityGroup)
+    , _ccsgrsStatus             :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateCacheSecurityGroup where
-    type Sv CreateCacheSecurityGroup = ElastiCache
-    type Rs CreateCacheSecurityGroup = CreateCacheSecurityGroupResponse
+-- | Creates a value of 'CreateCacheSecurityGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccsgrsCacheSecurityGroup'
+--
+-- * 'ccsgrsStatus'
+createCacheSecurityGroupResponse
+    :: Int -- ^ 'ccsgrsStatus'
+    -> CreateCacheSecurityGroupResponse
+createCacheSecurityGroupResponse pStatus_ =
+    CreateCacheSecurityGroupResponse'
+    { _ccsgrsCacheSecurityGroup = Nothing
+    , _ccsgrsStatus = pStatus_
+    }
 
-    request  = post "CreateCacheSecurityGroup"
-    response = xmlResponse
+-- | Undocumented member.
+ccsgrsCacheSecurityGroup :: Lens' CreateCacheSecurityGroupResponse (Maybe CacheSecurityGroup)
+ccsgrsCacheSecurityGroup = lens _ccsgrsCacheSecurityGroup (\ s a -> s{_ccsgrsCacheSecurityGroup = a});
 
-instance FromXML CreateCacheSecurityGroupResponse where
-    parseXML = withElement "CreateCacheSecurityGroupResult" $ \x -> CreateCacheSecurityGroupResponse
-        <$> x .@? "CacheSecurityGroup"
+-- | The response status code.
+ccsgrsStatus :: Lens' CreateCacheSecurityGroupResponse Int
+ccsgrsStatus = lens _ccsgrsStatus (\ s a -> s{_ccsgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateCacheSubnetGroup.hs b/gen/Network/AWS/ElastiCache/CreateCacheSubnetGroup.hs
--- a/gen/Network/AWS/ElastiCache/CreateCacheSubnetGroup.hs
+++ b/gen/Network/AWS/ElastiCache/CreateCacheSubnetGroup.hs
@@ -1,141 +1,155 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateCacheSubnetGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateCacheSubnetGroup/ action creates a new cache subnet group.
+-- The /CreateCacheSubnetGroup/ action creates a new cache subnet group.
 --
--- Use this parameter only when you are creating a cluster in an Amazon Virtual
--- Private Cloud (VPC).
+-- Use this parameter only when you are creating a cluster in an Amazon
+-- Virtual Private Cloud (VPC).
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html AWS API Reference> for CreateCacheSubnetGroup.
 module Network.AWS.ElastiCache.CreateCacheSubnetGroup
     (
-    -- * Request
-      CreateCacheSubnetGroup
-    -- ** Request constructor
-    , createCacheSubnetGroup
-    -- ** Request lenses
-    , ccsgCacheSubnetGroupDescription
+    -- * Creating a Request
+      createCacheSubnetGroup
+    , CreateCacheSubnetGroup
+    -- * Request Lenses
     , ccsgCacheSubnetGroupName
+    , ccsgCacheSubnetGroupDescription
     , ccsgSubnetIds
 
-    -- * Response
-    , CreateCacheSubnetGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createCacheSubnetGroupResponse
-    -- ** Response lenses
-    , ccsgrCacheSubnetGroup
+    , CreateCacheSubnetGroupResponse
+    -- * Response Lenses
+    , crsCacheSubnetGroup
+    , crsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateCacheSubnetGroup = CreateCacheSubnetGroup
-    { _ccsgCacheSubnetGroupDescription :: Text
-    , _ccsgCacheSubnetGroupName        :: Text
-    , _ccsgSubnetIds                   :: List "member" Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateCacheSubnetGroup' constructor.
+-- | Represents the input of a /CreateCacheSubnetGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createCacheSubnetGroup' smart constructor.
+data CreateCacheSubnetGroup = CreateCacheSubnetGroup'
+    { _ccsgCacheSubnetGroupName        :: !Text
+    , _ccsgCacheSubnetGroupDescription :: !Text
+    , _ccsgSubnetIds                   :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateCacheSubnetGroup' with the minimum fields required to make a request.
 --
--- * 'ccsgCacheSubnetGroupDescription' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'ccsgCacheSubnetGroupName' @::@ 'Text'
+-- * 'ccsgCacheSubnetGroupName'
 --
--- * 'ccsgSubnetIds' @::@ ['Text']
+-- * 'ccsgCacheSubnetGroupDescription'
 --
-createCacheSubnetGroup :: Text -- ^ 'ccsgCacheSubnetGroupName'
-                       -> Text -- ^ 'ccsgCacheSubnetGroupDescription'
-                       -> CreateCacheSubnetGroup
-createCacheSubnetGroup p1 p2 = CreateCacheSubnetGroup
-    { _ccsgCacheSubnetGroupName        = p1
-    , _ccsgCacheSubnetGroupDescription = p2
-    , _ccsgSubnetIds                   = mempty
+-- * 'ccsgSubnetIds'
+createCacheSubnetGroup
+    :: Text -- ^ 'ccsgCacheSubnetGroupName'
+    -> Text -- ^ 'ccsgCacheSubnetGroupDescription'
+    -> CreateCacheSubnetGroup
+createCacheSubnetGroup pCacheSubnetGroupName_ pCacheSubnetGroupDescription_ =
+    CreateCacheSubnetGroup'
+    { _ccsgCacheSubnetGroupName = pCacheSubnetGroupName_
+    , _ccsgCacheSubnetGroupDescription = pCacheSubnetGroupDescription_
+    , _ccsgSubnetIds = mempty
     }
 
--- | A description for the cache subnet group.
-ccsgCacheSubnetGroupDescription :: Lens' CreateCacheSubnetGroup Text
-ccsgCacheSubnetGroupDescription =
-    lens _ccsgCacheSubnetGroupDescription
-        (\s a -> s { _ccsgCacheSubnetGroupDescription = a })
-
--- | A name for the cache subnet group. This value is stored as a lowercase string.
+-- | A name for the cache subnet group. This value is stored as a lowercase
+-- string.
 --
 -- Constraints: Must contain no more than 255 alphanumeric characters or
 -- hyphens.
 --
 -- Example: 'mysubnetgroup'
 ccsgCacheSubnetGroupName :: Lens' CreateCacheSubnetGroup Text
-ccsgCacheSubnetGroupName =
-    lens _ccsgCacheSubnetGroupName
-        (\s a -> s { _ccsgCacheSubnetGroupName = a })
+ccsgCacheSubnetGroupName = lens _ccsgCacheSubnetGroupName (\ s a -> s{_ccsgCacheSubnetGroupName = a});
 
+-- | A description for the cache subnet group.
+ccsgCacheSubnetGroupDescription :: Lens' CreateCacheSubnetGroup Text
+ccsgCacheSubnetGroupDescription = lens _ccsgCacheSubnetGroupDescription (\ s a -> s{_ccsgCacheSubnetGroupDescription = a});
+
 -- | A list of VPC subnet IDs for the cache subnet group.
 ccsgSubnetIds :: Lens' CreateCacheSubnetGroup [Text]
-ccsgSubnetIds = lens _ccsgSubnetIds (\s a -> s { _ccsgSubnetIds = a }) . _List
-
-newtype CreateCacheSubnetGroupResponse = CreateCacheSubnetGroupResponse
-    { _ccsgrCacheSubnetGroup :: Maybe CacheSubnetGroup
-    } deriving (Eq, Read, Show)
+ccsgSubnetIds = lens _ccsgSubnetIds (\ s a -> s{_ccsgSubnetIds = a}) . _Coerce;
 
--- | 'CreateCacheSubnetGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ccsgrCacheSubnetGroup' @::@ 'Maybe' 'CacheSubnetGroup'
---
-createCacheSubnetGroupResponse :: CreateCacheSubnetGroupResponse
-createCacheSubnetGroupResponse = CreateCacheSubnetGroupResponse
-    { _ccsgrCacheSubnetGroup = Nothing
-    }
+instance AWSRequest CreateCacheSubnetGroup where
+        type Sv CreateCacheSubnetGroup = ElastiCache
+        type Rs CreateCacheSubnetGroup =
+             CreateCacheSubnetGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateCacheSubnetGroupResult"
+              (\ s h x ->
+                 CreateCacheSubnetGroupResponse' <$>
+                   (x .@? "CacheSubnetGroup") <*> (pure (fromEnum s)))
 
-ccsgrCacheSubnetGroup :: Lens' CreateCacheSubnetGroupResponse (Maybe CacheSubnetGroup)
-ccsgrCacheSubnetGroup =
-    lens _ccsgrCacheSubnetGroup (\s a -> s { _ccsgrCacheSubnetGroup = a })
+instance ToHeaders CreateCacheSubnetGroup where
+        toHeaders = const mempty
 
 instance ToPath CreateCacheSubnetGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateCacheSubnetGroup where
-    toQuery CreateCacheSubnetGroup{..} = mconcat
-        [ "CacheSubnetGroupDescription" =? _ccsgCacheSubnetGroupDescription
-        , "CacheSubnetGroupName"        =? _ccsgCacheSubnetGroupName
-        , "SubnetIds"                   =? _ccsgSubnetIds
-        ]
+        toQuery CreateCacheSubnetGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("CreateCacheSubnetGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSubnetGroupName" =: _ccsgCacheSubnetGroupName,
+               "CacheSubnetGroupDescription" =:
+                 _ccsgCacheSubnetGroupDescription,
+               "SubnetIds" =:
+                 toQueryList "SubnetIdentifier" _ccsgSubnetIds]
 
-instance ToHeaders CreateCacheSubnetGroup
+-- | /See:/ 'createCacheSubnetGroupResponse' smart constructor.
+data CreateCacheSubnetGroupResponse = CreateCacheSubnetGroupResponse'
+    { _crsCacheSubnetGroup :: !(Maybe CacheSubnetGroup)
+    , _crsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateCacheSubnetGroup where
-    type Sv CreateCacheSubnetGroup = ElastiCache
-    type Rs CreateCacheSubnetGroup = CreateCacheSubnetGroupResponse
+-- | Creates a value of 'CreateCacheSubnetGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crsCacheSubnetGroup'
+--
+-- * 'crsStatus'
+createCacheSubnetGroupResponse
+    :: Int -- ^ 'crsStatus'
+    -> CreateCacheSubnetGroupResponse
+createCacheSubnetGroupResponse pStatus_ =
+    CreateCacheSubnetGroupResponse'
+    { _crsCacheSubnetGroup = Nothing
+    , _crsStatus = pStatus_
+    }
 
-    request  = post "CreateCacheSubnetGroup"
-    response = xmlResponse
+-- | Undocumented member.
+crsCacheSubnetGroup :: Lens' CreateCacheSubnetGroupResponse (Maybe CacheSubnetGroup)
+crsCacheSubnetGroup = lens _crsCacheSubnetGroup (\ s a -> s{_crsCacheSubnetGroup = a});
 
-instance FromXML CreateCacheSubnetGroupResponse where
-    parseXML = withElement "CreateCacheSubnetGroupResult" $ \x -> CreateCacheSubnetGroupResponse
-        <$> x .@? "CacheSubnetGroup"
+-- | The response status code.
+crsStatus :: Lens' CreateCacheSubnetGroupResponse Int
+crsStatus = lens _crsStatus (\ s a -> s{_crsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateReplicationGroup.hs b/gen/Network/AWS/ElastiCache/CreateReplicationGroup.hs
--- a/gen/Network/AWS/ElastiCache/CreateReplicationGroup.hs
+++ b/gen/Network/AWS/ElastiCache/CreateReplicationGroup.hs
@@ -1,451 +1,499 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateReplicationGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateReplicationGroup/ action creates a replication group. A replication
--- group is a collection of cache clusters, where one of the cache clusters is a
--- read/write primary and the others are read-only replicas. Writes to the
--- primary are automatically propagated to the replicas.
+-- The /CreateReplicationGroup/ action creates a replication group. A
+-- replication group is a collection of cache clusters, where one of the
+-- cache clusters is a read\/write primary and the others are read-only
+-- replicas. Writes to the primary are automatically propagated to the
+-- replicas.
 --
 -- When you create a replication group, you must specify an existing cache
 -- cluster that is in the primary role. When the replication group has been
--- successfully created, you can add one or more read replica replicas to it, up
--- to a total of five read replicas.
+-- successfully created, you can add one or more read replica replicas to
+-- it, up to a total of five read replicas.
 --
--- Note: This action is valid only for Redis.
+-- __Note:__ This action is valid only for Redis.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html AWS API Reference> for CreateReplicationGroup.
 module Network.AWS.ElastiCache.CreateReplicationGroup
     (
-    -- * Request
-      CreateReplicationGroup
-    -- ** Request constructor
-    , createReplicationGroup
-    -- ** Request lenses
-    , crgAutoMinorVersionUpgrade
+    -- * Creating a Request
+      createReplicationGroup
+    , CreateReplicationGroup
+    -- * Request Lenses
     , crgAutomaticFailoverEnabled
     , crgCacheNodeType
+    , crgEngineVersion
+    , crgSecurityGroupIds
+    , crgAutoMinorVersionUpgrade
+    , crgSnapshotARNs
     , crgCacheParameterGroupName
-    , crgCacheSecurityGroupNames
-    , crgCacheSubnetGroupName
+    , crgSnapshotWindow
+    , crgPrimaryClusterId
     , crgEngine
-    , crgEngineVersion
-    , crgNotificationTopicArn
-    , crgNumCacheClusters
-    , crgPort
-    , crgPreferredCacheClusterAZs
     , crgPreferredMaintenanceWindow
-    , crgPrimaryClusterId
-    , crgReplicationGroupDescription
-    , crgReplicationGroupId
-    , crgSecurityGroupIds
-    , crgSnapshotArns
-    , crgSnapshotName
+    , crgCacheSubnetGroupName
     , crgSnapshotRetentionLimit
-    , crgSnapshotWindow
+    , crgSnapshotName
+    , crgPreferredCacheClusterAZs
+    , crgNumCacheClusters
+    , crgNotificationTopicARN
     , crgTags
+    , crgCacheSecurityGroupNames
+    , crgPort
+    , crgReplicationGroupId
+    , crgReplicationGroupDescription
 
-    -- * Response
-    , CreateReplicationGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createReplicationGroupResponse
-    -- ** Response lenses
-    , crgrReplicationGroup
+    , CreateReplicationGroupResponse
+    -- * Response Lenses
+    , crgrsReplicationGroup
+    , crgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateReplicationGroup = CreateReplicationGroup
-    { _crgAutoMinorVersionUpgrade     :: Maybe Bool
-    , _crgAutomaticFailoverEnabled    :: Maybe Bool
-    , _crgCacheNodeType               :: Maybe Text
-    , _crgCacheParameterGroupName     :: Maybe Text
-    , _crgCacheSecurityGroupNames     :: List "member" Text
-    , _crgCacheSubnetGroupName        :: Maybe Text
-    , _crgEngine                      :: Maybe Text
-    , _crgEngineVersion               :: Maybe Text
-    , _crgNotificationTopicArn        :: Maybe Text
-    , _crgNumCacheClusters            :: Maybe Int
-    , _crgPort                        :: Maybe Int
-    , _crgPreferredCacheClusterAZs    :: List "member" Text
-    , _crgPreferredMaintenanceWindow  :: Maybe Text
-    , _crgPrimaryClusterId            :: Maybe Text
-    , _crgReplicationGroupDescription :: Text
-    , _crgReplicationGroupId          :: Text
-    , _crgSecurityGroupIds            :: List "member" Text
-    , _crgSnapshotArns                :: List "member" Text
-    , _crgSnapshotName                :: Maybe Text
-    , _crgSnapshotRetentionLimit      :: Maybe Int
-    , _crgSnapshotWindow              :: Maybe Text
-    , _crgTags                        :: List "member" Tag
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateReplicationGroup' constructor.
+-- | Represents the input of a /CreateReplicationGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createReplicationGroup' smart constructor.
+data CreateReplicationGroup = CreateReplicationGroup'
+    { _crgAutomaticFailoverEnabled    :: !(Maybe Bool)
+    , _crgCacheNodeType               :: !(Maybe Text)
+    , _crgEngineVersion               :: !(Maybe Text)
+    , _crgSecurityGroupIds            :: !(Maybe [Text])
+    , _crgAutoMinorVersionUpgrade     :: !(Maybe Bool)
+    , _crgSnapshotARNs                :: !(Maybe [Text])
+    , _crgCacheParameterGroupName     :: !(Maybe Text)
+    , _crgSnapshotWindow              :: !(Maybe Text)
+    , _crgPrimaryClusterId            :: !(Maybe Text)
+    , _crgEngine                      :: !(Maybe Text)
+    , _crgPreferredMaintenanceWindow  :: !(Maybe Text)
+    , _crgCacheSubnetGroupName        :: !(Maybe Text)
+    , _crgSnapshotRetentionLimit      :: !(Maybe Int)
+    , _crgSnapshotName                :: !(Maybe Text)
+    , _crgPreferredCacheClusterAZs    :: !(Maybe [Text])
+    , _crgNumCacheClusters            :: !(Maybe Int)
+    , _crgNotificationTopicARN        :: !(Maybe Text)
+    , _crgTags                        :: !(Maybe [Tag])
+    , _crgCacheSecurityGroupNames     :: !(Maybe [Text])
+    , _crgPort                        :: !(Maybe Int)
+    , _crgReplicationGroupId          :: !Text
+    , _crgReplicationGroupDescription :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateReplicationGroup' with the minimum fields required to make a request.
 --
--- * 'crgAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'crgAutomaticFailoverEnabled' @::@ 'Maybe' 'Bool'
+-- * 'crgAutomaticFailoverEnabled'
 --
--- * 'crgCacheNodeType' @::@ 'Maybe' 'Text'
+-- * 'crgCacheNodeType'
 --
--- * 'crgCacheParameterGroupName' @::@ 'Maybe' 'Text'
+-- * 'crgEngineVersion'
 --
--- * 'crgCacheSecurityGroupNames' @::@ ['Text']
+-- * 'crgSecurityGroupIds'
 --
--- * 'crgCacheSubnetGroupName' @::@ 'Maybe' 'Text'
+-- * 'crgAutoMinorVersionUpgrade'
 --
--- * 'crgEngine' @::@ 'Maybe' 'Text'
+-- * 'crgSnapshotARNs'
 --
--- * 'crgEngineVersion' @::@ 'Maybe' 'Text'
+-- * 'crgCacheParameterGroupName'
 --
--- * 'crgNotificationTopicArn' @::@ 'Maybe' 'Text'
+-- * 'crgSnapshotWindow'
 --
--- * 'crgNumCacheClusters' @::@ 'Maybe' 'Int'
+-- * 'crgPrimaryClusterId'
 --
--- * 'crgPort' @::@ 'Maybe' 'Int'
+-- * 'crgEngine'
 --
--- * 'crgPreferredCacheClusterAZs' @::@ ['Text']
+-- * 'crgPreferredMaintenanceWindow'
 --
--- * 'crgPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+-- * 'crgCacheSubnetGroupName'
 --
--- * 'crgPrimaryClusterId' @::@ 'Maybe' 'Text'
+-- * 'crgSnapshotRetentionLimit'
 --
--- * 'crgReplicationGroupDescription' @::@ 'Text'
+-- * 'crgSnapshotName'
 --
--- * 'crgReplicationGroupId' @::@ 'Text'
+-- * 'crgPreferredCacheClusterAZs'
 --
--- * 'crgSecurityGroupIds' @::@ ['Text']
+-- * 'crgNumCacheClusters'
 --
--- * 'crgSnapshotArns' @::@ ['Text']
+-- * 'crgNotificationTopicARN'
 --
--- * 'crgSnapshotName' @::@ 'Maybe' 'Text'
+-- * 'crgTags'
 --
--- * 'crgSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
+-- * 'crgCacheSecurityGroupNames'
 --
--- * 'crgSnapshotWindow' @::@ 'Maybe' 'Text'
+-- * 'crgPort'
 --
--- * 'crgTags' @::@ ['Tag']
+-- * 'crgReplicationGroupId'
 --
-createReplicationGroup :: Text -- ^ 'crgReplicationGroupId'
-                       -> Text -- ^ 'crgReplicationGroupDescription'
-                       -> CreateReplicationGroup
-createReplicationGroup p1 p2 = CreateReplicationGroup
-    { _crgReplicationGroupId          = p1
-    , _crgReplicationGroupDescription = p2
-    , _crgPrimaryClusterId            = Nothing
-    , _crgAutomaticFailoverEnabled    = Nothing
-    , _crgNumCacheClusters            = Nothing
-    , _crgPreferredCacheClusterAZs    = mempty
-    , _crgCacheNodeType               = Nothing
-    , _crgEngine                      = Nothing
-    , _crgEngineVersion               = Nothing
-    , _crgCacheParameterGroupName     = Nothing
-    , _crgCacheSubnetGroupName        = Nothing
-    , _crgCacheSecurityGroupNames     = mempty
-    , _crgSecurityGroupIds            = mempty
-    , _crgTags                        = mempty
-    , _crgSnapshotArns                = mempty
-    , _crgSnapshotName                = Nothing
-    , _crgPreferredMaintenanceWindow  = Nothing
-    , _crgPort                        = Nothing
-    , _crgNotificationTopicArn        = Nothing
-    , _crgAutoMinorVersionUpgrade     = Nothing
-    , _crgSnapshotRetentionLimit      = Nothing
-    , _crgSnapshotWindow              = Nothing
+-- * 'crgReplicationGroupDescription'
+createReplicationGroup
+    :: Text -- ^ 'crgReplicationGroupId'
+    -> Text -- ^ 'crgReplicationGroupDescription'
+    -> CreateReplicationGroup
+createReplicationGroup pReplicationGroupId_ pReplicationGroupDescription_ =
+    CreateReplicationGroup'
+    { _crgAutomaticFailoverEnabled = Nothing
+    , _crgCacheNodeType = Nothing
+    , _crgEngineVersion = Nothing
+    , _crgSecurityGroupIds = Nothing
+    , _crgAutoMinorVersionUpgrade = Nothing
+    , _crgSnapshotARNs = Nothing
+    , _crgCacheParameterGroupName = Nothing
+    , _crgSnapshotWindow = Nothing
+    , _crgPrimaryClusterId = Nothing
+    , _crgEngine = Nothing
+    , _crgPreferredMaintenanceWindow = Nothing
+    , _crgCacheSubnetGroupName = Nothing
+    , _crgSnapshotRetentionLimit = Nothing
+    , _crgSnapshotName = Nothing
+    , _crgPreferredCacheClusterAZs = Nothing
+    , _crgNumCacheClusters = Nothing
+    , _crgNotificationTopicARN = Nothing
+    , _crgTags = Nothing
+    , _crgCacheSecurityGroupNames = Nothing
+    , _crgPort = Nothing
+    , _crgReplicationGroupId = pReplicationGroupId_
+    , _crgReplicationGroupDescription = pReplicationGroupDescription_
     }
 
--- | This parameter is currently disabled.
-crgAutoMinorVersionUpgrade :: Lens' CreateReplicationGroup (Maybe Bool)
-crgAutoMinorVersionUpgrade =
-    lens _crgAutoMinorVersionUpgrade
-        (\s a -> s { _crgAutoMinorVersionUpgrade = a })
-
 -- | Specifies whether a read-only replica will be automatically promoted to
--- read/write primary if the existing primary fails.
+-- read\/write primary if the existing primary fails.
 --
--- If 'true', Multi-AZ is enabled for this replication group. If 'false', Multi-AZ
--- is disabled for this replication group.
+-- If 'true', Multi-AZ is enabled for this replication group. If 'false',
+-- Multi-AZ is disabled for this replication group.
 --
 -- Default: false
 --
 -- ElastiCache Multi-AZ replication groups is not supported on:
 --
--- Redis versions earlier than 2.8.6. T1 and T2 cache node types.
+-- -   Redis versions earlier than 2.8.6.
+-- -   T1 and T2 cache node types.
 crgAutomaticFailoverEnabled :: Lens' CreateReplicationGroup (Maybe Bool)
-crgAutomaticFailoverEnabled =
-    lens _crgAutomaticFailoverEnabled
-        (\s a -> s { _crgAutomaticFailoverEnabled = a })
+crgAutomaticFailoverEnabled = lens _crgAutomaticFailoverEnabled (\ s a -> s{_crgAutomaticFailoverEnabled = a});
 
 -- | The compute and memory capacity of the nodes in the node group.
 --
 -- Valid node types are as follows:
 --
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
 --
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-crgCacheNodeType :: Lens' CreateReplicationGroup (Maybe Text)
-crgCacheNodeType = lens _crgCacheNodeType (\s a -> s { _crgCacheNodeType = a })
-
--- | The name of the parameter group to associate with this replication group. If
--- this argument is omitted, the default cache parameter group for the specified
--- engine is used.
-crgCacheParameterGroupName :: Lens' CreateReplicationGroup (Maybe Text)
-crgCacheParameterGroupName =
-    lens _crgCacheParameterGroupName
-        (\s a -> s { _crgCacheParameterGroupName = a })
-
--- | A list of cache security group names to associate with this replication group.
-crgCacheSecurityGroupNames :: Lens' CreateReplicationGroup [Text]
-crgCacheSecurityGroupNames =
-    lens _crgCacheSecurityGroupNames
-        (\s a -> s { _crgCacheSecurityGroupNames = a })
-            . _List
-
--- | The name of the cache subnet group to be used for the replication group.
-crgCacheSubnetGroupName :: Lens' CreateReplicationGroup (Maybe Text)
-crgCacheSubnetGroupName =
-    lens _crgCacheSubnetGroupName (\s a -> s { _crgCacheSubnetGroupName = a })
-
--- | The name of the cache engine to be used for the cache clusters in this
--- replication group.
+-- __Notes:__
 --
--- Default: redis
-crgEngine :: Lens' CreateReplicationGroup (Maybe Text)
-crgEngine = lens _crgEngine (\s a -> s { _crgEngine = a })
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+crgCacheNodeType :: Lens' CreateReplicationGroup (Maybe Text)
+crgCacheNodeType = lens _crgCacheNodeType (\ s a -> s{_crgCacheNodeType = a});
 
--- | The version number of the cache engine to be used for the cache clusters in
--- this replication group. To view the supported cache engine versions, use the /DescribeCacheEngineVersions/ action.
+-- | The version number of the cache engine to be used for the cache clusters
+-- in this replication group. To view the supported cache engine versions,
+-- use the /DescribeCacheEngineVersions/ action.
 crgEngineVersion :: Lens' CreateReplicationGroup (Maybe Text)
-crgEngineVersion = lens _crgEngineVersion (\s a -> s { _crgEngineVersion = a })
+crgEngineVersion = lens _crgEngineVersion (\ s a -> s{_crgEngineVersion = a});
 
--- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
--- (SNS) topic to which notifications will be sent.
+-- | One or more Amazon VPC security groups associated with this replication
+-- group.
 --
--- The Amazon SNS topic owner must be the same as the cache cluster owner.
-crgNotificationTopicArn :: Lens' CreateReplicationGroup (Maybe Text)
-crgNotificationTopicArn =
-    lens _crgNotificationTopicArn (\s a -> s { _crgNotificationTopicArn = a })
+-- Use this parameter only when you are creating a replication group in an
+-- Amazon Virtual Private Cloud (VPC).
+crgSecurityGroupIds :: Lens' CreateReplicationGroup [Text]
+crgSecurityGroupIds = lens _crgSecurityGroupIds (\ s a -> s{_crgSecurityGroupIds = a}) . _Default . _Coerce;
 
--- | The number of cache clusters this replication group will initially have.
+-- | This parameter is currently disabled.
+crgAutoMinorVersionUpgrade :: Lens' CreateReplicationGroup (Maybe Bool)
+crgAutoMinorVersionUpgrade = lens _crgAutoMinorVersionUpgrade (\ s a -> s{_crgAutoMinorVersionUpgrade = a});
+
+-- | A single-element string list containing an Amazon Resource Name (ARN)
+-- that uniquely identifies a Redis RDB snapshot file stored in Amazon S3.
+-- The snapshot file will be used to populate the node group. The Amazon S3
+-- object name in the ARN cannot contain any commas.
 --
--- If /Multi-AZ/ is 'enabled', the value of this parameter must be at least 2.
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
 --
--- The maximum permitted value for /NumCacheClusters/ is 6 (primary plus 5
--- replicas). If you need to exceed this limit, please fill out the ElastiCache
--- Limit Increase Request form at <http://aws.amazon.com/contact-us/elasticache-node-limit-request http://aws.amazon.com/contact-us/elasticache-node-limit-request>.
-crgNumCacheClusters :: Lens' CreateReplicationGroup (Maybe Int)
-crgNumCacheClusters =
-    lens _crgNumCacheClusters (\s a -> s { _crgNumCacheClusters = a })
+-- Example of an Amazon S3 ARN: 'arn:aws:s3:::my_bucket\/snapshot1.rdb'
+crgSnapshotARNs :: Lens' CreateReplicationGroup [Text]
+crgSnapshotARNs = lens _crgSnapshotARNs (\ s a -> s{_crgSnapshotARNs = a}) . _Default . _Coerce;
 
--- | The port number on which each member of the replication group will accept
--- connections.
-crgPort :: Lens' CreateReplicationGroup (Maybe Int)
-crgPort = lens _crgPort (\s a -> s { _crgPort = a })
+-- | The name of the parameter group to associate with this replication
+-- group. If this argument is omitted, the default cache parameter group
+-- for the specified engine is used.
+crgCacheParameterGroupName :: Lens' CreateReplicationGroup (Maybe Text)
+crgCacheParameterGroupName = lens _crgCacheParameterGroupName (\ s a -> s{_crgCacheParameterGroupName = a});
 
--- | A list of EC2 availability zones in which the replication group's cache
--- clusters will be created. The order of the availability zones in the list is
--- not important.
---
--- If you are creating your replication group in an Amazon VPC (recommended),
--- you can only locate cache clusters in availability zones associated with the
--- subnets in the selected subnet group. The number of availability zones listed
--- must equal the value of /NumCacheClusters/.
+-- | The daily time range (in UTC) during which ElastiCache will begin taking
+-- a daily snapshot of your node group.
 --
--- Default: system chosen availability zones.
+-- Example: '05:00-09:00'
 --
--- Example: One Redis cache cluster in each of three availability zones.
--- PreferredAvailabilityZones.member.1=us-west-2a
--- PreferredAvailabilityZones.member.2=us-west-2c
--- PreferredAvailabilityZones.member.3=us-west-2c
-crgPreferredCacheClusterAZs :: Lens' CreateReplicationGroup [Text]
-crgPreferredCacheClusterAZs =
-    lens _crgPreferredCacheClusterAZs
-        (\s a -> s { _crgPreferredCacheClusterAZs = a })
-            . _List
-
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
+-- If you do not specify this parameter, then ElastiCache will
+-- automatically choose an appropriate time range.
 --
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
-crgPreferredMaintenanceWindow :: Lens' CreateReplicationGroup (Maybe Text)
-crgPreferredMaintenanceWindow =
-    lens _crgPreferredMaintenanceWindow
-        (\s a -> s { _crgPreferredMaintenanceWindow = a })
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
+crgSnapshotWindow :: Lens' CreateReplicationGroup (Maybe Text)
+crgSnapshotWindow = lens _crgSnapshotWindow (\ s a -> s{_crgSnapshotWindow = a});
 
--- | The identifier of the cache cluster that will serve as the primary for this
--- replication group. This cache cluster must already exist and have a status of /available/.
+-- | The identifier of the cache cluster that will serve as the primary for
+-- this replication group. This cache cluster must already exist and have a
+-- status of /available/.
 --
 -- This parameter is not required if /NumCacheClusters/ is specified.
 crgPrimaryClusterId :: Lens' CreateReplicationGroup (Maybe Text)
-crgPrimaryClusterId =
-    lens _crgPrimaryClusterId (\s a -> s { _crgPrimaryClusterId = a })
+crgPrimaryClusterId = lens _crgPrimaryClusterId (\ s a -> s{_crgPrimaryClusterId = a});
 
--- | A user-created description for the replication group.
-crgReplicationGroupDescription :: Lens' CreateReplicationGroup Text
-crgReplicationGroupDescription =
-    lens _crgReplicationGroupDescription
-        (\s a -> s { _crgReplicationGroupDescription = a })
+-- | The name of the cache engine to be used for the cache clusters in this
+-- replication group.
+--
+-- Default: redis
+crgEngine :: Lens' CreateReplicationGroup (Maybe Text)
+crgEngine = lens _crgEngine (\ s a -> s{_crgEngine = a});
 
--- | The replication group identifier. This parameter is stored as a lowercase
--- string.
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
 --
--- Constraints:
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
 --
--- A name must contain from 1 to 20 alphanumeric characters or hyphens. The
--- first character must be a letter. A name cannot end with a hyphen or contain
--- two consecutive hyphens.
-crgReplicationGroupId :: Lens' CreateReplicationGroup Text
-crgReplicationGroupId =
-    lens _crgReplicationGroupId (\s a -> s { _crgReplicationGroupId = a })
+-- Example: 'sun:05:00-sun:09:00'
+crgPreferredMaintenanceWindow :: Lens' CreateReplicationGroup (Maybe Text)
+crgPreferredMaintenanceWindow = lens _crgPreferredMaintenanceWindow (\ s a -> s{_crgPreferredMaintenanceWindow = a});
 
--- | One or more Amazon VPC security groups associated with this replication group.
---
--- Use this parameter only when you are creating a replication group in an
--- Amazon Virtual Private Cloud (VPC).
-crgSecurityGroupIds :: Lens' CreateReplicationGroup [Text]
-crgSecurityGroupIds =
-    lens _crgSecurityGroupIds (\s a -> s { _crgSecurityGroupIds = a })
-        . _List
+-- | The name of the cache subnet group to be used for the replication group.
+crgCacheSubnetGroupName :: Lens' CreateReplicationGroup (Maybe Text)
+crgCacheSubnetGroupName = lens _crgCacheSubnetGroupName (\ s a -> s{_crgCacheSubnetGroupName = a});
 
--- | A single-element string list containing an Amazon Resource Name (ARN) that
--- uniquely identifies a Redis RDB snapshot file stored in Amazon S3. The
--- snapshot file will be used to populate the node group. The Amazon S3 object
--- name in the ARN cannot contain any commas.
+-- | The number of days for which ElastiCache will retain automatic snapshots
+-- before deleting them. For example, if you set 'SnapshotRetentionLimit'
+-- to 5, then a snapshot that was taken today will be retained for 5 days
+-- before being deleted.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
 --
--- Example of an Amazon S3 ARN: 'arn:aws:s3:::my_bucket/snapshot1.rdb'
-crgSnapshotArns :: Lens' CreateReplicationGroup [Text]
-crgSnapshotArns = lens _crgSnapshotArns (\s a -> s { _crgSnapshotArns = a }) . _List
+-- Default: 0 (i.e., automatic backups are disabled for this cache
+-- cluster).
+crgSnapshotRetentionLimit :: Lens' CreateReplicationGroup (Maybe Int)
+crgSnapshotRetentionLimit = lens _crgSnapshotRetentionLimit (\ s a -> s{_crgSnapshotRetentionLimit = a});
 
--- | The name of a snapshot from which to restore data into the new node group.
--- The snapshot status changes to 'restoring' while the new node group is being
--- created.
+-- | The name of a snapshot from which to restore data into the new node
+-- group. The snapshot status changes to 'restoring' while the new node
+-- group is being created.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- __Note:__ This parameter is only valid if the 'Engine' parameter is
+-- 'redis'.
 crgSnapshotName :: Lens' CreateReplicationGroup (Maybe Text)
-crgSnapshotName = lens _crgSnapshotName (\s a -> s { _crgSnapshotName = a })
+crgSnapshotName = lens _crgSnapshotName (\ s a -> s{_crgSnapshotName = a});
 
--- | The number of days for which ElastiCache will retain automatic snapshots
--- before deleting them. For example, if you set 'SnapshotRetentionLimit' to 5,
--- then a snapshot that was taken today will be retained for 5 days before being
--- deleted.
+-- | A list of EC2 availability zones in which the replication group\'s cache
+-- clusters will be created. The order of the availability zones in the
+-- list is not important.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
+-- If you are creating your replication group in an Amazon VPC
+-- (recommended), you can only locate cache clusters in availability zones
+-- associated with the subnets in the selected subnet group.
 --
--- Default: 0 (i.e., automatic backups are disabled for this cache cluster).
-crgSnapshotRetentionLimit :: Lens' CreateReplicationGroup (Maybe Int)
-crgSnapshotRetentionLimit =
-    lens _crgSnapshotRetentionLimit
-        (\s a -> s { _crgSnapshotRetentionLimit = a })
+-- The number of availability zones listed must equal the value of
+-- /NumCacheClusters/.
+--
+-- Default: system chosen availability zones.
+--
+-- Example: One Redis cache cluster in each of three availability zones.
+-- PreferredAvailabilityZones.member.1=us-west-2a
+-- PreferredAvailabilityZones.member.2=us-west-2c
+-- PreferredAvailabilityZones.member.3=us-west-2c
+crgPreferredCacheClusterAZs :: Lens' CreateReplicationGroup [Text]
+crgPreferredCacheClusterAZs = lens _crgPreferredCacheClusterAZs (\ s a -> s{_crgPreferredCacheClusterAZs = a}) . _Default . _Coerce;
 
--- | The daily time range (in UTC) during which ElastiCache will begin taking a
--- daily snapshot of your node group.
+-- | The number of cache clusters this replication group will initially have.
 --
--- Example: '05:00-09:00'
+-- If /Multi-AZ/ is 'enabled', the value of this parameter must be at least
+-- 2.
 --
--- If you do not specify this parameter, then ElastiCache will automatically
--- choose an appropriate time range.
+-- The maximum permitted value for /NumCacheClusters/ is 6 (primary plus 5
+-- replicas). If you need to exceed this limit, please fill out the
+-- ElastiCache Limit Increase Request form at
+-- <http://aws.amazon.com/contact-us/elasticache-node-limit-request>.
+crgNumCacheClusters :: Lens' CreateReplicationGroup (Maybe Int)
+crgNumCacheClusters = lens _crgNumCacheClusters (\ s a -> s{_crgNumCacheClusters = a});
+
+-- | The Amazon Resource Name (ARN) of the Amazon Simple Notification Service
+-- (SNS) topic to which notifications will be sent.
 --
--- Note: This parameter is only valid if the 'Engine' parameter is 'redis'.
-crgSnapshotWindow :: Lens' CreateReplicationGroup (Maybe Text)
-crgSnapshotWindow =
-    lens _crgSnapshotWindow (\s a -> s { _crgSnapshotWindow = a })
+-- The Amazon SNS topic owner must be the same as the cache cluster owner.
+crgNotificationTopicARN :: Lens' CreateReplicationGroup (Maybe Text)
+crgNotificationTopicARN = lens _crgNotificationTopicARN (\ s a -> s{_crgNotificationTopicARN = a});
 
 -- | A list of cost allocation tags to be added to this resource. A tag is a
 -- key-value pair. A tag key must be accompanied by a tag value.
 crgTags :: Lens' CreateReplicationGroup [Tag]
-crgTags = lens _crgTags (\s a -> s { _crgTags = a }) . _List
+crgTags = lens _crgTags (\ s a -> s{_crgTags = a}) . _Default . _Coerce;
 
-newtype CreateReplicationGroupResponse = CreateReplicationGroupResponse
-    { _crgrReplicationGroup :: Maybe ReplicationGroup
-    } deriving (Eq, Read, Show)
+-- | A list of cache security group names to associate with this replication
+-- group.
+crgCacheSecurityGroupNames :: Lens' CreateReplicationGroup [Text]
+crgCacheSecurityGroupNames = lens _crgCacheSecurityGroupNames (\ s a -> s{_crgCacheSecurityGroupNames = a}) . _Default . _Coerce;
 
--- | 'CreateReplicationGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
+-- | The port number on which each member of the replication group will
+-- accept connections.
+crgPort :: Lens' CreateReplicationGroup (Maybe Int)
+crgPort = lens _crgPort (\ s a -> s{_crgPort = a});
+
+-- | The replication group identifier. This parameter is stored as a
+-- lowercase string.
 --
--- * 'crgrReplicationGroup' @::@ 'Maybe' 'ReplicationGroup'
+-- Constraints:
 --
-createReplicationGroupResponse :: CreateReplicationGroupResponse
-createReplicationGroupResponse = CreateReplicationGroupResponse
-    { _crgrReplicationGroup = Nothing
-    }
+-- -   A name must contain from 1 to 20 alphanumeric characters or hyphens.
+-- -   The first character must be a letter.
+-- -   A name cannot end with a hyphen or contain two consecutive hyphens.
+crgReplicationGroupId :: Lens' CreateReplicationGroup Text
+crgReplicationGroupId = lens _crgReplicationGroupId (\ s a -> s{_crgReplicationGroupId = a});
 
-crgrReplicationGroup :: Lens' CreateReplicationGroupResponse (Maybe ReplicationGroup)
-crgrReplicationGroup =
-    lens _crgrReplicationGroup (\s a -> s { _crgrReplicationGroup = a })
+-- | A user-created description for the replication group.
+crgReplicationGroupDescription :: Lens' CreateReplicationGroup Text
+crgReplicationGroupDescription = lens _crgReplicationGroupDescription (\ s a -> s{_crgReplicationGroupDescription = a});
 
+instance AWSRequest CreateReplicationGroup where
+        type Sv CreateReplicationGroup = ElastiCache
+        type Rs CreateReplicationGroup =
+             CreateReplicationGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateReplicationGroupResult"
+              (\ s h x ->
+                 CreateReplicationGroupResponse' <$>
+                   (x .@? "ReplicationGroup") <*> (pure (fromEnum s)))
+
+instance ToHeaders CreateReplicationGroup where
+        toHeaders = const mempty
+
 instance ToPath CreateReplicationGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateReplicationGroup where
-    toQuery CreateReplicationGroup{..} = mconcat
-        [ "AutoMinorVersionUpgrade"     =? _crgAutoMinorVersionUpgrade
-        , "AutomaticFailoverEnabled"    =? _crgAutomaticFailoverEnabled
-        , "CacheNodeType"               =? _crgCacheNodeType
-        , "CacheParameterGroupName"     =? _crgCacheParameterGroupName
-        , "CacheSecurityGroupNames"     =? _crgCacheSecurityGroupNames
-        , "CacheSubnetGroupName"        =? _crgCacheSubnetGroupName
-        , "Engine"                      =? _crgEngine
-        , "EngineVersion"               =? _crgEngineVersion
-        , "NotificationTopicArn"        =? _crgNotificationTopicArn
-        , "NumCacheClusters"            =? _crgNumCacheClusters
-        , "Port"                        =? _crgPort
-        , "PreferredCacheClusterAZs"    =? _crgPreferredCacheClusterAZs
-        , "PreferredMaintenanceWindow"  =? _crgPreferredMaintenanceWindow
-        , "PrimaryClusterId"            =? _crgPrimaryClusterId
-        , "ReplicationGroupDescription" =? _crgReplicationGroupDescription
-        , "ReplicationGroupId"          =? _crgReplicationGroupId
-        , "SecurityGroupIds"            =? _crgSecurityGroupIds
-        , "SnapshotArns"                =? _crgSnapshotArns
-        , "SnapshotName"                =? _crgSnapshotName
-        , "SnapshotRetentionLimit"      =? _crgSnapshotRetentionLimit
-        , "SnapshotWindow"              =? _crgSnapshotWindow
-        , "Tags"                        =? _crgTags
-        ]
+        toQuery CreateReplicationGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("CreateReplicationGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "AutomaticFailoverEnabled" =:
+                 _crgAutomaticFailoverEnabled,
+               "CacheNodeType" =: _crgCacheNodeType,
+               "EngineVersion" =: _crgEngineVersion,
+               "SecurityGroupIds" =:
+                 toQuery
+                   (toQueryList "SecurityGroupId" <$>
+                      _crgSecurityGroupIds),
+               "AutoMinorVersionUpgrade" =:
+                 _crgAutoMinorVersionUpgrade,
+               "SnapshotArns" =:
+                 toQuery
+                   (toQueryList "SnapshotArn" <$> _crgSnapshotARNs),
+               "CacheParameterGroupName" =:
+                 _crgCacheParameterGroupName,
+               "SnapshotWindow" =: _crgSnapshotWindow,
+               "PrimaryClusterId" =: _crgPrimaryClusterId,
+               "Engine" =: _crgEngine,
+               "PreferredMaintenanceWindow" =:
+                 _crgPreferredMaintenanceWindow,
+               "CacheSubnetGroupName" =: _crgCacheSubnetGroupName,
+               "SnapshotRetentionLimit" =:
+                 _crgSnapshotRetentionLimit,
+               "SnapshotName" =: _crgSnapshotName,
+               "PreferredCacheClusterAZs" =:
+                 toQuery
+                   (toQueryList "AvailabilityZone" <$>
+                      _crgPreferredCacheClusterAZs),
+               "NumCacheClusters" =: _crgNumCacheClusters,
+               "NotificationTopicArn" =: _crgNotificationTopicARN,
+               "Tags" =: toQuery (toQueryList "Tag" <$> _crgTags),
+               "CacheSecurityGroupNames" =:
+                 toQuery
+                   (toQueryList "CacheSecurityGroupName" <$>
+                      _crgCacheSecurityGroupNames),
+               "Port" =: _crgPort,
+               "ReplicationGroupId" =: _crgReplicationGroupId,
+               "ReplicationGroupDescription" =:
+                 _crgReplicationGroupDescription]
 
-instance ToHeaders CreateReplicationGroup
+-- | /See:/ 'createReplicationGroupResponse' smart constructor.
+data CreateReplicationGroupResponse = CreateReplicationGroupResponse'
+    { _crgrsReplicationGroup :: !(Maybe ReplicationGroup)
+    , _crgrsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateReplicationGroup where
-    type Sv CreateReplicationGroup = ElastiCache
-    type Rs CreateReplicationGroup = CreateReplicationGroupResponse
+-- | Creates a value of 'CreateReplicationGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crgrsReplicationGroup'
+--
+-- * 'crgrsStatus'
+createReplicationGroupResponse
+    :: Int -- ^ 'crgrsStatus'
+    -> CreateReplicationGroupResponse
+createReplicationGroupResponse pStatus_ =
+    CreateReplicationGroupResponse'
+    { _crgrsReplicationGroup = Nothing
+    , _crgrsStatus = pStatus_
+    }
 
-    request  = post "CreateReplicationGroup"
-    response = xmlResponse
+-- | Undocumented member.
+crgrsReplicationGroup :: Lens' CreateReplicationGroupResponse (Maybe ReplicationGroup)
+crgrsReplicationGroup = lens _crgrsReplicationGroup (\ s a -> s{_crgrsReplicationGroup = a});
 
-instance FromXML CreateReplicationGroupResponse where
-    parseXML = withElement "CreateReplicationGroupResult" $ \x -> CreateReplicationGroupResponse
-        <$> x .@? "ReplicationGroup"
+-- | The response status code.
+crgrsStatus :: Lens' CreateReplicationGroupResponse Int
+crgrsStatus = lens _crgrsStatus (\ s a -> s{_crgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/CreateSnapshot.hs b/gen/Network/AWS/ElastiCache/CreateSnapshot.hs
--- a/gen/Network/AWS/ElastiCache/CreateSnapshot.hs
+++ b/gen/Network/AWS/ElastiCache/CreateSnapshot.hs
@@ -1,120 +1,134 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.CreateSnapshot
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- License     : This Source Code Form is subject to the terms of
---               the Mozilla Public License, v. 2.0.
---               A copy of the MPL can be found in the LICENSE file or
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /CreateSnapshot/ action creates a copy of an entire cache cluster at a
--- specific moment in time.
+-- The /CreateSnapshot/ action creates a copy of an entire cache cluster at
+-- a specific moment in time.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateSnapshot.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateSnapshot.html AWS API Reference> for CreateSnapshot.
 module Network.AWS.ElastiCache.CreateSnapshot
     (
-    -- * Request
-      CreateSnapshot
-    -- ** Request constructor
-    , createSnapshot
-    -- ** Request lenses
+    -- * Creating a Request
+      createSnapshot
+    , CreateSnapshot
+    -- * Request Lenses
     , csCacheClusterId
     , csSnapshotName
 
-    -- * Response
-    , CreateSnapshotResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , createSnapshotResponse
-    -- ** Response lenses
-    , csr1Snapshot
+    , CreateSnapshotResponse
+    -- * Response Lenses
+    , crersSnapshot
+    , crersStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data CreateSnapshot = CreateSnapshot
-    { _csCacheClusterId :: Text
-    , _csSnapshotName   :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'CreateSnapshot' constructor.
+-- | Represents the input of a /CreateSnapshot/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'createSnapshot' smart constructor.
+data CreateSnapshot = CreateSnapshot'
+    { _csCacheClusterId :: !Text
+    , _csSnapshotName   :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CreateSnapshot' with the minimum fields required to make a request.
 --
--- * 'csCacheClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'csSnapshotName' @::@ 'Text'
+-- * 'csCacheClusterId'
 --
-createSnapshot :: Text -- ^ 'csCacheClusterId'
-               -> Text -- ^ 'csSnapshotName'
-               -> CreateSnapshot
-createSnapshot p1 p2 = CreateSnapshot
-    { _csCacheClusterId = p1
-    , _csSnapshotName   = p2
+-- * 'csSnapshotName'
+createSnapshot
+    :: Text -- ^ 'csCacheClusterId'
+    -> Text -- ^ 'csSnapshotName'
+    -> CreateSnapshot
+createSnapshot pCacheClusterId_ pSnapshotName_ =
+    CreateSnapshot'
+    { _csCacheClusterId = pCacheClusterId_
+    , _csSnapshotName = pSnapshotName_
     }
 
--- | The identifier of an existing cache cluster. The snapshot will be created
--- from this cache cluster.
+-- | The identifier of an existing cache cluster. The snapshot will be
+-- created from this cache cluster.
 csCacheClusterId :: Lens' CreateSnapshot Text
-csCacheClusterId = lens _csCacheClusterId (\s a -> s { _csCacheClusterId = a })
+csCacheClusterId = lens _csCacheClusterId (\ s a -> s{_csCacheClusterId = a});
 
 -- | A name for the snapshot being created.
 csSnapshotName :: Lens' CreateSnapshot Text
-csSnapshotName = lens _csSnapshotName (\s a -> s { _csSnapshotName = a })
-
-newtype CreateSnapshotResponse = CreateSnapshotResponse
-    { _csr1Snapshot :: Maybe Snapshot
-    } deriving (Eq, Read, Show)
+csSnapshotName = lens _csSnapshotName (\ s a -> s{_csSnapshotName = a});
 
--- | 'CreateSnapshotResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csr1Snapshot' @::@ 'Maybe' 'Snapshot'
---
-createSnapshotResponse :: CreateSnapshotResponse
-createSnapshotResponse = CreateSnapshotResponse
-    { _csr1Snapshot = Nothing
-    }
+instance AWSRequest CreateSnapshot where
+        type Sv CreateSnapshot = ElastiCache
+        type Rs CreateSnapshot = CreateSnapshotResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "CreateSnapshotResult"
+              (\ s h x ->
+                 CreateSnapshotResponse' <$>
+                   (x .@? "Snapshot") <*> (pure (fromEnum s)))
 
-csr1Snapshot :: Lens' CreateSnapshotResponse (Maybe Snapshot)
-csr1Snapshot = lens _csr1Snapshot (\s a -> s { _csr1Snapshot = a })
+instance ToHeaders CreateSnapshot where
+        toHeaders = const mempty
 
 instance ToPath CreateSnapshot where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery CreateSnapshot where
-    toQuery CreateSnapshot{..} = mconcat
-        [ "CacheClusterId" =? _csCacheClusterId
-        , "SnapshotName"   =? _csSnapshotName
-        ]
+        toQuery CreateSnapshot'{..}
+          = mconcat
+              ["Action" =: ("CreateSnapshot" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheClusterId" =: _csCacheClusterId,
+               "SnapshotName" =: _csSnapshotName]
 
-instance ToHeaders CreateSnapshot
+-- | /See:/ 'createSnapshotResponse' smart constructor.
+data CreateSnapshotResponse = CreateSnapshotResponse'
+    { _crersSnapshot :: !(Maybe Snapshot)
+    , _crersStatus   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest CreateSnapshot where
-    type Sv CreateSnapshot = ElastiCache
-    type Rs CreateSnapshot = CreateSnapshotResponse
+-- | Creates a value of 'CreateSnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'crersSnapshot'
+--
+-- * 'crersStatus'
+createSnapshotResponse
+    :: Int -- ^ 'crersStatus'
+    -> CreateSnapshotResponse
+createSnapshotResponse pStatus_ =
+    CreateSnapshotResponse'
+    { _crersSnapshot = Nothing
+    , _crersStatus = pStatus_
+    }
 
-    request  = post "CreateSnapshot"
-    response = xmlResponse
+-- | Undocumented member.
+crersSnapshot :: Lens' CreateSnapshotResponse (Maybe Snapshot)
+crersSnapshot = lens _crersSnapshot (\ s a -> s{_crersSnapshot = a});
 
-instance FromXML CreateSnapshotResponse where
-    parseXML = withElement "CreateSnapshotResult" $ \x -> CreateSnapshotResponse
-        <$> x .@? "Snapshot"
+-- | The response status code.
+crersStatus :: Lens' CreateSnapshotResponse Int
+crersStatus = lens _crersStatus (\ s a -> s{_crersStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DeleteCacheCluster.hs b/gen/Network/AWS/ElastiCache/DeleteCacheCluster.hs
--- a/gen/Network/AWS/ElastiCache/DeleteCacheCluster.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteCacheCluster.hs
@@ -1,129 +1,143 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteCacheCluster
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteCacheCluster/ action deletes a previously provisioned cache cluster. /DeleteCacheCluster/ deletes all associated cache nodes, node endpoints and the
--- cache cluster itself. When you receive a successful response from this
--- action, Amazon ElastiCache immediately begins deleting the cache cluster; you
--- cannot cancel or revert this action.
+-- The /DeleteCacheCluster/ action deletes a previously provisioned cache
+-- cluster. /DeleteCacheCluster/ deletes all associated cache nodes, node
+-- endpoints and the cache cluster itself. When you receive a successful
+-- response from this action, Amazon ElastiCache immediately begins
+-- deleting the cache cluster; you cannot cancel or revert this action.
 --
 -- This API cannot be used to delete a cache cluster that is the last read
 -- replica of a replication group that has Multi-AZ mode enabled.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheCluster.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheCluster.html AWS API Reference> for DeleteCacheCluster.
 module Network.AWS.ElastiCache.DeleteCacheCluster
     (
-    -- * Request
-      DeleteCacheCluster
-    -- ** Request constructor
-    , deleteCacheCluster
-    -- ** Request lenses
-    , dccCacheClusterId
+    -- * Creating a Request
+      deleteCacheCluster
+    , DeleteCacheCluster
+    -- * Request Lenses
     , dccFinalSnapshotIdentifier
+    , dccCacheClusterId
 
-    -- * Response
-    , DeleteCacheClusterResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteCacheClusterResponse
-    -- ** Response lenses
-    , dccrCacheCluster
+    , DeleteCacheClusterResponse
+    -- * Response Lenses
+    , dccrsCacheCluster
+    , dccrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DeleteCacheCluster = DeleteCacheCluster
-    { _dccCacheClusterId          :: Text
-    , _dccFinalSnapshotIdentifier :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DeleteCacheCluster' constructor.
+-- | Represents the input of a /DeleteCacheCluster/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'deleteCacheCluster' smart constructor.
+data DeleteCacheCluster = DeleteCacheCluster'
+    { _dccFinalSnapshotIdentifier :: !(Maybe Text)
+    , _dccCacheClusterId          :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteCacheCluster' with the minimum fields required to make a request.
 --
--- * 'dccCacheClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dccFinalSnapshotIdentifier' @::@ 'Maybe' 'Text'
+-- * 'dccFinalSnapshotIdentifier'
 --
-deleteCacheCluster :: Text -- ^ 'dccCacheClusterId'
-                   -> DeleteCacheCluster
-deleteCacheCluster p1 = DeleteCacheCluster
-    { _dccCacheClusterId          = p1
-    , _dccFinalSnapshotIdentifier = Nothing
+-- * 'dccCacheClusterId'
+deleteCacheCluster
+    :: Text -- ^ 'dccCacheClusterId'
+    -> DeleteCacheCluster
+deleteCacheCluster pCacheClusterId_ =
+    DeleteCacheCluster'
+    { _dccFinalSnapshotIdentifier = Nothing
+    , _dccCacheClusterId = pCacheClusterId_
     }
 
--- | The cache cluster identifier for the cluster to be deleted. This parameter is
--- not case sensitive.
-dccCacheClusterId :: Lens' DeleteCacheCluster Text
-dccCacheClusterId =
-    lens _dccCacheClusterId (\s a -> s { _dccCacheClusterId = a })
-
--- | The user-supplied name of a final cache cluster snapshot. This is the unique
--- name that identifies the snapshot. ElastiCache creates the snapshot, and then
--- deletes the cache cluster immediately afterward.
+-- | The user-supplied name of a final cache cluster snapshot. This is the
+-- unique name that identifies the snapshot. ElastiCache creates the
+-- snapshot, and then deletes the cache cluster immediately afterward.
 dccFinalSnapshotIdentifier :: Lens' DeleteCacheCluster (Maybe Text)
-dccFinalSnapshotIdentifier =
-    lens _dccFinalSnapshotIdentifier
-        (\s a -> s { _dccFinalSnapshotIdentifier = a })
+dccFinalSnapshotIdentifier = lens _dccFinalSnapshotIdentifier (\ s a -> s{_dccFinalSnapshotIdentifier = a});
 
-newtype DeleteCacheClusterResponse = DeleteCacheClusterResponse
-    { _dccrCacheCluster :: Maybe CacheCluster
-    } deriving (Eq, Read, Show)
+-- | The cache cluster identifier for the cluster to be deleted. This
+-- parameter is not case sensitive.
+dccCacheClusterId :: Lens' DeleteCacheCluster Text
+dccCacheClusterId = lens _dccCacheClusterId (\ s a -> s{_dccCacheClusterId = a});
 
--- | 'DeleteCacheClusterResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dccrCacheCluster' @::@ 'Maybe' 'CacheCluster'
---
-deleteCacheClusterResponse :: DeleteCacheClusterResponse
-deleteCacheClusterResponse = DeleteCacheClusterResponse
-    { _dccrCacheCluster = Nothing
-    }
+instance AWSRequest DeleteCacheCluster where
+        type Sv DeleteCacheCluster = ElastiCache
+        type Rs DeleteCacheCluster =
+             DeleteCacheClusterResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DeleteCacheClusterResult"
+              (\ s h x ->
+                 DeleteCacheClusterResponse' <$>
+                   (x .@? "CacheCluster") <*> (pure (fromEnum s)))
 
-dccrCacheCluster :: Lens' DeleteCacheClusterResponse (Maybe CacheCluster)
-dccrCacheCluster = lens _dccrCacheCluster (\s a -> s { _dccrCacheCluster = a })
+instance ToHeaders DeleteCacheCluster where
+        toHeaders = const mempty
 
 instance ToPath DeleteCacheCluster where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteCacheCluster where
-    toQuery DeleteCacheCluster{..} = mconcat
-        [ "CacheClusterId"          =? _dccCacheClusterId
-        , "FinalSnapshotIdentifier" =? _dccFinalSnapshotIdentifier
-        ]
+        toQuery DeleteCacheCluster'{..}
+          = mconcat
+              ["Action" =: ("DeleteCacheCluster" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "FinalSnapshotIdentifier" =:
+                 _dccFinalSnapshotIdentifier,
+               "CacheClusterId" =: _dccCacheClusterId]
 
-instance ToHeaders DeleteCacheCluster
+-- | /See:/ 'deleteCacheClusterResponse' smart constructor.
+data DeleteCacheClusterResponse = DeleteCacheClusterResponse'
+    { _dccrsCacheCluster :: !(Maybe CacheCluster)
+    , _dccrsStatus       :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DeleteCacheCluster where
-    type Sv DeleteCacheCluster = ElastiCache
-    type Rs DeleteCacheCluster = DeleteCacheClusterResponse
+-- | Creates a value of 'DeleteCacheClusterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dccrsCacheCluster'
+--
+-- * 'dccrsStatus'
+deleteCacheClusterResponse
+    :: Int -- ^ 'dccrsStatus'
+    -> DeleteCacheClusterResponse
+deleteCacheClusterResponse pStatus_ =
+    DeleteCacheClusterResponse'
+    { _dccrsCacheCluster = Nothing
+    , _dccrsStatus = pStatus_
+    }
 
-    request  = post "DeleteCacheCluster"
-    response = xmlResponse
+-- | Undocumented member.
+dccrsCacheCluster :: Lens' DeleteCacheClusterResponse (Maybe CacheCluster)
+dccrsCacheCluster = lens _dccrsCacheCluster (\ s a -> s{_dccrsCacheCluster = a});
 
-instance FromXML DeleteCacheClusterResponse where
-    parseXML = withElement "DeleteCacheClusterResult" $ \x -> DeleteCacheClusterResponse
-        <$> x .@? "CacheCluster"
+-- | The response status code.
+dccrsStatus :: Lens' DeleteCacheClusterResponse Int
+dccrsStatus = lens _dccrsStatus (\ s a -> s{_dccrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DeleteCacheParameterGroup.hs b/gen/Network/AWS/ElastiCache/DeleteCacheParameterGroup.hs
--- a/gen/Network/AWS/ElastiCache/DeleteCacheParameterGroup.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteCacheParameterGroup.hs
@@ -1,97 +1,104 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteCacheParameterGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteCacheParameterGroup/ action deletes the specified cache parameter
--- group. You cannot delete a cache parameter group if it is associated with any
--- cache clusters.
+-- The /DeleteCacheParameterGroup/ action deletes the specified cache
+-- parameter group. You cannot delete a cache parameter group if it is
+-- associated with any cache clusters.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheParameterGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheParameterGroup.html AWS API Reference> for DeleteCacheParameterGroup.
 module Network.AWS.ElastiCache.DeleteCacheParameterGroup
     (
-    -- * Request
-      DeleteCacheParameterGroup
-    -- ** Request constructor
-    , deleteCacheParameterGroup
-    -- ** Request lenses
-    , dcpg1CacheParameterGroupName
+    -- * Creating a Request
+      deleteCacheParameterGroup
+    , DeleteCacheParameterGroup
+    -- * Request Lenses
+    , dCacheParameterGroupName
 
-    -- * Response
-    , DeleteCacheParameterGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteCacheParameterGroupResponse
+    , DeleteCacheParameterGroupResponse
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-newtype DeleteCacheParameterGroup = DeleteCacheParameterGroup
-    { _dcpg1CacheParameterGroupName :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DeleteCacheParameterGroup' constructor.
+-- | Represents the input of a /DeleteCacheParameterGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'deleteCacheParameterGroup' smart constructor.
+newtype DeleteCacheParameterGroup = DeleteCacheParameterGroup'
+    { _dCacheParameterGroupName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteCacheParameterGroup' with the minimum fields required to make a request.
 --
--- * 'dcpg1CacheParameterGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-deleteCacheParameterGroup :: Text -- ^ 'dcpg1CacheParameterGroupName'
-                          -> DeleteCacheParameterGroup
-deleteCacheParameterGroup p1 = DeleteCacheParameterGroup
-    { _dcpg1CacheParameterGroupName = p1
+-- * 'dCacheParameterGroupName'
+deleteCacheParameterGroup
+    :: Text -- ^ 'dCacheParameterGroupName'
+    -> DeleteCacheParameterGroup
+deleteCacheParameterGroup pCacheParameterGroupName_ =
+    DeleteCacheParameterGroup'
+    { _dCacheParameterGroupName = pCacheParameterGroupName_
     }
 
 -- | The name of the cache parameter group to delete.
 --
 -- The specified cache security group must not be associated with any cache
 -- clusters.
-dcpg1CacheParameterGroupName :: Lens' DeleteCacheParameterGroup Text
-dcpg1CacheParameterGroupName =
-    lens _dcpg1CacheParameterGroupName
-        (\s a -> s { _dcpg1CacheParameterGroupName = a })
+dCacheParameterGroupName :: Lens' DeleteCacheParameterGroup Text
+dCacheParameterGroupName = lens _dCacheParameterGroupName (\ s a -> s{_dCacheParameterGroupName = a});
 
-data DeleteCacheParameterGroupResponse = DeleteCacheParameterGroupResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest DeleteCacheParameterGroup where
+        type Sv DeleteCacheParameterGroup = ElastiCache
+        type Rs DeleteCacheParameterGroup =
+             DeleteCacheParameterGroupResponse
+        request = postQuery
+        response
+          = receiveNull DeleteCacheParameterGroupResponse'
 
--- | 'DeleteCacheParameterGroupResponse' constructor.
-deleteCacheParameterGroupResponse :: DeleteCacheParameterGroupResponse
-deleteCacheParameterGroupResponse = DeleteCacheParameterGroupResponse
+instance ToHeaders DeleteCacheParameterGroup where
+        toHeaders = const mempty
 
 instance ToPath DeleteCacheParameterGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteCacheParameterGroup where
-    toQuery DeleteCacheParameterGroup{..} = mconcat
-        [ "CacheParameterGroupName" =? _dcpg1CacheParameterGroupName
-        ]
-
-instance ToHeaders DeleteCacheParameterGroup
+        toQuery DeleteCacheParameterGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("DeleteCacheParameterGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheParameterGroupName" =:
+                 _dCacheParameterGroupName]
 
-instance AWSRequest DeleteCacheParameterGroup where
-    type Sv DeleteCacheParameterGroup = ElastiCache
-    type Rs DeleteCacheParameterGroup = DeleteCacheParameterGroupResponse
+-- | /See:/ 'deleteCacheParameterGroupResponse' smart constructor.
+data DeleteCacheParameterGroupResponse =
+    DeleteCacheParameterGroupResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "DeleteCacheParameterGroup"
-    response = nullResponse DeleteCacheParameterGroupResponse
+-- | Creates a value of 'DeleteCacheParameterGroupResponse' with the minimum fields required to make a request.
+--
+deleteCacheParameterGroupResponse
+    :: DeleteCacheParameterGroupResponse
+deleteCacheParameterGroupResponse = DeleteCacheParameterGroupResponse'
diff --git a/gen/Network/AWS/ElastiCache/DeleteCacheSecurityGroup.hs b/gen/Network/AWS/ElastiCache/DeleteCacheSecurityGroup.hs
--- a/gen/Network/AWS/ElastiCache/DeleteCacheSecurityGroup.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteCacheSecurityGroup.hs
@@ -1,97 +1,104 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteCacheSecurityGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteCacheSecurityGroup/ action deletes a cache security group.
+-- The /DeleteCacheSecurityGroup/ action deletes a cache security group.
 --
--- You cannot delete a cache security group if it is associated with any cache
--- clusters.
+-- You cannot delete a cache security group if it is associated with any
+-- cache clusters.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheSecurityGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheSecurityGroup.html AWS API Reference> for DeleteCacheSecurityGroup.
 module Network.AWS.ElastiCache.DeleteCacheSecurityGroup
     (
-    -- * Request
-      DeleteCacheSecurityGroup
-    -- ** Request constructor
-    , deleteCacheSecurityGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      deleteCacheSecurityGroup
+    , DeleteCacheSecurityGroup
+    -- * Request Lenses
     , dcsgCacheSecurityGroupName
 
-    -- * Response
-    , DeleteCacheSecurityGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteCacheSecurityGroupResponse
+    , DeleteCacheSecurityGroupResponse
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
-newtype DeleteCacheSecurityGroup = DeleteCacheSecurityGroup
+-- | Represents the input of a /DeleteCacheSecurityGroup/ action.
+--
+-- /See:/ 'deleteCacheSecurityGroup' smart constructor.
+newtype DeleteCacheSecurityGroup = DeleteCacheSecurityGroup'
     { _dcsgCacheSecurityGroupName :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
--- | 'DeleteCacheSecurityGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
+-- | Creates a value of 'DeleteCacheSecurityGroup' with the minimum fields required to make a request.
 --
--- * 'dcsgCacheSecurityGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-deleteCacheSecurityGroup :: Text -- ^ 'dcsgCacheSecurityGroupName'
-                         -> DeleteCacheSecurityGroup
-deleteCacheSecurityGroup p1 = DeleteCacheSecurityGroup
-    { _dcsgCacheSecurityGroupName = p1
+-- * 'dcsgCacheSecurityGroupName'
+deleteCacheSecurityGroup
+    :: Text -- ^ 'dcsgCacheSecurityGroupName'
+    -> DeleteCacheSecurityGroup
+deleteCacheSecurityGroup pCacheSecurityGroupName_ =
+    DeleteCacheSecurityGroup'
+    { _dcsgCacheSecurityGroupName = pCacheSecurityGroupName_
     }
 
 -- | The name of the cache security group to delete.
 --
 -- You cannot delete the default security group.
 dcsgCacheSecurityGroupName :: Lens' DeleteCacheSecurityGroup Text
-dcsgCacheSecurityGroupName =
-    lens _dcsgCacheSecurityGroupName
-        (\s a -> s { _dcsgCacheSecurityGroupName = a })
+dcsgCacheSecurityGroupName = lens _dcsgCacheSecurityGroupName (\ s a -> s{_dcsgCacheSecurityGroupName = a});
 
-data DeleteCacheSecurityGroupResponse = DeleteCacheSecurityGroupResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest DeleteCacheSecurityGroup where
+        type Sv DeleteCacheSecurityGroup = ElastiCache
+        type Rs DeleteCacheSecurityGroup =
+             DeleteCacheSecurityGroupResponse
+        request = postQuery
+        response
+          = receiveNull DeleteCacheSecurityGroupResponse'
 
--- | 'DeleteCacheSecurityGroupResponse' constructor.
-deleteCacheSecurityGroupResponse :: DeleteCacheSecurityGroupResponse
-deleteCacheSecurityGroupResponse = DeleteCacheSecurityGroupResponse
+instance ToHeaders DeleteCacheSecurityGroup where
+        toHeaders = const mempty
 
 instance ToPath DeleteCacheSecurityGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteCacheSecurityGroup where
-    toQuery DeleteCacheSecurityGroup{..} = mconcat
-        [ "CacheSecurityGroupName" =? _dcsgCacheSecurityGroupName
-        ]
-
-instance ToHeaders DeleteCacheSecurityGroup
+        toQuery DeleteCacheSecurityGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("DeleteCacheSecurityGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSecurityGroupName" =:
+                 _dcsgCacheSecurityGroupName]
 
-instance AWSRequest DeleteCacheSecurityGroup where
-    type Sv DeleteCacheSecurityGroup = ElastiCache
-    type Rs DeleteCacheSecurityGroup = DeleteCacheSecurityGroupResponse
+-- | /See:/ 'deleteCacheSecurityGroupResponse' smart constructor.
+data DeleteCacheSecurityGroupResponse =
+    DeleteCacheSecurityGroupResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "DeleteCacheSecurityGroup"
-    response = nullResponse DeleteCacheSecurityGroupResponse
+-- | Creates a value of 'DeleteCacheSecurityGroupResponse' with the minimum fields required to make a request.
+--
+deleteCacheSecurityGroupResponse
+    :: DeleteCacheSecurityGroupResponse
+deleteCacheSecurityGroupResponse = DeleteCacheSecurityGroupResponse'
diff --git a/gen/Network/AWS/ElastiCache/DeleteCacheSubnetGroup.hs b/gen/Network/AWS/ElastiCache/DeleteCacheSubnetGroup.hs
--- a/gen/Network/AWS/ElastiCache/DeleteCacheSubnetGroup.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteCacheSubnetGroup.hs
@@ -1,98 +1,104 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteCacheSubnetGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteCacheSubnetGroup/ action deletes a cache subnet group.
+-- The /DeleteCacheSubnetGroup/ action deletes a cache subnet group.
 --
--- You cannot delete a cache subnet group if it is associated with any cache
--- clusters.
+-- You cannot delete a cache subnet group if it is associated with any
+-- cache clusters.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheSubnetGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteCacheSubnetGroup.html AWS API Reference> for DeleteCacheSubnetGroup.
 module Network.AWS.ElastiCache.DeleteCacheSubnetGroup
     (
-    -- * Request
-      DeleteCacheSubnetGroup
-    -- ** Request constructor
-    , deleteCacheSubnetGroup
-    -- ** Request lenses
-    , dcsg1CacheSubnetGroupName
+    -- * Creating a Request
+      deleteCacheSubnetGroup
+    , DeleteCacheSubnetGroup
+    -- * Request Lenses
+    , dCacheSubnetGroupName
 
-    -- * Response
-    , DeleteCacheSubnetGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteCacheSubnetGroupResponse
+    , DeleteCacheSubnetGroupResponse
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-newtype DeleteCacheSubnetGroup = DeleteCacheSubnetGroup
-    { _dcsg1CacheSubnetGroupName :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DeleteCacheSubnetGroup' constructor.
+-- | Represents the input of a /DeleteCacheSubnetGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'deleteCacheSubnetGroup' smart constructor.
+newtype DeleteCacheSubnetGroup = DeleteCacheSubnetGroup'
+    { _dCacheSubnetGroupName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteCacheSubnetGroup' with the minimum fields required to make a request.
 --
--- * 'dcsg1CacheSubnetGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-deleteCacheSubnetGroup :: Text -- ^ 'dcsg1CacheSubnetGroupName'
-                       -> DeleteCacheSubnetGroup
-deleteCacheSubnetGroup p1 = DeleteCacheSubnetGroup
-    { _dcsg1CacheSubnetGroupName = p1
+-- * 'dCacheSubnetGroupName'
+deleteCacheSubnetGroup
+    :: Text -- ^ 'dCacheSubnetGroupName'
+    -> DeleteCacheSubnetGroup
+deleteCacheSubnetGroup pCacheSubnetGroupName_ =
+    DeleteCacheSubnetGroup'
+    { _dCacheSubnetGroupName = pCacheSubnetGroupName_
     }
 
 -- | The name of the cache subnet group to delete.
 --
 -- Constraints: Must contain no more than 255 alphanumeric characters or
 -- hyphens.
-dcsg1CacheSubnetGroupName :: Lens' DeleteCacheSubnetGroup Text
-dcsg1CacheSubnetGroupName =
-    lens _dcsg1CacheSubnetGroupName
-        (\s a -> s { _dcsg1CacheSubnetGroupName = a })
+dCacheSubnetGroupName :: Lens' DeleteCacheSubnetGroup Text
+dCacheSubnetGroupName = lens _dCacheSubnetGroupName (\ s a -> s{_dCacheSubnetGroupName = a});
 
-data DeleteCacheSubnetGroupResponse = DeleteCacheSubnetGroupResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest DeleteCacheSubnetGroup where
+        type Sv DeleteCacheSubnetGroup = ElastiCache
+        type Rs DeleteCacheSubnetGroup =
+             DeleteCacheSubnetGroupResponse
+        request = postQuery
+        response
+          = receiveNull DeleteCacheSubnetGroupResponse'
 
--- | 'DeleteCacheSubnetGroupResponse' constructor.
-deleteCacheSubnetGroupResponse :: DeleteCacheSubnetGroupResponse
-deleteCacheSubnetGroupResponse = DeleteCacheSubnetGroupResponse
+instance ToHeaders DeleteCacheSubnetGroup where
+        toHeaders = const mempty
 
 instance ToPath DeleteCacheSubnetGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteCacheSubnetGroup where
-    toQuery DeleteCacheSubnetGroup{..} = mconcat
-        [ "CacheSubnetGroupName" =? _dcsg1CacheSubnetGroupName
-        ]
-
-instance ToHeaders DeleteCacheSubnetGroup
+        toQuery DeleteCacheSubnetGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("DeleteCacheSubnetGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSubnetGroupName" =: _dCacheSubnetGroupName]
 
-instance AWSRequest DeleteCacheSubnetGroup where
-    type Sv DeleteCacheSubnetGroup = ElastiCache
-    type Rs DeleteCacheSubnetGroup = DeleteCacheSubnetGroupResponse
+-- | /See:/ 'deleteCacheSubnetGroupResponse' smart constructor.
+data DeleteCacheSubnetGroupResponse =
+    DeleteCacheSubnetGroupResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "DeleteCacheSubnetGroup"
-    response = nullResponse DeleteCacheSubnetGroupResponse
+-- | Creates a value of 'DeleteCacheSubnetGroupResponse' with the minimum fields required to make a request.
+--
+deleteCacheSubnetGroupResponse
+    :: DeleteCacheSubnetGroupResponse
+deleteCacheSubnetGroupResponse = DeleteCacheSubnetGroupResponse'
diff --git a/gen/Network/AWS/ElastiCache/DeleteReplicationGroup.hs b/gen/Network/AWS/ElastiCache/DeleteReplicationGroup.hs
--- a/gen/Network/AWS/ElastiCache/DeleteReplicationGroup.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteReplicationGroup.hs
@@ -1,144 +1,157 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteReplicationGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteReplicationGroup/ action deletes an existing replication group. By
--- default, this action deletes the entire replication group, including the
--- primary cluster and all of the read replicas. You can optionally delete only
--- the read replicas, while retaining the primary cluster.
+-- The /DeleteReplicationGroup/ action deletes an existing replication
+-- group. By default, this action deletes the entire replication group,
+-- including the primary cluster and all of the read replicas. You can
+-- optionally delete only the read replicas, while retaining the primary
+-- cluster.
 --
--- When you receive a successful response from this action, Amazon ElastiCache
--- immediately begins deleting the selected resources; you cannot cancel or
--- revert this action.
+-- When you receive a successful response from this action, Amazon
+-- ElastiCache immediately begins deleting the selected resources; you
+-- cannot cancel or revert this action.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteReplicationGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteReplicationGroup.html AWS API Reference> for DeleteReplicationGroup.
 module Network.AWS.ElastiCache.DeleteReplicationGroup
     (
-    -- * Request
-      DeleteReplicationGroup
-    -- ** Request constructor
-    , deleteReplicationGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      deleteReplicationGroup
+    , DeleteReplicationGroup
+    -- * Request Lenses
     , drgFinalSnapshotIdentifier
-    , drgReplicationGroupId
     , drgRetainPrimaryCluster
+    , drgReplicationGroupId
 
-    -- * Response
-    , DeleteReplicationGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteReplicationGroupResponse
-    -- ** Response lenses
-    , drgrReplicationGroup
+    , DeleteReplicationGroupResponse
+    -- * Response Lenses
+    , delrsReplicationGroup
+    , delrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DeleteReplicationGroup = DeleteReplicationGroup
-    { _drgFinalSnapshotIdentifier :: Maybe Text
-    , _drgReplicationGroupId      :: Text
-    , _drgRetainPrimaryCluster    :: Maybe Bool
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DeleteReplicationGroup' constructor.
+-- | Represents the input of a /DeleteReplicationGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'deleteReplicationGroup' smart constructor.
+data DeleteReplicationGroup = DeleteReplicationGroup'
+    { _drgFinalSnapshotIdentifier :: !(Maybe Text)
+    , _drgRetainPrimaryCluster    :: !(Maybe Bool)
+    , _drgReplicationGroupId      :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteReplicationGroup' with the minimum fields required to make a request.
 --
--- * 'drgFinalSnapshotIdentifier' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drgReplicationGroupId' @::@ 'Text'
+-- * 'drgFinalSnapshotIdentifier'
 --
--- * 'drgRetainPrimaryCluster' @::@ 'Maybe' 'Bool'
+-- * 'drgRetainPrimaryCluster'
 --
-deleteReplicationGroup :: Text -- ^ 'drgReplicationGroupId'
-                       -> DeleteReplicationGroup
-deleteReplicationGroup p1 = DeleteReplicationGroup
-    { _drgReplicationGroupId      = p1
-    , _drgRetainPrimaryCluster    = Nothing
-    , _drgFinalSnapshotIdentifier = Nothing
+-- * 'drgReplicationGroupId'
+deleteReplicationGroup
+    :: Text -- ^ 'drgReplicationGroupId'
+    -> DeleteReplicationGroup
+deleteReplicationGroup pReplicationGroupId_ =
+    DeleteReplicationGroup'
+    { _drgFinalSnapshotIdentifier = Nothing
+    , _drgRetainPrimaryCluster = Nothing
+    , _drgReplicationGroupId = pReplicationGroupId_
     }
 
--- | The name of a final node group snapshot. ElastiCache creates the snapshot
--- from the primary node in the cluster, rather than one of the replicas; this
--- is to ensure that it captures the freshest data. After the final snapshot is
--- taken, the cluster is immediately deleted.
+-- | The name of a final node group snapshot. ElastiCache creates the
+-- snapshot from the primary node in the cluster, rather than one of the
+-- replicas; this is to ensure that it captures the freshest data. After
+-- the final snapshot is taken, the cluster is immediately deleted.
 drgFinalSnapshotIdentifier :: Lens' DeleteReplicationGroup (Maybe Text)
-drgFinalSnapshotIdentifier =
-    lens _drgFinalSnapshotIdentifier
-        (\s a -> s { _drgFinalSnapshotIdentifier = a })
+drgFinalSnapshotIdentifier = lens _drgFinalSnapshotIdentifier (\ s a -> s{_drgFinalSnapshotIdentifier = a});
 
+-- | If set to /true/, all of the read replicas will be deleted, but the
+-- primary node will be retained.
+drgRetainPrimaryCluster :: Lens' DeleteReplicationGroup (Maybe Bool)
+drgRetainPrimaryCluster = lens _drgRetainPrimaryCluster (\ s a -> s{_drgRetainPrimaryCluster = a});
+
 -- | The identifier for the cluster to be deleted. This parameter is not case
 -- sensitive.
 drgReplicationGroupId :: Lens' DeleteReplicationGroup Text
-drgReplicationGroupId =
-    lens _drgReplicationGroupId (\s a -> s { _drgReplicationGroupId = a })
-
--- | If set to /true/, all of the read replicas will be deleted, but the primary
--- node will be retained.
-drgRetainPrimaryCluster :: Lens' DeleteReplicationGroup (Maybe Bool)
-drgRetainPrimaryCluster =
-    lens _drgRetainPrimaryCluster (\s a -> s { _drgRetainPrimaryCluster = a })
-
-newtype DeleteReplicationGroupResponse = DeleteReplicationGroupResponse
-    { _drgrReplicationGroup :: Maybe ReplicationGroup
-    } deriving (Eq, Read, Show)
+drgReplicationGroupId = lens _drgReplicationGroupId (\ s a -> s{_drgReplicationGroupId = a});
 
--- | 'DeleteReplicationGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'drgrReplicationGroup' @::@ 'Maybe' 'ReplicationGroup'
---
-deleteReplicationGroupResponse :: DeleteReplicationGroupResponse
-deleteReplicationGroupResponse = DeleteReplicationGroupResponse
-    { _drgrReplicationGroup = Nothing
-    }
+instance AWSRequest DeleteReplicationGroup where
+        type Sv DeleteReplicationGroup = ElastiCache
+        type Rs DeleteReplicationGroup =
+             DeleteReplicationGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DeleteReplicationGroupResult"
+              (\ s h x ->
+                 DeleteReplicationGroupResponse' <$>
+                   (x .@? "ReplicationGroup") <*> (pure (fromEnum s)))
 
-drgrReplicationGroup :: Lens' DeleteReplicationGroupResponse (Maybe ReplicationGroup)
-drgrReplicationGroup =
-    lens _drgrReplicationGroup (\s a -> s { _drgrReplicationGroup = a })
+instance ToHeaders DeleteReplicationGroup where
+        toHeaders = const mempty
 
 instance ToPath DeleteReplicationGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteReplicationGroup where
-    toQuery DeleteReplicationGroup{..} = mconcat
-        [ "FinalSnapshotIdentifier" =? _drgFinalSnapshotIdentifier
-        , "ReplicationGroupId"      =? _drgReplicationGroupId
-        , "RetainPrimaryCluster"    =? _drgRetainPrimaryCluster
-        ]
+        toQuery DeleteReplicationGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("DeleteReplicationGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "FinalSnapshotIdentifier" =:
+                 _drgFinalSnapshotIdentifier,
+               "RetainPrimaryCluster" =: _drgRetainPrimaryCluster,
+               "ReplicationGroupId" =: _drgReplicationGroupId]
 
-instance ToHeaders DeleteReplicationGroup
+-- | /See:/ 'deleteReplicationGroupResponse' smart constructor.
+data DeleteReplicationGroupResponse = DeleteReplicationGroupResponse'
+    { _delrsReplicationGroup :: !(Maybe ReplicationGroup)
+    , _delrsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DeleteReplicationGroup where
-    type Sv DeleteReplicationGroup = ElastiCache
-    type Rs DeleteReplicationGroup = DeleteReplicationGroupResponse
+-- | Creates a value of 'DeleteReplicationGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'delrsReplicationGroup'
+--
+-- * 'delrsStatus'
+deleteReplicationGroupResponse
+    :: Int -- ^ 'delrsStatus'
+    -> DeleteReplicationGroupResponse
+deleteReplicationGroupResponse pStatus_ =
+    DeleteReplicationGroupResponse'
+    { _delrsReplicationGroup = Nothing
+    , _delrsStatus = pStatus_
+    }
 
-    request  = post "DeleteReplicationGroup"
-    response = xmlResponse
+-- | Undocumented member.
+delrsReplicationGroup :: Lens' DeleteReplicationGroupResponse (Maybe ReplicationGroup)
+delrsReplicationGroup = lens _delrsReplicationGroup (\ s a -> s{_delrsReplicationGroup = a});
 
-instance FromXML DeleteReplicationGroupResponse where
-    parseXML = withElement "DeleteReplicationGroupResult" $ \x -> DeleteReplicationGroupResponse
-        <$> x .@? "ReplicationGroup"
+-- | The response status code.
+delrsStatus :: Lens' DeleteReplicationGroupResponse Int
+delrsStatus = lens _delrsStatus (\ s a -> s{_delrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DeleteSnapshot.hs b/gen/Network/AWS/ElastiCache/DeleteSnapshot.hs
--- a/gen/Network/AWS/ElastiCache/DeleteSnapshot.hs
+++ b/gen/Network/AWS/ElastiCache/DeleteSnapshot.hs
@@ -1,109 +1,123 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DeleteSnapshot
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DeleteSnapshot/ action deletes an existing snapshot. When you receive a
--- successful response from this action, ElastiCache immediately begins deleting
--- the snapshot; you cannot cancel or revert this action.
+-- The /DeleteSnapshot/ action deletes an existing snapshot. When you
+-- receive a successful response from this action, ElastiCache immediately
+-- begins deleting the snapshot; you cannot cancel or revert this action.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteSnapshot.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DeleteSnapshot.html AWS API Reference> for DeleteSnapshot.
 module Network.AWS.ElastiCache.DeleteSnapshot
     (
-    -- * Request
-      DeleteSnapshot
-    -- ** Request constructor
-    , deleteSnapshot
-    -- ** Request lenses
-    , ds1SnapshotName
+    -- * Creating a Request
+      deleteSnapshot
+    , DeleteSnapshot
+    -- * Request Lenses
+    , dSnapshotName
 
-    -- * Response
-    , DeleteSnapshotResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , deleteSnapshotResponse
-    -- ** Response lenses
-    , dsrSnapshot
+    , DeleteSnapshotResponse
+    -- * Response Lenses
+    , dsrsSnapshot
+    , dsrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-newtype DeleteSnapshot = DeleteSnapshot
-    { _ds1SnapshotName :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DeleteSnapshot' constructor.
+-- | Represents the input of a /DeleteSnapshot/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'deleteSnapshot' smart constructor.
+newtype DeleteSnapshot = DeleteSnapshot'
+    { _dSnapshotName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DeleteSnapshot' with the minimum fields required to make a request.
 --
--- * 'ds1SnapshotName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-deleteSnapshot :: Text -- ^ 'ds1SnapshotName'
-               -> DeleteSnapshot
-deleteSnapshot p1 = DeleteSnapshot
-    { _ds1SnapshotName = p1
+-- * 'dSnapshotName'
+deleteSnapshot
+    :: Text -- ^ 'dSnapshotName'
+    -> DeleteSnapshot
+deleteSnapshot pSnapshotName_ =
+    DeleteSnapshot'
+    { _dSnapshotName = pSnapshotName_
     }
 
 -- | The name of the snapshot to be deleted.
-ds1SnapshotName :: Lens' DeleteSnapshot Text
-ds1SnapshotName = lens _ds1SnapshotName (\s a -> s { _ds1SnapshotName = a })
-
-newtype DeleteSnapshotResponse = DeleteSnapshotResponse
-    { _dsrSnapshot :: Maybe Snapshot
-    } deriving (Eq, Read, Show)
+dSnapshotName :: Lens' DeleteSnapshot Text
+dSnapshotName = lens _dSnapshotName (\ s a -> s{_dSnapshotName = a});
 
--- | 'DeleteSnapshotResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dsrSnapshot' @::@ 'Maybe' 'Snapshot'
---
-deleteSnapshotResponse :: DeleteSnapshotResponse
-deleteSnapshotResponse = DeleteSnapshotResponse
-    { _dsrSnapshot = Nothing
-    }
+instance AWSRequest DeleteSnapshot where
+        type Sv DeleteSnapshot = ElastiCache
+        type Rs DeleteSnapshot = DeleteSnapshotResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DeleteSnapshotResult"
+              (\ s h x ->
+                 DeleteSnapshotResponse' <$>
+                   (x .@? "Snapshot") <*> (pure (fromEnum s)))
 
-dsrSnapshot :: Lens' DeleteSnapshotResponse (Maybe Snapshot)
-dsrSnapshot = lens _dsrSnapshot (\s a -> s { _dsrSnapshot = a })
+instance ToHeaders DeleteSnapshot where
+        toHeaders = const mempty
 
 instance ToPath DeleteSnapshot where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DeleteSnapshot where
-    toQuery DeleteSnapshot{..} = mconcat
-        [ "SnapshotName" =? _ds1SnapshotName
-        ]
+        toQuery DeleteSnapshot'{..}
+          = mconcat
+              ["Action" =: ("DeleteSnapshot" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "SnapshotName" =: _dSnapshotName]
 
-instance ToHeaders DeleteSnapshot
+-- | /See:/ 'deleteSnapshotResponse' smart constructor.
+data DeleteSnapshotResponse = DeleteSnapshotResponse'
+    { _dsrsSnapshot :: !(Maybe Snapshot)
+    , _dsrsStatus   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DeleteSnapshot where
-    type Sv DeleteSnapshot = ElastiCache
-    type Rs DeleteSnapshot = DeleteSnapshotResponse
+-- | Creates a value of 'DeleteSnapshotResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrsSnapshot'
+--
+-- * 'dsrsStatus'
+deleteSnapshotResponse
+    :: Int -- ^ 'dsrsStatus'
+    -> DeleteSnapshotResponse
+deleteSnapshotResponse pStatus_ =
+    DeleteSnapshotResponse'
+    { _dsrsSnapshot = Nothing
+    , _dsrsStatus = pStatus_
+    }
 
-    request  = post "DeleteSnapshot"
-    response = xmlResponse
+-- | Undocumented member.
+dsrsSnapshot :: Lens' DeleteSnapshotResponse (Maybe Snapshot)
+dsrsSnapshot = lens _dsrsSnapshot (\ s a -> s{_dsrsSnapshot = a});
 
-instance FromXML DeleteSnapshotResponse where
-    parseXML = withElement "DeleteSnapshotResult" $ \x -> DeleteSnapshotResponse
-        <$> x .@? "Snapshot"
+-- | The response status code.
+dsrsStatus :: Lens' DeleteSnapshotResponse Int
+dsrsStatus = lens _dsrsStatus (\ s a -> s{_dsrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheClusters.hs b/gen/Network/AWS/ElastiCache/DescribeCacheClusters.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheClusters.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheClusters.hs
@@ -1,190 +1,209 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheClusters
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheClusters/ action returns information about all provisioned
--- cache clusters if no cache cluster identifier is specified, or about a
--- specific cache cluster if a cache cluster identifier is supplied.
+-- The /DescribeCacheClusters/ action returns information about all
+-- provisioned cache clusters if no cache cluster identifier is specified,
+-- or about a specific cache cluster if a cache cluster identifier is
+-- supplied.
 --
 -- By default, abbreviated information about the cache clusters(s) will be
--- returned. You can use the optional /ShowDetails/ flag to retrieve detailed
--- information about the cache nodes associated with the cache clusters. These
--- details include the DNS address and port for the cache node endpoint.
+-- returned. You can use the optional /ShowDetails/ flag to retrieve
+-- detailed information about the cache nodes associated with the cache
+-- clusters. These details include the DNS address and port for the cache
+-- node endpoint.
 --
--- If the cluster is in the CREATING state, only cluster level information will
--- be displayed until all of the nodes are successfully provisioned.
+-- If the cluster is in the CREATING state, only cluster level information
+-- will be displayed until all of the nodes are successfully provisioned.
 --
--- If the cluster is in the DELETING state, only cluster level information will
--- be displayed.
+-- If the cluster is in the DELETING state, only cluster level information
+-- will be displayed.
 --
--- If cache nodes are currently being added to the cache cluster, node endpoint
--- information and creation time for the additional nodes will not be displayed
--- until they are completely provisioned. When the cache cluster state is /available/, the cluster is ready for use.
+-- If cache nodes are currently being added to the cache cluster, node
+-- endpoint information and creation time for the additional nodes will not
+-- be displayed until they are completely provisioned. When the cache
+-- cluster state is /available/, the cluster is ready for use.
 --
 -- If cache nodes are currently being removed from the cache cluster, no
 -- endpoint information for the removed nodes is displayed.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheClusters.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheClusters.html AWS API Reference> for DescribeCacheClusters.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheClusters
     (
-    -- * Request
-      DescribeCacheClusters
-    -- ** Request constructor
-    , describeCacheClusters
-    -- ** Request lenses
-    , dcc1CacheClusterId
-    , dcc1Marker
-    , dcc1MaxRecords
-    , dcc1ShowCacheNodeInfo
+    -- * Creating a Request
+      describeCacheClusters
+    , DescribeCacheClusters
+    -- * Request Lenses
+    , dCacheClusterId
+    , dMaxRecords
+    , dMarker
+    , dShowCacheNodeInfo
 
-    -- * Response
-    , DescribeCacheClustersResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheClustersResponse
-    -- ** Response lenses
-    , dccrCacheClusters
-    , dccrMarker
+    , DescribeCacheClustersResponse
+    -- * Response Lenses
+    , drsCacheClusters
+    , drsMarker
+    , drsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheClusters = DescribeCacheClusters
-    { _dcc1CacheClusterId    :: Maybe Text
-    , _dcc1Marker            :: Maybe Text
-    , _dcc1MaxRecords        :: Maybe Int
-    , _dcc1ShowCacheNodeInfo :: Maybe Bool
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheClusters' constructor.
+-- | Represents the input of a /DescribeCacheClusters/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheClusters' smart constructor.
+data DescribeCacheClusters = DescribeCacheClusters'
+    { _dCacheClusterId    :: !(Maybe Text)
+    , _dMaxRecords        :: !(Maybe Int)
+    , _dMarker            :: !(Maybe Text)
+    , _dShowCacheNodeInfo :: !(Maybe Bool)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheClusters' with the minimum fields required to make a request.
 --
--- * 'dcc1CacheClusterId' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcc1Marker' @::@ 'Maybe' 'Text'
+-- * 'dCacheClusterId'
 --
--- * 'dcc1MaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dMaxRecords'
 --
--- * 'dcc1ShowCacheNodeInfo' @::@ 'Maybe' 'Bool'
+-- * 'dMarker'
 --
-describeCacheClusters :: DescribeCacheClusters
-describeCacheClusters = DescribeCacheClusters
-    { _dcc1CacheClusterId    = Nothing
-    , _dcc1MaxRecords        = Nothing
-    , _dcc1Marker            = Nothing
-    , _dcc1ShowCacheNodeInfo = Nothing
+-- * 'dShowCacheNodeInfo'
+describeCacheClusters
+    :: DescribeCacheClusters
+describeCacheClusters =
+    DescribeCacheClusters'
+    { _dCacheClusterId = Nothing
+    , _dMaxRecords = Nothing
+    , _dMarker = Nothing
+    , _dShowCacheNodeInfo = Nothing
     }
 
--- | The user-supplied cluster identifier. If this parameter is specified, only
--- information about that specific cache cluster is returned. This parameter
--- isn't case sensitive.
-dcc1CacheClusterId :: Lens' DescribeCacheClusters (Maybe Text)
-dcc1CacheClusterId =
-    lens _dcc1CacheClusterId (\s a -> s { _dcc1CacheClusterId = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcc1Marker :: Lens' DescribeCacheClusters (Maybe Text)
-dcc1Marker = lens _dcc1Marker (\s a -> s { _dcc1Marker = a })
+-- | The user-supplied cluster identifier. If this parameter is specified,
+-- only information about that specific cache cluster is returned. This
+-- parameter isn\'t case sensitive.
+dCacheClusterId :: Lens' DescribeCacheClusters (Maybe Text)
+dCacheClusterId = lens _dCacheClusterId (\ s a -> s{_dCacheClusterId = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
-dcc1MaxRecords :: Lens' DescribeCacheClusters (Maybe Int)
-dcc1MaxRecords = lens _dcc1MaxRecords (\s a -> s { _dcc1MaxRecords = a })
+dMaxRecords :: Lens' DescribeCacheClusters (Maybe Int)
+dMaxRecords = lens _dMaxRecords (\ s a -> s{_dMaxRecords = a});
 
--- | An optional flag that can be included in the DescribeCacheCluster request to
--- retrieve information about the individual cache nodes.
-dcc1ShowCacheNodeInfo :: Lens' DescribeCacheClusters (Maybe Bool)
-dcc1ShowCacheNodeInfo =
-    lens _dcc1ShowCacheNodeInfo (\s a -> s { _dcc1ShowCacheNodeInfo = a })
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dMarker :: Lens' DescribeCacheClusters (Maybe Text)
+dMarker = lens _dMarker (\ s a -> s{_dMarker = a});
 
-data DescribeCacheClustersResponse = DescribeCacheClustersResponse
-    { _dccrCacheClusters :: List "member" CacheCluster
-    , _dccrMarker        :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | An optional flag that can be included in the DescribeCacheCluster
+-- request to retrieve information about the individual cache nodes.
+dShowCacheNodeInfo :: Lens' DescribeCacheClusters (Maybe Bool)
+dShowCacheNodeInfo = lens _dShowCacheNodeInfo (\ s a -> s{_dShowCacheNodeInfo = a});
 
--- | 'DescribeCacheClustersResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dccrCacheClusters' @::@ ['CacheCluster']
---
--- * 'dccrMarker' @::@ 'Maybe' 'Text'
---
-describeCacheClustersResponse :: DescribeCacheClustersResponse
-describeCacheClustersResponse = DescribeCacheClustersResponse
-    { _dccrMarker        = Nothing
-    , _dccrCacheClusters = mempty
-    }
+instance AWSPager DescribeCacheClusters where
+        page rq rs
+          | stop (rs ^. drsMarker) = Nothing
+          | stop (rs ^. drsCacheClusters) = Nothing
+          | otherwise = Just $ rq & dMarker .~ rs ^. drsMarker
 
--- | A list of cache clusters. Each item in the list contains detailed information
--- about one cache cluster.
-dccrCacheClusters :: Lens' DescribeCacheClustersResponse [CacheCluster]
-dccrCacheClusters =
-    lens _dccrCacheClusters (\s a -> s { _dccrCacheClusters = a })
-        . _List
+instance AWSRequest DescribeCacheClusters where
+        type Sv DescribeCacheClusters = ElastiCache
+        type Rs DescribeCacheClusters =
+             DescribeCacheClustersResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeCacheClustersResult"
+              (\ s h x ->
+                 DescribeCacheClustersResponse' <$>
+                   (x .@? "CacheClusters" .!@ mempty >>=
+                      may (parseXMLList "CacheCluster"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | Provides an identifier to allow retrieval of paginated results.
-dccrMarker :: Lens' DescribeCacheClustersResponse (Maybe Text)
-dccrMarker = lens _dccrMarker (\s a -> s { _dccrMarker = a })
+instance ToHeaders DescribeCacheClusters where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheClusters where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheClusters where
-    toQuery DescribeCacheClusters{..} = mconcat
-        [ "CacheClusterId"    =? _dcc1CacheClusterId
-        , "Marker"            =? _dcc1Marker
-        , "MaxRecords"        =? _dcc1MaxRecords
-        , "ShowCacheNodeInfo" =? _dcc1ShowCacheNodeInfo
-        ]
+        toQuery DescribeCacheClusters'{..}
+          = mconcat
+              ["Action" =: ("DescribeCacheClusters" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheClusterId" =: _dCacheClusterId,
+               "MaxRecords" =: _dMaxRecords, "Marker" =: _dMarker,
+               "ShowCacheNodeInfo" =: _dShowCacheNodeInfo]
 
-instance ToHeaders DescribeCacheClusters
+-- | Represents the output of a /DescribeCacheClusters/ action.
+--
+-- /See:/ 'describeCacheClustersResponse' smart constructor.
+data DescribeCacheClustersResponse = DescribeCacheClustersResponse'
+    { _drsCacheClusters :: !(Maybe [CacheCluster])
+    , _drsMarker        :: !(Maybe Text)
+    , _drsStatus        :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheClusters where
-    type Sv DescribeCacheClusters = ElastiCache
-    type Rs DescribeCacheClusters = DescribeCacheClustersResponse
+-- | Creates a value of 'DescribeCacheClustersResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drsCacheClusters'
+--
+-- * 'drsMarker'
+--
+-- * 'drsStatus'
+describeCacheClustersResponse
+    :: Int -- ^ 'drsStatus'
+    -> DescribeCacheClustersResponse
+describeCacheClustersResponse pStatus_ =
+    DescribeCacheClustersResponse'
+    { _drsCacheClusters = Nothing
+    , _drsMarker = Nothing
+    , _drsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheClusters"
-    response = xmlResponse
+-- | A list of cache clusters. Each item in the list contains detailed
+-- information about one cache cluster.
+drsCacheClusters :: Lens' DescribeCacheClustersResponse [CacheCluster]
+drsCacheClusters = lens _drsCacheClusters (\ s a -> s{_drsCacheClusters = a}) . _Default . _Coerce;
 
-instance FromXML DescribeCacheClustersResponse where
-    parseXML = withElement "DescribeCacheClustersResult" $ \x -> DescribeCacheClustersResponse
-        <$> x .@? "CacheClusters" .!@ mempty
-        <*> x .@? "Marker"
+-- | Provides an identifier to allow retrieval of paginated results.
+drsMarker :: Lens' DescribeCacheClustersResponse (Maybe Text)
+drsMarker = lens _drsMarker (\ s a -> s{_drsMarker = a});
 
-instance AWSPager DescribeCacheClusters where
-    page rq rs
-        | stop (rs ^. dccrMarker) = Nothing
-        | otherwise = (\x -> rq & dcc1Marker ?~ x)
-            <$> (rs ^. dccrMarker)
+-- | The response status code.
+drsStatus :: Lens' DescribeCacheClustersResponse Int
+drsStatus = lens _drsStatus (\ s a -> s{_drsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheEngineVersions.hs b/gen/Network/AWS/ElastiCache/DescribeCacheEngineVersions.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheEngineVersions.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheEngineVersions.hs
@@ -1,198 +1,219 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheEngineVersions
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheEngineVersions/ action returns a list of the available cache
--- engines and their versions.
+-- The /DescribeCacheEngineVersions/ action returns a list of the available
+-- cache engines and their versions.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheEngineVersions.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheEngineVersions.html AWS API Reference> for DescribeCacheEngineVersions.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheEngineVersions
     (
-    -- * Request
-      DescribeCacheEngineVersions
-    -- ** Request constructor
-    , describeCacheEngineVersions
-    -- ** Request lenses
+    -- * Creating a Request
+      describeCacheEngineVersions
+    , DescribeCacheEngineVersions
+    -- * Request Lenses
     , dcevCacheParameterGroupFamily
+    , dcevEngineVersion
     , dcevDefaultOnly
     , dcevEngine
-    , dcevEngineVersion
-    , dcevMarker
     , dcevMaxRecords
+    , dcevMarker
 
-    -- * Response
-    , DescribeCacheEngineVersionsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheEngineVersionsResponse
-    -- ** Response lenses
-    , dcevrCacheEngineVersions
-    , dcevrMarker
+    , DescribeCacheEngineVersionsResponse
+    -- * Response Lenses
+    , dcevrsCacheEngineVersions
+    , dcevrsMarker
+    , dcevrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheEngineVersions = DescribeCacheEngineVersions
-    { _dcevCacheParameterGroupFamily :: Maybe Text
-    , _dcevDefaultOnly               :: Maybe Bool
-    , _dcevEngine                    :: Maybe Text
-    , _dcevEngineVersion             :: Maybe Text
-    , _dcevMarker                    :: Maybe Text
-    , _dcevMaxRecords                :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheEngineVersions' constructor.
+-- | Represents the input of a /DescribeCacheEngineVersions/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheEngineVersions' smart constructor.
+data DescribeCacheEngineVersions = DescribeCacheEngineVersions'
+    { _dcevCacheParameterGroupFamily :: !(Maybe Text)
+    , _dcevEngineVersion             :: !(Maybe Text)
+    , _dcevDefaultOnly               :: !(Maybe Bool)
+    , _dcevEngine                    :: !(Maybe Text)
+    , _dcevMaxRecords                :: !(Maybe Int)
+    , _dcevMarker                    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheEngineVersions' with the minimum fields required to make a request.
 --
--- * 'dcevCacheParameterGroupFamily' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcevDefaultOnly' @::@ 'Maybe' 'Bool'
+-- * 'dcevCacheParameterGroupFamily'
 --
--- * 'dcevEngine' @::@ 'Maybe' 'Text'
+-- * 'dcevEngineVersion'
 --
--- * 'dcevEngineVersion' @::@ 'Maybe' 'Text'
+-- * 'dcevDefaultOnly'
 --
--- * 'dcevMarker' @::@ 'Maybe' 'Text'
+-- * 'dcevEngine'
 --
--- * 'dcevMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dcevMaxRecords'
 --
-describeCacheEngineVersions :: DescribeCacheEngineVersions
-describeCacheEngineVersions = DescribeCacheEngineVersions
-    { _dcevEngine                    = Nothing
-    , _dcevEngineVersion             = Nothing
-    , _dcevCacheParameterGroupFamily = Nothing
-    , _dcevMaxRecords                = Nothing
-    , _dcevMarker                    = Nothing
-    , _dcevDefaultOnly               = Nothing
+-- * 'dcevMarker'
+describeCacheEngineVersions
+    :: DescribeCacheEngineVersions
+describeCacheEngineVersions =
+    DescribeCacheEngineVersions'
+    { _dcevCacheParameterGroupFamily = Nothing
+    , _dcevEngineVersion = Nothing
+    , _dcevDefaultOnly = Nothing
+    , _dcevEngine = Nothing
+    , _dcevMaxRecords = Nothing
+    , _dcevMarker = Nothing
     }
 
--- | The name of a specific cache parameter group family to return details for.
+-- | The name of a specific cache 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
---
+-- -   Must be 1 to 255 alphanumeric characters
+-- -   First character must be a letter
+-- -   Cannot end with a hyphen or contain two consecutive hyphens
 dcevCacheParameterGroupFamily :: Lens' DescribeCacheEngineVersions (Maybe Text)
-dcevCacheParameterGroupFamily =
-    lens _dcevCacheParameterGroupFamily
-        (\s a -> s { _dcevCacheParameterGroupFamily = a })
-
--- | If /true/, specifies that only the default version of the specified engine or
--- engine and major version combination is to be returned.
-dcevDefaultOnly :: Lens' DescribeCacheEngineVersions (Maybe Bool)
-dcevDefaultOnly = lens _dcevDefaultOnly (\s a -> s { _dcevDefaultOnly = a })
-
--- | The cache engine to return. Valid values: 'memcached' | 'redis'
-dcevEngine :: Lens' DescribeCacheEngineVersions (Maybe Text)
-dcevEngine = lens _dcevEngine (\s a -> s { _dcevEngine = a })
+dcevCacheParameterGroupFamily = lens _dcevCacheParameterGroupFamily (\ s a -> s{_dcevCacheParameterGroupFamily = a});
 
 -- | The cache engine version to return.
 --
 -- Example: '1.4.14'
 dcevEngineVersion :: Lens' DescribeCacheEngineVersions (Maybe Text)
-dcevEngineVersion =
-    lens _dcevEngineVersion (\s a -> s { _dcevEngineVersion = a })
+dcevEngineVersion = lens _dcevEngineVersion (\ s a -> s{_dcevEngineVersion = a});
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcevMarker :: Lens' DescribeCacheEngineVersions (Maybe Text)
-dcevMarker = lens _dcevMarker (\s a -> s { _dcevMarker = a })
+-- | If /true/, specifies that only the default version of the specified
+-- engine or engine and major version combination is to be returned.
+dcevDefaultOnly :: Lens' DescribeCacheEngineVersions (Maybe Bool)
+dcevDefaultOnly = lens _dcevDefaultOnly (\ s a -> s{_dcevDefaultOnly = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The cache engine to return. Valid values: 'memcached' | 'redis'
+dcevEngine :: Lens' DescribeCacheEngineVersions (Maybe Text)
+dcevEngine = lens _dcevEngine (\ s a -> s{_dcevEngine = a});
+
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 dcevMaxRecords :: Lens' DescribeCacheEngineVersions (Maybe Int)
-dcevMaxRecords = lens _dcevMaxRecords (\s a -> s { _dcevMaxRecords = a })
+dcevMaxRecords = lens _dcevMaxRecords (\ s a -> s{_dcevMaxRecords = a});
 
-data DescribeCacheEngineVersionsResponse = DescribeCacheEngineVersionsResponse
-    { _dcevrCacheEngineVersions :: List "member" CacheEngineVersion
-    , _dcevrMarker              :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dcevMarker :: Lens' DescribeCacheEngineVersions (Maybe Text)
+dcevMarker = lens _dcevMarker (\ s a -> s{_dcevMarker = a});
 
--- | 'DescribeCacheEngineVersionsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcevrCacheEngineVersions' @::@ ['CacheEngineVersion']
---
--- * 'dcevrMarker' @::@ 'Maybe' 'Text'
---
-describeCacheEngineVersionsResponse :: DescribeCacheEngineVersionsResponse
-describeCacheEngineVersionsResponse = DescribeCacheEngineVersionsResponse
-    { _dcevrMarker              = Nothing
-    , _dcevrCacheEngineVersions = mempty
-    }
+instance AWSPager DescribeCacheEngineVersions where
+        page rq rs
+          | stop (rs ^. dcevrsMarker) = Nothing
+          | stop (rs ^. dcevrsCacheEngineVersions) = Nothing
+          | otherwise =
+            Just $ rq & dcevMarker .~ rs ^. dcevrsMarker
 
--- | A list of cache engine version details. Each element in the list contains
--- detailed information about one cache engine version.
-dcevrCacheEngineVersions :: Lens' DescribeCacheEngineVersionsResponse [CacheEngineVersion]
-dcevrCacheEngineVersions =
-    lens _dcevrCacheEngineVersions
-        (\s a -> s { _dcevrCacheEngineVersions = a })
-            . _List
+instance AWSRequest DescribeCacheEngineVersions where
+        type Sv DescribeCacheEngineVersions = ElastiCache
+        type Rs DescribeCacheEngineVersions =
+             DescribeCacheEngineVersionsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeCacheEngineVersionsResult"
+              (\ s h x ->
+                 DescribeCacheEngineVersionsResponse' <$>
+                   (x .@? "CacheEngineVersions" .!@ mempty >>=
+                      may (parseXMLList "CacheEngineVersion"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | Provides an identifier to allow retrieval of paginated results.
-dcevrMarker :: Lens' DescribeCacheEngineVersionsResponse (Maybe Text)
-dcevrMarker = lens _dcevrMarker (\s a -> s { _dcevrMarker = a })
+instance ToHeaders DescribeCacheEngineVersions where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheEngineVersions where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheEngineVersions where
-    toQuery DescribeCacheEngineVersions{..} = mconcat
-        [ "CacheParameterGroupFamily" =? _dcevCacheParameterGroupFamily
-        , "DefaultOnly"               =? _dcevDefaultOnly
-        , "Engine"                    =? _dcevEngine
-        , "EngineVersion"             =? _dcevEngineVersion
-        , "Marker"                    =? _dcevMarker
-        , "MaxRecords"                =? _dcevMaxRecords
-        ]
+        toQuery DescribeCacheEngineVersions'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeCacheEngineVersions" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheParameterGroupFamily" =:
+                 _dcevCacheParameterGroupFamily,
+               "EngineVersion" =: _dcevEngineVersion,
+               "DefaultOnly" =: _dcevDefaultOnly,
+               "Engine" =: _dcevEngine,
+               "MaxRecords" =: _dcevMaxRecords,
+               "Marker" =: _dcevMarker]
 
-instance ToHeaders DescribeCacheEngineVersions
+-- | Represents the output of a DescribeCacheEngineVersions action.
+--
+-- /See:/ 'describeCacheEngineVersionsResponse' smart constructor.
+data DescribeCacheEngineVersionsResponse = DescribeCacheEngineVersionsResponse'
+    { _dcevrsCacheEngineVersions :: !(Maybe [CacheEngineVersion])
+    , _dcevrsMarker              :: !(Maybe Text)
+    , _dcevrsStatus              :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheEngineVersions where
-    type Sv DescribeCacheEngineVersions = ElastiCache
-    type Rs DescribeCacheEngineVersions = DescribeCacheEngineVersionsResponse
+-- | Creates a value of 'DescribeCacheEngineVersionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcevrsCacheEngineVersions'
+--
+-- * 'dcevrsMarker'
+--
+-- * 'dcevrsStatus'
+describeCacheEngineVersionsResponse
+    :: Int -- ^ 'dcevrsStatus'
+    -> DescribeCacheEngineVersionsResponse
+describeCacheEngineVersionsResponse pStatus_ =
+    DescribeCacheEngineVersionsResponse'
+    { _dcevrsCacheEngineVersions = Nothing
+    , _dcevrsMarker = Nothing
+    , _dcevrsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheEngineVersions"
-    response = xmlResponse
+-- | A list of cache engine version details. Each element in the list
+-- contains detailed information about one cache engine version.
+dcevrsCacheEngineVersions :: Lens' DescribeCacheEngineVersionsResponse [CacheEngineVersion]
+dcevrsCacheEngineVersions = lens _dcevrsCacheEngineVersions (\ s a -> s{_dcevrsCacheEngineVersions = a}) . _Default . _Coerce;
 
-instance FromXML DescribeCacheEngineVersionsResponse where
-    parseXML = withElement "DescribeCacheEngineVersionsResult" $ \x -> DescribeCacheEngineVersionsResponse
-        <$> x .@? "CacheEngineVersions" .!@ mempty
-        <*> x .@? "Marker"
+-- | Provides an identifier to allow retrieval of paginated results.
+dcevrsMarker :: Lens' DescribeCacheEngineVersionsResponse (Maybe Text)
+dcevrsMarker = lens _dcevrsMarker (\ s a -> s{_dcevrsMarker = a});
 
-instance AWSPager DescribeCacheEngineVersions where
-    page rq rs
-        | stop (rs ^. dcevrMarker) = Nothing
-        | otherwise = (\x -> rq & dcevMarker ?~ x)
-            <$> (rs ^. dcevrMarker)
+-- | The response status code.
+dcevrsStatus :: Lens' DescribeCacheEngineVersionsResponse Int
+dcevrsStatus = lens _dcevrsStatus (\ s a -> s{_dcevrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheParameterGroups.hs b/gen/Network/AWS/ElastiCache/DescribeCacheParameterGroups.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheParameterGroups.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheParameterGroups.hs
@@ -1,160 +1,181 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheParameterGroups
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheParameterGroups/ action returns a list of cache parameter
--- group descriptions. If a cache parameter group name is specified, the list
--- will contain only the descriptions for that group.
+-- The /DescribeCacheParameterGroups/ action returns a list of cache
+-- parameter group descriptions. If a cache parameter group name is
+-- specified, the list will contain only the descriptions for that group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameterGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameterGroups.html AWS API Reference> for DescribeCacheParameterGroups.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheParameterGroups
     (
-    -- * Request
-      DescribeCacheParameterGroups
-    -- ** Request constructor
-    , describeCacheParameterGroups
-    -- ** Request lenses
+    -- * Creating a Request
+      describeCacheParameterGroups
+    , DescribeCacheParameterGroups
+    -- * Request Lenses
     , dcpgCacheParameterGroupName
-    , dcpgMarker
     , dcpgMaxRecords
+    , dcpgMarker
 
-    -- * Response
-    , DescribeCacheParameterGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheParameterGroupsResponse
-    -- ** Response lenses
-    , dcpgrCacheParameterGroups
-    , dcpgrMarker
+    , DescribeCacheParameterGroupsResponse
+    -- * Response Lenses
+    , dcpgrsCacheParameterGroups
+    , dcpgrsMarker
+    , dcpgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheParameterGroups = DescribeCacheParameterGroups
-    { _dcpgCacheParameterGroupName :: Maybe Text
-    , _dcpgMarker                  :: Maybe Text
-    , _dcpgMaxRecords              :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheParameterGroups' constructor.
+-- | Represents the input of a /DescribeCacheParameterGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheParameterGroups' smart constructor.
+data DescribeCacheParameterGroups = DescribeCacheParameterGroups'
+    { _dcpgCacheParameterGroupName :: !(Maybe Text)
+    , _dcpgMaxRecords              :: !(Maybe Int)
+    , _dcpgMarker                  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheParameterGroups' with the minimum fields required to make a request.
 --
--- * 'dcpgCacheParameterGroupName' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcpgMarker' @::@ 'Maybe' 'Text'
+-- * 'dcpgCacheParameterGroupName'
 --
--- * 'dcpgMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dcpgMaxRecords'
 --
-describeCacheParameterGroups :: DescribeCacheParameterGroups
-describeCacheParameterGroups = DescribeCacheParameterGroups
+-- * 'dcpgMarker'
+describeCacheParameterGroups
+    :: DescribeCacheParameterGroups
+describeCacheParameterGroups =
+    DescribeCacheParameterGroups'
     { _dcpgCacheParameterGroupName = Nothing
-    , _dcpgMaxRecords              = Nothing
-    , _dcpgMarker                  = Nothing
+    , _dcpgMaxRecords = Nothing
+    , _dcpgMarker = Nothing
     }
 
 -- | The name of a specific cache parameter group to return details for.
 dcpgCacheParameterGroupName :: Lens' DescribeCacheParameterGroups (Maybe Text)
-dcpgCacheParameterGroupName =
-    lens _dcpgCacheParameterGroupName
-        (\s a -> s { _dcpgCacheParameterGroupName = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcpgMarker :: Lens' DescribeCacheParameterGroups (Maybe Text)
-dcpgMarker = lens _dcpgMarker (\s a -> s { _dcpgMarker = a })
+dcpgCacheParameterGroupName = lens _dcpgCacheParameterGroupName (\ s a -> s{_dcpgCacheParameterGroupName = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 dcpgMaxRecords :: Lens' DescribeCacheParameterGroups (Maybe Int)
-dcpgMaxRecords = lens _dcpgMaxRecords (\s a -> s { _dcpgMaxRecords = a })
+dcpgMaxRecords = lens _dcpgMaxRecords (\ s a -> s{_dcpgMaxRecords = a});
 
-data DescribeCacheParameterGroupsResponse = DescribeCacheParameterGroupsResponse
-    { _dcpgrCacheParameterGroups :: List "member" CacheParameterGroup
-    , _dcpgrMarker               :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dcpgMarker :: Lens' DescribeCacheParameterGroups (Maybe Text)
+dcpgMarker = lens _dcpgMarker (\ s a -> s{_dcpgMarker = a});
 
--- | 'DescribeCacheParameterGroupsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcpgrCacheParameterGroups' @::@ ['CacheParameterGroup']
---
--- * 'dcpgrMarker' @::@ 'Maybe' 'Text'
---
-describeCacheParameterGroupsResponse :: DescribeCacheParameterGroupsResponse
-describeCacheParameterGroupsResponse = DescribeCacheParameterGroupsResponse
-    { _dcpgrMarker               = Nothing
-    , _dcpgrCacheParameterGroups = mempty
-    }
+instance AWSPager DescribeCacheParameterGroups where
+        page rq rs
+          | stop (rs ^. dcpgrsMarker) = Nothing
+          | stop (rs ^. dcpgrsCacheParameterGroups) = Nothing
+          | otherwise =
+            Just $ rq & dcpgMarker .~ rs ^. dcpgrsMarker
 
--- | A list of cache parameter groups. Each element in the list contains detailed
--- information about one cache parameter group.
-dcpgrCacheParameterGroups :: Lens' DescribeCacheParameterGroupsResponse [CacheParameterGroup]
-dcpgrCacheParameterGroups =
-    lens _dcpgrCacheParameterGroups
-        (\s a -> s { _dcpgrCacheParameterGroups = a })
-            . _List
+instance AWSRequest DescribeCacheParameterGroups
+         where
+        type Sv DescribeCacheParameterGroups = ElastiCache
+        type Rs DescribeCacheParameterGroups =
+             DescribeCacheParameterGroupsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeCacheParameterGroupsResult"
+              (\ s h x ->
+                 DescribeCacheParameterGroupsResponse' <$>
+                   (x .@? "CacheParameterGroups" .!@ mempty >>=
+                      may (parseXMLList "CacheParameterGroup"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | Provides an identifier to allow retrieval of paginated results.
-dcpgrMarker :: Lens' DescribeCacheParameterGroupsResponse (Maybe Text)
-dcpgrMarker = lens _dcpgrMarker (\s a -> s { _dcpgrMarker = a })
+instance ToHeaders DescribeCacheParameterGroups where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheParameterGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheParameterGroups where
-    toQuery DescribeCacheParameterGroups{..} = mconcat
-        [ "CacheParameterGroupName" =? _dcpgCacheParameterGroupName
-        , "Marker"                  =? _dcpgMarker
-        , "MaxRecords"              =? _dcpgMaxRecords
-        ]
+        toQuery DescribeCacheParameterGroups'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeCacheParameterGroups" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheParameterGroupName" =:
+                 _dcpgCacheParameterGroupName,
+               "MaxRecords" =: _dcpgMaxRecords,
+               "Marker" =: _dcpgMarker]
 
-instance ToHeaders DescribeCacheParameterGroups
+-- | Represents the output of a /DescribeCacheParameterGroups/ action.
+--
+-- /See:/ 'describeCacheParameterGroupsResponse' smart constructor.
+data DescribeCacheParameterGroupsResponse = DescribeCacheParameterGroupsResponse'
+    { _dcpgrsCacheParameterGroups :: !(Maybe [CacheParameterGroup])
+    , _dcpgrsMarker               :: !(Maybe Text)
+    , _dcpgrsStatus               :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheParameterGroups where
-    type Sv DescribeCacheParameterGroups = ElastiCache
-    type Rs DescribeCacheParameterGroups = DescribeCacheParameterGroupsResponse
+-- | Creates a value of 'DescribeCacheParameterGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcpgrsCacheParameterGroups'
+--
+-- * 'dcpgrsMarker'
+--
+-- * 'dcpgrsStatus'
+describeCacheParameterGroupsResponse
+    :: Int -- ^ 'dcpgrsStatus'
+    -> DescribeCacheParameterGroupsResponse
+describeCacheParameterGroupsResponse pStatus_ =
+    DescribeCacheParameterGroupsResponse'
+    { _dcpgrsCacheParameterGroups = Nothing
+    , _dcpgrsMarker = Nothing
+    , _dcpgrsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheParameterGroups"
-    response = xmlResponse
+-- | A list of cache parameter groups. Each element in the list contains
+-- detailed information about one cache parameter group.
+dcpgrsCacheParameterGroups :: Lens' DescribeCacheParameterGroupsResponse [CacheParameterGroup]
+dcpgrsCacheParameterGroups = lens _dcpgrsCacheParameterGroups (\ s a -> s{_dcpgrsCacheParameterGroups = a}) . _Default . _Coerce;
 
-instance FromXML DescribeCacheParameterGroupsResponse where
-    parseXML = withElement "DescribeCacheParameterGroupsResult" $ \x -> DescribeCacheParameterGroupsResponse
-        <$> x .@? "CacheParameterGroups" .!@ mempty
-        <*> x .@? "Marker"
+-- | Provides an identifier to allow retrieval of paginated results.
+dcpgrsMarker :: Lens' DescribeCacheParameterGroupsResponse (Maybe Text)
+dcpgrsMarker = lens _dcpgrsMarker (\ s a -> s{_dcpgrsMarker = a});
 
-instance AWSPager DescribeCacheParameterGroups where
-    page rq rs
-        | stop (rs ^. dcpgrMarker) = Nothing
-        | otherwise = (\x -> rq & dcpgMarker ?~ x)
-            <$> (rs ^. dcpgrMarker)
+-- | The response status code.
+dcpgrsStatus :: Lens' DescribeCacheParameterGroupsResponse Int
+dcpgrsStatus = lens _dcpgrsStatus (\ s a -> s{_dcpgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheParameters.hs b/gen/Network/AWS/ElastiCache/DescribeCacheParameters.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheParameters.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheParameters.hs
@@ -1,182 +1,203 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheParameters
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheParameters/ action returns the detailed parameter list for a
--- particular cache parameter group.
+-- The /DescribeCacheParameters/ action returns the detailed parameter list
+-- for a particular cache parameter group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameters.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameters.html AWS API Reference> for DescribeCacheParameters.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheParameters
     (
-    -- * Request
-      DescribeCacheParameters
-    -- ** Request constructor
-    , describeCacheParameters
-    -- ** Request lenses
-    , dcpCacheParameterGroupName
-    , dcpMarker
+    -- * Creating a Request
+      describeCacheParameters
+    , DescribeCacheParameters
+    -- * Request Lenses
     , dcpMaxRecords
+    , dcpMarker
     , dcpSource
+    , dcpCacheParameterGroupName
 
-    -- * Response
-    , DescribeCacheParametersResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheParametersResponse
-    -- ** Response lenses
-    , dcprCacheNodeTypeSpecificParameters
-    , dcprMarker
-    , dcprParameters
+    , DescribeCacheParametersResponse
+    -- * Response Lenses
+    , dcprsCacheNodeTypeSpecificParameters
+    , dcprsParameters
+    , dcprsMarker
+    , dcprsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheParameters = DescribeCacheParameters
-    { _dcpCacheParameterGroupName :: Text
-    , _dcpMarker                  :: Maybe Text
-    , _dcpMaxRecords              :: Maybe Int
-    , _dcpSource                  :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheParameters' constructor.
+-- | Represents the input of a /DescribeCacheParameters/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheParameters' smart constructor.
+data DescribeCacheParameters = DescribeCacheParameters'
+    { _dcpMaxRecords              :: !(Maybe Int)
+    , _dcpMarker                  :: !(Maybe Text)
+    , _dcpSource                  :: !(Maybe Text)
+    , _dcpCacheParameterGroupName :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheParameters' with the minimum fields required to make a request.
 --
--- * 'dcpCacheParameterGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcpMarker' @::@ 'Maybe' 'Text'
+-- * 'dcpMaxRecords'
 --
--- * 'dcpMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dcpMarker'
 --
--- * 'dcpSource' @::@ 'Maybe' 'Text'
+-- * 'dcpSource'
 --
-describeCacheParameters :: Text -- ^ 'dcpCacheParameterGroupName'
-                        -> DescribeCacheParameters
-describeCacheParameters p1 = DescribeCacheParameters
-    { _dcpCacheParameterGroupName = p1
-    , _dcpSource                  = Nothing
-    , _dcpMaxRecords              = Nothing
-    , _dcpMarker                  = Nothing
+-- * 'dcpCacheParameterGroupName'
+describeCacheParameters
+    :: Text -- ^ 'dcpCacheParameterGroupName'
+    -> DescribeCacheParameters
+describeCacheParameters pCacheParameterGroupName_ =
+    DescribeCacheParameters'
+    { _dcpMaxRecords = Nothing
+    , _dcpMarker = Nothing
+    , _dcpSource = Nothing
+    , _dcpCacheParameterGroupName = pCacheParameterGroupName_
     }
 
--- | The name of a specific cache parameter group to return details for.
-dcpCacheParameterGroupName :: Lens' DescribeCacheParameters Text
-dcpCacheParameterGroupName =
-    lens _dcpCacheParameterGroupName
-        (\s a -> s { _dcpCacheParameterGroupName = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcpMarker :: Lens' DescribeCacheParameters (Maybe Text)
-dcpMarker = lens _dcpMarker (\s a -> s { _dcpMarker = a })
-
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 dcpMaxRecords :: Lens' DescribeCacheParameters (Maybe Int)
-dcpMaxRecords = lens _dcpMaxRecords (\s a -> s { _dcpMaxRecords = a })
+dcpMaxRecords = lens _dcpMaxRecords (\ s a -> s{_dcpMaxRecords = a});
 
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dcpMarker :: Lens' DescribeCacheParameters (Maybe Text)
+dcpMarker = lens _dcpMarker (\ s a -> s{_dcpMarker = a});
+
 -- | The parameter types to return.
 --
 -- Valid values: 'user' | 'system' | 'engine-default'
 dcpSource :: Lens' DescribeCacheParameters (Maybe Text)
-dcpSource = lens _dcpSource (\s a -> s { _dcpSource = a })
-
-data DescribeCacheParametersResponse = DescribeCacheParametersResponse
-    { _dcprCacheNodeTypeSpecificParameters :: List "member" CacheNodeTypeSpecificParameter
-    , _dcprMarker                          :: Maybe Text
-    , _dcprParameters                      :: List "member" Parameter
-    } deriving (Eq, Read, Show)
+dcpSource = lens _dcpSource (\ s a -> s{_dcpSource = a});
 
--- | 'DescribeCacheParametersResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcprCacheNodeTypeSpecificParameters' @::@ ['CacheNodeTypeSpecificParameter']
---
--- * 'dcprMarker' @::@ 'Maybe' 'Text'
---
--- * 'dcprParameters' @::@ ['Parameter']
---
-describeCacheParametersResponse :: DescribeCacheParametersResponse
-describeCacheParametersResponse = DescribeCacheParametersResponse
-    { _dcprMarker                          = Nothing
-    , _dcprParameters                      = mempty
-    , _dcprCacheNodeTypeSpecificParameters = mempty
-    }
+-- | The name of a specific cache parameter group to return details for.
+dcpCacheParameterGroupName :: Lens' DescribeCacheParameters Text
+dcpCacheParameterGroupName = lens _dcpCacheParameterGroupName (\ s a -> s{_dcpCacheParameterGroupName = a});
 
--- | A list of parameters specific to a particular cache node type. Each element
--- in the list contains detailed information about one parameter.
-dcprCacheNodeTypeSpecificParameters :: Lens' DescribeCacheParametersResponse [CacheNodeTypeSpecificParameter]
-dcprCacheNodeTypeSpecificParameters =
-    lens _dcprCacheNodeTypeSpecificParameters
-        (\s a -> s { _dcprCacheNodeTypeSpecificParameters = a })
-            . _List
+instance AWSPager DescribeCacheParameters where
+        page rq rs
+          | stop (rs ^. dcprsMarker) = Nothing
+          | stop (rs ^. dcprsParameters) = Nothing
+          | otherwise =
+            Just $ rq & dcpMarker .~ rs ^. dcprsMarker
 
--- | Provides an identifier to allow retrieval of paginated results.
-dcprMarker :: Lens' DescribeCacheParametersResponse (Maybe Text)
-dcprMarker = lens _dcprMarker (\s a -> s { _dcprMarker = a })
+instance AWSRequest DescribeCacheParameters where
+        type Sv DescribeCacheParameters = ElastiCache
+        type Rs DescribeCacheParameters =
+             DescribeCacheParametersResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeCacheParametersResult"
+              (\ s h x ->
+                 DescribeCacheParametersResponse' <$>
+                   (x .@? "CacheNodeTypeSpecificParameters" .!@ mempty
+                      >>=
+                      may (parseXMLList "CacheNodeTypeSpecificParameter"))
+                     <*>
+                     (x .@? "Parameters" .!@ mempty >>=
+                        may (parseXMLList "Parameter"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | A list of 'Parameter' instances.
-dcprParameters :: Lens' DescribeCacheParametersResponse [Parameter]
-dcprParameters = lens _dcprParameters (\s a -> s { _dcprParameters = a }) . _List
+instance ToHeaders DescribeCacheParameters where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheParameters where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheParameters where
-    toQuery DescribeCacheParameters{..} = mconcat
-        [ "CacheParameterGroupName" =? _dcpCacheParameterGroupName
-        , "Marker"                  =? _dcpMarker
-        , "MaxRecords"              =? _dcpMaxRecords
-        , "Source"                  =? _dcpSource
-        ]
+        toQuery DescribeCacheParameters'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeCacheParameters" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "MaxRecords" =: _dcpMaxRecords,
+               "Marker" =: _dcpMarker, "Source" =: _dcpSource,
+               "CacheParameterGroupName" =:
+                 _dcpCacheParameterGroupName]
 
-instance ToHeaders DescribeCacheParameters
+-- | Represents the output of a /DescribeCacheParameters/ action.
+--
+-- /See:/ 'describeCacheParametersResponse' smart constructor.
+data DescribeCacheParametersResponse = DescribeCacheParametersResponse'
+    { _dcprsCacheNodeTypeSpecificParameters :: !(Maybe [CacheNodeTypeSpecificParameter])
+    , _dcprsParameters                      :: !(Maybe [Parameter])
+    , _dcprsMarker                          :: !(Maybe Text)
+    , _dcprsStatus                          :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheParameters where
-    type Sv DescribeCacheParameters = ElastiCache
-    type Rs DescribeCacheParameters = DescribeCacheParametersResponse
+-- | Creates a value of 'DescribeCacheParametersResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcprsCacheNodeTypeSpecificParameters'
+--
+-- * 'dcprsParameters'
+--
+-- * 'dcprsMarker'
+--
+-- * 'dcprsStatus'
+describeCacheParametersResponse
+    :: Int -- ^ 'dcprsStatus'
+    -> DescribeCacheParametersResponse
+describeCacheParametersResponse pStatus_ =
+    DescribeCacheParametersResponse'
+    { _dcprsCacheNodeTypeSpecificParameters = Nothing
+    , _dcprsParameters = Nothing
+    , _dcprsMarker = Nothing
+    , _dcprsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheParameters"
-    response = xmlResponse
+-- | A list of parameters specific to a particular cache node type. Each
+-- element in the list contains detailed information about one parameter.
+dcprsCacheNodeTypeSpecificParameters :: Lens' DescribeCacheParametersResponse [CacheNodeTypeSpecificParameter]
+dcprsCacheNodeTypeSpecificParameters = lens _dcprsCacheNodeTypeSpecificParameters (\ s a -> s{_dcprsCacheNodeTypeSpecificParameters = a}) . _Default . _Coerce;
 
-instance FromXML DescribeCacheParametersResponse where
-    parseXML = withElement "DescribeCacheParametersResult" $ \x -> DescribeCacheParametersResponse
-        <$> x .@? "CacheNodeTypeSpecificParameters" .!@ mempty
-        <*> x .@? "Marker"
-        <*> x .@? "Parameters" .!@ mempty
+-- | A list of Parameter instances.
+dcprsParameters :: Lens' DescribeCacheParametersResponse [Parameter]
+dcprsParameters = lens _dcprsParameters (\ s a -> s{_dcprsParameters = a}) . _Default . _Coerce;
 
-instance AWSPager DescribeCacheParameters where
-    page rq rs
-        | stop (rs ^. dcprMarker) = Nothing
-        | otherwise = (\x -> rq & dcpMarker ?~ x)
-            <$> (rs ^. dcprMarker)
+-- | Provides an identifier to allow retrieval of paginated results.
+dcprsMarker :: Lens' DescribeCacheParametersResponse (Maybe Text)
+dcprsMarker = lens _dcprsMarker (\ s a -> s{_dcprsMarker = a});
+
+-- | The response status code.
+dcprsStatus :: Lens' DescribeCacheParametersResponse Int
+dcprsStatus = lens _dcprsStatus (\ s a -> s{_dcprsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheSecurityGroups.hs b/gen/Network/AWS/ElastiCache/DescribeCacheSecurityGroups.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheSecurityGroups.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheSecurityGroups.hs
@@ -1,160 +1,180 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheSecurityGroups
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheSecurityGroups/ action returns a list of cache security group
--- descriptions. If a cache security group name is specified, the list will
--- contain only the description of that group.
+-- The /DescribeCacheSecurityGroups/ action returns a list of cache
+-- security group descriptions. If a cache security group name is
+-- specified, the list will contain only the description of that group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheSecurityGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheSecurityGroups.html AWS API Reference> for DescribeCacheSecurityGroups.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheSecurityGroups
     (
-    -- * Request
-      DescribeCacheSecurityGroups
-    -- ** Request constructor
-    , describeCacheSecurityGroups
-    -- ** Request lenses
-    , dcsg1CacheSecurityGroupName
-    , dcsg1Marker
-    , dcsg1MaxRecords
+    -- * Creating a Request
+      describeCacheSecurityGroups
+    , DescribeCacheSecurityGroups
+    -- * Request Lenses
+    , dcsgsCacheSecurityGroupName
+    , dcsgsMaxRecords
+    , dcsgsMarker
 
-    -- * Response
-    , DescribeCacheSecurityGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheSecurityGroupsResponse
-    -- ** Response lenses
-    , dcsgr1CacheSecurityGroups
-    , dcsgr1Marker
+    , DescribeCacheSecurityGroupsResponse
+    -- * Response Lenses
+    , dcsgsrsCacheSecurityGroups
+    , dcsgsrsMarker
+    , dcsgsrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheSecurityGroups = DescribeCacheSecurityGroups
-    { _dcsg1CacheSecurityGroupName :: Maybe Text
-    , _dcsg1Marker                 :: Maybe Text
-    , _dcsg1MaxRecords             :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheSecurityGroups' constructor.
+-- | Represents the input of a /DescribeCacheSecurityGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheSecurityGroups' smart constructor.
+data DescribeCacheSecurityGroups = DescribeCacheSecurityGroups'
+    { _dcsgsCacheSecurityGroupName :: !(Maybe Text)
+    , _dcsgsMaxRecords             :: !(Maybe Int)
+    , _dcsgsMarker                 :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheSecurityGroups' with the minimum fields required to make a request.
 --
--- * 'dcsg1CacheSecurityGroupName' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcsg1Marker' @::@ 'Maybe' 'Text'
+-- * 'dcsgsCacheSecurityGroupName'
 --
--- * 'dcsg1MaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dcsgsMaxRecords'
 --
-describeCacheSecurityGroups :: DescribeCacheSecurityGroups
-describeCacheSecurityGroups = DescribeCacheSecurityGroups
-    { _dcsg1CacheSecurityGroupName = Nothing
-    , _dcsg1MaxRecords             = Nothing
-    , _dcsg1Marker                 = Nothing
+-- * 'dcsgsMarker'
+describeCacheSecurityGroups
+    :: DescribeCacheSecurityGroups
+describeCacheSecurityGroups =
+    DescribeCacheSecurityGroups'
+    { _dcsgsCacheSecurityGroupName = Nothing
+    , _dcsgsMaxRecords = Nothing
+    , _dcsgsMarker = Nothing
     }
 
 -- | The name of the cache security group to return details for.
-dcsg1CacheSecurityGroupName :: Lens' DescribeCacheSecurityGroups (Maybe Text)
-dcsg1CacheSecurityGroupName =
-    lens _dcsg1CacheSecurityGroupName
-        (\s a -> s { _dcsg1CacheSecurityGroupName = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcsg1Marker :: Lens' DescribeCacheSecurityGroups (Maybe Text)
-dcsg1Marker = lens _dcsg1Marker (\s a -> s { _dcsg1Marker = a })
+dcsgsCacheSecurityGroupName :: Lens' DescribeCacheSecurityGroups (Maybe Text)
+dcsgsCacheSecurityGroupName = lens _dcsgsCacheSecurityGroupName (\ s a -> s{_dcsgsCacheSecurityGroupName = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
-dcsg1MaxRecords :: Lens' DescribeCacheSecurityGroups (Maybe Int)
-dcsg1MaxRecords = lens _dcsg1MaxRecords (\s a -> s { _dcsg1MaxRecords = a })
+dcsgsMaxRecords :: Lens' DescribeCacheSecurityGroups (Maybe Int)
+dcsgsMaxRecords = lens _dcsgsMaxRecords (\ s a -> s{_dcsgsMaxRecords = a});
 
-data DescribeCacheSecurityGroupsResponse = DescribeCacheSecurityGroupsResponse
-    { _dcsgr1CacheSecurityGroups :: List "member" CacheSecurityGroup
-    , _dcsgr1Marker              :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dcsgsMarker :: Lens' DescribeCacheSecurityGroups (Maybe Text)
+dcsgsMarker = lens _dcsgsMarker (\ s a -> s{_dcsgsMarker = a});
 
--- | 'DescribeCacheSecurityGroupsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcsgr1CacheSecurityGroups' @::@ ['CacheSecurityGroup']
---
--- * 'dcsgr1Marker' @::@ 'Maybe' 'Text'
---
-describeCacheSecurityGroupsResponse :: DescribeCacheSecurityGroupsResponse
-describeCacheSecurityGroupsResponse = DescribeCacheSecurityGroupsResponse
-    { _dcsgr1Marker              = Nothing
-    , _dcsgr1CacheSecurityGroups = mempty
-    }
+instance AWSPager DescribeCacheSecurityGroups where
+        page rq rs
+          | stop (rs ^. dcsgsrsMarker) = Nothing
+          | stop (rs ^. dcsgsrsCacheSecurityGroups) = Nothing
+          | otherwise =
+            Just $ rq & dcsgsMarker .~ rs ^. dcsgsrsMarker
 
--- | A list of cache security groups. Each element in the list contains detailed
--- information about one group.
-dcsgr1CacheSecurityGroups :: Lens' DescribeCacheSecurityGroupsResponse [CacheSecurityGroup]
-dcsgr1CacheSecurityGroups =
-    lens _dcsgr1CacheSecurityGroups
-        (\s a -> s { _dcsgr1CacheSecurityGroups = a })
-            . _List
+instance AWSRequest DescribeCacheSecurityGroups where
+        type Sv DescribeCacheSecurityGroups = ElastiCache
+        type Rs DescribeCacheSecurityGroups =
+             DescribeCacheSecurityGroupsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeCacheSecurityGroupsResult"
+              (\ s h x ->
+                 DescribeCacheSecurityGroupsResponse' <$>
+                   (x .@? "CacheSecurityGroups" .!@ mempty >>=
+                      may (parseXMLList "CacheSecurityGroup"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | Provides an identifier to allow retrieval of paginated results.
-dcsgr1Marker :: Lens' DescribeCacheSecurityGroupsResponse (Maybe Text)
-dcsgr1Marker = lens _dcsgr1Marker (\s a -> s { _dcsgr1Marker = a })
+instance ToHeaders DescribeCacheSecurityGroups where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheSecurityGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheSecurityGroups where
-    toQuery DescribeCacheSecurityGroups{..} = mconcat
-        [ "CacheSecurityGroupName" =? _dcsg1CacheSecurityGroupName
-        , "Marker"                 =? _dcsg1Marker
-        , "MaxRecords"             =? _dcsg1MaxRecords
-        ]
+        toQuery DescribeCacheSecurityGroups'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeCacheSecurityGroups" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSecurityGroupName" =:
+                 _dcsgsCacheSecurityGroupName,
+               "MaxRecords" =: _dcsgsMaxRecords,
+               "Marker" =: _dcsgsMarker]
 
-instance ToHeaders DescribeCacheSecurityGroups
+-- | Represents the output of a /DescribeCacheSecurityGroups/ action.
+--
+-- /See:/ 'describeCacheSecurityGroupsResponse' smart constructor.
+data DescribeCacheSecurityGroupsResponse = DescribeCacheSecurityGroupsResponse'
+    { _dcsgsrsCacheSecurityGroups :: !(Maybe [CacheSecurityGroup])
+    , _dcsgsrsMarker              :: !(Maybe Text)
+    , _dcsgsrsStatus              :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheSecurityGroups where
-    type Sv DescribeCacheSecurityGroups = ElastiCache
-    type Rs DescribeCacheSecurityGroups = DescribeCacheSecurityGroupsResponse
+-- | Creates a value of 'DescribeCacheSecurityGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcsgsrsCacheSecurityGroups'
+--
+-- * 'dcsgsrsMarker'
+--
+-- * 'dcsgsrsStatus'
+describeCacheSecurityGroupsResponse
+    :: Int -- ^ 'dcsgsrsStatus'
+    -> DescribeCacheSecurityGroupsResponse
+describeCacheSecurityGroupsResponse pStatus_ =
+    DescribeCacheSecurityGroupsResponse'
+    { _dcsgsrsCacheSecurityGroups = Nothing
+    , _dcsgsrsMarker = Nothing
+    , _dcsgsrsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheSecurityGroups"
-    response = xmlResponse
+-- | A list of cache security groups. Each element in the list contains
+-- detailed information about one group.
+dcsgsrsCacheSecurityGroups :: Lens' DescribeCacheSecurityGroupsResponse [CacheSecurityGroup]
+dcsgsrsCacheSecurityGroups = lens _dcsgsrsCacheSecurityGroups (\ s a -> s{_dcsgsrsCacheSecurityGroups = a}) . _Default . _Coerce;
 
-instance FromXML DescribeCacheSecurityGroupsResponse where
-    parseXML = withElement "DescribeCacheSecurityGroupsResult" $ \x -> DescribeCacheSecurityGroupsResponse
-        <$> x .@? "CacheSecurityGroups" .!@ mempty
-        <*> x .@? "Marker"
+-- | Provides an identifier to allow retrieval of paginated results.
+dcsgsrsMarker :: Lens' DescribeCacheSecurityGroupsResponse (Maybe Text)
+dcsgsrsMarker = lens _dcsgsrsMarker (\ s a -> s{_dcsgsrsMarker = a});
 
-instance AWSPager DescribeCacheSecurityGroups where
-    page rq rs
-        | stop (rs ^. dcsgr1Marker) = Nothing
-        | otherwise = (\x -> rq & dcsg1Marker ?~ x)
-            <$> (rs ^. dcsgr1Marker)
+-- | The response status code.
+dcsgsrsStatus :: Lens' DescribeCacheSecurityGroupsResponse Int
+dcsgsrsStatus = lens _dcsgsrsStatus (\ s a -> s{_dcsgsrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeCacheSubnetGroups.hs b/gen/Network/AWS/ElastiCache/DescribeCacheSubnetGroups.hs
--- a/gen/Network/AWS/ElastiCache/DescribeCacheSubnetGroups.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeCacheSubnetGroups.hs
@@ -1,159 +1,178 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeCacheSubnetGroups
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeCacheSubnetGroups/ action returns a list of cache subnet group
--- descriptions. If a subnet group name is specified, the list will contain only
--- the description of that group.
+-- The /DescribeCacheSubnetGroups/ action returns a list of cache subnet
+-- group descriptions. If a subnet group name is specified, the list will
+-- contain only the description of that group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheSubnetGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeCacheSubnetGroups.html AWS API Reference> for DescribeCacheSubnetGroups.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeCacheSubnetGroups
     (
-    -- * Request
-      DescribeCacheSubnetGroups
-    -- ** Request constructor
-    , describeCacheSubnetGroups
-    -- ** Request lenses
+    -- * Creating a Request
+      describeCacheSubnetGroups
+    , DescribeCacheSubnetGroups
+    -- * Request Lenses
     , dcsgCacheSubnetGroupName
-    , dcsgMarker
     , dcsgMaxRecords
+    , dcsgMarker
 
-    -- * Response
-    , DescribeCacheSubnetGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeCacheSubnetGroupsResponse
-    -- ** Response lenses
-    , dcsgrCacheSubnetGroups
-    , dcsgrMarker
+    , DescribeCacheSubnetGroupsResponse
+    -- * Response Lenses
+    , dcsgrsMarker
+    , dcsgrsCacheSubnetGroups
+    , dcsgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeCacheSubnetGroups = DescribeCacheSubnetGroups
-    { _dcsgCacheSubnetGroupName :: Maybe Text
-    , _dcsgMarker               :: Maybe Text
-    , _dcsgMaxRecords           :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeCacheSubnetGroups' constructor.
+-- | Represents the input of a /DescribeCacheSubnetGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeCacheSubnetGroups' smart constructor.
+data DescribeCacheSubnetGroups = DescribeCacheSubnetGroups'
+    { _dcsgCacheSubnetGroupName :: !(Maybe Text)
+    , _dcsgMaxRecords           :: !(Maybe Int)
+    , _dcsgMarker               :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeCacheSubnetGroups' with the minimum fields required to make a request.
 --
--- * 'dcsgCacheSubnetGroupName' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dcsgMarker' @::@ 'Maybe' 'Text'
+-- * 'dcsgCacheSubnetGroupName'
 --
--- * 'dcsgMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dcsgMaxRecords'
 --
-describeCacheSubnetGroups :: DescribeCacheSubnetGroups
-describeCacheSubnetGroups = DescribeCacheSubnetGroups
+-- * 'dcsgMarker'
+describeCacheSubnetGroups
+    :: DescribeCacheSubnetGroups
+describeCacheSubnetGroups =
+    DescribeCacheSubnetGroups'
     { _dcsgCacheSubnetGroupName = Nothing
-    , _dcsgMaxRecords           = Nothing
-    , _dcsgMarker               = Nothing
+    , _dcsgMaxRecords = Nothing
+    , _dcsgMarker = Nothing
     }
 
 -- | The name of the cache subnet group to return details for.
 dcsgCacheSubnetGroupName :: Lens' DescribeCacheSubnetGroups (Maybe Text)
-dcsgCacheSubnetGroupName =
-    lens _dcsgCacheSubnetGroupName
-        (\s a -> s { _dcsgCacheSubnetGroupName = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dcsgMarker :: Lens' DescribeCacheSubnetGroups (Maybe Text)
-dcsgMarker = lens _dcsgMarker (\s a -> s { _dcsgMarker = a })
+dcsgCacheSubnetGroupName = lens _dcsgCacheSubnetGroupName (\ s a -> s{_dcsgCacheSubnetGroupName = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 dcsgMaxRecords :: Lens' DescribeCacheSubnetGroups (Maybe Int)
-dcsgMaxRecords = lens _dcsgMaxRecords (\s a -> s { _dcsgMaxRecords = a })
+dcsgMaxRecords = lens _dcsgMaxRecords (\ s a -> s{_dcsgMaxRecords = a});
 
-data DescribeCacheSubnetGroupsResponse = DescribeCacheSubnetGroupsResponse
-    { _dcsgrCacheSubnetGroups :: List "member" CacheSubnetGroup
-    , _dcsgrMarker            :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dcsgMarker :: Lens' DescribeCacheSubnetGroups (Maybe Text)
+dcsgMarker = lens _dcsgMarker (\ s a -> s{_dcsgMarker = a});
 
--- | 'DescribeCacheSubnetGroupsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcsgrCacheSubnetGroups' @::@ ['CacheSubnetGroup']
---
--- * 'dcsgrMarker' @::@ 'Maybe' 'Text'
---
-describeCacheSubnetGroupsResponse :: DescribeCacheSubnetGroupsResponse
-describeCacheSubnetGroupsResponse = DescribeCacheSubnetGroupsResponse
-    { _dcsgrMarker            = Nothing
-    , _dcsgrCacheSubnetGroups = mempty
-    }
+instance AWSPager DescribeCacheSubnetGroups where
+        page rq rs
+          | stop (rs ^. dcsgrsMarker) = Nothing
+          | stop (rs ^. dcsgrsCacheSubnetGroups) = Nothing
+          | otherwise =
+            Just $ rq & dcsgMarker .~ rs ^. dcsgrsMarker
 
--- | A list of cache subnet groups. Each element in the list contains detailed
--- information about one group.
-dcsgrCacheSubnetGroups :: Lens' DescribeCacheSubnetGroupsResponse [CacheSubnetGroup]
-dcsgrCacheSubnetGroups =
-    lens _dcsgrCacheSubnetGroups (\s a -> s { _dcsgrCacheSubnetGroups = a })
-        . _List
+instance AWSRequest DescribeCacheSubnetGroups where
+        type Sv DescribeCacheSubnetGroups = ElastiCache
+        type Rs DescribeCacheSubnetGroups =
+             DescribeCacheSubnetGroupsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeCacheSubnetGroupsResult"
+              (\ s h x ->
+                 DescribeCacheSubnetGroupsResponse' <$>
+                   (x .@? "Marker") <*>
+                     (x .@? "CacheSubnetGroups" .!@ mempty >>=
+                        may (parseXMLList "CacheSubnetGroup"))
+                     <*> (pure (fromEnum s)))
 
--- | Provides an identifier to allow retrieval of paginated results.
-dcsgrMarker :: Lens' DescribeCacheSubnetGroupsResponse (Maybe Text)
-dcsgrMarker = lens _dcsgrMarker (\s a -> s { _dcsgrMarker = a })
+instance ToHeaders DescribeCacheSubnetGroups where
+        toHeaders = const mempty
 
 instance ToPath DescribeCacheSubnetGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCacheSubnetGroups where
-    toQuery DescribeCacheSubnetGroups{..} = mconcat
-        [ "CacheSubnetGroupName" =? _dcsgCacheSubnetGroupName
-        , "Marker"               =? _dcsgMarker
-        , "MaxRecords"           =? _dcsgMaxRecords
-        ]
+        toQuery DescribeCacheSubnetGroups'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeCacheSubnetGroups" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSubnetGroupName" =: _dcsgCacheSubnetGroupName,
+               "MaxRecords" =: _dcsgMaxRecords,
+               "Marker" =: _dcsgMarker]
 
-instance ToHeaders DescribeCacheSubnetGroups
+-- | Represents the output of a /DescribeCacheSubnetGroups/ action.
+--
+-- /See:/ 'describeCacheSubnetGroupsResponse' smart constructor.
+data DescribeCacheSubnetGroupsResponse = DescribeCacheSubnetGroupsResponse'
+    { _dcsgrsMarker            :: !(Maybe Text)
+    , _dcsgrsCacheSubnetGroups :: !(Maybe [CacheSubnetGroup])
+    , _dcsgrsStatus            :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCacheSubnetGroups where
-    type Sv DescribeCacheSubnetGroups = ElastiCache
-    type Rs DescribeCacheSubnetGroups = DescribeCacheSubnetGroupsResponse
+-- | Creates a value of 'DescribeCacheSubnetGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcsgrsMarker'
+--
+-- * 'dcsgrsCacheSubnetGroups'
+--
+-- * 'dcsgrsStatus'
+describeCacheSubnetGroupsResponse
+    :: Int -- ^ 'dcsgrsStatus'
+    -> DescribeCacheSubnetGroupsResponse
+describeCacheSubnetGroupsResponse pStatus_ =
+    DescribeCacheSubnetGroupsResponse'
+    { _dcsgrsMarker = Nothing
+    , _dcsgrsCacheSubnetGroups = Nothing
+    , _dcsgrsStatus = pStatus_
+    }
 
-    request  = post "DescribeCacheSubnetGroups"
-    response = xmlResponse
+-- | Provides an identifier to allow retrieval of paginated results.
+dcsgrsMarker :: Lens' DescribeCacheSubnetGroupsResponse (Maybe Text)
+dcsgrsMarker = lens _dcsgrsMarker (\ s a -> s{_dcsgrsMarker = a});
 
-instance FromXML DescribeCacheSubnetGroupsResponse where
-    parseXML = withElement "DescribeCacheSubnetGroupsResult" $ \x -> DescribeCacheSubnetGroupsResponse
-        <$> x .@? "CacheSubnetGroups" .!@ mempty
-        <*> x .@? "Marker"
+-- | A list of cache subnet groups. Each element in the list contains
+-- detailed information about one group.
+dcsgrsCacheSubnetGroups :: Lens' DescribeCacheSubnetGroupsResponse [CacheSubnetGroup]
+dcsgrsCacheSubnetGroups = lens _dcsgrsCacheSubnetGroups (\ s a -> s{_dcsgrsCacheSubnetGroups = a}) . _Default . _Coerce;
 
-instance AWSPager DescribeCacheSubnetGroups where
-    page rq rs
-        | stop (rs ^. dcsgrMarker) = Nothing
-        | otherwise = (\x -> rq & dcsgMarker ?~ x)
-            <$> (rs ^. dcsgrMarker)
+-- | The response status code.
+dcsgrsStatus :: Lens' DescribeCacheSubnetGroupsResponse Int
+dcsgrsStatus = lens _dcsgrsStatus (\ s a -> s{_dcsgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeEngineDefaultParameters.hs b/gen/Network/AWS/ElastiCache/DescribeEngineDefaultParameters.hs
--- a/gen/Network/AWS/ElastiCache/DescribeEngineDefaultParameters.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeEngineDefaultParameters.hs
@@ -1,148 +1,176 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeEngineDefaultParameters
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeEngineDefaultParameters/ action returns the default engine and
--- system parameter information for the specified cache engine.
+-- The /DescribeEngineDefaultParameters/ action returns the default engine
+-- and system parameter information for the specified cache engine.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeEngineDefaultParameters.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeEngineDefaultParameters.html AWS API Reference> for DescribeEngineDefaultParameters.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeEngineDefaultParameters
     (
-    -- * Request
-      DescribeEngineDefaultParameters
-    -- ** Request constructor
-    , describeEngineDefaultParameters
-    -- ** Request lenses
-    , dedpCacheParameterGroupFamily
-    , dedpMarker
+    -- * Creating a Request
+      describeEngineDefaultParameters
+    , DescribeEngineDefaultParameters
+    -- * Request Lenses
     , dedpMaxRecords
+    , dedpMarker
+    , dedpCacheParameterGroupFamily
 
-    -- * Response
-    , DescribeEngineDefaultParametersResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeEngineDefaultParametersResponse
-    -- ** Response lenses
-    , dedprEngineDefaults
+    , DescribeEngineDefaultParametersResponse
+    -- * Response Lenses
+    , dedprsStatus
+    , dedprsEngineDefaults
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeEngineDefaultParameters = DescribeEngineDefaultParameters
-    { _dedpCacheParameterGroupFamily :: Text
-    , _dedpMarker                    :: Maybe Text
-    , _dedpMaxRecords                :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeEngineDefaultParameters' constructor.
+-- | Represents the input of a /DescribeEngineDefaultParameters/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeEngineDefaultParameters' smart constructor.
+data DescribeEngineDefaultParameters = DescribeEngineDefaultParameters'
+    { _dedpMaxRecords                :: !(Maybe Int)
+    , _dedpMarker                    :: !(Maybe Text)
+    , _dedpCacheParameterGroupFamily :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeEngineDefaultParameters' with the minimum fields required to make a request.
 --
--- * 'dedpCacheParameterGroupFamily' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dedpMarker' @::@ 'Maybe' 'Text'
+-- * 'dedpMaxRecords'
 --
--- * 'dedpMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dedpMarker'
 --
-describeEngineDefaultParameters :: Text -- ^ 'dedpCacheParameterGroupFamily'
-                                -> DescribeEngineDefaultParameters
-describeEngineDefaultParameters p1 = DescribeEngineDefaultParameters
-    { _dedpCacheParameterGroupFamily = p1
-    , _dedpMaxRecords                = Nothing
-    , _dedpMarker                    = Nothing
+-- * 'dedpCacheParameterGroupFamily'
+describeEngineDefaultParameters
+    :: Text -- ^ 'dedpCacheParameterGroupFamily'
+    -> DescribeEngineDefaultParameters
+describeEngineDefaultParameters pCacheParameterGroupFamily_ =
+    DescribeEngineDefaultParameters'
+    { _dedpMaxRecords = Nothing
+    , _dedpMarker = Nothing
+    , _dedpCacheParameterGroupFamily = pCacheParameterGroupFamily_
     }
 
--- | The name of the cache parameter group family. Valid values are: 'memcached1.4'
--- | 'redis2.6' | 'redis2.8'
-dedpCacheParameterGroupFamily :: Lens' DescribeEngineDefaultParameters Text
-dedpCacheParameterGroupFamily =
-    lens _dedpCacheParameterGroupFamily
-        (\s a -> s { _dedpCacheParameterGroupFamily = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dedpMarker :: Lens' DescribeEngineDefaultParameters (Maybe Text)
-dedpMarker = lens _dedpMarker (\s a -> s { _dedpMarker = a })
-
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 dedpMaxRecords :: Lens' DescribeEngineDefaultParameters (Maybe Int)
-dedpMaxRecords = lens _dedpMaxRecords (\s a -> s { _dedpMaxRecords = a })
-
-newtype DescribeEngineDefaultParametersResponse = DescribeEngineDefaultParametersResponse
-    { _dedprEngineDefaults :: EngineDefaults
-    } deriving (Eq, Read, Show)
+dedpMaxRecords = lens _dedpMaxRecords (\ s a -> s{_dedpMaxRecords = a});
 
--- | 'DescribeEngineDefaultParametersResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dedprEngineDefaults' @::@ 'EngineDefaults'
---
-describeEngineDefaultParametersResponse :: EngineDefaults -- ^ 'dedprEngineDefaults'
-                                        -> DescribeEngineDefaultParametersResponse
-describeEngineDefaultParametersResponse p1 = DescribeEngineDefaultParametersResponse
-    { _dedprEngineDefaults = p1
-    }
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dedpMarker :: Lens' DescribeEngineDefaultParameters (Maybe Text)
+dedpMarker = lens _dedpMarker (\ s a -> s{_dedpMarker = a});
 
-dedprEngineDefaults :: Lens' DescribeEngineDefaultParametersResponse EngineDefaults
-dedprEngineDefaults =
-    lens _dedprEngineDefaults (\s a -> s { _dedprEngineDefaults = a })
+-- | The name of the cache parameter group family. Valid values are:
+-- 'memcached1.4' | 'redis2.6' | 'redis2.8'
+dedpCacheParameterGroupFamily :: Lens' DescribeEngineDefaultParameters Text
+dedpCacheParameterGroupFamily = lens _dedpCacheParameterGroupFamily (\ s a -> s{_dedpCacheParameterGroupFamily = a});
 
-instance ToPath DescribeEngineDefaultParameters where
-    toPath = const "/"
+instance AWSPager DescribeEngineDefaultParameters
+         where
+        page rq rs
+          | stop
+              (rs ^? dedprsEngineDefaults . edMarker . _Just)
+            = Nothing
+          | stop (rs ^. dedprsEngineDefaults . edParameters) =
+            Nothing
+          | otherwise =
+            Just $ rq &
+              dedpMarker .~
+                rs ^? dedprsEngineDefaults . edMarker . _Just
 
-instance ToQuery DescribeEngineDefaultParameters where
-    toQuery DescribeEngineDefaultParameters{..} = mconcat
-        [ "CacheParameterGroupFamily" =? _dedpCacheParameterGroupFamily
-        , "Marker"                    =? _dedpMarker
-        , "MaxRecords"                =? _dedpMaxRecords
-        ]
+instance AWSRequest DescribeEngineDefaultParameters
+         where
+        type Sv DescribeEngineDefaultParameters = ElastiCache
+        type Rs DescribeEngineDefaultParameters =
+             DescribeEngineDefaultParametersResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeEngineDefaultParametersResult"
+              (\ s h x ->
+                 DescribeEngineDefaultParametersResponse' <$>
+                   (pure (fromEnum s)) <*> (x .@ "EngineDefaults"))
 
 instance ToHeaders DescribeEngineDefaultParameters
+         where
+        toHeaders = const mempty
 
-instance AWSRequest DescribeEngineDefaultParameters where
-    type Sv DescribeEngineDefaultParameters = ElastiCache
-    type Rs DescribeEngineDefaultParameters = DescribeEngineDefaultParametersResponse
+instance ToPath DescribeEngineDefaultParameters where
+        toPath = const "/"
 
-    request  = post "DescribeEngineDefaultParameters"
-    response = xmlResponse
+instance ToQuery DescribeEngineDefaultParameters
+         where
+        toQuery DescribeEngineDefaultParameters'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeEngineDefaultParameters" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "MaxRecords" =: _dedpMaxRecords,
+               "Marker" =: _dedpMarker,
+               "CacheParameterGroupFamily" =:
+                 _dedpCacheParameterGroupFamily]
 
-instance FromXML DescribeEngineDefaultParametersResponse where
-    parseXML = withElement "DescribeEngineDefaultParametersResult" $ \x -> DescribeEngineDefaultParametersResponse
-        <$> x .@  "EngineDefaults"
+-- | /See:/ 'describeEngineDefaultParametersResponse' smart constructor.
+data DescribeEngineDefaultParametersResponse = DescribeEngineDefaultParametersResponse'
+    { _dedprsStatus         :: !Int
+    , _dedprsEngineDefaults :: !EngineDefaults
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSPager DescribeEngineDefaultParameters where
-    page rq rs
-        | stop (rs ^. dedprEngineDefaults . edMarker) = Nothing
-        | otherwise = (\x -> rq & dedpMarker ?~ x)
-            <$> (rs ^. dedprEngineDefaults . edMarker)
+-- | Creates a value of 'DescribeEngineDefaultParametersResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dedprsStatus'
+--
+-- * 'dedprsEngineDefaults'
+describeEngineDefaultParametersResponse
+    :: Int -- ^ 'dedprsStatus'
+    -> EngineDefaults -- ^ 'dedprsEngineDefaults'
+    -> DescribeEngineDefaultParametersResponse
+describeEngineDefaultParametersResponse pStatus_ pEngineDefaults_ =
+    DescribeEngineDefaultParametersResponse'
+    { _dedprsStatus = pStatus_
+    , _dedprsEngineDefaults = pEngineDefaults_
+    }
+
+-- | The response status code.
+dedprsStatus :: Lens' DescribeEngineDefaultParametersResponse Int
+dedprsStatus = lens _dedprsStatus (\ s a -> s{_dedprsStatus = a});
+
+-- | Undocumented member.
+dedprsEngineDefaults :: Lens' DescribeEngineDefaultParametersResponse EngineDefaults
+dedprsEngineDefaults = lens _dedprsEngineDefaults (\ s a -> s{_dedprsEngineDefaults = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeEvents.hs b/gen/Network/AWS/ElastiCache/DescribeEvents.hs
--- a/gen/Network/AWS/ElastiCache/DescribeEvents.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeEvents.hs
@@ -1,206 +1,226 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeEvents/ action returns events related to cache clusters, cache
--- security groups, and cache parameter groups. You can obtain events specific
--- to a particular cache cluster, cache security group, or cache parameter group
--- by providing the name as a parameter.
+-- The /DescribeEvents/ action returns events related to cache clusters,
+-- cache security groups, and cache parameter groups. You can obtain events
+-- specific to a particular cache cluster, cache security group, or cache
+-- parameter group by providing the name as a parameter.
 --
 -- By default, only the events occurring within the last hour are returned;
--- however, you can retrieve up to 14 days' worth of events if necessary.
+-- however, you can retrieve up to 14 days\' worth of events if necessary.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeEvents.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeEvents.html AWS API Reference> for DescribeEvents.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeEvents
     (
-    -- * Request
-      DescribeEvents
-    -- ** Request constructor
-    , describeEvents
-    -- ** Request lenses
-    , deDuration
+    -- * Creating a Request
+      describeEvents
+    , DescribeEvents
+    -- * Request Lenses
+    , deStartTime
+    , deSourceType
+    , deSourceIdentifier
+    , deMaxRecords
     , deEndTime
     , deMarker
-    , deMaxRecords
-    , deSourceIdentifier
-    , deSourceType
-    , deStartTime
+    , deDuration
 
-    -- * Response
-    , DescribeEventsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeEventsResponse
-    -- ** Response lenses
-    , derEvents
-    , derMarker
+    , DescribeEventsResponse
+    -- * Response Lenses
+    , dersEvents
+    , dersMarker
+    , dersStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeEvents = DescribeEvents
-    { _deDuration         :: Maybe Int
-    , _deEndTime          :: Maybe ISO8601
-    , _deMarker           :: Maybe Text
-    , _deMaxRecords       :: Maybe Int
-    , _deSourceIdentifier :: Maybe Text
-    , _deSourceType       :: Maybe SourceType
-    , _deStartTime        :: Maybe ISO8601
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeEvents' constructor.
+-- | Represents the input of a /DescribeEvents/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeEvents' smart constructor.
+data DescribeEvents = DescribeEvents'
+    { _deStartTime        :: !(Maybe ISO8601)
+    , _deSourceType       :: !(Maybe SourceType)
+    , _deSourceIdentifier :: !(Maybe Text)
+    , _deMaxRecords       :: !(Maybe Int)
+    , _deEndTime          :: !(Maybe ISO8601)
+    , _deMarker           :: !(Maybe Text)
+    , _deDuration         :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeEvents' with the minimum fields required to make a request.
 --
--- * 'deDuration' @::@ 'Maybe' 'Int'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'deEndTime' @::@ 'Maybe' 'UTCTime'
+-- * 'deStartTime'
 --
--- * 'deMarker' @::@ 'Maybe' 'Text'
+-- * 'deSourceType'
 --
--- * 'deMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'deSourceIdentifier'
 --
--- * 'deSourceIdentifier' @::@ 'Maybe' 'Text'
+-- * 'deMaxRecords'
 --
--- * 'deSourceType' @::@ 'Maybe' 'SourceType'
+-- * 'deEndTime'
 --
--- * 'deStartTime' @::@ 'Maybe' 'UTCTime'
+-- * 'deMarker'
 --
-describeEvents :: DescribeEvents
-describeEvents = DescribeEvents
-    { _deSourceIdentifier = Nothing
-    , _deSourceType       = Nothing
-    , _deStartTime        = Nothing
-    , _deEndTime          = Nothing
-    , _deDuration         = Nothing
-    , _deMaxRecords       = Nothing
-    , _deMarker           = Nothing
+-- * 'deDuration'
+describeEvents
+    :: DescribeEvents
+describeEvents =
+    DescribeEvents'
+    { _deStartTime = Nothing
+    , _deSourceType = Nothing
+    , _deSourceIdentifier = Nothing
+    , _deMaxRecords = Nothing
+    , _deEndTime = Nothing
+    , _deMarker = Nothing
+    , _deDuration = Nothing
     }
 
--- | The number of minutes' worth of events to retrieve.
-deDuration :: Lens' DescribeEvents (Maybe Int)
-deDuration = lens _deDuration (\s a -> s { _deDuration = a })
+-- | The beginning of the time interval to retrieve events for, specified in
+-- ISO 8601 format.
+deStartTime :: Lens' DescribeEvents (Maybe UTCTime)
+deStartTime = lens _deStartTime (\ s a -> s{_deStartTime = a}) . mapping _Time;
 
--- | The end of the time interval for which to retrieve events, specified in ISO
--- 8601 format.
-deEndTime :: Lens' DescribeEvents (Maybe UTCTime)
-deEndTime = lens _deEndTime (\s a -> s { _deEndTime = a }) . mapping _Time
+-- | The event source to retrieve events for. If no value is specified, all
+-- events are returned.
+--
+-- Valid values are: 'cache-cluster' | 'cache-parameter-group' |
+-- 'cache-security-group' | 'cache-subnet-group'
+deSourceType :: Lens' DescribeEvents (Maybe SourceType)
+deSourceType = lens _deSourceType (\ s a -> s{_deSourceType = a});
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-deMarker :: Lens' DescribeEvents (Maybe Text)
-deMarker = lens _deMarker (\s a -> s { _deMarker = a })
+-- | The identifier of the event source for which events will be returned. If
+-- not specified, then all sources are included in the response.
+deSourceIdentifier :: Lens' DescribeEvents (Maybe Text)
+deSourceIdentifier = lens _deSourceIdentifier (\ s a -> s{_deSourceIdentifier = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 deMaxRecords :: Lens' DescribeEvents (Maybe Int)
-deMaxRecords = lens _deMaxRecords (\s a -> s { _deMaxRecords = a })
+deMaxRecords = lens _deMaxRecords (\ s a -> s{_deMaxRecords = a});
 
--- | The identifier of the event source for which events will be returned. If not
--- specified, then all sources are included in the response.
-deSourceIdentifier :: Lens' DescribeEvents (Maybe Text)
-deSourceIdentifier =
-    lens _deSourceIdentifier (\s a -> s { _deSourceIdentifier = a })
+-- | The end of the time interval for which to retrieve events, specified in
+-- ISO 8601 format.
+deEndTime :: Lens' DescribeEvents (Maybe UTCTime)
+deEndTime = lens _deEndTime (\ s a -> s{_deEndTime = a}) . mapping _Time;
 
--- | The event source to retrieve events for. If no value is specified, all events
--- are returned.
---
--- Valid values are: 'cache-cluster' | 'cache-parameter-group' | 'cache-security-group' | 'cache-subnet-group'
-deSourceType :: Lens' DescribeEvents (Maybe SourceType)
-deSourceType = lens _deSourceType (\s a -> s { _deSourceType = a })
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+deMarker :: Lens' DescribeEvents (Maybe Text)
+deMarker = lens _deMarker (\ s a -> s{_deMarker = a});
 
--- | The beginning of the time interval to retrieve events for, specified in ISO
--- 8601 format.
-deStartTime :: Lens' DescribeEvents (Maybe UTCTime)
-deStartTime = lens _deStartTime (\s a -> s { _deStartTime = a }) . mapping _Time
+-- | The number of minutes\' worth of events to retrieve.
+deDuration :: Lens' DescribeEvents (Maybe Int)
+deDuration = lens _deDuration (\ s a -> s{_deDuration = a});
 
-data DescribeEventsResponse = DescribeEventsResponse
-    { _derEvents :: List "member" Event
-    , _derMarker :: Maybe Text
-    } deriving (Eq, Read, Show)
+instance AWSPager DescribeEvents where
+        page rq rs
+          | stop (rs ^. dersMarker) = Nothing
+          | stop (rs ^. dersEvents) = Nothing
+          | otherwise =
+            Just $ rq & deMarker .~ rs ^. dersMarker
 
--- | 'DescribeEventsResponse' constructor.
+instance AWSRequest DescribeEvents where
+        type Sv DescribeEvents = ElastiCache
+        type Rs DescribeEvents = DescribeEventsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeEventsResult"
+              (\ s h x ->
+                 DescribeEventsResponse' <$>
+                   (x .@? "Events" .!@ mempty >>=
+                      may (parseXMLList "Event"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeEvents where
+        toHeaders = const mempty
+
+instance ToPath DescribeEvents where
+        toPath = const "/"
+
+instance ToQuery DescribeEvents where
+        toQuery DescribeEvents'{..}
+          = mconcat
+              ["Action" =: ("DescribeEvents" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "StartTime" =: _deStartTime,
+               "SourceType" =: _deSourceType,
+               "SourceIdentifier" =: _deSourceIdentifier,
+               "MaxRecords" =: _deMaxRecords,
+               "EndTime" =: _deEndTime, "Marker" =: _deMarker,
+               "Duration" =: _deDuration]
+
+-- | Represents the output of a /DescribeEvents/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeEventsResponse' smart constructor.
+data DescribeEventsResponse = DescribeEventsResponse'
+    { _dersEvents :: !(Maybe [Event])
+    , _dersMarker :: !(Maybe Text)
+    , _dersStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeEventsResponse' with the minimum fields required to make a request.
 --
--- * 'derEvents' @::@ ['Event']
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'derMarker' @::@ 'Maybe' 'Text'
+-- * 'dersEvents'
 --
-describeEventsResponse :: DescribeEventsResponse
-describeEventsResponse = DescribeEventsResponse
-    { _derMarker = Nothing
-    , _derEvents = mempty
+-- * 'dersMarker'
+--
+-- * 'dersStatus'
+describeEventsResponse
+    :: Int -- ^ 'dersStatus'
+    -> DescribeEventsResponse
+describeEventsResponse pStatus_ =
+    DescribeEventsResponse'
+    { _dersEvents = Nothing
+    , _dersMarker = Nothing
+    , _dersStatus = pStatus_
     }
 
 -- | A list of events. Each element in the list contains detailed information
 -- about one event.
-derEvents :: Lens' DescribeEventsResponse [Event]
-derEvents = lens _derEvents (\s a -> s { _derEvents = a }) . _List
+dersEvents :: Lens' DescribeEventsResponse [Event]
+dersEvents = lens _dersEvents (\ s a -> s{_dersEvents = a}) . _Default . _Coerce;
 
 -- | Provides an identifier to allow retrieval of paginated results.
-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 = ElastiCache
-    type Rs DescribeEvents = DescribeEventsResponse
-
-    request  = post "DescribeEvents"
-    response = xmlResponse
-
-instance FromXML DescribeEventsResponse where
-    parseXML = withElement "DescribeEventsResult" $ \x -> DescribeEventsResponse
-        <$> x .@? "Events" .!@ mempty
-        <*> x .@? "Marker"
+dersMarker :: Lens' DescribeEventsResponse (Maybe Text)
+dersMarker = lens _dersMarker (\ s a -> s{_dersMarker = a});
 
-instance AWSPager DescribeEvents where
-    page rq rs
-        | stop (rs ^. derMarker) = Nothing
-        | otherwise = (\x -> rq & deMarker ?~ x)
-            <$> (rs ^. derMarker)
+-- | The response status code.
+dersStatus :: Lens' DescribeEventsResponse Int
+dersStatus = lens _dersStatus (\ s a -> s{_dersStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeReplicationGroups.hs b/gen/Network/AWS/ElastiCache/DescribeReplicationGroups.hs
--- a/gen/Network/AWS/ElastiCache/DescribeReplicationGroups.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeReplicationGroups.hs
@@ -1,162 +1,183 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeReplicationGroups
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeReplicationGroups/ action returns information about a particular
--- replication group. If no identifier is specified, /DescribeReplicationGroups/
--- returns information about all replication groups.
+-- The /DescribeReplicationGroups/ action returns information about a
+-- particular replication group. If no identifier is specified,
+-- /DescribeReplicationGroups/ returns information about all replication
+-- groups.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html AWS API Reference> for DescribeReplicationGroups.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeReplicationGroups
     (
-    -- * Request
-      DescribeReplicationGroups
-    -- ** Request constructor
-    , describeReplicationGroups
-    -- ** Request lenses
-    , drg1Marker
-    , drg1MaxRecords
-    , drg1ReplicationGroupId
+    -- * Creating a Request
+      describeReplicationGroups
+    , DescribeReplicationGroups
+    -- * Request Lenses
+    , drgsMaxRecords
+    , drgsMarker
+    , drgsReplicationGroupId
 
-    -- * Response
-    , DescribeReplicationGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeReplicationGroupsResponse
-    -- ** Response lenses
-    , drgrMarker
-    , drgrReplicationGroups
+    , DescribeReplicationGroupsResponse
+    -- * Response Lenses
+    , drgrsMarker
+    , drgrsReplicationGroups
+    , drgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeReplicationGroups = DescribeReplicationGroups
-    { _drg1Marker             :: Maybe Text
-    , _drg1MaxRecords         :: Maybe Int
-    , _drg1ReplicationGroupId :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeReplicationGroups' constructor.
+-- | Represents the input of a /DescribeReplicationGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeReplicationGroups' smart constructor.
+data DescribeReplicationGroups = DescribeReplicationGroups'
+    { _drgsMaxRecords         :: !(Maybe Int)
+    , _drgsMarker             :: !(Maybe Text)
+    , _drgsReplicationGroupId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeReplicationGroups' with the minimum fields required to make a request.
 --
--- * 'drg1Marker' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drg1MaxRecords' @::@ 'Maybe' 'Int'
+-- * 'drgsMaxRecords'
 --
--- * 'drg1ReplicationGroupId' @::@ 'Maybe' 'Text'
+-- * 'drgsMarker'
 --
-describeReplicationGroups :: DescribeReplicationGroups
-describeReplicationGroups = DescribeReplicationGroups
-    { _drg1ReplicationGroupId = Nothing
-    , _drg1MaxRecords         = Nothing
-    , _drg1Marker             = Nothing
+-- * 'drgsReplicationGroupId'
+describeReplicationGroups
+    :: DescribeReplicationGroups
+describeReplicationGroups =
+    DescribeReplicationGroups'
+    { _drgsMaxRecords = Nothing
+    , _drgsMarker = Nothing
+    , _drgsReplicationGroupId = Nothing
     }
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-drg1Marker :: Lens' DescribeReplicationGroups (Maybe Text)
-drg1Marker = lens _drg1Marker (\s a -> s { _drg1Marker = a })
-
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
-drg1MaxRecords :: Lens' DescribeReplicationGroups (Maybe Int)
-drg1MaxRecords = lens _drg1MaxRecords (\s a -> s { _drg1MaxRecords = a })
+drgsMaxRecords :: Lens' DescribeReplicationGroups (Maybe Int)
+drgsMaxRecords = lens _drgsMaxRecords (\ s a -> s{_drgsMaxRecords = a});
 
--- | The identifier for the replication group to be described. This parameter is
--- not case sensitive.
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+drgsMarker :: Lens' DescribeReplicationGroups (Maybe Text)
+drgsMarker = lens _drgsMarker (\ s a -> s{_drgsMarker = a});
+
+-- | The identifier for the replication group to be described. This parameter
+-- is not case sensitive.
 --
 -- If you do not specify this parameter, information about all replication
 -- groups is returned.
-drg1ReplicationGroupId :: Lens' DescribeReplicationGroups (Maybe Text)
-drg1ReplicationGroupId =
-    lens _drg1ReplicationGroupId (\s a -> s { _drg1ReplicationGroupId = a })
+drgsReplicationGroupId :: Lens' DescribeReplicationGroups (Maybe Text)
+drgsReplicationGroupId = lens _drgsReplicationGroupId (\ s a -> s{_drgsReplicationGroupId = a});
 
-data DescribeReplicationGroupsResponse = DescribeReplicationGroupsResponse
-    { _drgrMarker            :: Maybe Text
-    , _drgrReplicationGroups :: List "member" ReplicationGroup
-    } deriving (Eq, Read, Show)
+instance AWSPager DescribeReplicationGroups where
+        page rq rs
+          | stop (rs ^. drgrsMarker) = Nothing
+          | stop (rs ^. drgrsReplicationGroups) = Nothing
+          | otherwise =
+            Just $ rq & drgsMarker .~ rs ^. drgrsMarker
 
--- | 'DescribeReplicationGroupsResponse' constructor.
+instance AWSRequest DescribeReplicationGroups where
+        type Sv DescribeReplicationGroups = ElastiCache
+        type Rs DescribeReplicationGroups =
+             DescribeReplicationGroupsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeReplicationGroupsResult"
+              (\ s h x ->
+                 DescribeReplicationGroupsResponse' <$>
+                   (x .@? "Marker") <*>
+                     (x .@? "ReplicationGroups" .!@ mempty >>=
+                        may (parseXMLList "ReplicationGroup"))
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders DescribeReplicationGroups where
+        toHeaders = const mempty
+
+instance ToPath DescribeReplicationGroups where
+        toPath = const "/"
+
+instance ToQuery DescribeReplicationGroups where
+        toQuery DescribeReplicationGroups'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeReplicationGroups" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "MaxRecords" =: _drgsMaxRecords,
+               "Marker" =: _drgsMarker,
+               "ReplicationGroupId" =: _drgsReplicationGroupId]
+
+-- | Represents the output of a /DescribeReplicationGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeReplicationGroupsResponse' smart constructor.
+data DescribeReplicationGroupsResponse = DescribeReplicationGroupsResponse'
+    { _drgrsMarker            :: !(Maybe Text)
+    , _drgrsReplicationGroups :: !(Maybe [ReplicationGroup])
+    , _drgrsStatus            :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeReplicationGroupsResponse' with the minimum fields required to make a request.
 --
--- * 'drgrMarker' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drgrReplicationGroups' @::@ ['ReplicationGroup']
+-- * 'drgrsMarker'
 --
-describeReplicationGroupsResponse :: DescribeReplicationGroupsResponse
-describeReplicationGroupsResponse = DescribeReplicationGroupsResponse
-    { _drgrMarker            = Nothing
-    , _drgrReplicationGroups = mempty
+-- * 'drgrsReplicationGroups'
+--
+-- * 'drgrsStatus'
+describeReplicationGroupsResponse
+    :: Int -- ^ 'drgrsStatus'
+    -> DescribeReplicationGroupsResponse
+describeReplicationGroupsResponse pStatus_ =
+    DescribeReplicationGroupsResponse'
+    { _drgrsMarker = Nothing
+    , _drgrsReplicationGroups = Nothing
+    , _drgrsStatus = pStatus_
     }
 
 -- | Provides an identifier to allow retrieval of paginated results.
-drgrMarker :: Lens' DescribeReplicationGroupsResponse (Maybe Text)
-drgrMarker = lens _drgrMarker (\s a -> s { _drgrMarker = a })
+drgrsMarker :: Lens' DescribeReplicationGroupsResponse (Maybe Text)
+drgrsMarker = lens _drgrsMarker (\ s a -> s{_drgrsMarker = a});
 
 -- | A list of replication groups. Each item in the list contains detailed
 -- information about one replication group.
-drgrReplicationGroups :: Lens' DescribeReplicationGroupsResponse [ReplicationGroup]
-drgrReplicationGroups =
-    lens _drgrReplicationGroups (\s a -> s { _drgrReplicationGroups = a })
-        . _List
-
-instance ToPath DescribeReplicationGroups where
-    toPath = const "/"
-
-instance ToQuery DescribeReplicationGroups where
-    toQuery DescribeReplicationGroups{..} = mconcat
-        [ "Marker"             =? _drg1Marker
-        , "MaxRecords"         =? _drg1MaxRecords
-        , "ReplicationGroupId" =? _drg1ReplicationGroupId
-        ]
-
-instance ToHeaders DescribeReplicationGroups
-
-instance AWSRequest DescribeReplicationGroups where
-    type Sv DescribeReplicationGroups = ElastiCache
-    type Rs DescribeReplicationGroups = DescribeReplicationGroupsResponse
-
-    request  = post "DescribeReplicationGroups"
-    response = xmlResponse
-
-instance FromXML DescribeReplicationGroupsResponse where
-    parseXML = withElement "DescribeReplicationGroupsResult" $ \x -> DescribeReplicationGroupsResponse
-        <$> x .@? "Marker"
-        <*> x .@? "ReplicationGroups" .!@ mempty
+drgrsReplicationGroups :: Lens' DescribeReplicationGroupsResponse [ReplicationGroup]
+drgrsReplicationGroups = lens _drgrsReplicationGroups (\ s a -> s{_drgrsReplicationGroups = a}) . _Default . _Coerce;
 
-instance AWSPager DescribeReplicationGroups where
-    page rq rs
-        | stop (rs ^. drgrMarker) = Nothing
-        | otherwise = (\x -> rq & drg1Marker ?~ x)
-            <$> (rs ^. drgrMarker)
+-- | The response status code.
+drgrsStatus :: Lens' DescribeReplicationGroupsResponse Int
+drgrsStatus = lens _drgrsStatus (\ s a -> s{_drgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodes.hs b/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodes.hs
--- a/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodes.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodes.hs
@@ -1,102 +1,106 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeReservedCacheNodes
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeReservedCacheNodes/ action returns information about reserved
--- cache nodes for this account, or about a specified reserved cache node.
+-- The /DescribeReservedCacheNodes/ action returns information about
+-- reserved cache nodes for this account, or about a specified reserved
+-- cache node.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReservedCacheNodes.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReservedCacheNodes.html AWS API Reference> for DescribeReservedCacheNodes.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeReservedCacheNodes
     (
-    -- * Request
-      DescribeReservedCacheNodes
-    -- ** Request constructor
-    , describeReservedCacheNodes
-    -- ** Request lenses
+    -- * Creating a Request
+      describeReservedCacheNodes
+    , DescribeReservedCacheNodes
+    -- * Request Lenses
     , drcnCacheNodeType
-    , drcnDuration
-    , drcnMarker
-    , drcnMaxRecords
-    , drcnOfferingType
     , drcnProductDescription
+    , drcnMaxRecords
+    , drcnMarker
     , drcnReservedCacheNodeId
+    , drcnOfferingType
+    , drcnDuration
     , drcnReservedCacheNodesOfferingId
 
-    -- * Response
-    , DescribeReservedCacheNodesResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeReservedCacheNodesResponse
-    -- ** Response lenses
-    , drcnrMarker
-    , drcnrReservedCacheNodes
+    , DescribeReservedCacheNodesResponse
+    -- * Response Lenses
+    , drcnrsMarker
+    , drcnrsReservedCacheNodes
+    , drcnrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeReservedCacheNodes = DescribeReservedCacheNodes
-    { _drcnCacheNodeType                :: Maybe Text
-    , _drcnDuration                     :: Maybe Text
-    , _drcnMarker                       :: Maybe Text
-    , _drcnMaxRecords                   :: Maybe Int
-    , _drcnOfferingType                 :: Maybe Text
-    , _drcnProductDescription           :: Maybe Text
-    , _drcnReservedCacheNodeId          :: Maybe Text
-    , _drcnReservedCacheNodesOfferingId :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeReservedCacheNodes' constructor.
+-- | Represents the input of a /DescribeReservedCacheNodes/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeReservedCacheNodes' smart constructor.
+data DescribeReservedCacheNodes = DescribeReservedCacheNodes'
+    { _drcnCacheNodeType                :: !(Maybe Text)
+    , _drcnProductDescription           :: !(Maybe Text)
+    , _drcnMaxRecords                   :: !(Maybe Int)
+    , _drcnMarker                       :: !(Maybe Text)
+    , _drcnReservedCacheNodeId          :: !(Maybe Text)
+    , _drcnOfferingType                 :: !(Maybe Text)
+    , _drcnDuration                     :: !(Maybe Text)
+    , _drcnReservedCacheNodesOfferingId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeReservedCacheNodes' with the minimum fields required to make a request.
 --
--- * 'drcnCacheNodeType' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drcnDuration' @::@ 'Maybe' 'Text'
+-- * 'drcnCacheNodeType'
 --
--- * 'drcnMarker' @::@ 'Maybe' 'Text'
+-- * 'drcnProductDescription'
 --
--- * 'drcnMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'drcnMaxRecords'
 --
--- * 'drcnOfferingType' @::@ 'Maybe' 'Text'
+-- * 'drcnMarker'
 --
--- * 'drcnProductDescription' @::@ 'Maybe' 'Text'
+-- * 'drcnReservedCacheNodeId'
 --
--- * 'drcnReservedCacheNodeId' @::@ 'Maybe' 'Text'
+-- * 'drcnOfferingType'
 --
--- * 'drcnReservedCacheNodesOfferingId' @::@ 'Maybe' 'Text'
+-- * 'drcnDuration'
 --
-describeReservedCacheNodes :: DescribeReservedCacheNodes
-describeReservedCacheNodes = DescribeReservedCacheNodes
-    { _drcnReservedCacheNodeId          = Nothing
+-- * 'drcnReservedCacheNodesOfferingId'
+describeReservedCacheNodes
+    :: DescribeReservedCacheNodes
+describeReservedCacheNodes =
+    DescribeReservedCacheNodes'
+    { _drcnCacheNodeType = Nothing
+    , _drcnProductDescription = Nothing
+    , _drcnMaxRecords = Nothing
+    , _drcnMarker = Nothing
+    , _drcnReservedCacheNodeId = Nothing
+    , _drcnOfferingType = Nothing
+    , _drcnDuration = Nothing
     , _drcnReservedCacheNodesOfferingId = Nothing
-    , _drcnCacheNodeType                = Nothing
-    , _drcnDuration                     = Nothing
-    , _drcnProductDescription           = Nothing
-    , _drcnOfferingType                 = Nothing
-    , _drcnMaxRecords                   = Nothing
-    , _drcnMarker                       = Nothing
     }
 
 -- | The cache node type filter value. Use this parameter to show only those
@@ -104,129 +108,164 @@
 --
 -- Valid node types are as follows:
 --
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
 --
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-drcnCacheNodeType :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnCacheNodeType =
-    lens _drcnCacheNodeType (\s a -> s { _drcnCacheNodeType = a })
-
--- | The duration filter value, specified in years or seconds. Use this parameter
--- to show only reservations for this duration.
+-- __Notes:__
 --
--- Valid Values: '1 | 3 | 31536000 | 94608000'
-drcnDuration :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnDuration = lens _drcnDuration (\s a -> s { _drcnDuration = a })
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+drcnCacheNodeType :: Lens' DescribeReservedCacheNodes (Maybe Text)
+drcnCacheNodeType = lens _drcnCacheNodeType (\ s a -> s{_drcnCacheNodeType = a});
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-drcnMarker :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnMarker = lens _drcnMarker (\s a -> s { _drcnMarker = a })
+-- | The product description filter value. Use this parameter to show only
+-- those reservations matching the specified product description.
+drcnProductDescription :: Lens' DescribeReservedCacheNodes (Maybe Text)
+drcnProductDescription = lens _drcnProductDescription (\ s a -> s{_drcnProductDescription = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 drcnMaxRecords :: Lens' DescribeReservedCacheNodes (Maybe Int)
-drcnMaxRecords = lens _drcnMaxRecords (\s a -> s { _drcnMaxRecords = a })
+drcnMaxRecords = lens _drcnMaxRecords (\ s a -> s{_drcnMaxRecords = a});
 
--- | The offering type filter value. Use this parameter to show only the available
--- offerings matching the specified offering type.
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+drcnMarker :: Lens' DescribeReservedCacheNodes (Maybe Text)
+drcnMarker = lens _drcnMarker (\ s a -> s{_drcnMarker = a});
+
+-- | The reserved cache node identifier filter value. Use this parameter to
+-- show only the reservation that matches the specified reservation ID.
+drcnReservedCacheNodeId :: Lens' DescribeReservedCacheNodes (Maybe Text)
+drcnReservedCacheNodeId = lens _drcnReservedCacheNodeId (\ s a -> s{_drcnReservedCacheNodeId = a});
+
+-- | The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type.
 --
--- Valid values: '"Light Utilization"|"Medium Utilization"|"Heavy Utilization"'
+-- Valid values:
+-- '\"Light Utilization\"|\"Medium Utilization\"|\"Heavy Utilization\"'
 drcnOfferingType :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnOfferingType = lens _drcnOfferingType (\s a -> s { _drcnOfferingType = a })
-
--- | The product description filter value. Use this parameter to show only those
--- reservations matching the specified product description.
-drcnProductDescription :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnProductDescription =
-    lens _drcnProductDescription (\s a -> s { _drcnProductDescription = a })
+drcnOfferingType = lens _drcnOfferingType (\ s a -> s{_drcnOfferingType = a});
 
--- | The reserved cache node identifier filter value. Use this parameter to show
--- only the reservation that matches the specified reservation ID.
-drcnReservedCacheNodeId :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnReservedCacheNodeId =
-    lens _drcnReservedCacheNodeId (\s a -> s { _drcnReservedCacheNodeId = a })
+-- | The duration filter value, specified in years or seconds. Use this
+-- parameter to show only reservations for this duration.
+--
+-- Valid Values: '1 | 3 | 31536000 | 94608000'
+drcnDuration :: Lens' DescribeReservedCacheNodes (Maybe Text)
+drcnDuration = lens _drcnDuration (\ s a -> s{_drcnDuration = a});
 
 -- | The offering identifier filter value. Use this parameter to show only
 -- purchased reservations matching the specified offering identifier.
 drcnReservedCacheNodesOfferingId :: Lens' DescribeReservedCacheNodes (Maybe Text)
-drcnReservedCacheNodesOfferingId =
-    lens _drcnReservedCacheNodesOfferingId
-        (\s a -> s { _drcnReservedCacheNodesOfferingId = a })
-
-data DescribeReservedCacheNodesResponse = DescribeReservedCacheNodesResponse
-    { _drcnrMarker             :: Maybe Text
-    , _drcnrReservedCacheNodes :: List "member" ReservedCacheNode
-    } deriving (Eq, Read, Show)
+drcnReservedCacheNodesOfferingId = lens _drcnReservedCacheNodesOfferingId (\ s a -> s{_drcnReservedCacheNodesOfferingId = a});
 
--- | 'DescribeReservedCacheNodesResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'drcnrMarker' @::@ 'Maybe' 'Text'
---
--- * 'drcnrReservedCacheNodes' @::@ ['ReservedCacheNode']
---
-describeReservedCacheNodesResponse :: DescribeReservedCacheNodesResponse
-describeReservedCacheNodesResponse = DescribeReservedCacheNodesResponse
-    { _drcnrMarker             = Nothing
-    , _drcnrReservedCacheNodes = mempty
-    }
+instance AWSPager DescribeReservedCacheNodes where
+        page rq rs
+          | stop (rs ^. drcnrsMarker) = Nothing
+          | stop (rs ^. drcnrsReservedCacheNodes) = Nothing
+          | otherwise =
+            Just $ rq & drcnMarker .~ rs ^. drcnrsMarker
 
--- | Provides an identifier to allow retrieval of paginated results.
-drcnrMarker :: Lens' DescribeReservedCacheNodesResponse (Maybe Text)
-drcnrMarker = lens _drcnrMarker (\s a -> s { _drcnrMarker = a })
+instance AWSRequest DescribeReservedCacheNodes where
+        type Sv DescribeReservedCacheNodes = ElastiCache
+        type Rs DescribeReservedCacheNodes =
+             DescribeReservedCacheNodesResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeReservedCacheNodesResult"
+              (\ s h x ->
+                 DescribeReservedCacheNodesResponse' <$>
+                   (x .@? "Marker") <*>
+                     (x .@? "ReservedCacheNodes" .!@ mempty >>=
+                        may (parseXMLList "ReservedCacheNode"))
+                     <*> (pure (fromEnum s)))
 
--- | A list of reserved cache nodes. Each element in the list contains detailed
--- information about one node.
-drcnrReservedCacheNodes :: Lens' DescribeReservedCacheNodesResponse [ReservedCacheNode]
-drcnrReservedCacheNodes =
-    lens _drcnrReservedCacheNodes (\s a -> s { _drcnrReservedCacheNodes = a })
-        . _List
+instance ToHeaders DescribeReservedCacheNodes where
+        toHeaders = const mempty
 
 instance ToPath DescribeReservedCacheNodes where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeReservedCacheNodes where
-    toQuery DescribeReservedCacheNodes{..} = mconcat
-        [ "CacheNodeType"                =? _drcnCacheNodeType
-        , "Duration"                     =? _drcnDuration
-        , "Marker"                       =? _drcnMarker
-        , "MaxRecords"                   =? _drcnMaxRecords
-        , "OfferingType"                 =? _drcnOfferingType
-        , "ProductDescription"           =? _drcnProductDescription
-        , "ReservedCacheNodeId"          =? _drcnReservedCacheNodeId
-        , "ReservedCacheNodesOfferingId" =? _drcnReservedCacheNodesOfferingId
-        ]
+        toQuery DescribeReservedCacheNodes'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeReservedCacheNodes" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheNodeType" =: _drcnCacheNodeType,
+               "ProductDescription" =: _drcnProductDescription,
+               "MaxRecords" =: _drcnMaxRecords,
+               "Marker" =: _drcnMarker,
+               "ReservedCacheNodeId" =: _drcnReservedCacheNodeId,
+               "OfferingType" =: _drcnOfferingType,
+               "Duration" =: _drcnDuration,
+               "ReservedCacheNodesOfferingId" =:
+                 _drcnReservedCacheNodesOfferingId]
 
-instance ToHeaders DescribeReservedCacheNodes
+-- | Represents the output of a /DescribeReservedCacheNodes/ action.
+--
+-- /See:/ 'describeReservedCacheNodesResponse' smart constructor.
+data DescribeReservedCacheNodesResponse = DescribeReservedCacheNodesResponse'
+    { _drcnrsMarker             :: !(Maybe Text)
+    , _drcnrsReservedCacheNodes :: !(Maybe [ReservedCacheNode])
+    , _drcnrsStatus             :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeReservedCacheNodes where
-    type Sv DescribeReservedCacheNodes = ElastiCache
-    type Rs DescribeReservedCacheNodes = DescribeReservedCacheNodesResponse
+-- | Creates a value of 'DescribeReservedCacheNodesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'drcnrsMarker'
+--
+-- * 'drcnrsReservedCacheNodes'
+--
+-- * 'drcnrsStatus'
+describeReservedCacheNodesResponse
+    :: Int -- ^ 'drcnrsStatus'
+    -> DescribeReservedCacheNodesResponse
+describeReservedCacheNodesResponse pStatus_ =
+    DescribeReservedCacheNodesResponse'
+    { _drcnrsMarker = Nothing
+    , _drcnrsReservedCacheNodes = Nothing
+    , _drcnrsStatus = pStatus_
+    }
 
-    request  = post "DescribeReservedCacheNodes"
-    response = xmlResponse
+-- | Provides an identifier to allow retrieval of paginated results.
+drcnrsMarker :: Lens' DescribeReservedCacheNodesResponse (Maybe Text)
+drcnrsMarker = lens _drcnrsMarker (\ s a -> s{_drcnrsMarker = a});
 
-instance FromXML DescribeReservedCacheNodesResponse where
-    parseXML = withElement "DescribeReservedCacheNodesResult" $ \x -> DescribeReservedCacheNodesResponse
-        <$> x .@? "Marker"
-        <*> x .@? "ReservedCacheNodes" .!@ mempty
+-- | A list of reserved cache nodes. Each element in the list contains
+-- detailed information about one node.
+drcnrsReservedCacheNodes :: Lens' DescribeReservedCacheNodesResponse [ReservedCacheNode]
+drcnrsReservedCacheNodes = lens _drcnrsReservedCacheNodes (\ s a -> s{_drcnrsReservedCacheNodes = a}) . _Default . _Coerce;
 
-instance AWSPager DescribeReservedCacheNodes where
-    page rq rs
-        | stop (rs ^. drcnrMarker) = Nothing
-        | otherwise = (\x -> rq & drcnMarker ?~ x)
-            <$> (rs ^. drcnrMarker)
+-- | The response status code.
+drcnrsStatus :: Lens' DescribeReservedCacheNodesResponse Int
+drcnrsStatus = lens _drcnrsStatus (\ s a -> s{_drcnrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodesOfferings.hs b/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodesOfferings.hs
--- a/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodesOfferings.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeReservedCacheNodesOfferings.hs
@@ -1,97 +1,100 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeReservedCacheNodesOfferings/ action lists available reserved cache
--- node offerings.
+-- The /DescribeReservedCacheNodesOfferings/ action lists available
+-- reserved cache node offerings.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReservedCacheNodesOfferings.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReservedCacheNodesOfferings.html AWS API Reference> for DescribeReservedCacheNodesOfferings.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeReservedCacheNodesOfferings
     (
-    -- * Request
-      DescribeReservedCacheNodesOfferings
-    -- ** Request constructor
-    , describeReservedCacheNodesOfferings
-    -- ** Request lenses
+    -- * Creating a Request
+      describeReservedCacheNodesOfferings
+    , DescribeReservedCacheNodesOfferings
+    -- * Request Lenses
     , drcnoCacheNodeType
-    , drcnoDuration
-    , drcnoMarker
+    , drcnoProductDescription
     , drcnoMaxRecords
+    , drcnoMarker
     , drcnoOfferingType
-    , drcnoProductDescription
+    , drcnoDuration
     , drcnoReservedCacheNodesOfferingId
 
-    -- * Response
-    , DescribeReservedCacheNodesOfferingsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeReservedCacheNodesOfferingsResponse
-    -- ** Response lenses
-    , drcnorMarker
-    , drcnorReservedCacheNodesOfferings
+    , DescribeReservedCacheNodesOfferingsResponse
+    -- * Response Lenses
+    , drcnorsMarker
+    , drcnorsReservedCacheNodesOfferings
+    , drcnorsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeReservedCacheNodesOfferings = DescribeReservedCacheNodesOfferings
-    { _drcnoCacheNodeType                :: Maybe Text
-    , _drcnoDuration                     :: Maybe Text
-    , _drcnoMarker                       :: Maybe Text
-    , _drcnoMaxRecords                   :: Maybe Int
-    , _drcnoOfferingType                 :: Maybe Text
-    , _drcnoProductDescription           :: Maybe Text
-    , _drcnoReservedCacheNodesOfferingId :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeReservedCacheNodesOfferings' constructor.
+-- | Represents the input of a /DescribeReservedCacheNodesOfferings/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeReservedCacheNodesOfferings' smart constructor.
+data DescribeReservedCacheNodesOfferings = DescribeReservedCacheNodesOfferings'
+    { _drcnoCacheNodeType                :: !(Maybe Text)
+    , _drcnoProductDescription           :: !(Maybe Text)
+    , _drcnoMaxRecords                   :: !(Maybe Int)
+    , _drcnoMarker                       :: !(Maybe Text)
+    , _drcnoOfferingType                 :: !(Maybe Text)
+    , _drcnoDuration                     :: !(Maybe Text)
+    , _drcnoReservedCacheNodesOfferingId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeReservedCacheNodesOfferings' with the minimum fields required to make a request.
 --
--- * 'drcnoCacheNodeType' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drcnoDuration' @::@ 'Maybe' 'Text'
+-- * 'drcnoCacheNodeType'
 --
--- * 'drcnoMarker' @::@ 'Maybe' 'Text'
+-- * 'drcnoProductDescription'
 --
--- * 'drcnoMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'drcnoMaxRecords'
 --
--- * 'drcnoOfferingType' @::@ 'Maybe' 'Text'
+-- * 'drcnoMarker'
 --
--- * 'drcnoProductDescription' @::@ 'Maybe' 'Text'
+-- * 'drcnoOfferingType'
 --
--- * 'drcnoReservedCacheNodesOfferingId' @::@ 'Maybe' 'Text'
+-- * 'drcnoDuration'
 --
-describeReservedCacheNodesOfferings :: DescribeReservedCacheNodesOfferings
-describeReservedCacheNodesOfferings = DescribeReservedCacheNodesOfferings
-    { _drcnoReservedCacheNodesOfferingId = Nothing
-    , _drcnoCacheNodeType                = Nothing
-    , _drcnoDuration                     = Nothing
-    , _drcnoProductDescription           = Nothing
-    , _drcnoOfferingType                 = Nothing
-    , _drcnoMaxRecords                   = Nothing
-    , _drcnoMarker                       = Nothing
+-- * 'drcnoReservedCacheNodesOfferingId'
+describeReservedCacheNodesOfferings
+    :: DescribeReservedCacheNodesOfferings
+describeReservedCacheNodesOfferings =
+    DescribeReservedCacheNodesOfferings'
+    { _drcnoCacheNodeType = Nothing
+    , _drcnoProductDescription = Nothing
+    , _drcnoMaxRecords = Nothing
+    , _drcnoMarker = Nothing
+    , _drcnoOfferingType = Nothing
+    , _drcnoDuration = Nothing
+    , _drcnoReservedCacheNodesOfferingId = Nothing
     }
 
 -- | The cache node type filter value. Use this parameter to show only the
@@ -99,126 +102,169 @@
 --
 -- Valid node types are as follows:
 --
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
 --
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-drcnoCacheNodeType :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoCacheNodeType =
-    lens _drcnoCacheNodeType (\s a -> s { _drcnoCacheNodeType = a })
-
--- | Duration filter value, specified in years or seconds. Use this parameter to
--- show only reservations for a given duration.
+-- __Notes:__
 --
--- Valid Values: '1 | 3 | 31536000 | 94608000'
-drcnoDuration :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoDuration = lens _drcnoDuration (\s a -> s { _drcnoDuration = a })
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+drcnoCacheNodeType :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
+drcnoCacheNodeType = lens _drcnoCacheNodeType (\ s a -> s{_drcnoCacheNodeType = a});
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-drcnoMarker :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoMarker = lens _drcnoMarker (\s a -> s { _drcnoMarker = a })
+-- | The product description filter value. Use this parameter to show only
+-- the available offerings matching the specified product description.
+drcnoProductDescription :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
+drcnoProductDescription = lens _drcnoProductDescription (\ s a -> s{_drcnoProductDescription = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 100
 --
 -- Constraints: minimum 20; maximum 100.
 drcnoMaxRecords :: Lens' DescribeReservedCacheNodesOfferings (Maybe Int)
-drcnoMaxRecords = lens _drcnoMaxRecords (\s a -> s { _drcnoMaxRecords = a })
+drcnoMaxRecords = lens _drcnoMaxRecords (\ s a -> s{_drcnoMaxRecords = a});
 
--- | The offering type filter value. Use this parameter to show only the available
--- offerings matching the specified offering type.
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+drcnoMarker :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
+drcnoMarker = lens _drcnoMarker (\ s a -> s{_drcnoMarker = a});
+
+-- | The offering type filter value. Use this parameter to show only the
+-- available offerings matching the specified offering type.
 --
--- Valid Values: '"Light Utilization"|"Medium Utilization"|"Heavy Utilization"'
+-- Valid Values:
+-- '\"Light Utilization\"|\"Medium Utilization\"|\"Heavy Utilization\"'
 drcnoOfferingType :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoOfferingType =
-    lens _drcnoOfferingType (\s a -> s { _drcnoOfferingType = a })
+drcnoOfferingType = lens _drcnoOfferingType (\ s a -> s{_drcnoOfferingType = a});
 
--- | The product description filter value. Use this parameter to show only the
--- available offerings matching the specified product description.
-drcnoProductDescription :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoProductDescription =
-    lens _drcnoProductDescription (\s a -> s { _drcnoProductDescription = a })
+-- | Duration filter value, specified in years or seconds. Use this parameter
+-- to show only reservations for a given duration.
+--
+-- Valid Values: '1 | 3 | 31536000 | 94608000'
+drcnoDuration :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
+drcnoDuration = lens _drcnoDuration (\ s a -> s{_drcnoDuration = a});
 
--- | The offering identifier filter value. Use this parameter to show only the
--- available offering that matches the specified reservation identifier.
+-- | The offering identifier filter value. Use this parameter to show only
+-- the available offering that matches the specified reservation
+-- identifier.
 --
 -- Example: '438012d3-4052-4cc7-b2e3-8d3372e0e706'
 drcnoReservedCacheNodesOfferingId :: Lens' DescribeReservedCacheNodesOfferings (Maybe Text)
-drcnoReservedCacheNodesOfferingId =
-    lens _drcnoReservedCacheNodesOfferingId
-        (\s a -> s { _drcnoReservedCacheNodesOfferingId = a })
+drcnoReservedCacheNodesOfferingId = lens _drcnoReservedCacheNodesOfferingId (\ s a -> s{_drcnoReservedCacheNodesOfferingId = a});
 
-data DescribeReservedCacheNodesOfferingsResponse = DescribeReservedCacheNodesOfferingsResponse
-    { _drcnorMarker                      :: Maybe Text
-    , _drcnorReservedCacheNodesOfferings :: List "member" ReservedCacheNodesOffering
-    } deriving (Eq, Read, Show)
+instance AWSPager DescribeReservedCacheNodesOfferings
+         where
+        page rq rs
+          | stop (rs ^. drcnorsMarker) = Nothing
+          | stop (rs ^. drcnorsReservedCacheNodesOfferings) =
+            Nothing
+          | otherwise =
+            Just $ rq & drcnoMarker .~ rs ^. drcnorsMarker
 
--- | 'DescribeReservedCacheNodesOfferingsResponse' constructor.
+instance AWSRequest
+         DescribeReservedCacheNodesOfferings where
+        type Sv DescribeReservedCacheNodesOfferings =
+             ElastiCache
+        type Rs DescribeReservedCacheNodesOfferings =
+             DescribeReservedCacheNodesOfferingsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "DescribeReservedCacheNodesOfferingsResult"
+              (\ s h x ->
+                 DescribeReservedCacheNodesOfferingsResponse' <$>
+                   (x .@? "Marker") <*>
+                     (x .@? "ReservedCacheNodesOfferings" .!@ mempty >>=
+                        may (parseXMLList "ReservedCacheNodesOffering"))
+                     <*> (pure (fromEnum s)))
+
+instance ToHeaders
+         DescribeReservedCacheNodesOfferings where
+        toHeaders = const mempty
+
+instance ToPath DescribeReservedCacheNodesOfferings
+         where
+        toPath = const "/"
+
+instance ToQuery DescribeReservedCacheNodesOfferings
+         where
+        toQuery DescribeReservedCacheNodesOfferings'{..}
+          = mconcat
+              ["Action" =:
+                 ("DescribeReservedCacheNodesOfferings" ::
+                    ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheNodeType" =: _drcnoCacheNodeType,
+               "ProductDescription" =: _drcnoProductDescription,
+               "MaxRecords" =: _drcnoMaxRecords,
+               "Marker" =: _drcnoMarker,
+               "OfferingType" =: _drcnoOfferingType,
+               "Duration" =: _drcnoDuration,
+               "ReservedCacheNodesOfferingId" =:
+                 _drcnoReservedCacheNodesOfferingId]
+
+-- | Represents the output of a /DescribeReservedCacheNodesOfferings/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeReservedCacheNodesOfferingsResponse' smart constructor.
+data DescribeReservedCacheNodesOfferingsResponse = DescribeReservedCacheNodesOfferingsResponse'
+    { _drcnorsMarker                      :: !(Maybe Text)
+    , _drcnorsReservedCacheNodesOfferings :: !(Maybe [ReservedCacheNodesOffering])
+    , _drcnorsStatus                      :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeReservedCacheNodesOfferingsResponse' with the minimum fields required to make a request.
 --
--- * 'drcnorMarker' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'drcnorReservedCacheNodesOfferings' @::@ ['ReservedCacheNodesOffering']
+-- * 'drcnorsMarker'
 --
-describeReservedCacheNodesOfferingsResponse :: DescribeReservedCacheNodesOfferingsResponse
-describeReservedCacheNodesOfferingsResponse = DescribeReservedCacheNodesOfferingsResponse
-    { _drcnorMarker                      = Nothing
-    , _drcnorReservedCacheNodesOfferings = mempty
+-- * 'drcnorsReservedCacheNodesOfferings'
+--
+-- * 'drcnorsStatus'
+describeReservedCacheNodesOfferingsResponse
+    :: Int -- ^ 'drcnorsStatus'
+    -> DescribeReservedCacheNodesOfferingsResponse
+describeReservedCacheNodesOfferingsResponse pStatus_ =
+    DescribeReservedCacheNodesOfferingsResponse'
+    { _drcnorsMarker = Nothing
+    , _drcnorsReservedCacheNodesOfferings = Nothing
+    , _drcnorsStatus = pStatus_
     }
 
 -- | Provides an identifier to allow retrieval of paginated results.
-drcnorMarker :: Lens' DescribeReservedCacheNodesOfferingsResponse (Maybe Text)
-drcnorMarker = lens _drcnorMarker (\s a -> s { _drcnorMarker = a })
-
--- | A list of reserved cache node offerings. Each element in the list contains
--- detailed information about one offering.
-drcnorReservedCacheNodesOfferings :: Lens' DescribeReservedCacheNodesOfferingsResponse [ReservedCacheNodesOffering]
-drcnorReservedCacheNodesOfferings =
-    lens _drcnorReservedCacheNodesOfferings
-        (\s a -> s { _drcnorReservedCacheNodesOfferings = a })
-            . _List
-
-instance ToPath DescribeReservedCacheNodesOfferings where
-    toPath = const "/"
-
-instance ToQuery DescribeReservedCacheNodesOfferings where
-    toQuery DescribeReservedCacheNodesOfferings{..} = mconcat
-        [ "CacheNodeType"                =? _drcnoCacheNodeType
-        , "Duration"                     =? _drcnoDuration
-        , "Marker"                       =? _drcnoMarker
-        , "MaxRecords"                   =? _drcnoMaxRecords
-        , "OfferingType"                 =? _drcnoOfferingType
-        , "ProductDescription"           =? _drcnoProductDescription
-        , "ReservedCacheNodesOfferingId" =? _drcnoReservedCacheNodesOfferingId
-        ]
-
-instance ToHeaders DescribeReservedCacheNodesOfferings
-
-instance AWSRequest DescribeReservedCacheNodesOfferings where
-    type Sv DescribeReservedCacheNodesOfferings = ElastiCache
-    type Rs DescribeReservedCacheNodesOfferings = DescribeReservedCacheNodesOfferingsResponse
-
-    request  = post "DescribeReservedCacheNodesOfferings"
-    response = xmlResponse
+drcnorsMarker :: Lens' DescribeReservedCacheNodesOfferingsResponse (Maybe Text)
+drcnorsMarker = lens _drcnorsMarker (\ s a -> s{_drcnorsMarker = a});
 
-instance FromXML DescribeReservedCacheNodesOfferingsResponse where
-    parseXML = withElement "DescribeReservedCacheNodesOfferingsResult" $ \x -> DescribeReservedCacheNodesOfferingsResponse
-        <$> x .@? "Marker"
-        <*> x .@? "ReservedCacheNodesOfferings" .!@ mempty
+-- | A list of reserved cache node offerings. Each element in the list
+-- contains detailed information about one offering.
+drcnorsReservedCacheNodesOfferings :: Lens' DescribeReservedCacheNodesOfferingsResponse [ReservedCacheNodesOffering]
+drcnorsReservedCacheNodesOfferings = lens _drcnorsReservedCacheNodesOfferings (\ s a -> s{_drcnorsReservedCacheNodesOfferings = a}) . _Default . _Coerce;
 
-instance AWSPager DescribeReservedCacheNodesOfferings where
-    page rq rs
-        | stop (rs ^. drcnorMarker) = Nothing
-        | otherwise = (\x -> rq & drcnoMarker ?~ x)
-            <$> (rs ^. drcnorMarker)
+-- | The response status code.
+drcnorsStatus :: Lens' DescribeReservedCacheNodesOfferingsResponse Int
+drcnorsStatus = lens _drcnorsStatus (\ s a -> s{_drcnorsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/DescribeSnapshots.hs b/gen/Network/AWS/ElastiCache/DescribeSnapshots.hs
--- a/gen/Network/AWS/ElastiCache/DescribeSnapshots.hs
+++ b/gen/Network/AWS/ElastiCache/DescribeSnapshots.hs
@@ -1,184 +1,204 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.DescribeSnapshots
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /DescribeSnapshots/ action returns information about cache cluster
--- snapshots. By default, /DescribeSnapshots/ lists all of your snapshots; it can
--- optionally describe a single snapshot, or just the snapshots associated with
--- a particular cache cluster.
+-- The /DescribeSnapshots/ action returns information about cache cluster
+-- snapshots. By default, /DescribeSnapshots/ lists all of your snapshots;
+-- it can optionally describe a single snapshot, or just the snapshots
+-- associated with a particular cache cluster.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeSnapshots.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeSnapshots.html AWS API Reference> for DescribeSnapshots.
+--
+-- This operation returns paginated results.
 module Network.AWS.ElastiCache.DescribeSnapshots
     (
-    -- * Request
-      DescribeSnapshots
-    -- ** Request constructor
-    , describeSnapshots
-    -- ** Request lenses
+    -- * Creating a Request
+      describeSnapshots
+    , DescribeSnapshots
+    -- * Request Lenses
     , dsCacheClusterId
-    , dsMarker
     , dsMaxRecords
+    , dsMarker
     , dsSnapshotName
     , dsSnapshotSource
 
-    -- * Response
-    , DescribeSnapshotsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeSnapshotsResponse
-    -- ** Response lenses
-    , dsrMarker
-    , dsrSnapshots
+    , DescribeSnapshotsResponse
+    -- * Response Lenses
+    , dssrsSnapshots
+    , dssrsMarker
+    , dssrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data DescribeSnapshots = DescribeSnapshots
-    { _dsCacheClusterId :: Maybe Text
-    , _dsMarker         :: Maybe Text
-    , _dsMaxRecords     :: Maybe Int
-    , _dsSnapshotName   :: Maybe Text
-    , _dsSnapshotSource :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeSnapshots' constructor.
+-- | Represents the input of a /DescribeSnapshotsMessage/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeSnapshots' smart constructor.
+data DescribeSnapshots = DescribeSnapshots'
+    { _dsCacheClusterId :: !(Maybe Text)
+    , _dsMaxRecords     :: !(Maybe Int)
+    , _dsMarker         :: !(Maybe Text)
+    , _dsSnapshotName   :: !(Maybe Text)
+    , _dsSnapshotSource :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeSnapshots' with the minimum fields required to make a request.
 --
--- * 'dsCacheClusterId' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dsMarker' @::@ 'Maybe' 'Text'
+-- * 'dsCacheClusterId'
 --
--- * 'dsMaxRecords' @::@ 'Maybe' 'Int'
+-- * 'dsMaxRecords'
 --
--- * 'dsSnapshotName' @::@ 'Maybe' 'Text'
+-- * 'dsMarker'
 --
--- * 'dsSnapshotSource' @::@ 'Maybe' 'Text'
+-- * 'dsSnapshotName'
 --
-describeSnapshots :: DescribeSnapshots
-describeSnapshots = DescribeSnapshots
+-- * 'dsSnapshotSource'
+describeSnapshots
+    :: DescribeSnapshots
+describeSnapshots =
+    DescribeSnapshots'
     { _dsCacheClusterId = Nothing
-    , _dsSnapshotName   = Nothing
+    , _dsMaxRecords = Nothing
+    , _dsMarker = Nothing
+    , _dsSnapshotName = Nothing
     , _dsSnapshotSource = Nothing
-    , _dsMarker         = Nothing
-    , _dsMaxRecords     = Nothing
     }
 
 -- | A user-supplied cluster identifier. If this parameter is specified, only
 -- snapshots associated with that specific cache cluster will be described.
 dsCacheClusterId :: Lens' DescribeSnapshots (Maybe Text)
-dsCacheClusterId = lens _dsCacheClusterId (\s a -> s { _dsCacheClusterId = a })
-
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dsMarker :: Lens' DescribeSnapshots (Maybe Text)
-dsMarker = lens _dsMarker (\s a -> s { _dsMarker = a })
+dsCacheClusterId = lens _dsCacheClusterId (\ s a -> s{_dsCacheClusterId = a});
 
--- | The maximum number of records to include in the response. If more records
--- exist than the specified 'MaxRecords' value, a marker is included in the
--- response so that the remaining results can be retrieved.
+-- | The maximum number of records to include in the response. If more
+-- records exist than the specified 'MaxRecords' value, a marker is
+-- included in the response so that the remaining results can be retrieved.
 --
 -- Default: 50
 --
 -- Constraints: minimum 20; maximum 50.
 dsMaxRecords :: Lens' DescribeSnapshots (Maybe Int)
-dsMaxRecords = lens _dsMaxRecords (\s a -> s { _dsMaxRecords = a })
+dsMaxRecords = lens _dsMaxRecords (\ s a -> s{_dsMaxRecords = a});
 
--- | A user-supplied name of the snapshot. If this parameter is specified, only
--- this snapshot will be described.
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dsMarker :: Lens' DescribeSnapshots (Maybe Text)
+dsMarker = lens _dsMarker (\ s a -> s{_dsMarker = a});
+
+-- | A user-supplied name of the snapshot. If this parameter is specified,
+-- only this snapshot will be described.
 dsSnapshotName :: Lens' DescribeSnapshots (Maybe Text)
-dsSnapshotName = lens _dsSnapshotName (\s a -> s { _dsSnapshotName = a })
+dsSnapshotName = lens _dsSnapshotName (\ s a -> s{_dsSnapshotName = a});
 
--- | If set to 'system', the output shows snapshots that were automatically created
--- by ElastiCache. If set to 'user' the output shows snapshots that were manually
--- created. If omitted, the output shows both automatically and manually created
--- snapshots.
+-- | If set to 'system', the output shows snapshots that were automatically
+-- created by ElastiCache. If set to 'user' the output shows snapshots that
+-- were manually created. If omitted, the output shows both automatically
+-- and manually created snapshots.
 dsSnapshotSource :: Lens' DescribeSnapshots (Maybe Text)
-dsSnapshotSource = lens _dsSnapshotSource (\s a -> s { _dsSnapshotSource = a })
-
-data DescribeSnapshotsResponse = DescribeSnapshotsResponse
-    { _dsrMarker    :: Maybe Text
-    , _dsrSnapshots :: List "member" Snapshot
-    } deriving (Eq, Read, Show)
+dsSnapshotSource = lens _dsSnapshotSource (\ s a -> s{_dsSnapshotSource = a});
 
--- | 'DescribeSnapshotsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dsrMarker' @::@ 'Maybe' 'Text'
---
--- * 'dsrSnapshots' @::@ ['Snapshot']
---
-describeSnapshotsResponse :: DescribeSnapshotsResponse
-describeSnapshotsResponse = DescribeSnapshotsResponse
-    { _dsrMarker    = Nothing
-    , _dsrSnapshots = mempty
-    }
+instance AWSPager DescribeSnapshots where
+        page rq rs
+          | stop (rs ^. dssrsMarker) = Nothing
+          | stop (rs ^. dssrsSnapshots) = Nothing
+          | otherwise =
+            Just $ rq & dsMarker .~ rs ^. dssrsMarker
 
--- | An optional marker returned from a prior request. Use this marker for
--- pagination of results from this action. If this parameter is specified, the
--- response includes only records beyond the marker, up to the value specified
--- by /MaxRecords/.
-dsrMarker :: Lens' DescribeSnapshotsResponse (Maybe Text)
-dsrMarker = lens _dsrMarker (\s a -> s { _dsrMarker = a })
+instance AWSRequest DescribeSnapshots where
+        type Sv DescribeSnapshots = ElastiCache
+        type Rs DescribeSnapshots = DescribeSnapshotsResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "DescribeSnapshotsResult"
+              (\ s h x ->
+                 DescribeSnapshotsResponse' <$>
+                   (x .@? "Snapshots" .!@ mempty >>=
+                      may (parseXMLList "Snapshot"))
+                     <*> (x .@? "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | A list of snapshots. Each item in the list contains detailed information
--- about one snapshot.
-dsrSnapshots :: Lens' DescribeSnapshotsResponse [Snapshot]
-dsrSnapshots = lens _dsrSnapshots (\s a -> s { _dsrSnapshots = a }) . _List
+instance ToHeaders DescribeSnapshots where
+        toHeaders = const mempty
 
 instance ToPath DescribeSnapshots where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeSnapshots where
-    toQuery DescribeSnapshots{..} = mconcat
-        [ "CacheClusterId" =? _dsCacheClusterId
-        , "Marker"         =? _dsMarker
-        , "MaxRecords"     =? _dsMaxRecords
-        , "SnapshotName"   =? _dsSnapshotName
-        , "SnapshotSource" =? _dsSnapshotSource
-        ]
+        toQuery DescribeSnapshots'{..}
+          = mconcat
+              ["Action" =: ("DescribeSnapshots" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheClusterId" =: _dsCacheClusterId,
+               "MaxRecords" =: _dsMaxRecords, "Marker" =: _dsMarker,
+               "SnapshotName" =: _dsSnapshotName,
+               "SnapshotSource" =: _dsSnapshotSource]
 
-instance ToHeaders DescribeSnapshots
+-- | Represents the output of a /DescribeSnapshots/ action.
+--
+-- /See:/ 'describeSnapshotsResponse' smart constructor.
+data DescribeSnapshotsResponse = DescribeSnapshotsResponse'
+    { _dssrsSnapshots :: !(Maybe [Snapshot])
+    , _dssrsMarker    :: !(Maybe Text)
+    , _dssrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeSnapshots where
-    type Sv DescribeSnapshots = ElastiCache
-    type Rs DescribeSnapshots = DescribeSnapshotsResponse
+-- | Creates a value of 'DescribeSnapshotsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dssrsSnapshots'
+--
+-- * 'dssrsMarker'
+--
+-- * 'dssrsStatus'
+describeSnapshotsResponse
+    :: Int -- ^ 'dssrsStatus'
+    -> DescribeSnapshotsResponse
+describeSnapshotsResponse pStatus_ =
+    DescribeSnapshotsResponse'
+    { _dssrsSnapshots = Nothing
+    , _dssrsMarker = Nothing
+    , _dssrsStatus = pStatus_
+    }
 
-    request  = post "DescribeSnapshots"
-    response = xmlResponse
+-- | A list of snapshots. Each item in the list contains detailed information
+-- about one snapshot.
+dssrsSnapshots :: Lens' DescribeSnapshotsResponse [Snapshot]
+dssrsSnapshots = lens _dssrsSnapshots (\ s a -> s{_dssrsSnapshots = a}) . _Default . _Coerce;
 
-instance FromXML DescribeSnapshotsResponse where
-    parseXML = withElement "DescribeSnapshotsResult" $ \x -> DescribeSnapshotsResponse
-        <$> x .@? "Marker"
-        <*> x .@? "Snapshots" .!@ mempty
+-- | An optional marker returned from a prior request. Use this marker for
+-- pagination of results from this action. If this parameter is specified,
+-- the response includes only records beyond the marker, up to the value
+-- specified by /MaxRecords/.
+dssrsMarker :: Lens' DescribeSnapshotsResponse (Maybe Text)
+dssrsMarker = lens _dssrsMarker (\ s a -> s{_dssrsMarker = a});
 
-instance AWSPager DescribeSnapshots where
-    page rq rs
-        | stop (rs ^. dsrMarker) = Nothing
-        | otherwise = (\x -> rq & dsMarker ?~ x)
-            <$> (rs ^. dsrMarker)
+-- | The response status code.
+dssrsStatus :: Lens' DescribeSnapshotsResponse Int
+dssrsStatus = lens _dssrsStatus (\ s a -> s{_dssrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/ListTagsForResource.hs b/gen/Network/AWS/ElastiCache/ListTagsForResource.hs
--- a/gen/Network/AWS/ElastiCache/ListTagsForResource.hs
+++ b/gen/Network/AWS/ElastiCache/ListTagsForResource.hs
@@ -1,120 +1,96 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ListTagsForResource
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ListTagsForResource/ action lists all cost allocation tags currently on
--- the named resource. A /cost allocation tag/ is a key-value pair where the key
--- is case-sensitive and the value is optional. Cost allocation tags can be used
--- to categorize and track your AWS costs.
+-- The /ListTagsForResource/ action lists all cost allocation tags
+-- currently on the named resource. A /cost allocation tag/ is a key-value
+-- pair where the key is case-sensitive and the value is optional. Cost
+-- allocation tags can be used to categorize and track your AWS costs.
 --
 -- You can have a maximum of 10 cost allocation tags on an ElastiCache
--- resource. For more information, see <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/BestPractices.html Using Cost Allocation Tags in AmazonElastiCache>.
+-- resource. For more information, see
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/BestPractices.html Using Cost Allocation Tags in Amazon ElastiCache>.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ListTagsForResource.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ListTagsForResource.html AWS API Reference> for ListTagsForResource.
 module Network.AWS.ElastiCache.ListTagsForResource
     (
-    -- * Request
-      ListTagsForResource
-    -- ** Request constructor
-    , listTagsForResource
-    -- ** Request lenses
+    -- * Creating a Request
+      listTagsForResource
+    , ListTagsForResource
+    -- * Request Lenses
     , ltfrResourceName
 
-    -- * Response
-    , ListTagsForResourceResponse
-    -- ** Response constructor
-    , listTagsForResourceResponse
-    -- ** Response lenses
-    , ltfrrTagList
+    -- * Destructuring the Response
+    , tagListMessage
+    , TagListMessage
+    -- * Response Lenses
+    , tlmTagList
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
-newtype ListTagsForResource = ListTagsForResource
+-- | The input parameters for the /ListTagsForResource/ action.
+--
+-- /See:/ 'listTagsForResource' smart constructor.
+newtype ListTagsForResource = ListTagsForResource'
     { _ltfrResourceName :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
--- | 'ListTagsForResource' constructor.
---
--- The fields accessible through corresponding lenses are:
+-- | Creates a value of 'ListTagsForResource' with the minimum fields required to make a request.
 --
--- * 'ltfrResourceName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-listTagsForResource :: Text -- ^ 'ltfrResourceName'
-                    -> ListTagsForResource
-listTagsForResource p1 = ListTagsForResource
-    { _ltfrResourceName = p1
+-- * 'ltfrResourceName'
+listTagsForResource
+    :: Text -- ^ 'ltfrResourceName'
+    -> ListTagsForResource
+listTagsForResource pResourceName_ =
+    ListTagsForResource'
+    { _ltfrResourceName = pResourceName_
     }
 
--- | The name of the resource for which you want the list of tags, for example 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
+-- | The name of the resource for which you want the list of tags, for
+-- example 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
 ltfrResourceName :: Lens' ListTagsForResource Text
-ltfrResourceName = lens _ltfrResourceName (\s a -> s { _ltfrResourceName = a })
-
-newtype ListTagsForResourceResponse = ListTagsForResourceResponse
-    { _ltfrrTagList :: List "member" Tag
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList ListTagsForResourceResponse where
-    type Item ListTagsForResourceResponse = Tag
-
-    fromList = ListTagsForResourceResponse . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _ltfrrTagList
+ltfrResourceName = lens _ltfrResourceName (\ s a -> s{_ltfrResourceName = a});
 
--- | 'ListTagsForResourceResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ltfrrTagList' @::@ ['Tag']
---
-listTagsForResourceResponse :: ListTagsForResourceResponse
-listTagsForResourceResponse = ListTagsForResourceResponse
-    { _ltfrrTagList = mempty
-    }
+instance AWSRequest ListTagsForResource where
+        type Sv ListTagsForResource = ElastiCache
+        type Rs ListTagsForResource = TagListMessage
+        request = postQuery
+        response
+          = receiveXMLWrapper "ListTagsForResourceResult"
+              (\ s h x -> parseXML x)
 
--- | A list of cost allocation tags as key-value pairs.
-ltfrrTagList :: Lens' ListTagsForResourceResponse [Tag]
-ltfrrTagList = lens _ltfrrTagList (\s a -> s { _ltfrrTagList = a }) . _List
+instance ToHeaders ListTagsForResource where
+        toHeaders = const mempty
 
 instance ToPath ListTagsForResource where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListTagsForResource where
-    toQuery ListTagsForResource{..} = mconcat
-        [ "ResourceName" =? _ltfrResourceName
-        ]
-
-instance ToHeaders ListTagsForResource
-
-instance AWSRequest ListTagsForResource where
-    type Sv ListTagsForResource = ElastiCache
-    type Rs ListTagsForResource = ListTagsForResourceResponse
-
-    request  = post "ListTagsForResource"
-    response = xmlResponse
-
-instance FromXML ListTagsForResourceResponse where
-    parseXML = withElement "ListTagsForResourceResult" $ \x -> ListTagsForResourceResponse
-        <$> x .@? "TagList" .!@ mempty
+        toQuery ListTagsForResource'{..}
+          = mconcat
+              ["Action" =: ("ListTagsForResource" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "ResourceName" =: _ltfrResourceName]
diff --git a/gen/Network/AWS/ElastiCache/ModifyCacheCluster.hs b/gen/Network/AWS/ElastiCache/ModifyCacheCluster.hs
--- a/gen/Network/AWS/ElastiCache/ModifyCacheCluster.hs
+++ b/gen/Network/AWS/ElastiCache/ModifyCacheCluster.hs
@@ -1,303 +1,328 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ModifyCacheCluster
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ModifyCacheCluster/ action modifies the settings for a cache cluster. You
--- can use this action to change one or more cluster configuration parameters by
--- specifying the parameters and the new values.
+-- The /ModifyCacheCluster/ action modifies the settings for a cache
+-- cluster. You can use this action to change one or more cluster
+-- configuration parameters by specifying the parameters and the new
+-- values.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheCluster.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheCluster.html AWS API Reference> for ModifyCacheCluster.
 module Network.AWS.ElastiCache.ModifyCacheCluster
     (
-    -- * Request
-      ModifyCacheCluster
-    -- ** Request constructor
-    , modifyCacheCluster
-    -- ** Request lenses
-    , mccAZMode
-    , mccApplyImmediately
+    -- * Creating a Request
+      modifyCacheCluster
+    , ModifyCacheCluster
+    -- * Request Lenses
+    , mccEngineVersion
+    , mccSecurityGroupIds
     , mccAutoMinorVersionUpgrade
-    , mccCacheClusterId
-    , mccCacheNodeIdsToRemove
     , mccCacheParameterGroupName
-    , mccCacheSecurityGroupNames
-    , mccEngineVersion
     , mccNewAvailabilityZones
-    , mccNotificationTopicArn
-    , mccNotificationTopicStatus
-    , mccNumCacheNodes
+    , mccSnapshotWindow
     , mccPreferredMaintenanceWindow
-    , mccSecurityGroupIds
+    , mccCacheNodeIdsToRemove
     , mccSnapshotRetentionLimit
-    , mccSnapshotWindow
+    , mccAZMode
+    , mccNotificationTopicStatus
+    , mccApplyImmediately
+    , mccNotificationTopicARN
+    , mccNumCacheNodes
+    , mccCacheSecurityGroupNames
+    , mccCacheClusterId
 
-    -- * Response
-    , ModifyCacheClusterResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , modifyCacheClusterResponse
-    -- ** Response lenses
-    , mccrCacheCluster
+    , ModifyCacheClusterResponse
+    -- * Response Lenses
+    , mccrsCacheCluster
+    , mccrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data ModifyCacheCluster = ModifyCacheCluster
-    { _mccAZMode                     :: Maybe AZMode
-    , _mccApplyImmediately           :: Maybe Bool
-    , _mccAutoMinorVersionUpgrade    :: Maybe Bool
-    , _mccCacheClusterId             :: Text
-    , _mccCacheNodeIdsToRemove       :: List "member" Text
-    , _mccCacheParameterGroupName    :: Maybe Text
-    , _mccCacheSecurityGroupNames    :: List "member" Text
-    , _mccEngineVersion              :: Maybe Text
-    , _mccNewAvailabilityZones       :: List "member" Text
-    , _mccNotificationTopicArn       :: Maybe Text
-    , _mccNotificationTopicStatus    :: Maybe Text
-    , _mccNumCacheNodes              :: Maybe Int
-    , _mccPreferredMaintenanceWindow :: Maybe Text
-    , _mccSecurityGroupIds           :: List "member" Text
-    , _mccSnapshotRetentionLimit     :: Maybe Int
-    , _mccSnapshotWindow             :: Maybe Text
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ModifyCacheCluster' constructor.
+-- | Represents the input of a /ModifyCacheCluster/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'modifyCacheCluster' smart constructor.
+data ModifyCacheCluster = ModifyCacheCluster'
+    { _mccEngineVersion              :: !(Maybe Text)
+    , _mccSecurityGroupIds           :: !(Maybe [Text])
+    , _mccAutoMinorVersionUpgrade    :: !(Maybe Bool)
+    , _mccCacheParameterGroupName    :: !(Maybe Text)
+    , _mccNewAvailabilityZones       :: !(Maybe [Text])
+    , _mccSnapshotWindow             :: !(Maybe Text)
+    , _mccPreferredMaintenanceWindow :: !(Maybe Text)
+    , _mccCacheNodeIdsToRemove       :: !(Maybe [Text])
+    , _mccSnapshotRetentionLimit     :: !(Maybe Int)
+    , _mccAZMode                     :: !(Maybe AZMode)
+    , _mccNotificationTopicStatus    :: !(Maybe Text)
+    , _mccApplyImmediately           :: !(Maybe Bool)
+    , _mccNotificationTopicARN       :: !(Maybe Text)
+    , _mccNumCacheNodes              :: !(Maybe Int)
+    , _mccCacheSecurityGroupNames    :: !(Maybe [Text])
+    , _mccCacheClusterId             :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyCacheCluster' with the minimum fields required to make a request.
 --
--- * 'mccAZMode' @::@ 'Maybe' 'AZMode'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'mccApplyImmediately' @::@ 'Maybe' 'Bool'
+-- * 'mccEngineVersion'
 --
--- * 'mccAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
+-- * 'mccSecurityGroupIds'
 --
--- * 'mccCacheClusterId' @::@ 'Text'
+-- * 'mccAutoMinorVersionUpgrade'
 --
--- * 'mccCacheNodeIdsToRemove' @::@ ['Text']
+-- * 'mccCacheParameterGroupName'
 --
--- * 'mccCacheParameterGroupName' @::@ 'Maybe' 'Text'
+-- * 'mccNewAvailabilityZones'
 --
--- * 'mccCacheSecurityGroupNames' @::@ ['Text']
+-- * 'mccSnapshotWindow'
 --
--- * 'mccEngineVersion' @::@ 'Maybe' 'Text'
+-- * 'mccPreferredMaintenanceWindow'
 --
--- * 'mccNewAvailabilityZones' @::@ ['Text']
+-- * 'mccCacheNodeIdsToRemove'
 --
--- * 'mccNotificationTopicArn' @::@ 'Maybe' 'Text'
+-- * 'mccSnapshotRetentionLimit'
 --
--- * 'mccNotificationTopicStatus' @::@ 'Maybe' 'Text'
+-- * 'mccAZMode'
 --
--- * 'mccNumCacheNodes' @::@ 'Maybe' 'Int'
+-- * 'mccNotificationTopicStatus'
 --
--- * 'mccPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+-- * 'mccApplyImmediately'
 --
--- * 'mccSecurityGroupIds' @::@ ['Text']
+-- * 'mccNotificationTopicARN'
 --
--- * 'mccSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
+-- * 'mccNumCacheNodes'
 --
--- * 'mccSnapshotWindow' @::@ 'Maybe' 'Text'
+-- * 'mccCacheSecurityGroupNames'
 --
-modifyCacheCluster :: Text -- ^ 'mccCacheClusterId'
-                   -> ModifyCacheCluster
-modifyCacheCluster p1 = ModifyCacheCluster
-    { _mccCacheClusterId             = p1
-    , _mccNumCacheNodes              = Nothing
-    , _mccCacheNodeIdsToRemove       = mempty
-    , _mccAZMode                     = Nothing
-    , _mccNewAvailabilityZones       = mempty
-    , _mccCacheSecurityGroupNames    = mempty
-    , _mccSecurityGroupIds           = mempty
+-- * 'mccCacheClusterId'
+modifyCacheCluster
+    :: Text -- ^ 'mccCacheClusterId'
+    -> ModifyCacheCluster
+modifyCacheCluster pCacheClusterId_ =
+    ModifyCacheCluster'
+    { _mccEngineVersion = Nothing
+    , _mccSecurityGroupIds = Nothing
+    , _mccAutoMinorVersionUpgrade = Nothing
+    , _mccCacheParameterGroupName = Nothing
+    , _mccNewAvailabilityZones = Nothing
+    , _mccSnapshotWindow = Nothing
     , _mccPreferredMaintenanceWindow = Nothing
-    , _mccNotificationTopicArn       = Nothing
-    , _mccCacheParameterGroupName    = Nothing
-    , _mccNotificationTopicStatus    = Nothing
-    , _mccApplyImmediately           = Nothing
-    , _mccEngineVersion              = Nothing
-    , _mccAutoMinorVersionUpgrade    = Nothing
-    , _mccSnapshotRetentionLimit     = Nothing
-    , _mccSnapshotWindow             = Nothing
+    , _mccCacheNodeIdsToRemove = Nothing
+    , _mccSnapshotRetentionLimit = Nothing
+    , _mccAZMode = Nothing
+    , _mccNotificationTopicStatus = Nothing
+    , _mccApplyImmediately = Nothing
+    , _mccNotificationTopicARN = Nothing
+    , _mccNumCacheNodes = Nothing
+    , _mccCacheSecurityGroupNames = Nothing
+    , _mccCacheClusterId = pCacheClusterId_
     }
 
--- | Specifies whether the new nodes in this Memcached cache cluster are all
--- created in a single Availability Zone or created across multiple Availability
--- Zones.
+-- | The upgraded version of the cache engine to be run on the cache nodes.
+mccEngineVersion :: Lens' ModifyCacheCluster (Maybe Text)
+mccEngineVersion = lens _mccEngineVersion (\ s a -> s{_mccEngineVersion = a});
+
+-- | Specifies the VPC Security Groups associated with the cache cluster.
 --
--- Valid values: 'single-az' | 'cross-az'.
+-- This parameter can be used only with clusters that are created in an
+-- Amazon Virtual Private Cloud (VPC).
+mccSecurityGroupIds :: Lens' ModifyCacheCluster [Text]
+mccSecurityGroupIds = lens _mccSecurityGroupIds (\ s a -> s{_mccSecurityGroupIds = a}) . _Default . _Coerce;
+
+-- | This parameter is currently disabled.
+mccAutoMinorVersionUpgrade :: Lens' ModifyCacheCluster (Maybe Bool)
+mccAutoMinorVersionUpgrade = lens _mccAutoMinorVersionUpgrade (\ s a -> s{_mccAutoMinorVersionUpgrade = a});
+
+-- | The name of the cache parameter group to apply to this cache cluster.
+-- This change is asynchronously applied as soon as possible for parameters
+-- when the /ApplyImmediately/ parameter is specified as /true/ for this
+-- request.
+mccCacheParameterGroupName :: Lens' ModifyCacheCluster (Maybe Text)
+mccCacheParameterGroupName = lens _mccCacheParameterGroupName (\ s a -> s{_mccCacheParameterGroupName = a});
+
+-- | The list of Availability Zones where the new Memcached cache nodes will
+-- be created.
 --
--- This option is only supported for Memcached cache clusters.
+-- This parameter is only valid when /NumCacheNodes/ in the request is
+-- greater than the sum of the number of active cache nodes and the number
+-- of cache nodes pending creation (which may be zero). The number of
+-- Availability Zones supplied in this list must match the cache nodes
+-- being added in this request.
 --
--- You cannot specify 'single-az' if the Memcached cache cluster already has
--- cache nodes in different Availability Zones. If 'cross-az' is specified,
--- existing Memcached nodes remain in their current Availability Zone.
+-- This option is only supported on Memcached clusters.
 --
--- Only newly created nodes will be located in different Availability Zones.
--- For instructions on how to move existing Memcached nodes to different
--- Availability Zones, see the Availability Zone Considerations section of <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheNode.Memcached.html CacheNode Considerations for Memcached>.
+-- Scenarios:
 --
+-- -   __Scenario 1:__ You have 3 active nodes and wish to add 2 nodes.
+--      Specify 'NumCacheNodes=5' (3 + 2) and optionally specify two
+--     Availability Zones for the two new nodes.
+-- -   __Scenario 2:__ You have 3 active nodes and 2 nodes pending creation
+--     (from the scenario 1 call) and want to add 1 more node.
+--      Specify 'NumCacheNodes=6' ((3 + 2) + 1)
+-- -   __Scenario 3:__ You want to cancel all pending actions.
+--      Specify 'NumCacheNodes=3' to cancel all pending actions.
 --
-mccAZMode :: Lens' ModifyCacheCluster (Maybe AZMode)
-mccAZMode = lens _mccAZMode (\s a -> s { _mccAZMode = a })
-
--- | If 'true', this parameter causes the modifications in this request and any
--- pending modifications to be applied, asynchronously and as soon as possible,
--- regardless of the /PreferredMaintenanceWindow/ setting for the cache cluster.
+-- The Availability Zone placement of nodes pending creation cannot be
+-- modified. If you wish to cancel any nodes pending creation, add 0 nodes
+-- by setting 'NumCacheNodes' to the number of current nodes.
 --
--- If 'false', then changes to the cache cluster are applied on the next
--- maintenance reboot, or the next failure reboot, whichever occurs first.
+-- If 'cross-az' is specified, existing Memcached nodes remain in their
+-- current Availability Zone. Only newly created nodes can be located in
+-- different Availability Zones. For guidance on how to move existing
+-- Memcached nodes to different Availability Zones, see the __Availability
+-- Zone Considerations__ section of
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheNode.Memcached.html Cache Node Considerations for Memcached>.
 --
--- If you perform a 'ModifyCacheCluster' before a pending modification is
--- applied, the pending modification is replaced by the newer modification. Valid values:
--- 'true' | 'false'
+-- __Impact of new add\/remove requests upon pending requests__
 --
--- Default: 'false'
-mccApplyImmediately :: Lens' ModifyCacheCluster (Maybe Bool)
-mccApplyImmediately =
-    lens _mccApplyImmediately (\s a -> s { _mccApplyImmediately = a })
-
--- | This parameter is currently disabled.
-mccAutoMinorVersionUpgrade :: Lens' ModifyCacheCluster (Maybe Bool)
-mccAutoMinorVersionUpgrade =
-    lens _mccAutoMinorVersionUpgrade
-        (\s a -> s { _mccAutoMinorVersionUpgrade = a })
-
--- | The cache cluster identifier. This value is stored as a lowercase string.
-mccCacheClusterId :: Lens' ModifyCacheCluster Text
-mccCacheClusterId =
-    lens _mccCacheClusterId (\s a -> s { _mccCacheClusterId = a })
-
--- | A list of cache node IDs to be removed. A node ID is a numeric identifier
--- (0001, 0002, etc.). This parameter is only valid when /NumCacheNodes/ is less
--- than the existing number of cache nodes. The number of cache node IDs
--- supplied in this parameter must match the difference between the existing
--- number of cache nodes in the cluster or pending cache nodes, whichever is
--- greater, and the value of /NumCacheNodes/ in the request.
+-- >   --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- >   Scenarios    Pending action   New Request   Results
+-- >   ------------ ---------------- ------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- >   Scenario-1   Delete           Delete        The new delete, pending or immediate, replaces the pending delete.
+-- >
+-- >   Scenario-2   Delete           Create        The new create, pending or immediate, replaces the pending delete.
+-- >
+-- >   Scenario-3   Create           Delete        The new delete, pending or immediate, replaces the pending create.
+-- >
+-- >   Scenario-4   Create           Create        The new create is added to the pending create.
+-- >                                                __Important:__
+-- >                                               If the new create request is __Apply Immediately - Yes__, all creates are performed immediately. If the new create request is __Apply Immediately - No__, all creates are pending.
+-- >   --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --
--- For example: If you have 3 active cache nodes, 7 pending cache nodes, and
--- the number of cache nodes in this 'ModifyCacheCluser' call is 5, you must list
--- 2 (7 - 5) cache node IDs to remove.
-mccCacheNodeIdsToRemove :: Lens' ModifyCacheCluster [Text]
-mccCacheNodeIdsToRemove =
-    lens _mccCacheNodeIdsToRemove (\s a -> s { _mccCacheNodeIdsToRemove = a })
-        . _List
+-- Example:
+-- 'NewAvailabilityZones.member.1=us-west-2a&NewAvailabilityZones.member.2=us-west-2b&NewAvailabilityZones.member.3=us-west-2c'
+mccNewAvailabilityZones :: Lens' ModifyCacheCluster [Text]
+mccNewAvailabilityZones = lens _mccNewAvailabilityZones (\ s a -> s{_mccNewAvailabilityZones = a}) . _Default . _Coerce;
 
--- | The name of the cache parameter group to apply to this cache cluster. This
--- change is asynchronously applied as soon as possible for parameters when the /ApplyImmediately/ parameter is specified as /true/ for this request.
-mccCacheParameterGroupName :: Lens' ModifyCacheCluster (Maybe Text)
-mccCacheParameterGroupName =
-    lens _mccCacheParameterGroupName
-        (\s a -> s { _mccCacheParameterGroupName = a })
+-- | The daily time range (in UTC) during which ElastiCache will begin taking
+-- a daily snapshot of your cache cluster.
+mccSnapshotWindow :: Lens' ModifyCacheCluster (Maybe Text)
+mccSnapshotWindow = lens _mccSnapshotWindow (\ s a -> s{_mccSnapshotWindow = a});
 
--- | A list of cache security group names to authorize on this cache cluster. This
--- change is asynchronously applied as soon as possible.
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
 --
--- This parameter can be used only with clusters that are created outside of an
--- Amazon Virtual Private Cloud (VPC).
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
 --
--- Constraints: Must contain no more than 255 alphanumeric characters. Must not
--- be "Default".
-mccCacheSecurityGroupNames :: Lens' ModifyCacheCluster [Text]
-mccCacheSecurityGroupNames =
-    lens _mccCacheSecurityGroupNames
-        (\s a -> s { _mccCacheSecurityGroupNames = a })
-            . _List
+-- Example: 'sun:05:00-sun:09:00'
+mccPreferredMaintenanceWindow :: Lens' ModifyCacheCluster (Maybe Text)
+mccPreferredMaintenanceWindow = lens _mccPreferredMaintenanceWindow (\ s a -> s{_mccPreferredMaintenanceWindow = a});
 
--- | The upgraded version of the cache engine to be run on the cache nodes.
-mccEngineVersion :: Lens' ModifyCacheCluster (Maybe Text)
-mccEngineVersion = lens _mccEngineVersion (\s a -> s { _mccEngineVersion = a })
+-- | A list of cache node IDs to be removed. A node ID is a numeric
+-- identifier (0001, 0002, etc.). This parameter is only valid when
+-- /NumCacheNodes/ is less than the existing number of cache nodes. The
+-- number of cache node IDs supplied in this parameter must match the
+-- difference between the existing number of cache nodes in the cluster or
+-- pending cache nodes, whichever is greater, and the value of
+-- /NumCacheNodes/ in the request.
+--
+-- For example: If you have 3 active cache nodes, 7 pending cache nodes,
+-- and the number of cache nodes in this 'ModifyCacheCluser' call is 5, you
+-- must list 2 (7 - 5) cache node IDs to remove.
+mccCacheNodeIdsToRemove :: Lens' ModifyCacheCluster [Text]
+mccCacheNodeIdsToRemove = lens _mccCacheNodeIdsToRemove (\ s a -> s{_mccCacheNodeIdsToRemove = a}) . _Default . _Coerce;
 
--- | The list of Availability Zones where the new Memcached cache nodes will be
--- created.
+-- | The number of days for which ElastiCache will retain automatic cache
+-- cluster snapshots before deleting them. For example, if you set
+-- /SnapshotRetentionLimit/ to 5, then a snapshot that was taken today will
+-- be retained for 5 days before being deleted.
 --
--- This parameter is only valid when /NumCacheNodes/ in the request is greater
--- than the sum of the number of active cache nodes and the number of cache
--- nodes pending creation (which may be zero). The number of Availability Zones
--- supplied in this list must match the cache nodes being added in this request.
+-- __Important__
+-- If the value of SnapshotRetentionLimit is set to zero (0), backups are
+-- turned off.
+mccSnapshotRetentionLimit :: Lens' ModifyCacheCluster (Maybe Int)
+mccSnapshotRetentionLimit = lens _mccSnapshotRetentionLimit (\ s a -> s{_mccSnapshotRetentionLimit = a});
+
+-- | Specifies whether the new nodes in this Memcached cache cluster are all
+-- created in a single Availability Zone or created across multiple
+-- Availability Zones.
 --
--- This option is only supported on Memcached clusters.
+-- Valid values: 'single-az' | 'cross-az'.
 --
--- Scenarios:   Scenario 1: You have 3 active nodes and wish to add 2 nodes.
+-- This option is only supported for Memcached cache clusters.
 --
--- Specify 'NumCacheNodes=5' (3 + 2) and optionally specify two Availability Zones
--- for the two new nodes.  Scenario 2: You have 3 active nodes and 2 nodes
--- pending creation (from the scenario 1 call) and want to add 1 more node.
+-- You cannot specify 'single-az' if the Memcached cache cluster already
+-- has cache nodes in different Availability Zones. If 'cross-az' is
+-- specified, existing Memcached nodes remain in their current Availability
+-- Zone.
 --
--- Specify 'NumCacheNodes=6' ((3 + 2) + 1) and optionally specify an Availability
--- Zone for the new node.  Scenario 3: You want to cancel all pending actions.
+-- Only newly created nodes will be located in different Availability
+-- Zones. For instructions on how to move existing Memcached nodes to
+-- different Availability Zones, see the __Availability Zone
+-- Considerations__ section of
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheNode.Memcached.html Cache Node Considerations for Memcached>.
+mccAZMode :: Lens' ModifyCacheCluster (Maybe AZMode)
+mccAZMode = lens _mccAZMode (\ s a -> s{_mccAZMode = a});
+
+-- | The status of the Amazon SNS notification topic. Notifications are sent
+-- only if the status is /active/.
 --
--- Specify 'NumCacheNodes=3' to cancel all pending actions.
+-- Valid values: 'active' | 'inactive'
+mccNotificationTopicStatus :: Lens' ModifyCacheCluster (Maybe Text)
+mccNotificationTopicStatus = lens _mccNotificationTopicStatus (\ s a -> s{_mccNotificationTopicStatus = a});
+
+-- | If 'true', this parameter causes the modifications in this request and
+-- any pending modifications to be applied, asynchronously and as soon as
+-- possible, regardless of the /PreferredMaintenanceWindow/ setting for the
+-- cache cluster.
 --
--- The Availability Zone placement of nodes pending creation cannot be
--- modified. If you wish to cancel any nodes pending creation, add 0 nodes by
--- setting 'NumCacheNodes' to the number of current nodes.
+-- If 'false', then changes to the cache cluster are applied on the next
+-- maintenance reboot, or the next failure reboot, whichever occurs first.
 --
--- If 'cross-az' is specified, existing Memcached nodes remain in their current
--- Availability Zone. Only newly created nodes can be located in different
--- Availability Zones. For guidance on how to move existing Memcached nodes to
--- different Availability Zones, see the Availability Zone Considerations
--- section of <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheNode.Memcached.html Cache Node Considerations for Memcached>.
+-- If you perform a 'ModifyCacheCluster' before a pending modification is
+-- applied, the pending modification is replaced by the newer modification.
 --
--- Impact of new add/remove requests upon pending requests
+-- Valid values: 'true' | 'false'
 --
--- Scenarios Pending action New Request Results   Scenario-1 Delete Delete The new delete, pending or immediate, replaces the pending delete.
--- Scenario-2 Delete Create The new create, pending or immediate, replaces
--- the pending delete.   Scenario-3 Create Delete The new delete, pending or
--- immediate, replaces the pending create.   Scenario-4 Create Create The new
--- create is added to the pending create.
--- Important:
--- If the new create request is
--- Apply Immediately - Yes, all creates are performed immediately. If the new
--- create request is Apply Immediately - No, all creates are pending.   Example: 'NewAvailabilityZones.member.1=us-west-2a&NewAvailabilityZones.member.2=us-west-2b&NewAvailabilityZones.member.3=us-west-2c'
-mccNewAvailabilityZones :: Lens' ModifyCacheCluster [Text]
-mccNewAvailabilityZones =
-    lens _mccNewAvailabilityZones (\s a -> s { _mccNewAvailabilityZones = a })
-        . _List
+-- Default: 'false'
+mccApplyImmediately :: Lens' ModifyCacheCluster (Maybe Bool)
+mccApplyImmediately = lens _mccApplyImmediately (\ s a -> s{_mccApplyImmediately = a});
 
--- | The Amazon Resource Name (ARN) of the Amazon SNS topic to which notifications
--- will be sent.
+-- | The Amazon Resource Name (ARN) of the Amazon SNS topic to which
+-- notifications will be sent.
 --
 -- The Amazon SNS topic owner must be same as the cache cluster owner.
-mccNotificationTopicArn :: Lens' ModifyCacheCluster (Maybe Text)
-mccNotificationTopicArn =
-    lens _mccNotificationTopicArn (\s a -> s { _mccNotificationTopicArn = a })
-
--- | The status of the Amazon SNS notification topic. Notifications are sent only
--- if the status is /active/.
---
--- Valid values: 'active' | 'inactive'
-mccNotificationTopicStatus :: Lens' ModifyCacheCluster (Maybe Text)
-mccNotificationTopicStatus =
-    lens _mccNotificationTopicStatus
-        (\s a -> s { _mccNotificationTopicStatus = a })
+mccNotificationTopicARN :: Lens' ModifyCacheCluster (Maybe Text)
+mccNotificationTopicARN = lens _mccNotificationTopicARN (\ s a -> s{_mccNotificationTopicARN = a});
 
--- | The number of cache nodes that the cache cluster should have. If the value
--- for 'NumCacheNodes' is greater than the sum of the number of current cache
--- nodes and the number of cache nodes pending creation (which may be zero),
--- then more nodes will be added. If the value is less than the number of
--- existing cache nodes, then nodes will be removed. If the value is equal to
--- the number of current cache nodes, then any pending add or remove requests
--- are canceled.
+-- | The number of cache nodes that the cache cluster should have. If the
+-- value for 'NumCacheNodes' is greater than the sum of the number of
+-- current cache nodes and the number of cache nodes pending creation
+-- (which may be zero), then more nodes will be added. If the value is less
+-- than the number of existing cache nodes, then nodes will be removed. If
+-- the value is equal to the number of current cache nodes, then any
+-- pending add or remove requests are canceled.
 --
 -- If you are removing cache nodes, you must use the 'CacheNodeIdsToRemove'
 -- parameter to provide the IDs of the specific cache nodes to remove.
@@ -305,116 +330,127 @@
 -- For clusters running Redis, this value must be 1. For clusters running
 -- Memcached, this value must be between 1 and 20.
 --
--- Note:
+-- __Note:__
 -- Adding or removing Memcached cache nodes can be applied immediately or
 -- as a pending action. See 'ApplyImmediately'.
--- A pending action to modify the
--- number of cache nodes in a cluster during its maintenance window, whether by
--- adding or removing nodes in accordance with the scale out architecture, is
--- not queued. The customer's latest request to add or remove nodes to the
--- cluster overrides any previous pending actions to modify the number of cache
--- nodes in the cluster. For example, a request to remove 2 nodes would override
--- a previous pending action to remove 3 nodes. Similarly, a request to add 2
--- nodes would override a previous pending action to remove 3 nodes and vice
--- versa. As Memcached cache nodes may now be provisioned in different
--- Availability Zones with flexible cache node placement, a request to add nodes
--- does not automatically override a previous pending action to add nodes. The
--- customer can modify the previous pending action to add more nodes or
--- explicitly cancel the pending request and retry the new request. To cancel
--- pending actions to modify the number of cache nodes in a cluster, use the 'ModifyCacheCluster' request and set /NumCacheNodes/ equal to the number of cache nodes currently
--- in the cache cluster.
+--  A pending action to modify the number of cache nodes in a cluster
+-- during its maintenance window, whether by adding or removing nodes in
+-- accordance with the scale out architecture, is not queued. The
+-- customer\'s latest request to add or remove nodes to the cluster
+-- overrides any previous pending actions to modify the number of cache
+-- nodes in the cluster. For example, a request to remove 2 nodes would
+-- override a previous pending action to remove 3 nodes. Similarly, a
+-- request to add 2 nodes would override a previous pending action to
+-- remove 3 nodes and vice versa. As Memcached cache nodes may now be
+-- provisioned in different Availability Zones with flexible cache node
+-- placement, a request to add nodes does not automatically override a
+-- previous pending action to add nodes. The customer can modify the
+-- previous pending action to add more nodes or explicitly cancel the
+-- pending request and retry the new request. To cancel pending actions to
+-- modify the number of cache nodes in a cluster, use the
+-- 'ModifyCacheCluster' request and set /NumCacheNodes/ equal to the number
+-- of cache nodes currently in the cache cluster.
 mccNumCacheNodes :: Lens' ModifyCacheCluster (Maybe Int)
-mccNumCacheNodes = lens _mccNumCacheNodes (\s a -> s { _mccNumCacheNodes = a })
-
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
---
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
-mccPreferredMaintenanceWindow :: Lens' ModifyCacheCluster (Maybe Text)
-mccPreferredMaintenanceWindow =
-    lens _mccPreferredMaintenanceWindow
-        (\s a -> s { _mccPreferredMaintenanceWindow = a })
+mccNumCacheNodes = lens _mccNumCacheNodes (\ s a -> s{_mccNumCacheNodes = a});
 
--- | Specifies the VPC Security Groups associated with the cache cluster.
+-- | A list of cache security group names to authorize on this cache cluster.
+-- This change is asynchronously applied as soon as possible.
 --
--- This parameter can be used only with clusters that are created in an Amazon
--- Virtual Private Cloud (VPC).
-mccSecurityGroupIds :: Lens' ModifyCacheCluster [Text]
-mccSecurityGroupIds =
-    lens _mccSecurityGroupIds (\s a -> s { _mccSecurityGroupIds = a })
-        . _List
-
--- | The number of days for which ElastiCache will retain automatic cache cluster
--- snapshots before deleting them. For example, if you set /SnapshotRetentionLimit/
--- to 5, then a snapshot that was taken today will be retained for 5 days
--- before being deleted.
+-- This parameter can be used only with clusters that are created outside
+-- of an Amazon Virtual Private Cloud (VPC).
 --
--- Important
--- If the value of SnapshotRetentionLimit is set to zero (0), backups
--- are turned off.
-mccSnapshotRetentionLimit :: Lens' ModifyCacheCluster (Maybe Int)
-mccSnapshotRetentionLimit =
-    lens _mccSnapshotRetentionLimit
-        (\s a -> s { _mccSnapshotRetentionLimit = a })
-
--- | The daily time range (in UTC) during which ElastiCache will begin taking a
--- daily snapshot of your cache cluster.
-mccSnapshotWindow :: Lens' ModifyCacheCluster (Maybe Text)
-mccSnapshotWindow =
-    lens _mccSnapshotWindow (\s a -> s { _mccSnapshotWindow = a })
+-- Constraints: Must contain no more than 255 alphanumeric characters. Must
+-- not be \"Default\".
+mccCacheSecurityGroupNames :: Lens' ModifyCacheCluster [Text]
+mccCacheSecurityGroupNames = lens _mccCacheSecurityGroupNames (\ s a -> s{_mccCacheSecurityGroupNames = a}) . _Default . _Coerce;
 
-newtype ModifyCacheClusterResponse = ModifyCacheClusterResponse
-    { _mccrCacheCluster :: Maybe CacheCluster
-    } deriving (Eq, Read, Show)
+-- | The cache cluster identifier. This value is stored as a lowercase
+-- string.
+mccCacheClusterId :: Lens' ModifyCacheCluster Text
+mccCacheClusterId = lens _mccCacheClusterId (\ s a -> s{_mccCacheClusterId = a});
 
--- | 'ModifyCacheClusterResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'mccrCacheCluster' @::@ 'Maybe' 'CacheCluster'
---
-modifyCacheClusterResponse :: ModifyCacheClusterResponse
-modifyCacheClusterResponse = ModifyCacheClusterResponse
-    { _mccrCacheCluster = Nothing
-    }
+instance AWSRequest ModifyCacheCluster where
+        type Sv ModifyCacheCluster = ElastiCache
+        type Rs ModifyCacheCluster =
+             ModifyCacheClusterResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "ModifyCacheClusterResult"
+              (\ s h x ->
+                 ModifyCacheClusterResponse' <$>
+                   (x .@? "CacheCluster") <*> (pure (fromEnum s)))
 
-mccrCacheCluster :: Lens' ModifyCacheClusterResponse (Maybe CacheCluster)
-mccrCacheCluster = lens _mccrCacheCluster (\s a -> s { _mccrCacheCluster = a })
+instance ToHeaders ModifyCacheCluster where
+        toHeaders = const mempty
 
 instance ToPath ModifyCacheCluster where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ModifyCacheCluster where
-    toQuery ModifyCacheCluster{..} = mconcat
-        [ "AZMode"                     =? _mccAZMode
-        , "ApplyImmediately"           =? _mccApplyImmediately
-        , "AutoMinorVersionUpgrade"    =? _mccAutoMinorVersionUpgrade
-        , "CacheClusterId"             =? _mccCacheClusterId
-        , "CacheNodeIdsToRemove"       =? _mccCacheNodeIdsToRemove
-        , "CacheParameterGroupName"    =? _mccCacheParameterGroupName
-        , "CacheSecurityGroupNames"    =? _mccCacheSecurityGroupNames
-        , "EngineVersion"              =? _mccEngineVersion
-        , "NewAvailabilityZones"       =? _mccNewAvailabilityZones
-        , "NotificationTopicArn"       =? _mccNotificationTopicArn
-        , "NotificationTopicStatus"    =? _mccNotificationTopicStatus
-        , "NumCacheNodes"              =? _mccNumCacheNodes
-        , "PreferredMaintenanceWindow" =? _mccPreferredMaintenanceWindow
-        , "SecurityGroupIds"           =? _mccSecurityGroupIds
-        , "SnapshotRetentionLimit"     =? _mccSnapshotRetentionLimit
-        , "SnapshotWindow"             =? _mccSnapshotWindow
-        ]
+        toQuery ModifyCacheCluster'{..}
+          = mconcat
+              ["Action" =: ("ModifyCacheCluster" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "EngineVersion" =: _mccEngineVersion,
+               "SecurityGroupIds" =:
+                 toQuery
+                   (toQueryList "SecurityGroupId" <$>
+                      _mccSecurityGroupIds),
+               "AutoMinorVersionUpgrade" =:
+                 _mccAutoMinorVersionUpgrade,
+               "CacheParameterGroupName" =:
+                 _mccCacheParameterGroupName,
+               "NewAvailabilityZones" =:
+                 toQuery
+                   (toQueryList "PreferredAvailabilityZone" <$>
+                      _mccNewAvailabilityZones),
+               "SnapshotWindow" =: _mccSnapshotWindow,
+               "PreferredMaintenanceWindow" =:
+                 _mccPreferredMaintenanceWindow,
+               "CacheNodeIdsToRemove" =:
+                 toQuery
+                   (toQueryList "CacheNodeId" <$>
+                      _mccCacheNodeIdsToRemove),
+               "SnapshotRetentionLimit" =:
+                 _mccSnapshotRetentionLimit,
+               "AZMode" =: _mccAZMode,
+               "NotificationTopicStatus" =:
+                 _mccNotificationTopicStatus,
+               "ApplyImmediately" =: _mccApplyImmediately,
+               "NotificationTopicArn" =: _mccNotificationTopicARN,
+               "NumCacheNodes" =: _mccNumCacheNodes,
+               "CacheSecurityGroupNames" =:
+                 toQuery
+                   (toQueryList "CacheSecurityGroupName" <$>
+                      _mccCacheSecurityGroupNames),
+               "CacheClusterId" =: _mccCacheClusterId]
 
-instance ToHeaders ModifyCacheCluster
+-- | /See:/ 'modifyCacheClusterResponse' smart constructor.
+data ModifyCacheClusterResponse = ModifyCacheClusterResponse'
+    { _mccrsCacheCluster :: !(Maybe CacheCluster)
+    , _mccrsStatus       :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ModifyCacheCluster where
-    type Sv ModifyCacheCluster = ElastiCache
-    type Rs ModifyCacheCluster = ModifyCacheClusterResponse
+-- | Creates a value of 'ModifyCacheClusterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mccrsCacheCluster'
+--
+-- * 'mccrsStatus'
+modifyCacheClusterResponse
+    :: Int -- ^ 'mccrsStatus'
+    -> ModifyCacheClusterResponse
+modifyCacheClusterResponse pStatus_ =
+    ModifyCacheClusterResponse'
+    { _mccrsCacheCluster = Nothing
+    , _mccrsStatus = pStatus_
+    }
 
-    request  = post "ModifyCacheCluster"
-    response = xmlResponse
+-- | Undocumented member.
+mccrsCacheCluster :: Lens' ModifyCacheClusterResponse (Maybe CacheCluster)
+mccrsCacheCluster = lens _mccrsCacheCluster (\ s a -> s{_mccrsCacheCluster = a});
 
-instance FromXML ModifyCacheClusterResponse where
-    parseXML = withElement "ModifyCacheClusterResult" $ \x -> ModifyCacheClusterResponse
-        <$> x .@? "CacheCluster"
+-- | The response status code.
+mccrsStatus :: Lens' ModifyCacheClusterResponse Int
+mccrsStatus = lens _mccrsStatus (\ s a -> s{_mccrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/ModifyCacheParameterGroup.hs b/gen/Network/AWS/ElastiCache/ModifyCacheParameterGroup.hs
--- a/gen/Network/AWS/ElastiCache/ModifyCacheParameterGroup.hs
+++ b/gen/Network/AWS/ElastiCache/ModifyCacheParameterGroup.hs
@@ -1,128 +1,107 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ModifyCacheParameterGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ModifyCacheParameterGroup/ action modifies the parameters of a cache
--- parameter group. You can modify up to 20 parameters in a single request by
--- submitting a list parameter name and value pairs.
+-- The /ModifyCacheParameterGroup/ action modifies the parameters of a
+-- cache parameter group. You can modify up to 20 parameters in a single
+-- request by submitting a list parameter name and value pairs.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheParameterGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheParameterGroup.html AWS API Reference> for ModifyCacheParameterGroup.
 module Network.AWS.ElastiCache.ModifyCacheParameterGroup
     (
-    -- * Request
-      ModifyCacheParameterGroup
-    -- ** Request constructor
-    , modifyCacheParameterGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      modifyCacheParameterGroup
+    , ModifyCacheParameterGroup
+    -- * Request Lenses
     , mcpgCacheParameterGroupName
     , mcpgParameterNameValues
 
-    -- * Response
-    , ModifyCacheParameterGroupResponse
-    -- ** Response constructor
-    , modifyCacheParameterGroupResponse
-    -- ** Response lenses
-    , mcpgrCacheParameterGroupName
+    -- * Destructuring the Response
+    , cacheParameterGroupNameMessage
+    , CacheParameterGroupNameMessage
+    -- * Response Lenses
+    , cpgnmCacheParameterGroupName
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data ModifyCacheParameterGroup = ModifyCacheParameterGroup
-    { _mcpgCacheParameterGroupName :: Text
-    , _mcpgParameterNameValues     :: List "member" ParameterNameValue
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ModifyCacheParameterGroup' constructor.
+-- | Represents the input of a /ModifyCacheParameterGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'modifyCacheParameterGroup' smart constructor.
+data ModifyCacheParameterGroup = ModifyCacheParameterGroup'
+    { _mcpgCacheParameterGroupName :: !Text
+    , _mcpgParameterNameValues     :: ![ParameterNameValue]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyCacheParameterGroup' with the minimum fields required to make a request.
 --
--- * 'mcpgCacheParameterGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'mcpgParameterNameValues' @::@ ['ParameterNameValue']
+-- * 'mcpgCacheParameterGroupName'
 --
-modifyCacheParameterGroup :: Text -- ^ 'mcpgCacheParameterGroupName'
-                          -> ModifyCacheParameterGroup
-modifyCacheParameterGroup p1 = ModifyCacheParameterGroup
-    { _mcpgCacheParameterGroupName = p1
-    , _mcpgParameterNameValues     = mempty
+-- * 'mcpgParameterNameValues'
+modifyCacheParameterGroup
+    :: Text -- ^ 'mcpgCacheParameterGroupName'
+    -> ModifyCacheParameterGroup
+modifyCacheParameterGroup pCacheParameterGroupName_ =
+    ModifyCacheParameterGroup'
+    { _mcpgCacheParameterGroupName = pCacheParameterGroupName_
+    , _mcpgParameterNameValues = mempty
     }
 
 -- | The name of the cache parameter group to modify.
 mcpgCacheParameterGroupName :: Lens' ModifyCacheParameterGroup Text
-mcpgCacheParameterGroupName =
-    lens _mcpgCacheParameterGroupName
-        (\s a -> s { _mcpgCacheParameterGroupName = a })
+mcpgCacheParameterGroupName = lens _mcpgCacheParameterGroupName (\ s a -> s{_mcpgCacheParameterGroupName = a});
 
--- | An array of parameter names and values for the parameter update. You must
--- supply at least one parameter name and value; subsequent arguments are
--- optional. A maximum of 20 parameters may be modified per request.
+-- | An array of parameter names and values for the parameter update. You
+-- must supply at least one parameter name and value; subsequent arguments
+-- are optional. A maximum of 20 parameters may be modified per request.
 mcpgParameterNameValues :: Lens' ModifyCacheParameterGroup [ParameterNameValue]
-mcpgParameterNameValues =
-    lens _mcpgParameterNameValues (\s a -> s { _mcpgParameterNameValues = a })
-        . _List
-
-newtype ModifyCacheParameterGroupResponse = ModifyCacheParameterGroupResponse
-    { _mcpgrCacheParameterGroupName :: Maybe Text
-    } deriving (Eq, Ord, Read, Show, Monoid)
+mcpgParameterNameValues = lens _mcpgParameterNameValues (\ s a -> s{_mcpgParameterNameValues = a}) . _Coerce;
 
--- | 'ModifyCacheParameterGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'mcpgrCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
-modifyCacheParameterGroupResponse :: ModifyCacheParameterGroupResponse
-modifyCacheParameterGroupResponse = ModifyCacheParameterGroupResponse
-    { _mcpgrCacheParameterGroupName = Nothing
-    }
+instance AWSRequest ModifyCacheParameterGroup where
+        type Sv ModifyCacheParameterGroup = ElastiCache
+        type Rs ModifyCacheParameterGroup =
+             CacheParameterGroupNameMessage
+        request = postQuery
+        response
+          = receiveXMLWrapper "ModifyCacheParameterGroupResult"
+              (\ s h x -> parseXML x)
 
--- | The name of the cache parameter group.
-mcpgrCacheParameterGroupName :: Lens' ModifyCacheParameterGroupResponse (Maybe Text)
-mcpgrCacheParameterGroupName =
-    lens _mcpgrCacheParameterGroupName
-        (\s a -> s { _mcpgrCacheParameterGroupName = a })
+instance ToHeaders ModifyCacheParameterGroup where
+        toHeaders = const mempty
 
 instance ToPath ModifyCacheParameterGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ModifyCacheParameterGroup where
-    toQuery ModifyCacheParameterGroup{..} = mconcat
-        [ "CacheParameterGroupName" =? _mcpgCacheParameterGroupName
-        , "ParameterNameValues"     =? _mcpgParameterNameValues
-        ]
-
-instance ToHeaders ModifyCacheParameterGroup
-
-instance AWSRequest ModifyCacheParameterGroup where
-    type Sv ModifyCacheParameterGroup = ElastiCache
-    type Rs ModifyCacheParameterGroup = ModifyCacheParameterGroupResponse
-
-    request  = post "ModifyCacheParameterGroup"
-    response = xmlResponse
-
-instance FromXML ModifyCacheParameterGroupResponse where
-    parseXML = withElement "ModifyCacheParameterGroupResult" $ \x -> ModifyCacheParameterGroupResponse
-        <$> x .@? "CacheParameterGroupName"
+        toQuery ModifyCacheParameterGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("ModifyCacheParameterGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheParameterGroupName" =:
+                 _mcpgCacheParameterGroupName,
+               "ParameterNameValues" =:
+                 toQueryList "ParameterNameValue"
+                   _mcpgParameterNameValues]
diff --git a/gen/Network/AWS/ElastiCache/ModifyCacheSubnetGroup.hs b/gen/Network/AWS/ElastiCache/ModifyCacheSubnetGroup.hs
--- a/gen/Network/AWS/ElastiCache/ModifyCacheSubnetGroup.hs
+++ b/gen/Network/AWS/ElastiCache/ModifyCacheSubnetGroup.hs
@@ -1,83 +1,86 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ModifyCacheSubnetGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ModifyCacheSubnetGroup/ action modifies an existing cache subnet group.
+-- The /ModifyCacheSubnetGroup/ action modifies an existing cache subnet
+-- group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheSubnetGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyCacheSubnetGroup.html AWS API Reference> for ModifyCacheSubnetGroup.
 module Network.AWS.ElastiCache.ModifyCacheSubnetGroup
     (
-    -- * Request
-      ModifyCacheSubnetGroup
-    -- ** Request constructor
-    , modifyCacheSubnetGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      modifyCacheSubnetGroup
+    , ModifyCacheSubnetGroup
+    -- * Request Lenses
+    , mcsgSubnetIds
     , mcsgCacheSubnetGroupDescription
     , mcsgCacheSubnetGroupName
-    , mcsgSubnetIds
 
-    -- * Response
-    , ModifyCacheSubnetGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , modifyCacheSubnetGroupResponse
-    -- ** Response lenses
-    , mcsgrCacheSubnetGroup
+    , ModifyCacheSubnetGroupResponse
+    -- * Response Lenses
+    , mcsgrsCacheSubnetGroup
+    , mcsgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data ModifyCacheSubnetGroup = ModifyCacheSubnetGroup
-    { _mcsgCacheSubnetGroupDescription :: Maybe Text
-    , _mcsgCacheSubnetGroupName        :: Text
-    , _mcsgSubnetIds                   :: List "member" Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ModifyCacheSubnetGroup' constructor.
+-- | Represents the input of a /ModifyCacheSubnetGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'modifyCacheSubnetGroup' smart constructor.
+data ModifyCacheSubnetGroup = ModifyCacheSubnetGroup'
+    { _mcsgSubnetIds                   :: !(Maybe [Text])
+    , _mcsgCacheSubnetGroupDescription :: !(Maybe Text)
+    , _mcsgCacheSubnetGroupName        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyCacheSubnetGroup' with the minimum fields required to make a request.
 --
--- * 'mcsgCacheSubnetGroupDescription' @::@ 'Maybe' 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'mcsgCacheSubnetGroupName' @::@ 'Text'
+-- * 'mcsgSubnetIds'
 --
--- * 'mcsgSubnetIds' @::@ ['Text']
+-- * 'mcsgCacheSubnetGroupDescription'
 --
-modifyCacheSubnetGroup :: Text -- ^ 'mcsgCacheSubnetGroupName'
-                       -> ModifyCacheSubnetGroup
-modifyCacheSubnetGroup p1 = ModifyCacheSubnetGroup
-    { _mcsgCacheSubnetGroupName        = p1
+-- * 'mcsgCacheSubnetGroupName'
+modifyCacheSubnetGroup
+    :: Text -- ^ 'mcsgCacheSubnetGroupName'
+    -> ModifyCacheSubnetGroup
+modifyCacheSubnetGroup pCacheSubnetGroupName_ =
+    ModifyCacheSubnetGroup'
+    { _mcsgSubnetIds = Nothing
     , _mcsgCacheSubnetGroupDescription = Nothing
-    , _mcsgSubnetIds                   = mempty
+    , _mcsgCacheSubnetGroupName = pCacheSubnetGroupName_
     }
 
+-- | The EC2 subnet IDs for the cache subnet group.
+mcsgSubnetIds :: Lens' ModifyCacheSubnetGroup [Text]
+mcsgSubnetIds = lens _mcsgSubnetIds (\ s a -> s{_mcsgSubnetIds = a}) . _Default . _Coerce;
+
 -- | A description for the cache subnet group.
 mcsgCacheSubnetGroupDescription :: Lens' ModifyCacheSubnetGroup (Maybe Text)
-mcsgCacheSubnetGroupDescription =
-    lens _mcsgCacheSubnetGroupDescription
-        (\s a -> s { _mcsgCacheSubnetGroupDescription = a })
+mcsgCacheSubnetGroupDescription = lens _mcsgCacheSubnetGroupDescription (\ s a -> s{_mcsgCacheSubnetGroupDescription = a});
 
 -- | The name for the cache subnet group. This value is stored as a lowercase
 -- string.
@@ -87,52 +90,64 @@
 --
 -- Example: 'mysubnetgroup'
 mcsgCacheSubnetGroupName :: Lens' ModifyCacheSubnetGroup Text
-mcsgCacheSubnetGroupName =
-    lens _mcsgCacheSubnetGroupName
-        (\s a -> s { _mcsgCacheSubnetGroupName = a })
-
--- | The EC2 subnet IDs for the cache subnet group.
-mcsgSubnetIds :: Lens' ModifyCacheSubnetGroup [Text]
-mcsgSubnetIds = lens _mcsgSubnetIds (\s a -> s { _mcsgSubnetIds = a }) . _List
-
-newtype ModifyCacheSubnetGroupResponse = ModifyCacheSubnetGroupResponse
-    { _mcsgrCacheSubnetGroup :: Maybe CacheSubnetGroup
-    } deriving (Eq, Read, Show)
+mcsgCacheSubnetGroupName = lens _mcsgCacheSubnetGroupName (\ s a -> s{_mcsgCacheSubnetGroupName = a});
 
--- | 'ModifyCacheSubnetGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'mcsgrCacheSubnetGroup' @::@ 'Maybe' 'CacheSubnetGroup'
---
-modifyCacheSubnetGroupResponse :: ModifyCacheSubnetGroupResponse
-modifyCacheSubnetGroupResponse = ModifyCacheSubnetGroupResponse
-    { _mcsgrCacheSubnetGroup = Nothing
-    }
+instance AWSRequest ModifyCacheSubnetGroup where
+        type Sv ModifyCacheSubnetGroup = ElastiCache
+        type Rs ModifyCacheSubnetGroup =
+             ModifyCacheSubnetGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "ModifyCacheSubnetGroupResult"
+              (\ s h x ->
+                 ModifyCacheSubnetGroupResponse' <$>
+                   (x .@? "CacheSubnetGroup") <*> (pure (fromEnum s)))
 
-mcsgrCacheSubnetGroup :: Lens' ModifyCacheSubnetGroupResponse (Maybe CacheSubnetGroup)
-mcsgrCacheSubnetGroup =
-    lens _mcsgrCacheSubnetGroup (\s a -> s { _mcsgrCacheSubnetGroup = a })
+instance ToHeaders ModifyCacheSubnetGroup where
+        toHeaders = const mempty
 
 instance ToPath ModifyCacheSubnetGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ModifyCacheSubnetGroup where
-    toQuery ModifyCacheSubnetGroup{..} = mconcat
-        [ "CacheSubnetGroupDescription" =? _mcsgCacheSubnetGroupDescription
-        , "CacheSubnetGroupName"        =? _mcsgCacheSubnetGroupName
-        , "SubnetIds"                   =? _mcsgSubnetIds
-        ]
+        toQuery ModifyCacheSubnetGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("ModifyCacheSubnetGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "SubnetIds" =:
+                 toQuery
+                   (toQueryList "SubnetIdentifier" <$> _mcsgSubnetIds),
+               "CacheSubnetGroupDescription" =:
+                 _mcsgCacheSubnetGroupDescription,
+               "CacheSubnetGroupName" =: _mcsgCacheSubnetGroupName]
 
-instance ToHeaders ModifyCacheSubnetGroup
+-- | /See:/ 'modifyCacheSubnetGroupResponse' smart constructor.
+data ModifyCacheSubnetGroupResponse = ModifyCacheSubnetGroupResponse'
+    { _mcsgrsCacheSubnetGroup :: !(Maybe CacheSubnetGroup)
+    , _mcsgrsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ModifyCacheSubnetGroup where
-    type Sv ModifyCacheSubnetGroup = ElastiCache
-    type Rs ModifyCacheSubnetGroup = ModifyCacheSubnetGroupResponse
+-- | Creates a value of 'ModifyCacheSubnetGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mcsgrsCacheSubnetGroup'
+--
+-- * 'mcsgrsStatus'
+modifyCacheSubnetGroupResponse
+    :: Int -- ^ 'mcsgrsStatus'
+    -> ModifyCacheSubnetGroupResponse
+modifyCacheSubnetGroupResponse pStatus_ =
+    ModifyCacheSubnetGroupResponse'
+    { _mcsgrsCacheSubnetGroup = Nothing
+    , _mcsgrsStatus = pStatus_
+    }
 
-    request  = post "ModifyCacheSubnetGroup"
-    response = xmlResponse
+-- | Undocumented member.
+mcsgrsCacheSubnetGroup :: Lens' ModifyCacheSubnetGroupResponse (Maybe CacheSubnetGroup)
+mcsgrsCacheSubnetGroup = lens _mcsgrsCacheSubnetGroup (\ s a -> s{_mcsgrsCacheSubnetGroup = a});
 
-instance FromXML ModifyCacheSubnetGroupResponse where
-    parseXML = withElement "ModifyCacheSubnetGroupResult" $ \x -> ModifyCacheSubnetGroupResponse
-        <$> x .@? "CacheSubnetGroup"
+-- | The response status code.
+mcsgrsStatus :: Lens' ModifyCacheSubnetGroupResponse Int
+mcsgrsStatus = lens _mcsgrsStatus (\ s a -> s{_mcsgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/ModifyReplicationGroup.hs b/gen/Network/AWS/ElastiCache/ModifyReplicationGroup.hs
--- a/gen/Network/AWS/ElastiCache/ModifyReplicationGroup.hs
+++ b/gen/Network/AWS/ElastiCache/ModifyReplicationGroup.hs
@@ -1,345 +1,359 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ModifyReplicationGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ModifyReplicationGroup/ action modifies the settings for a replication
--- group.
+-- The /ModifyReplicationGroup/ action modifies the settings for a
+-- replication group.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html AWS API Reference> for ModifyReplicationGroup.
 module Network.AWS.ElastiCache.ModifyReplicationGroup
     (
-    -- * Request
-      ModifyReplicationGroup
-    -- ** Request constructor
-    , modifyReplicationGroup
-    -- ** Request lenses
-    , mrgApplyImmediately
-    , mrgAutoMinorVersionUpgrade
+    -- * Creating a Request
+      modifyReplicationGroup
+    , ModifyReplicationGroup
+    -- * Request Lenses
     , mrgAutomaticFailoverEnabled
-    , mrgCacheParameterGroupName
-    , mrgCacheSecurityGroupNames
     , mrgEngineVersion
-    , mrgNotificationTopicArn
-    , mrgNotificationTopicStatus
-    , mrgPreferredMaintenanceWindow
-    , mrgPrimaryClusterId
-    , mrgReplicationGroupDescription
-    , mrgReplicationGroupId
+    , mrgSnapshottingClusterId
     , mrgSecurityGroupIds
-    , mrgSnapshotRetentionLimit
+    , mrgAutoMinorVersionUpgrade
+    , mrgReplicationGroupDescription
+    , mrgCacheParameterGroupName
     , mrgSnapshotWindow
-    , mrgSnapshottingClusterId
+    , mrgPrimaryClusterId
+    , mrgPreferredMaintenanceWindow
+    , mrgSnapshotRetentionLimit
+    , mrgNotificationTopicStatus
+    , mrgApplyImmediately
+    , mrgNotificationTopicARN
+    , mrgCacheSecurityGroupNames
+    , mrgReplicationGroupId
 
-    -- * Response
-    , ModifyReplicationGroupResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , modifyReplicationGroupResponse
-    -- ** Response lenses
-    , mrgrReplicationGroup
+    , ModifyReplicationGroupResponse
+    -- * Response Lenses
+    , mrgrsReplicationGroup
+    , mrgrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data ModifyReplicationGroup = ModifyReplicationGroup
-    { _mrgApplyImmediately            :: Maybe Bool
-    , _mrgAutoMinorVersionUpgrade     :: Maybe Bool
-    , _mrgAutomaticFailoverEnabled    :: Maybe Bool
-    , _mrgCacheParameterGroupName     :: Maybe Text
-    , _mrgCacheSecurityGroupNames     :: List "member" Text
-    , _mrgEngineVersion               :: Maybe Text
-    , _mrgNotificationTopicArn        :: Maybe Text
-    , _mrgNotificationTopicStatus     :: Maybe Text
-    , _mrgPreferredMaintenanceWindow  :: Maybe Text
-    , _mrgPrimaryClusterId            :: Maybe Text
-    , _mrgReplicationGroupDescription :: Maybe Text
-    , _mrgReplicationGroupId          :: Text
-    , _mrgSecurityGroupIds            :: List "member" Text
-    , _mrgSnapshotRetentionLimit      :: Maybe Int
-    , _mrgSnapshotWindow              :: Maybe Text
-    , _mrgSnapshottingClusterId       :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ModifyReplicationGroup' constructor.
+-- | Represents the input of a /ModifyReplicationGroups/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'modifyReplicationGroup' smart constructor.
+data ModifyReplicationGroup = ModifyReplicationGroup'
+    { _mrgAutomaticFailoverEnabled    :: !(Maybe Bool)
+    , _mrgEngineVersion               :: !(Maybe Text)
+    , _mrgSnapshottingClusterId       :: !(Maybe Text)
+    , _mrgSecurityGroupIds            :: !(Maybe [Text])
+    , _mrgAutoMinorVersionUpgrade     :: !(Maybe Bool)
+    , _mrgReplicationGroupDescription :: !(Maybe Text)
+    , _mrgCacheParameterGroupName     :: !(Maybe Text)
+    , _mrgSnapshotWindow              :: !(Maybe Text)
+    , _mrgPrimaryClusterId            :: !(Maybe Text)
+    , _mrgPreferredMaintenanceWindow  :: !(Maybe Text)
+    , _mrgSnapshotRetentionLimit      :: !(Maybe Int)
+    , _mrgNotificationTopicStatus     :: !(Maybe Text)
+    , _mrgApplyImmediately            :: !(Maybe Bool)
+    , _mrgNotificationTopicARN        :: !(Maybe Text)
+    , _mrgCacheSecurityGroupNames     :: !(Maybe [Text])
+    , _mrgReplicationGroupId          :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyReplicationGroup' with the minimum fields required to make a request.
 --
--- * 'mrgApplyImmediately' @::@ 'Maybe' 'Bool'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'mrgAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
+-- * 'mrgAutomaticFailoverEnabled'
 --
--- * 'mrgAutomaticFailoverEnabled' @::@ 'Maybe' 'Bool'
+-- * 'mrgEngineVersion'
 --
--- * 'mrgCacheParameterGroupName' @::@ 'Maybe' 'Text'
+-- * 'mrgSnapshottingClusterId'
 --
--- * 'mrgCacheSecurityGroupNames' @::@ ['Text']
+-- * 'mrgSecurityGroupIds'
 --
--- * 'mrgEngineVersion' @::@ 'Maybe' 'Text'
+-- * 'mrgAutoMinorVersionUpgrade'
 --
--- * 'mrgNotificationTopicArn' @::@ 'Maybe' 'Text'
+-- * 'mrgReplicationGroupDescription'
 --
--- * 'mrgNotificationTopicStatus' @::@ 'Maybe' 'Text'
+-- * 'mrgCacheParameterGroupName'
 --
--- * 'mrgPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
+-- * 'mrgSnapshotWindow'
 --
--- * 'mrgPrimaryClusterId' @::@ 'Maybe' 'Text'
+-- * 'mrgPrimaryClusterId'
 --
--- * 'mrgReplicationGroupDescription' @::@ 'Maybe' 'Text'
+-- * 'mrgPreferredMaintenanceWindow'
 --
--- * 'mrgReplicationGroupId' @::@ 'Text'
+-- * 'mrgSnapshotRetentionLimit'
 --
--- * 'mrgSecurityGroupIds' @::@ ['Text']
+-- * 'mrgNotificationTopicStatus'
 --
--- * 'mrgSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
+-- * 'mrgApplyImmediately'
 --
--- * 'mrgSnapshotWindow' @::@ 'Maybe' 'Text'
+-- * 'mrgNotificationTopicARN'
 --
--- * 'mrgSnapshottingClusterId' @::@ 'Maybe' 'Text'
+-- * 'mrgCacheSecurityGroupNames'
 --
-modifyReplicationGroup :: Text -- ^ 'mrgReplicationGroupId'
-                       -> ModifyReplicationGroup
-modifyReplicationGroup p1 = ModifyReplicationGroup
-    { _mrgReplicationGroupId          = p1
+-- * 'mrgReplicationGroupId'
+modifyReplicationGroup
+    :: Text -- ^ 'mrgReplicationGroupId'
+    -> ModifyReplicationGroup
+modifyReplicationGroup pReplicationGroupId_ =
+    ModifyReplicationGroup'
+    { _mrgAutomaticFailoverEnabled = Nothing
+    , _mrgEngineVersion = Nothing
+    , _mrgSnapshottingClusterId = Nothing
+    , _mrgSecurityGroupIds = Nothing
+    , _mrgAutoMinorVersionUpgrade = Nothing
     , _mrgReplicationGroupDescription = Nothing
-    , _mrgPrimaryClusterId            = Nothing
-    , _mrgSnapshottingClusterId       = Nothing
-    , _mrgAutomaticFailoverEnabled    = Nothing
-    , _mrgCacheSecurityGroupNames     = mempty
-    , _mrgSecurityGroupIds            = mempty
-    , _mrgPreferredMaintenanceWindow  = Nothing
-    , _mrgNotificationTopicArn        = Nothing
-    , _mrgCacheParameterGroupName     = Nothing
-    , _mrgNotificationTopicStatus     = Nothing
-    , _mrgApplyImmediately            = Nothing
-    , _mrgEngineVersion               = Nothing
-    , _mrgAutoMinorVersionUpgrade     = Nothing
-    , _mrgSnapshotRetentionLimit      = Nothing
-    , _mrgSnapshotWindow              = Nothing
+    , _mrgCacheParameterGroupName = Nothing
+    , _mrgSnapshotWindow = Nothing
+    , _mrgPrimaryClusterId = Nothing
+    , _mrgPreferredMaintenanceWindow = Nothing
+    , _mrgSnapshotRetentionLimit = Nothing
+    , _mrgNotificationTopicStatus = Nothing
+    , _mrgApplyImmediately = Nothing
+    , _mrgNotificationTopicARN = Nothing
+    , _mrgCacheSecurityGroupNames = Nothing
+    , _mrgReplicationGroupId = pReplicationGroupId_
     }
 
--- | If 'true', this parameter causes the modifications in this request and any
--- pending modifications to be applied, asynchronously and as soon as possible,
--- regardless of the /PreferredMaintenanceWindow/ setting for the replication
--- group.
---
--- If 'false', then changes to the nodes in the replication group are applied on
--- the next maintenance reboot, or the next failure reboot, whichever occurs
--- first.
---
--- Valid values: 'true' | 'false'
---
--- Default: 'false'
-mrgApplyImmediately :: Lens' ModifyReplicationGroup (Maybe Bool)
-mrgApplyImmediately =
-    lens _mrgApplyImmediately (\s a -> s { _mrgApplyImmediately = a })
-
--- | This parameter is currently disabled.
-mrgAutoMinorVersionUpgrade :: Lens' ModifyReplicationGroup (Maybe Bool)
-mrgAutoMinorVersionUpgrade =
-    lens _mrgAutoMinorVersionUpgrade
-        (\s a -> s { _mrgAutoMinorVersionUpgrade = a })
-
--- | Whether a read replica will be automatically promoted to read/write primary
--- if the existing primary encounters a failure.
+-- | Whether a read replica will be automatically promoted to read\/write
+-- primary if the existing primary encounters a failure.
 --
 -- Valid values: 'true' | 'false'
 --
 -- ElastiCache Multi-AZ replication groups are not supported on:
 --
--- Redis versions earlier than 2.8.6. T1 and T2 cache node types.
+-- -   Redis versions earlier than 2.8.6.
+-- -   T1 and T2 cache node types.
 mrgAutomaticFailoverEnabled :: Lens' ModifyReplicationGroup (Maybe Bool)
-mrgAutomaticFailoverEnabled =
-    lens _mrgAutomaticFailoverEnabled
-        (\s a -> s { _mrgAutomaticFailoverEnabled = a })
+mrgAutomaticFailoverEnabled = lens _mrgAutomaticFailoverEnabled (\ s a -> s{_mrgAutomaticFailoverEnabled = a});
 
--- | The name of the cache parameter group to apply to all of the clusters in this
--- replication group. This change is asynchronously applied as soon as possible
--- for parameters when the /ApplyImmediately/ parameter is specified as /true/ for
--- this request.
-mrgCacheParameterGroupName :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgCacheParameterGroupName =
-    lens _mrgCacheParameterGroupName
-        (\s a -> s { _mrgCacheParameterGroupName = a })
+-- | The upgraded version of the cache engine to be run on the cache clusters
+-- in the replication group.
+mrgEngineVersion :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgEngineVersion = lens _mrgEngineVersion (\ s a -> s{_mrgEngineVersion = a});
 
--- | A list of cache security group names to authorize for the clusters in this
--- replication group. This change is asynchronously applied as soon as possible.
+-- | The cache cluster ID that will be used as the daily snapshot source for
+-- the replication group.
+mrgSnapshottingClusterId :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgSnapshottingClusterId = lens _mrgSnapshottingClusterId (\ s a -> s{_mrgSnapshottingClusterId = a});
+
+-- | Specifies the VPC Security Groups associated with the cache clusters in
+-- the replication group.
 --
 -- This parameter can be used only with replication group containing cache
--- clusters running outside of an Amazon Virtual Private Cloud (VPC).
---
--- Constraints: Must contain no more than 255 alphanumeric characters. Must not
--- be "Default".
-mrgCacheSecurityGroupNames :: Lens' ModifyReplicationGroup [Text]
-mrgCacheSecurityGroupNames =
-    lens _mrgCacheSecurityGroupNames
-        (\s a -> s { _mrgCacheSecurityGroupNames = a })
-            . _List
+-- clusters running in an Amazon Virtual Private Cloud (VPC).
+mrgSecurityGroupIds :: Lens' ModifyReplicationGroup [Text]
+mrgSecurityGroupIds = lens _mrgSecurityGroupIds (\ s a -> s{_mrgSecurityGroupIds = a}) . _Default . _Coerce;
 
--- | The upgraded version of the cache engine to be run on the cache clusters in
--- the replication group.
-mrgEngineVersion :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgEngineVersion = lens _mrgEngineVersion (\s a -> s { _mrgEngineVersion = a })
+-- | This parameter is currently disabled.
+mrgAutoMinorVersionUpgrade :: Lens' ModifyReplicationGroup (Maybe Bool)
+mrgAutoMinorVersionUpgrade = lens _mrgAutoMinorVersionUpgrade (\ s a -> s{_mrgAutoMinorVersionUpgrade = a});
 
--- | The Amazon Resource Name (ARN) of the Amazon SNS topic to which notifications
--- will be sent.
---
--- The Amazon SNS topic owner must be same as the replication group owner.
-mrgNotificationTopicArn :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgNotificationTopicArn =
-    lens _mrgNotificationTopicArn (\s a -> s { _mrgNotificationTopicArn = a })
+-- | A description for the replication group. Maximum length is 255
+-- characters.
+mrgReplicationGroupDescription :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgReplicationGroupDescription = lens _mrgReplicationGroupDescription (\ s a -> s{_mrgReplicationGroupDescription = a});
 
--- | The status of the Amazon SNS notification topic for the replication group.
--- Notifications are sent only if the status is /active/.
---
--- Valid values: 'active' | 'inactive'
-mrgNotificationTopicStatus :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgNotificationTopicStatus =
-    lens _mrgNotificationTopicStatus
-        (\s a -> s { _mrgNotificationTopicStatus = a })
+-- | The name of the cache parameter group to apply to all of the clusters in
+-- this replication group. This change is asynchronously applied as soon as
+-- possible for parameters when the /ApplyImmediately/ parameter is
+-- specified as /true/ for this request.
+mrgCacheParameterGroupName :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgCacheParameterGroupName = lens _mrgCacheParameterGroupName (\ s a -> s{_mrgCacheParameterGroupName = a});
 
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
+-- | The daily time range (in UTC) during which ElastiCache will begin taking
+-- a daily snapshot of the node group specified by /SnapshottingClusterId/.
 --
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
-mrgPreferredMaintenanceWindow :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgPreferredMaintenanceWindow =
-    lens _mrgPreferredMaintenanceWindow
-        (\s a -> s { _mrgPreferredMaintenanceWindow = a })
+-- Example: '05:00-09:00'
+--
+-- If you do not specify this parameter, then ElastiCache will
+-- automatically choose an appropriate time range.
+mrgSnapshotWindow :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgSnapshotWindow = lens _mrgSnapshotWindow (\ s a -> s{_mrgSnapshotWindow = a});
 
--- | If this parameter is specified, ElastiCache will promote each of the cache
--- clusters in the specified replication group to the primary role. The nodes of
--- all other cache clusters in the replication group will be read replicas.
+-- | If this parameter is specified, ElastiCache will promote each of the
+-- cache clusters in the specified replication group to the primary role.
+-- The nodes of all other cache clusters in the replication group will be
+-- read replicas.
 mrgPrimaryClusterId :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgPrimaryClusterId =
-    lens _mrgPrimaryClusterId (\s a -> s { _mrgPrimaryClusterId = a })
-
--- | A description for the replication group. Maximum length is 255 characters.
-mrgReplicationGroupDescription :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgReplicationGroupDescription =
-    lens _mrgReplicationGroupDescription
-        (\s a -> s { _mrgReplicationGroupDescription = a })
-
--- | The identifier of the replication group to modify.
-mrgReplicationGroupId :: Lens' ModifyReplicationGroup Text
-mrgReplicationGroupId =
-    lens _mrgReplicationGroupId (\s a -> s { _mrgReplicationGroupId = a })
+mrgPrimaryClusterId = lens _mrgPrimaryClusterId (\ s a -> s{_mrgPrimaryClusterId = a});
 
--- | Specifies the VPC Security Groups associated with the cache clusters in the
--- replication group.
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
 --
--- This parameter can be used only with replication group containing cache
--- clusters running in an Amazon Virtual Private Cloud (VPC).
-mrgSecurityGroupIds :: Lens' ModifyReplicationGroup [Text]
-mrgSecurityGroupIds =
-    lens _mrgSecurityGroupIds (\s a -> s { _mrgSecurityGroupIds = a })
-        . _List
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
+--
+-- Example: 'sun:05:00-sun:09:00'
+mrgPreferredMaintenanceWindow :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgPreferredMaintenanceWindow = lens _mrgPreferredMaintenanceWindow (\ s a -> s{_mrgPreferredMaintenanceWindow = a});
 
--- | The number of days for which ElastiCache will retain automatic node group
--- snapshots before deleting them. For example, if you set /SnapshotRetentionLimit/
--- to 5, then a snapshot that was taken today will be retained for 5 days
--- before being deleted.
+-- | The number of days for which ElastiCache will retain automatic node
+-- group snapshots before deleting them. For example, if you set
+-- /SnapshotRetentionLimit/ to 5, then a snapshot that was taken today will
+-- be retained for 5 days before being deleted.
 --
--- Important
--- If the value of SnapshotRetentionLimit is set to zero (0), backups
--- are turned off.
+-- __Important__
+-- If the value of SnapshotRetentionLimit is set to zero (0), backups are
+-- turned off.
 mrgSnapshotRetentionLimit :: Lens' ModifyReplicationGroup (Maybe Int)
-mrgSnapshotRetentionLimit =
-    lens _mrgSnapshotRetentionLimit
-        (\s a -> s { _mrgSnapshotRetentionLimit = a })
+mrgSnapshotRetentionLimit = lens _mrgSnapshotRetentionLimit (\ s a -> s{_mrgSnapshotRetentionLimit = a});
 
--- | The daily time range (in UTC) during which ElastiCache will begin taking a
--- daily snapshot of the node group specified by /SnapshottingClusterId/.
---
--- Example: '05:00-09:00'
+-- | The status of the Amazon SNS notification topic for the replication
+-- group. Notifications are sent only if the status is /active/.
 --
--- If you do not specify this parameter, then ElastiCache will automatically
--- choose an appropriate time range.
-mrgSnapshotWindow :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgSnapshotWindow =
-    lens _mrgSnapshotWindow (\s a -> s { _mrgSnapshotWindow = a })
+-- Valid values: 'active' | 'inactive'
+mrgNotificationTopicStatus :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgNotificationTopicStatus = lens _mrgNotificationTopicStatus (\ s a -> s{_mrgNotificationTopicStatus = a});
 
--- | The cache cluster ID that will be used as the daily snapshot source for the
+-- | If 'true', this parameter causes the modifications in this request and
+-- any pending modifications to be applied, asynchronously and as soon as
+-- possible, regardless of the /PreferredMaintenanceWindow/ setting for the
 -- replication group.
-mrgSnapshottingClusterId :: Lens' ModifyReplicationGroup (Maybe Text)
-mrgSnapshottingClusterId =
-    lens _mrgSnapshottingClusterId
-        (\s a -> s { _mrgSnapshottingClusterId = a })
-
-newtype ModifyReplicationGroupResponse = ModifyReplicationGroupResponse
-    { _mrgrReplicationGroup :: Maybe ReplicationGroup
-    } deriving (Eq, Read, Show)
+--
+-- If 'false', then changes to the nodes in the replication group are
+-- applied on the next maintenance reboot, or the next failure reboot,
+-- whichever occurs first.
+--
+-- Valid values: 'true' | 'false'
+--
+-- Default: 'false'
+mrgApplyImmediately :: Lens' ModifyReplicationGroup (Maybe Bool)
+mrgApplyImmediately = lens _mrgApplyImmediately (\ s a -> s{_mrgApplyImmediately = a});
 
--- | 'ModifyReplicationGroupResponse' constructor.
+-- | The Amazon Resource Name (ARN) of the Amazon SNS topic to which
+-- notifications will be sent.
 --
--- The fields accessible through corresponding lenses are:
+-- The Amazon SNS topic owner must be same as the replication group owner.
+mrgNotificationTopicARN :: Lens' ModifyReplicationGroup (Maybe Text)
+mrgNotificationTopicARN = lens _mrgNotificationTopicARN (\ s a -> s{_mrgNotificationTopicARN = a});
+
+-- | A list of cache security group names to authorize for the clusters in
+-- this replication group. This change is asynchronously applied as soon as
+-- possible.
 --
--- * 'mrgrReplicationGroup' @::@ 'Maybe' 'ReplicationGroup'
+-- This parameter can be used only with replication group containing cache
+-- clusters running outside of an Amazon Virtual Private Cloud (VPC).
 --
-modifyReplicationGroupResponse :: ModifyReplicationGroupResponse
-modifyReplicationGroupResponse = ModifyReplicationGroupResponse
-    { _mrgrReplicationGroup = Nothing
-    }
+-- Constraints: Must contain no more than 255 alphanumeric characters. Must
+-- not be \"Default\".
+mrgCacheSecurityGroupNames :: Lens' ModifyReplicationGroup [Text]
+mrgCacheSecurityGroupNames = lens _mrgCacheSecurityGroupNames (\ s a -> s{_mrgCacheSecurityGroupNames = a}) . _Default . _Coerce;
 
-mrgrReplicationGroup :: Lens' ModifyReplicationGroupResponse (Maybe ReplicationGroup)
-mrgrReplicationGroup =
-    lens _mrgrReplicationGroup (\s a -> s { _mrgrReplicationGroup = a })
+-- | The identifier of the replication group to modify.
+mrgReplicationGroupId :: Lens' ModifyReplicationGroup Text
+mrgReplicationGroupId = lens _mrgReplicationGroupId (\ s a -> s{_mrgReplicationGroupId = a});
 
+instance AWSRequest ModifyReplicationGroup where
+        type Sv ModifyReplicationGroup = ElastiCache
+        type Rs ModifyReplicationGroup =
+             ModifyReplicationGroupResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "ModifyReplicationGroupResult"
+              (\ s h x ->
+                 ModifyReplicationGroupResponse' <$>
+                   (x .@? "ReplicationGroup") <*> (pure (fromEnum s)))
+
+instance ToHeaders ModifyReplicationGroup where
+        toHeaders = const mempty
+
 instance ToPath ModifyReplicationGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ModifyReplicationGroup where
-    toQuery ModifyReplicationGroup{..} = mconcat
-        [ "ApplyImmediately"            =? _mrgApplyImmediately
-        , "AutoMinorVersionUpgrade"     =? _mrgAutoMinorVersionUpgrade
-        , "AutomaticFailoverEnabled"    =? _mrgAutomaticFailoverEnabled
-        , "CacheParameterGroupName"     =? _mrgCacheParameterGroupName
-        , "CacheSecurityGroupNames"     =? _mrgCacheSecurityGroupNames
-        , "EngineVersion"               =? _mrgEngineVersion
-        , "NotificationTopicArn"        =? _mrgNotificationTopicArn
-        , "NotificationTopicStatus"     =? _mrgNotificationTopicStatus
-        , "PreferredMaintenanceWindow"  =? _mrgPreferredMaintenanceWindow
-        , "PrimaryClusterId"            =? _mrgPrimaryClusterId
-        , "ReplicationGroupDescription" =? _mrgReplicationGroupDescription
-        , "ReplicationGroupId"          =? _mrgReplicationGroupId
-        , "SecurityGroupIds"            =? _mrgSecurityGroupIds
-        , "SnapshotRetentionLimit"      =? _mrgSnapshotRetentionLimit
-        , "SnapshotWindow"              =? _mrgSnapshotWindow
-        , "SnapshottingClusterId"       =? _mrgSnapshottingClusterId
-        ]
+        toQuery ModifyReplicationGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("ModifyReplicationGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "AutomaticFailoverEnabled" =:
+                 _mrgAutomaticFailoverEnabled,
+               "EngineVersion" =: _mrgEngineVersion,
+               "SnapshottingClusterId" =: _mrgSnapshottingClusterId,
+               "SecurityGroupIds" =:
+                 toQuery
+                   (toQueryList "SecurityGroupId" <$>
+                      _mrgSecurityGroupIds),
+               "AutoMinorVersionUpgrade" =:
+                 _mrgAutoMinorVersionUpgrade,
+               "ReplicationGroupDescription" =:
+                 _mrgReplicationGroupDescription,
+               "CacheParameterGroupName" =:
+                 _mrgCacheParameterGroupName,
+               "SnapshotWindow" =: _mrgSnapshotWindow,
+               "PrimaryClusterId" =: _mrgPrimaryClusterId,
+               "PreferredMaintenanceWindow" =:
+                 _mrgPreferredMaintenanceWindow,
+               "SnapshotRetentionLimit" =:
+                 _mrgSnapshotRetentionLimit,
+               "NotificationTopicStatus" =:
+                 _mrgNotificationTopicStatus,
+               "ApplyImmediately" =: _mrgApplyImmediately,
+               "NotificationTopicArn" =: _mrgNotificationTopicARN,
+               "CacheSecurityGroupNames" =:
+                 toQuery
+                   (toQueryList "CacheSecurityGroupName" <$>
+                      _mrgCacheSecurityGroupNames),
+               "ReplicationGroupId" =: _mrgReplicationGroupId]
 
-instance ToHeaders ModifyReplicationGroup
+-- | /See:/ 'modifyReplicationGroupResponse' smart constructor.
+data ModifyReplicationGroupResponse = ModifyReplicationGroupResponse'
+    { _mrgrsReplicationGroup :: !(Maybe ReplicationGroup)
+    , _mrgrsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ModifyReplicationGroup where
-    type Sv ModifyReplicationGroup = ElastiCache
-    type Rs ModifyReplicationGroup = ModifyReplicationGroupResponse
+-- | Creates a value of 'ModifyReplicationGroupResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'mrgrsReplicationGroup'
+--
+-- * 'mrgrsStatus'
+modifyReplicationGroupResponse
+    :: Int -- ^ 'mrgrsStatus'
+    -> ModifyReplicationGroupResponse
+modifyReplicationGroupResponse pStatus_ =
+    ModifyReplicationGroupResponse'
+    { _mrgrsReplicationGroup = Nothing
+    , _mrgrsStatus = pStatus_
+    }
 
-    request  = post "ModifyReplicationGroup"
-    response = xmlResponse
+-- | Undocumented member.
+mrgrsReplicationGroup :: Lens' ModifyReplicationGroupResponse (Maybe ReplicationGroup)
+mrgrsReplicationGroup = lens _mrgrsReplicationGroup (\ s a -> s{_mrgrsReplicationGroup = a});
 
-instance FromXML ModifyReplicationGroupResponse where
-    parseXML = withElement "ModifyReplicationGroupResult" $ \x -> ModifyReplicationGroupResponse
-        <$> x .@? "ReplicationGroup"
+-- | The response status code.
+mrgrsStatus :: Lens' ModifyReplicationGroupResponse Int
+mrgrsStatus = lens _mrgrsStatus (\ s a -> s{_mrgrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/PurchaseReservedCacheNodesOffering.hs b/gen/Network/AWS/ElastiCache/PurchaseReservedCacheNodesOffering.hs
--- a/gen/Network/AWS/ElastiCache/PurchaseReservedCacheNodesOffering.hs
+++ b/gen/Network/AWS/ElastiCache/PurchaseReservedCacheNodesOffering.hs
@@ -1,140 +1,157 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /PurchaseReservedCacheNodesOffering/ action allows you to purchase a
+-- The /PurchaseReservedCacheNodesOffering/ action allows you to purchase a
 -- reserved cache node offering.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_PurchaseReservedCacheNodesOffering.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_PurchaseReservedCacheNodesOffering.html AWS API Reference> for PurchaseReservedCacheNodesOffering.
 module Network.AWS.ElastiCache.PurchaseReservedCacheNodesOffering
     (
-    -- * Request
-      PurchaseReservedCacheNodesOffering
-    -- ** Request constructor
-    , purchaseReservedCacheNodesOffering
-    -- ** Request lenses
+    -- * Creating a Request
+      purchaseReservedCacheNodesOffering
+    , PurchaseReservedCacheNodesOffering
+    -- * Request Lenses
     , prcnoCacheNodeCount
     , prcnoReservedCacheNodeId
     , prcnoReservedCacheNodesOfferingId
 
-    -- * Response
-    , PurchaseReservedCacheNodesOfferingResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , purchaseReservedCacheNodesOfferingResponse
-    -- ** Response lenses
-    , prcnorReservedCacheNode
+    , PurchaseReservedCacheNodesOfferingResponse
+    -- * Response Lenses
+    , prcnorsReservedCacheNode
+    , prcnorsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data PurchaseReservedCacheNodesOffering = PurchaseReservedCacheNodesOffering
-    { _prcnoCacheNodeCount               :: Maybe Int
-    , _prcnoReservedCacheNodeId          :: Maybe Text
-    , _prcnoReservedCacheNodesOfferingId :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'PurchaseReservedCacheNodesOffering' constructor.
+-- | Represents the input of a /PurchaseReservedCacheNodesOffering/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'purchaseReservedCacheNodesOffering' smart constructor.
+data PurchaseReservedCacheNodesOffering = PurchaseReservedCacheNodesOffering'
+    { _prcnoCacheNodeCount               :: !(Maybe Int)
+    , _prcnoReservedCacheNodeId          :: !(Maybe Text)
+    , _prcnoReservedCacheNodesOfferingId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PurchaseReservedCacheNodesOffering' with the minimum fields required to make a request.
 --
--- * 'prcnoCacheNodeCount' @::@ 'Maybe' 'Int'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'prcnoReservedCacheNodeId' @::@ 'Maybe' 'Text'
+-- * 'prcnoCacheNodeCount'
 --
--- * 'prcnoReservedCacheNodesOfferingId' @::@ 'Text'
+-- * 'prcnoReservedCacheNodeId'
 --
-purchaseReservedCacheNodesOffering :: Text -- ^ 'prcnoReservedCacheNodesOfferingId'
-                                   -> PurchaseReservedCacheNodesOffering
-purchaseReservedCacheNodesOffering p1 = PurchaseReservedCacheNodesOffering
-    { _prcnoReservedCacheNodesOfferingId = p1
-    , _prcnoReservedCacheNodeId          = Nothing
-    , _prcnoCacheNodeCount               = Nothing
+-- * 'prcnoReservedCacheNodesOfferingId'
+purchaseReservedCacheNodesOffering
+    :: Text -- ^ 'prcnoReservedCacheNodesOfferingId'
+    -> PurchaseReservedCacheNodesOffering
+purchaseReservedCacheNodesOffering pReservedCacheNodesOfferingId_ =
+    PurchaseReservedCacheNodesOffering'
+    { _prcnoCacheNodeCount = Nothing
+    , _prcnoReservedCacheNodeId = Nothing
+    , _prcnoReservedCacheNodesOfferingId = pReservedCacheNodesOfferingId_
     }
 
 -- | The number of cache node instances to reserve.
 --
 -- Default: '1'
 prcnoCacheNodeCount :: Lens' PurchaseReservedCacheNodesOffering (Maybe Int)
-prcnoCacheNodeCount =
-    lens _prcnoCacheNodeCount (\s a -> s { _prcnoCacheNodeCount = a })
+prcnoCacheNodeCount = lens _prcnoCacheNodeCount (\ s a -> s{_prcnoCacheNodeCount = a});
 
 -- | A customer-specified identifier to track this reservation.
 --
 -- Example: myreservationID
 prcnoReservedCacheNodeId :: Lens' PurchaseReservedCacheNodesOffering (Maybe Text)
-prcnoReservedCacheNodeId =
-    lens _prcnoReservedCacheNodeId
-        (\s a -> s { _prcnoReservedCacheNodeId = a })
+prcnoReservedCacheNodeId = lens _prcnoReservedCacheNodeId (\ s a -> s{_prcnoReservedCacheNodeId = a});
 
 -- | The ID of the reserved cache node offering to purchase.
 --
 -- Example: 438012d3-4052-4cc7-b2e3-8d3372e0e706
 prcnoReservedCacheNodesOfferingId :: Lens' PurchaseReservedCacheNodesOffering Text
-prcnoReservedCacheNodesOfferingId =
-    lens _prcnoReservedCacheNodesOfferingId
-        (\s a -> s { _prcnoReservedCacheNodesOfferingId = a })
-
-newtype PurchaseReservedCacheNodesOfferingResponse = PurchaseReservedCacheNodesOfferingResponse
-    { _prcnorReservedCacheNode :: Maybe ReservedCacheNode
-    } deriving (Eq, Read, Show)
+prcnoReservedCacheNodesOfferingId = lens _prcnoReservedCacheNodesOfferingId (\ s a -> s{_prcnoReservedCacheNodesOfferingId = a});
 
--- | 'PurchaseReservedCacheNodesOfferingResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'prcnorReservedCacheNode' @::@ 'Maybe' 'ReservedCacheNode'
---
-purchaseReservedCacheNodesOfferingResponse :: PurchaseReservedCacheNodesOfferingResponse
-purchaseReservedCacheNodesOfferingResponse = PurchaseReservedCacheNodesOfferingResponse
-    { _prcnorReservedCacheNode = Nothing
-    }
+instance AWSRequest
+         PurchaseReservedCacheNodesOffering where
+        type Sv PurchaseReservedCacheNodesOffering =
+             ElastiCache
+        type Rs PurchaseReservedCacheNodesOffering =
+             PurchaseReservedCacheNodesOfferingResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "PurchaseReservedCacheNodesOfferingResult"
+              (\ s h x ->
+                 PurchaseReservedCacheNodesOfferingResponse' <$>
+                   (x .@? "ReservedCacheNode") <*> (pure (fromEnum s)))
 
-prcnorReservedCacheNode :: Lens' PurchaseReservedCacheNodesOfferingResponse (Maybe ReservedCacheNode)
-prcnorReservedCacheNode =
-    lens _prcnorReservedCacheNode (\s a -> s { _prcnorReservedCacheNode = a })
+instance ToHeaders PurchaseReservedCacheNodesOffering
+         where
+        toHeaders = const mempty
 
-instance ToPath PurchaseReservedCacheNodesOffering where
-    toPath = const "/"
+instance ToPath PurchaseReservedCacheNodesOffering
+         where
+        toPath = const "/"
 
-instance ToQuery PurchaseReservedCacheNodesOffering where
-    toQuery PurchaseReservedCacheNodesOffering{..} = mconcat
-        [ "CacheNodeCount"               =? _prcnoCacheNodeCount
-        , "ReservedCacheNodeId"          =? _prcnoReservedCacheNodeId
-        , "ReservedCacheNodesOfferingId" =? _prcnoReservedCacheNodesOfferingId
-        ]
+instance ToQuery PurchaseReservedCacheNodesOffering
+         where
+        toQuery PurchaseReservedCacheNodesOffering'{..}
+          = mconcat
+              ["Action" =:
+                 ("PurchaseReservedCacheNodesOffering" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheNodeCount" =: _prcnoCacheNodeCount,
+               "ReservedCacheNodeId" =: _prcnoReservedCacheNodeId,
+               "ReservedCacheNodesOfferingId" =:
+                 _prcnoReservedCacheNodesOfferingId]
 
-instance ToHeaders PurchaseReservedCacheNodesOffering
+-- | /See:/ 'purchaseReservedCacheNodesOfferingResponse' smart constructor.
+data PurchaseReservedCacheNodesOfferingResponse = PurchaseReservedCacheNodesOfferingResponse'
+    { _prcnorsReservedCacheNode :: !(Maybe ReservedCacheNode)
+    , _prcnorsStatus            :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest PurchaseReservedCacheNodesOffering where
-    type Sv PurchaseReservedCacheNodesOffering = ElastiCache
-    type Rs PurchaseReservedCacheNodesOffering = PurchaseReservedCacheNodesOfferingResponse
+-- | Creates a value of 'PurchaseReservedCacheNodesOfferingResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'prcnorsReservedCacheNode'
+--
+-- * 'prcnorsStatus'
+purchaseReservedCacheNodesOfferingResponse
+    :: Int -- ^ 'prcnorsStatus'
+    -> PurchaseReservedCacheNodesOfferingResponse
+purchaseReservedCacheNodesOfferingResponse pStatus_ =
+    PurchaseReservedCacheNodesOfferingResponse'
+    { _prcnorsReservedCacheNode = Nothing
+    , _prcnorsStatus = pStatus_
+    }
 
-    request  = post "PurchaseReservedCacheNodesOffering"
-    response = xmlResponse
+-- | Undocumented member.
+prcnorsReservedCacheNode :: Lens' PurchaseReservedCacheNodesOfferingResponse (Maybe ReservedCacheNode)
+prcnorsReservedCacheNode = lens _prcnorsReservedCacheNode (\ s a -> s{_prcnorsReservedCacheNode = a});
 
-instance FromXML PurchaseReservedCacheNodesOfferingResponse where
-    parseXML = withElement "PurchaseReservedCacheNodesOfferingResult" $ \x -> PurchaseReservedCacheNodesOfferingResponse
-        <$> x .@? "ReservedCacheNode"
+-- | The response status code.
+prcnorsStatus :: Lens' PurchaseReservedCacheNodesOfferingResponse Int
+prcnorsStatus = lens _prcnorsStatus (\ s a -> s{_prcnorsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/RebootCacheCluster.hs b/gen/Network/AWS/ElastiCache/RebootCacheCluster.hs
--- a/gen/Network/AWS/ElastiCache/RebootCacheCluster.hs
+++ b/gen/Network/AWS/ElastiCache/RebootCacheCluster.hs
@@ -1,131 +1,146 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.RebootCacheCluster
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /RebootCacheCluster/ action reboots some, or all, of the cache nodes within
--- a provisioned cache cluster. This API will apply any modified cache parameter
--- groups to the cache cluster. The reboot action takes place as soon as
--- possible, and results in a momentary outage to the cache cluster. During the
--- reboot, the cache cluster status is set to REBOOTING.
+-- The /RebootCacheCluster/ action reboots some, or all, of the cache nodes
+-- within a provisioned cache cluster. This API will apply any modified
+-- cache parameter groups to the cache cluster. The reboot action takes
+-- place as soon as possible, and results in a momentary outage to the
+-- cache cluster. During the reboot, the cache cluster status is set to
+-- REBOOTING.
 --
 -- The reboot causes the contents of the cache (for each cache node being
 -- rebooted) to be lost.
 --
 -- When the reboot is complete, a cache cluster event is created.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RebootCacheCluster.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RebootCacheCluster.html AWS API Reference> for RebootCacheCluster.
 module Network.AWS.ElastiCache.RebootCacheCluster
     (
-    -- * Request
-      RebootCacheCluster
-    -- ** Request constructor
-    , rebootCacheCluster
-    -- ** Request lenses
+    -- * Creating a Request
+      rebootCacheCluster
+    , RebootCacheCluster
+    -- * Request Lenses
     , rccCacheClusterId
     , rccCacheNodeIdsToReboot
 
-    -- * Response
-    , RebootCacheClusterResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , rebootCacheClusterResponse
-    -- ** Response lenses
-    , rccrCacheCluster
+    , RebootCacheClusterResponse
+    -- * Response Lenses
+    , rccrsCacheCluster
+    , rccrsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data RebootCacheCluster = RebootCacheCluster
-    { _rccCacheClusterId       :: Text
-    , _rccCacheNodeIdsToReboot :: List "member" Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'RebootCacheCluster' constructor.
+-- | Represents the input of a /RebootCacheCluster/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'rebootCacheCluster' smart constructor.
+data RebootCacheCluster = RebootCacheCluster'
+    { _rccCacheClusterId       :: !Text
+    , _rccCacheNodeIdsToReboot :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RebootCacheCluster' with the minimum fields required to make a request.
 --
--- * 'rccCacheClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rccCacheNodeIdsToReboot' @::@ ['Text']
+-- * 'rccCacheClusterId'
 --
-rebootCacheCluster :: Text -- ^ 'rccCacheClusterId'
-                   -> RebootCacheCluster
-rebootCacheCluster p1 = RebootCacheCluster
-    { _rccCacheClusterId       = p1
+-- * 'rccCacheNodeIdsToReboot'
+rebootCacheCluster
+    :: Text -- ^ 'rccCacheClusterId'
+    -> RebootCacheCluster
+rebootCacheCluster pCacheClusterId_ =
+    RebootCacheCluster'
+    { _rccCacheClusterId = pCacheClusterId_
     , _rccCacheNodeIdsToReboot = mempty
     }
 
--- | The cache cluster identifier. This parameter is stored as a lowercase string.
+-- | The cache cluster identifier. This parameter is stored as a lowercase
+-- string.
 rccCacheClusterId :: Lens' RebootCacheCluster Text
-rccCacheClusterId =
-    lens _rccCacheClusterId (\s a -> s { _rccCacheClusterId = a })
+rccCacheClusterId = lens _rccCacheClusterId (\ s a -> s{_rccCacheClusterId = a});
 
--- | A list of cache node IDs to reboot. A node ID is a numeric identifier (0001,
--- 0002, etc.). To reboot an entire cache cluster, specify all of the cache node
--- IDs.
+-- | A list of cache node IDs to reboot. A node ID is a numeric identifier
+-- (0001, 0002, etc.). To reboot an entire cache cluster, specify all of
+-- the cache node IDs.
 rccCacheNodeIdsToReboot :: Lens' RebootCacheCluster [Text]
-rccCacheNodeIdsToReboot =
-    lens _rccCacheNodeIdsToReboot (\s a -> s { _rccCacheNodeIdsToReboot = a })
-        . _List
-
-newtype RebootCacheClusterResponse = RebootCacheClusterResponse
-    { _rccrCacheCluster :: Maybe CacheCluster
-    } deriving (Eq, Read, Show)
+rccCacheNodeIdsToReboot = lens _rccCacheNodeIdsToReboot (\ s a -> s{_rccCacheNodeIdsToReboot = a}) . _Coerce;
 
--- | 'RebootCacheClusterResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rccrCacheCluster' @::@ 'Maybe' 'CacheCluster'
---
-rebootCacheClusterResponse :: RebootCacheClusterResponse
-rebootCacheClusterResponse = RebootCacheClusterResponse
-    { _rccrCacheCluster = Nothing
-    }
+instance AWSRequest RebootCacheCluster where
+        type Sv RebootCacheCluster = ElastiCache
+        type Rs RebootCacheCluster =
+             RebootCacheClusterResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper "RebootCacheClusterResult"
+              (\ s h x ->
+                 RebootCacheClusterResponse' <$>
+                   (x .@? "CacheCluster") <*> (pure (fromEnum s)))
 
-rccrCacheCluster :: Lens' RebootCacheClusterResponse (Maybe CacheCluster)
-rccrCacheCluster = lens _rccrCacheCluster (\s a -> s { _rccrCacheCluster = a })
+instance ToHeaders RebootCacheCluster where
+        toHeaders = const mempty
 
 instance ToPath RebootCacheCluster where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery RebootCacheCluster where
-    toQuery RebootCacheCluster{..} = mconcat
-        [ "CacheClusterId"       =? _rccCacheClusterId
-        , "CacheNodeIdsToReboot" =? _rccCacheNodeIdsToReboot
-        ]
+        toQuery RebootCacheCluster'{..}
+          = mconcat
+              ["Action" =: ("RebootCacheCluster" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheClusterId" =: _rccCacheClusterId,
+               "CacheNodeIdsToReboot" =:
+                 toQueryList "CacheNodeId" _rccCacheNodeIdsToReboot]
 
-instance ToHeaders RebootCacheCluster
+-- | /See:/ 'rebootCacheClusterResponse' smart constructor.
+data RebootCacheClusterResponse = RebootCacheClusterResponse'
+    { _rccrsCacheCluster :: !(Maybe CacheCluster)
+    , _rccrsStatus       :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest RebootCacheCluster where
-    type Sv RebootCacheCluster = ElastiCache
-    type Rs RebootCacheCluster = RebootCacheClusterResponse
+-- | Creates a value of 'RebootCacheClusterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rccrsCacheCluster'
+--
+-- * 'rccrsStatus'
+rebootCacheClusterResponse
+    :: Int -- ^ 'rccrsStatus'
+    -> RebootCacheClusterResponse
+rebootCacheClusterResponse pStatus_ =
+    RebootCacheClusterResponse'
+    { _rccrsCacheCluster = Nothing
+    , _rccrsStatus = pStatus_
+    }
 
-    request  = post "RebootCacheCluster"
-    response = xmlResponse
+-- | Undocumented member.
+rccrsCacheCluster :: Lens' RebootCacheClusterResponse (Maybe CacheCluster)
+rccrsCacheCluster = lens _rccrsCacheCluster (\ s a -> s{_rccrsCacheCluster = a});
 
-instance FromXML RebootCacheClusterResponse where
-    parseXML = withElement "RebootCacheClusterResult" $ \x -> RebootCacheClusterResponse
-        <$> x .@? "CacheCluster"
+-- | The response status code.
+rccrsStatus :: Lens' RebootCacheClusterResponse Int
+rccrsStatus = lens _rccrsStatus (\ s a -> s{_rccrsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/RemoveTagsFromResource.hs b/gen/Network/AWS/ElastiCache/RemoveTagsFromResource.hs
--- a/gen/Network/AWS/ElastiCache/RemoveTagsFromResource.hs
+++ b/gen/Network/AWS/ElastiCache/RemoveTagsFromResource.hs
@@ -1,129 +1,105 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.RemoveTagsFromResource
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /RemoveTagsFromResource/ action removes the tags identified by the 'TagKeys'
--- list from the named resource.
+-- The /RemoveTagsFromResource/ action removes the tags identified by the
+-- 'TagKeys' list from the named resource.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RemoveTagsFromResource.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RemoveTagsFromResource.html AWS API Reference> for RemoveTagsFromResource.
 module Network.AWS.ElastiCache.RemoveTagsFromResource
     (
-    -- * Request
-      RemoveTagsFromResource
-    -- ** Request constructor
-    , removeTagsFromResource
-    -- ** Request lenses
+    -- * Creating a Request
+      removeTagsFromResource
+    , RemoveTagsFromResource
+    -- * Request Lenses
     , rtfrResourceName
     , rtfrTagKeys
 
-    -- * Response
-    , RemoveTagsFromResourceResponse
-    -- ** Response constructor
-    , removeTagsFromResourceResponse
-    -- ** Response lenses
-    , rtfrrTagList
+    -- * Destructuring the Response
+    , tagListMessage
+    , TagListMessage
+    -- * Response Lenses
+    , tlmTagList
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data RemoveTagsFromResource = RemoveTagsFromResource
-    { _rtfrResourceName :: Text
-    , _rtfrTagKeys      :: List "member" Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'RemoveTagsFromResource' constructor.
+-- | Represents the input of a /RemoveTagsFromResource/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'removeTagsFromResource' smart constructor.
+data RemoveTagsFromResource = RemoveTagsFromResource'
+    { _rtfrResourceName :: !Text
+    , _rtfrTagKeys      :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveTagsFromResource' with the minimum fields required to make a request.
 --
--- * 'rtfrResourceName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rtfrTagKeys' @::@ ['Text']
+-- * 'rtfrResourceName'
 --
-removeTagsFromResource :: Text -- ^ 'rtfrResourceName'
-                       -> RemoveTagsFromResource
-removeTagsFromResource p1 = RemoveTagsFromResource
-    { _rtfrResourceName = p1
-    , _rtfrTagKeys      = mempty
+-- * 'rtfrTagKeys'
+removeTagsFromResource
+    :: Text -- ^ 'rtfrResourceName'
+    -> RemoveTagsFromResource
+removeTagsFromResource pResourceName_ =
+    RemoveTagsFromResource'
+    { _rtfrResourceName = pResourceName_
+    , _rtfrTagKeys = mempty
     }
 
 -- | The name of the ElastiCache resource from which you want the listed tags
--- removed, for example 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
+-- removed, for example
+-- 'arn:aws:elasticache:us-west-2:0123456789:cluster:myCluster'.
 rtfrResourceName :: Lens' RemoveTagsFromResource Text
-rtfrResourceName = lens _rtfrResourceName (\s a -> s { _rtfrResourceName = a })
+rtfrResourceName = lens _rtfrResourceName (\ s a -> s{_rtfrResourceName = a});
 
 -- | A list of 'TagKeys' identifying the tags you want removed from the named
--- resource. For example, 'TagKeys.member.1=Region' removes the cost allocation
--- tag with the key name 'Region' from the resource named by the /ResourceName/
--- parameter.
+-- resource. For example, 'TagKeys.member.1=Region' removes the cost
+-- allocation tag with the key name 'Region' from the resource named by the
+-- /ResourceName/ parameter.
 rtfrTagKeys :: Lens' RemoveTagsFromResource [Text]
-rtfrTagKeys = lens _rtfrTagKeys (\s a -> s { _rtfrTagKeys = a }) . _List
-
-newtype RemoveTagsFromResourceResponse = RemoveTagsFromResourceResponse
-    { _rtfrrTagList :: List "member" Tag
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList RemoveTagsFromResourceResponse where
-    type Item RemoveTagsFromResourceResponse = Tag
-
-    fromList = RemoveTagsFromResourceResponse . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _rtfrrTagList
+rtfrTagKeys = lens _rtfrTagKeys (\ s a -> s{_rtfrTagKeys = a}) . _Coerce;
 
--- | 'RemoveTagsFromResourceResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rtfrrTagList' @::@ ['Tag']
---
-removeTagsFromResourceResponse :: RemoveTagsFromResourceResponse
-removeTagsFromResourceResponse = RemoveTagsFromResourceResponse
-    { _rtfrrTagList = mempty
-    }
+instance AWSRequest RemoveTagsFromResource where
+        type Sv RemoveTagsFromResource = ElastiCache
+        type Rs RemoveTagsFromResource = TagListMessage
+        request = postQuery
+        response
+          = receiveXMLWrapper "RemoveTagsFromResourceResult"
+              (\ s h x -> parseXML x)
 
--- | A list of cost allocation tags as key-value pairs.
-rtfrrTagList :: Lens' RemoveTagsFromResourceResponse [Tag]
-rtfrrTagList = lens _rtfrrTagList (\s a -> s { _rtfrrTagList = a }) . _List
+instance ToHeaders RemoveTagsFromResource where
+        toHeaders = const mempty
 
 instance ToPath RemoveTagsFromResource where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery RemoveTagsFromResource where
-    toQuery RemoveTagsFromResource{..} = mconcat
-        [ "ResourceName" =? _rtfrResourceName
-        , "TagKeys"      =? _rtfrTagKeys
-        ]
-
-instance ToHeaders RemoveTagsFromResource
-
-instance AWSRequest RemoveTagsFromResource where
-    type Sv RemoveTagsFromResource = ElastiCache
-    type Rs RemoveTagsFromResource = RemoveTagsFromResourceResponse
-
-    request  = post "RemoveTagsFromResource"
-    response = xmlResponse
-
-instance FromXML RemoveTagsFromResourceResponse where
-    parseXML = withElement "RemoveTagsFromResourceResult" $ \x -> RemoveTagsFromResourceResponse
-        <$> x .@? "TagList" .!@ mempty
+        toQuery RemoveTagsFromResource'{..}
+          = mconcat
+              ["Action" =:
+                 ("RemoveTagsFromResource" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "ResourceName" =: _rtfrResourceName,
+               "TagKeys" =: toQueryList "member" _rtfrTagKeys]
diff --git a/gen/Network/AWS/ElastiCache/ResetCacheParameterGroup.hs b/gen/Network/AWS/ElastiCache/ResetCacheParameterGroup.hs
--- a/gen/Network/AWS/ElastiCache/ResetCacheParameterGroup.hs
+++ b/gen/Network/AWS/ElastiCache/ResetCacheParameterGroup.hs
@@ -1,143 +1,122 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.ResetCacheParameterGroup
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /ResetCacheParameterGroup/ action modifies the parameters of a cache
--- parameter group to the engine or system default value. You can reset specific
--- parameters by submitting a list of parameter names. To reset the entire cache
--- parameter group, specify the /ResetAllParameters/ and /CacheParameterGroupName/
--- parameters.
+-- The /ResetCacheParameterGroup/ action modifies the parameters of a cache
+-- parameter group to the engine or system default value. You can reset
+-- specific parameters by submitting a list of parameter names. To reset
+-- the entire cache parameter group, specify the /ResetAllParameters/ and
+-- /CacheParameterGroupName/ parameters.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ResetCacheParameterGroup.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ResetCacheParameterGroup.html AWS API Reference> for ResetCacheParameterGroup.
 module Network.AWS.ElastiCache.ResetCacheParameterGroup
     (
-    -- * Request
-      ResetCacheParameterGroup
-    -- ** Request constructor
-    , resetCacheParameterGroup
-    -- ** Request lenses
+    -- * Creating a Request
+      resetCacheParameterGroup
+    , ResetCacheParameterGroup
+    -- * Request Lenses
+    , rcpgResetAllParameters
     , rcpgCacheParameterGroupName
     , rcpgParameterNameValues
-    , rcpgResetAllParameters
 
-    -- * Response
-    , ResetCacheParameterGroupResponse
-    -- ** Response constructor
-    , resetCacheParameterGroupResponse
-    -- ** Response lenses
-    , rcpgrCacheParameterGroupName
+    -- * Destructuring the Response
+    , cacheParameterGroupNameMessage
+    , CacheParameterGroupNameMessage
+    -- * Response Lenses
+    , cpgnmCacheParameterGroupName
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data ResetCacheParameterGroup = ResetCacheParameterGroup
-    { _rcpgCacheParameterGroupName :: Text
-    , _rcpgParameterNameValues     :: List "member" ParameterNameValue
-    , _rcpgResetAllParameters      :: Maybe Bool
-    } deriving (Eq, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ResetCacheParameterGroup' constructor.
+-- | Represents the input of a /ResetCacheParameterGroup/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'resetCacheParameterGroup' smart constructor.
+data ResetCacheParameterGroup = ResetCacheParameterGroup'
+    { _rcpgResetAllParameters      :: !(Maybe Bool)
+    , _rcpgCacheParameterGroupName :: !Text
+    , _rcpgParameterNameValues     :: ![ParameterNameValue]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ResetCacheParameterGroup' with the minimum fields required to make a request.
 --
--- * 'rcpgCacheParameterGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rcpgParameterNameValues' @::@ ['ParameterNameValue']
+-- * 'rcpgResetAllParameters'
 --
--- * 'rcpgResetAllParameters' @::@ 'Maybe' 'Bool'
+-- * 'rcpgCacheParameterGroupName'
 --
-resetCacheParameterGroup :: Text -- ^ 'rcpgCacheParameterGroupName'
-                         -> ResetCacheParameterGroup
-resetCacheParameterGroup p1 = ResetCacheParameterGroup
-    { _rcpgCacheParameterGroupName = p1
-    , _rcpgResetAllParameters      = Nothing
-    , _rcpgParameterNameValues     = mempty
+-- * 'rcpgParameterNameValues'
+resetCacheParameterGroup
+    :: Text -- ^ 'rcpgCacheParameterGroupName'
+    -> ResetCacheParameterGroup
+resetCacheParameterGroup pCacheParameterGroupName_ =
+    ResetCacheParameterGroup'
+    { _rcpgResetAllParameters = Nothing
+    , _rcpgCacheParameterGroupName = pCacheParameterGroupName_
+    , _rcpgParameterNameValues = mempty
     }
 
--- | The name of the cache parameter group to reset.
-rcpgCacheParameterGroupName :: Lens' ResetCacheParameterGroup Text
-rcpgCacheParameterGroupName =
-    lens _rcpgCacheParameterGroupName
-        (\s a -> s { _rcpgCacheParameterGroupName = a })
-
--- | An array of parameter names to be reset. If you are not resetting the entire
--- cache parameter group, you must specify at least one parameter name.
-rcpgParameterNameValues :: Lens' ResetCacheParameterGroup [ParameterNameValue]
-rcpgParameterNameValues =
-    lens _rcpgParameterNameValues (\s a -> s { _rcpgParameterNameValues = a })
-        . _List
-
--- | If /true/, all parameters in the cache parameter group will be reset to default
--- values. If /false/, no such action occurs.
+-- | If /true/, all parameters in the cache parameter group will be reset to
+-- default values. If /false/, no such action occurs.
 --
 -- Valid values: 'true' | 'false'
 rcpgResetAllParameters :: Lens' ResetCacheParameterGroup (Maybe Bool)
-rcpgResetAllParameters =
-    lens _rcpgResetAllParameters (\s a -> s { _rcpgResetAllParameters = a })
+rcpgResetAllParameters = lens _rcpgResetAllParameters (\ s a -> s{_rcpgResetAllParameters = a});
 
-newtype ResetCacheParameterGroupResponse = ResetCacheParameterGroupResponse
-    { _rcpgrCacheParameterGroupName :: Maybe Text
-    } deriving (Eq, Ord, Read, Show, Monoid)
+-- | The name of the cache parameter group to reset.
+rcpgCacheParameterGroupName :: Lens' ResetCacheParameterGroup Text
+rcpgCacheParameterGroupName = lens _rcpgCacheParameterGroupName (\ s a -> s{_rcpgCacheParameterGroupName = a});
 
--- | 'ResetCacheParameterGroupResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rcpgrCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
-resetCacheParameterGroupResponse :: ResetCacheParameterGroupResponse
-resetCacheParameterGroupResponse = ResetCacheParameterGroupResponse
-    { _rcpgrCacheParameterGroupName = Nothing
-    }
+-- | An array of parameter names to be reset. If you are not resetting the
+-- entire cache parameter group, you must specify at least one parameter
+-- name.
+rcpgParameterNameValues :: Lens' ResetCacheParameterGroup [ParameterNameValue]
+rcpgParameterNameValues = lens _rcpgParameterNameValues (\ s a -> s{_rcpgParameterNameValues = a}) . _Coerce;
 
--- | The name of the cache parameter group.
-rcpgrCacheParameterGroupName :: Lens' ResetCacheParameterGroupResponse (Maybe Text)
-rcpgrCacheParameterGroupName =
-    lens _rcpgrCacheParameterGroupName
-        (\s a -> s { _rcpgrCacheParameterGroupName = a })
+instance AWSRequest ResetCacheParameterGroup where
+        type Sv ResetCacheParameterGroup = ElastiCache
+        type Rs ResetCacheParameterGroup =
+             CacheParameterGroupNameMessage
+        request = postQuery
+        response
+          = receiveXMLWrapper "ResetCacheParameterGroupResult"
+              (\ s h x -> parseXML x)
 
+instance ToHeaders ResetCacheParameterGroup where
+        toHeaders = const mempty
+
 instance ToPath ResetCacheParameterGroup where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ResetCacheParameterGroup where
-    toQuery ResetCacheParameterGroup{..} = mconcat
-        [ "CacheParameterGroupName" =? _rcpgCacheParameterGroupName
-        , "ParameterNameValues"     =? _rcpgParameterNameValues
-        , "ResetAllParameters"      =? _rcpgResetAllParameters
-        ]
-
-instance ToHeaders ResetCacheParameterGroup
-
-instance AWSRequest ResetCacheParameterGroup where
-    type Sv ResetCacheParameterGroup = ElastiCache
-    type Rs ResetCacheParameterGroup = ResetCacheParameterGroupResponse
-
-    request  = post "ResetCacheParameterGroup"
-    response = xmlResponse
-
-instance FromXML ResetCacheParameterGroupResponse where
-    parseXML = withElement "ResetCacheParameterGroupResult" $ \x -> ResetCacheParameterGroupResponse
-        <$> x .@? "CacheParameterGroupName"
+        toQuery ResetCacheParameterGroup'{..}
+          = mconcat
+              ["Action" =:
+                 ("ResetCacheParameterGroup" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "ResetAllParameters" =: _rcpgResetAllParameters,
+               "CacheParameterGroupName" =:
+                 _rcpgCacheParameterGroupName,
+               "ParameterNameValues" =:
+                 toQueryList "ParameterNameValue"
+                   _rcpgParameterNameValues]
diff --git a/gen/Network/AWS/ElastiCache/RevokeCacheSecurityGroupIngress.hs b/gen/Network/AWS/ElastiCache/RevokeCacheSecurityGroupIngress.hs
--- a/gen/Network/AWS/ElastiCache/RevokeCacheSecurityGroupIngress.hs
+++ b/gen/Network/AWS/ElastiCache/RevokeCacheSecurityGroupIngress.hs
@@ -1,141 +1,155 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
 
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | The /RevokeCacheSecurityGroupIngress/ action revokes ingress from a cache
--- security group. Use this action to disallow access from an Amazon EC2
--- security group that had been previously authorized.
+-- The /RevokeCacheSecurityGroupIngress/ action revokes ingress from a
+-- cache security group. Use this action to disallow access from an Amazon
+-- EC2 security group that had been previously authorized.
 --
--- <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RevokeCacheSecurityGroupIngress.html>
+-- /See:/ <http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_RevokeCacheSecurityGroupIngress.html AWS API Reference> for RevokeCacheSecurityGroupIngress.
 module Network.AWS.ElastiCache.RevokeCacheSecurityGroupIngress
     (
-    -- * Request
-      RevokeCacheSecurityGroupIngress
-    -- ** Request constructor
-    , revokeCacheSecurityGroupIngress
-    -- ** Request lenses
+    -- * Creating a Request
+      revokeCacheSecurityGroupIngress
+    , RevokeCacheSecurityGroupIngress
+    -- * Request Lenses
     , rcsgiCacheSecurityGroupName
     , rcsgiEC2SecurityGroupName
     , rcsgiEC2SecurityGroupOwnerId
 
-    -- * Response
-    , RevokeCacheSecurityGroupIngressResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , revokeCacheSecurityGroupIngressResponse
-    -- ** Response lenses
-    , rcsgirCacheSecurityGroup
+    , RevokeCacheSecurityGroupIngressResponse
+    -- * Response Lenses
+    , rcsgirsCacheSecurityGroup
+    , rcsgirsStatus
     ) where
 
-import Network.AWS.Prelude
-import Network.AWS.Request.Query
-import Network.AWS.ElastiCache.Types
-import qualified GHC.Exts
-
-data RevokeCacheSecurityGroupIngress = RevokeCacheSecurityGroupIngress
-    { _rcsgiCacheSecurityGroupName  :: Text
-    , _rcsgiEC2SecurityGroupName    :: Text
-    , _rcsgiEC2SecurityGroupOwnerId :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'RevokeCacheSecurityGroupIngress' constructor.
+-- | Represents the input of a /RevokeCacheSecurityGroupIngress/ action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'revokeCacheSecurityGroupIngress' smart constructor.
+data RevokeCacheSecurityGroupIngress = RevokeCacheSecurityGroupIngress'
+    { _rcsgiCacheSecurityGroupName  :: !Text
+    , _rcsgiEC2SecurityGroupName    :: !Text
+    , _rcsgiEC2SecurityGroupOwnerId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RevokeCacheSecurityGroupIngress' with the minimum fields required to make a request.
 --
--- * 'rcsgiCacheSecurityGroupName' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rcsgiEC2SecurityGroupName' @::@ 'Text'
+-- * 'rcsgiCacheSecurityGroupName'
 --
--- * 'rcsgiEC2SecurityGroupOwnerId' @::@ 'Text'
+-- * 'rcsgiEC2SecurityGroupName'
 --
-revokeCacheSecurityGroupIngress :: Text -- ^ 'rcsgiCacheSecurityGroupName'
-                                -> Text -- ^ 'rcsgiEC2SecurityGroupName'
-                                -> Text -- ^ 'rcsgiEC2SecurityGroupOwnerId'
-                                -> RevokeCacheSecurityGroupIngress
-revokeCacheSecurityGroupIngress p1 p2 p3 = RevokeCacheSecurityGroupIngress
-    { _rcsgiCacheSecurityGroupName  = p1
-    , _rcsgiEC2SecurityGroupName    = p2
-    , _rcsgiEC2SecurityGroupOwnerId = p3
+-- * 'rcsgiEC2SecurityGroupOwnerId'
+revokeCacheSecurityGroupIngress
+    :: Text -- ^ 'rcsgiCacheSecurityGroupName'
+    -> Text -- ^ 'rcsgiEC2SecurityGroupName'
+    -> Text -- ^ 'rcsgiEC2SecurityGroupOwnerId'
+    -> RevokeCacheSecurityGroupIngress
+revokeCacheSecurityGroupIngress pCacheSecurityGroupName_ pEC2SecurityGroupName_ pEC2SecurityGroupOwnerId_ =
+    RevokeCacheSecurityGroupIngress'
+    { _rcsgiCacheSecurityGroupName = pCacheSecurityGroupName_
+    , _rcsgiEC2SecurityGroupName = pEC2SecurityGroupName_
+    , _rcsgiEC2SecurityGroupOwnerId = pEC2SecurityGroupOwnerId_
     }
 
 -- | The name of the cache security group to revoke ingress from.
 rcsgiCacheSecurityGroupName :: Lens' RevokeCacheSecurityGroupIngress Text
-rcsgiCacheSecurityGroupName =
-    lens _rcsgiCacheSecurityGroupName
-        (\s a -> s { _rcsgiCacheSecurityGroupName = a })
+rcsgiCacheSecurityGroupName = lens _rcsgiCacheSecurityGroupName (\ s a -> s{_rcsgiCacheSecurityGroupName = a});
 
 -- | The name of the Amazon EC2 security group to revoke access from.
 rcsgiEC2SecurityGroupName :: Lens' RevokeCacheSecurityGroupIngress Text
-rcsgiEC2SecurityGroupName =
-    lens _rcsgiEC2SecurityGroupName
-        (\s a -> s { _rcsgiEC2SecurityGroupName = a })
+rcsgiEC2SecurityGroupName = lens _rcsgiEC2SecurityGroupName (\ s a -> s{_rcsgiEC2SecurityGroupName = a});
 
--- | The AWS account number of the Amazon EC2 security group owner. Note that this
--- is not the same thing as an AWS access key ID - you must provide a valid AWS
--- account number for this parameter.
+-- | The AWS account number of the Amazon EC2 security group owner. Note that
+-- this is not the same thing as an AWS access key ID - you must provide a
+-- valid AWS account number for this parameter.
 rcsgiEC2SecurityGroupOwnerId :: Lens' RevokeCacheSecurityGroupIngress Text
-rcsgiEC2SecurityGroupOwnerId =
-    lens _rcsgiEC2SecurityGroupOwnerId
-        (\s a -> s { _rcsgiEC2SecurityGroupOwnerId = a })
-
-newtype RevokeCacheSecurityGroupIngressResponse = RevokeCacheSecurityGroupIngressResponse
-    { _rcsgirCacheSecurityGroup :: Maybe CacheSecurityGroup
-    } deriving (Eq, Read, Show)
+rcsgiEC2SecurityGroupOwnerId = lens _rcsgiEC2SecurityGroupOwnerId (\ s a -> s{_rcsgiEC2SecurityGroupOwnerId = a});
 
--- | 'RevokeCacheSecurityGroupIngressResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rcsgirCacheSecurityGroup' @::@ 'Maybe' 'CacheSecurityGroup'
---
-revokeCacheSecurityGroupIngressResponse :: RevokeCacheSecurityGroupIngressResponse
-revokeCacheSecurityGroupIngressResponse = RevokeCacheSecurityGroupIngressResponse
-    { _rcsgirCacheSecurityGroup = Nothing
-    }
+instance AWSRequest RevokeCacheSecurityGroupIngress
+         where
+        type Sv RevokeCacheSecurityGroupIngress = ElastiCache
+        type Rs RevokeCacheSecurityGroupIngress =
+             RevokeCacheSecurityGroupIngressResponse
+        request = postQuery
+        response
+          = receiveXMLWrapper
+              "RevokeCacheSecurityGroupIngressResult"
+              (\ s h x ->
+                 RevokeCacheSecurityGroupIngressResponse' <$>
+                   (x .@? "CacheSecurityGroup") <*> (pure (fromEnum s)))
 
-rcsgirCacheSecurityGroup :: Lens' RevokeCacheSecurityGroupIngressResponse (Maybe CacheSecurityGroup)
-rcsgirCacheSecurityGroup =
-    lens _rcsgirCacheSecurityGroup
-        (\s a -> s { _rcsgirCacheSecurityGroup = a })
+instance ToHeaders RevokeCacheSecurityGroupIngress
+         where
+        toHeaders = const mempty
 
 instance ToPath RevokeCacheSecurityGroupIngress where
-    toPath = const "/"
+        toPath = const "/"
 
-instance ToQuery RevokeCacheSecurityGroupIngress where
-    toQuery RevokeCacheSecurityGroupIngress{..} = mconcat
-        [ "CacheSecurityGroupName"  =? _rcsgiCacheSecurityGroupName
-        , "EC2SecurityGroupName"    =? _rcsgiEC2SecurityGroupName
-        , "EC2SecurityGroupOwnerId" =? _rcsgiEC2SecurityGroupOwnerId
-        ]
+instance ToQuery RevokeCacheSecurityGroupIngress
+         where
+        toQuery RevokeCacheSecurityGroupIngress'{..}
+          = mconcat
+              ["Action" =:
+                 ("RevokeCacheSecurityGroupIngress" :: ByteString),
+               "Version" =: ("2015-02-02" :: ByteString),
+               "CacheSecurityGroupName" =:
+                 _rcsgiCacheSecurityGroupName,
+               "EC2SecurityGroupName" =: _rcsgiEC2SecurityGroupName,
+               "EC2SecurityGroupOwnerId" =:
+                 _rcsgiEC2SecurityGroupOwnerId]
 
-instance ToHeaders RevokeCacheSecurityGroupIngress
+-- | /See:/ 'revokeCacheSecurityGroupIngressResponse' smart constructor.
+data RevokeCacheSecurityGroupIngressResponse = RevokeCacheSecurityGroupIngressResponse'
+    { _rcsgirsCacheSecurityGroup :: !(Maybe CacheSecurityGroup)
+    , _rcsgirsStatus             :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest RevokeCacheSecurityGroupIngress where
-    type Sv RevokeCacheSecurityGroupIngress = ElastiCache
-    type Rs RevokeCacheSecurityGroupIngress = RevokeCacheSecurityGroupIngressResponse
+-- | Creates a value of 'RevokeCacheSecurityGroupIngressResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcsgirsCacheSecurityGroup'
+--
+-- * 'rcsgirsStatus'
+revokeCacheSecurityGroupIngressResponse
+    :: Int -- ^ 'rcsgirsStatus'
+    -> RevokeCacheSecurityGroupIngressResponse
+revokeCacheSecurityGroupIngressResponse pStatus_ =
+    RevokeCacheSecurityGroupIngressResponse'
+    { _rcsgirsCacheSecurityGroup = Nothing
+    , _rcsgirsStatus = pStatus_
+    }
 
-    request  = post "RevokeCacheSecurityGroupIngress"
-    response = xmlResponse
+-- | Undocumented member.
+rcsgirsCacheSecurityGroup :: Lens' RevokeCacheSecurityGroupIngressResponse (Maybe CacheSecurityGroup)
+rcsgirsCacheSecurityGroup = lens _rcsgirsCacheSecurityGroup (\ s a -> s{_rcsgirsCacheSecurityGroup = a});
 
-instance FromXML RevokeCacheSecurityGroupIngressResponse where
-    parseXML = withElement "RevokeCacheSecurityGroupIngressResult" $ \x -> RevokeCacheSecurityGroupIngressResponse
-        <$> x .@? "CacheSecurityGroup"
+-- | The response status code.
+rcsgirsStatus :: Lens' RevokeCacheSecurityGroupIngressResponse Int
+rcsgirsStatus = lens _rcsgirsStatus (\ s a -> s{_rcsgirsStatus = a});
diff --git a/gen/Network/AWS/ElastiCache/Types.hs b/gen/Network/AWS/ElastiCache/Types.hs
--- a/gen/Network/AWS/ElastiCache/Types.hs
+++ b/gen/Network/AWS/ElastiCache/Types.hs
@@ -1,2983 +1,644 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
-{-# LANGUAGE ViewPatterns                #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Module      : Network.AWS.ElastiCache.Types
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- License     : This Source Code Form is subject to the terms of
---               the Mozilla Public License, v. 2.0.
---               A copy of the MPL can be found in the LICENSE file or
---               you can obtain it at http://mozilla.org/MPL/2.0/.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
---
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
-module Network.AWS.ElastiCache.Types
-    (
-    -- * Service
-      ElastiCache
-    -- ** Error
-    , RESTError
-    -- ** XML
-    , ns
-
-    -- * NodeSnapshot
-    , NodeSnapshot
-    , nodeSnapshot
-    , nsCacheNodeCreateTime
-    , nsCacheNodeId
-    , nsCacheSize
-    , nsSnapshotCreateTime
-
-    -- * Snapshot
-    , Snapshot
-    , snapshot
-    , sAutoMinorVersionUpgrade
-    , sCacheClusterCreateTime
-    , sCacheClusterId
-    , sCacheNodeType
-    , sCacheParameterGroupName
-    , sCacheSubnetGroupName
-    , sEngine
-    , sEngineVersion
-    , sNodeSnapshots
-    , sNumCacheNodes
-    , sPort
-    , sPreferredAvailabilityZone
-    , sPreferredMaintenanceWindow
-    , sSnapshotName
-    , sSnapshotRetentionLimit
-    , sSnapshotSource
-    , sSnapshotStatus
-    , sSnapshotWindow
-    , sTopicArn
-    , sVpcId
-
-    -- * Event
-    , Event
-    , event
-    , eDate
-    , eMessage
-    , eSourceIdentifier
-    , eSourceType
-
-    -- * NodeGroup
-    , NodeGroup
-    , nodeGroup
-    , ngNodeGroupId
-    , ngNodeGroupMembers
-    , ngPrimaryEndpoint
-    , ngStatus
-
-    -- * CacheNodeTypeSpecificValue
-    , CacheNodeTypeSpecificValue
-    , cacheNodeTypeSpecificValue
-    , cntsvCacheNodeType
-    , cntsvValue
-
-    -- * Tag
-    , Tag
-    , tag
-    , tagKey
-    , tagValue
-
-    -- * PendingAutomaticFailoverStatus
-    , PendingAutomaticFailoverStatus (..)
-
-    -- * NotificationConfiguration
-    , NotificationConfiguration
-    , notificationConfiguration
-    , ncTopicArn
-    , ncTopicStatus
-
-    -- * ReplicationGroupPendingModifiedValues
-    , ReplicationGroupPendingModifiedValues
-    , replicationGroupPendingModifiedValues
-    , rgpmvAutomaticFailoverStatus
-    , rgpmvPrimaryClusterId
-
-    -- * EC2SecurityGroup
-    , EC2SecurityGroup
-    , ec2SecurityGroup
-    , ecsgEC2SecurityGroupName
-    , ecsgEC2SecurityGroupOwnerId
-    , ecsgStatus
-
-    -- * ParameterNameValue
-    , ParameterNameValue
-    , parameterNameValue
-    , pnvParameterName
-    , pnvParameterValue
-
-    -- * SourceType
-    , SourceType (..)
-
-    -- * CacheSubnetGroup
-    , CacheSubnetGroup
-    , cacheSubnetGroup
-    , csgCacheSubnetGroupDescription
-    , csgCacheSubnetGroupName
-    , csgSubnets
-    , csgVpcId
-
-    -- * ReservedCacheNode
-    , ReservedCacheNode
-    , reservedCacheNode
-    , rcnCacheNodeCount
-    , rcnCacheNodeType
-    , rcnDuration
-    , rcnFixedPrice
-    , rcnOfferingType
-    , rcnProductDescription
-    , rcnRecurringCharges
-    , rcnReservedCacheNodeId
-    , rcnReservedCacheNodesOfferingId
-    , rcnStartTime
-    , rcnState
-    , rcnUsagePrice
-
-    -- * Subnet
-    , Subnet
-    , subnet
-    , sSubnetAvailabilityZone
-    , sSubnetIdentifier
-
-    -- * SecurityGroupMembership
-    , SecurityGroupMembership
-    , securityGroupMembership
-    , sgmSecurityGroupId
-    , sgmStatus
-
-    -- * CacheCluster
-    , CacheCluster
-    , cacheCluster
-    , ccAutoMinorVersionUpgrade
-    , ccCacheClusterCreateTime
-    , ccCacheClusterId
-    , ccCacheClusterStatus
-    , ccCacheNodeType
-    , ccCacheNodes
-    , ccCacheParameterGroup
-    , ccCacheSecurityGroups
-    , ccCacheSubnetGroupName
-    , ccClientDownloadLandingPage
-    , ccConfigurationEndpoint
-    , ccEngine
-    , ccEngineVersion
-    , ccNotificationConfiguration
-    , ccNumCacheNodes
-    , ccPendingModifiedValues
-    , ccPreferredAvailabilityZone
-    , ccPreferredMaintenanceWindow
-    , ccReplicationGroupId
-    , ccSecurityGroups
-    , ccSnapshotRetentionLimit
-    , ccSnapshotWindow
-
-    -- * EngineDefaults
-    , EngineDefaults
-    , engineDefaults
-    , edCacheNodeTypeSpecificParameters
-    , edCacheParameterGroupFamily
-    , edMarker
-    , edParameters
-
-    -- * CacheParameterGroupStatus
-    , CacheParameterGroupStatus
-    , cacheParameterGroupStatus
-    , cpgsCacheNodeIdsToReboot
-    , cpgsCacheParameterGroupName
-    , cpgsParameterApplyStatus
-
-    -- * CacheNode
-    , CacheNode
-    , cacheNode
-    , cnCacheNodeCreateTime
-    , cnCacheNodeId
-    , cnCacheNodeStatus
-    , cnCustomerAvailabilityZone
-    , cnEndpoint
-    , cnParameterGroupStatus
-    , cnSourceCacheNodeId
-
-    -- * CacheSecurityGroupMembership
-    , CacheSecurityGroupMembership
-    , cacheSecurityGroupMembership
-    , csgmCacheSecurityGroupName
-    , csgmStatus
-
-    -- * AvailabilityZone
-    , AvailabilityZone
-    , availabilityZone
-    , azName
-
-    -- * NodeGroupMember
-    , NodeGroupMember
-    , nodeGroupMember
-    , ngmCacheClusterId
-    , ngmCacheNodeId
-    , ngmCurrentRole
-    , ngmPreferredAvailabilityZone
-    , ngmReadEndpoint
-
-    -- * CacheParameterGroup
-    , CacheParameterGroup
-    , cacheParameterGroup
-    , cpgCacheParameterGroupFamily
-    , cpgCacheParameterGroupName
-    , cpgDescription
-
-    -- * AutomaticFailoverStatus
-    , AutomaticFailoverStatus (..)
-
-    -- * CacheSecurityGroup
-    , CacheSecurityGroup
-    , cacheSecurityGroup
-    , csgCacheSecurityGroupName
-    , csgDescription
-    , csgEC2SecurityGroups
-    , csgOwnerId
-
-    -- * CacheNodeTypeSpecificParameter
-    , CacheNodeTypeSpecificParameter
-    , cacheNodeTypeSpecificParameter
-    , cntspAllowedValues
-    , cntspCacheNodeTypeSpecificValues
-    , cntspDataType
-    , cntspDescription
-    , cntspIsModifiable
-    , cntspMinimumEngineVersion
-    , cntspParameterName
-    , cntspSource
-
-    -- * AZMode
-    , AZMode (..)
-
-    -- * CacheEngineVersion
-    , CacheEngineVersion
-    , cacheEngineVersion
-    , cevCacheEngineDescription
-    , cevCacheEngineVersionDescription
-    , cevCacheParameterGroupFamily
-    , cevEngine
-    , cevEngineVersion
-
-    -- * ReplicationGroup
-    , ReplicationGroup
-    , replicationGroup
-    , rgAutomaticFailover
-    , rgDescription
-    , rgMemberClusters
-    , rgNodeGroups
-    , rgPendingModifiedValues
-    , rgReplicationGroupId
-    , rgSnapshottingClusterId
-    , rgStatus
-
-    -- * RecurringCharge
-    , RecurringCharge
-    , recurringCharge
-    , rcRecurringChargeAmount
-    , rcRecurringChargeFrequency
-
-    -- * ReservedCacheNodesOffering
-    , ReservedCacheNodesOffering
-    , reservedCacheNodesOffering
-    , rcnoCacheNodeType
-    , rcnoDuration
-    , rcnoFixedPrice
-    , rcnoOfferingType
-    , rcnoProductDescription
-    , rcnoRecurringCharges
-    , rcnoReservedCacheNodesOfferingId
-    , rcnoUsagePrice
-
-    -- * TagListMessage
-    , TagListMessage
-    , tagListMessage
-    , tlmTagList
-
-    -- * Endpoint
-    , Endpoint
-    , endpoint
-    , eAddress
-    , ePort
-
-    -- * PendingModifiedValues
-    , PendingModifiedValues
-    , pendingModifiedValues
-    , pmvCacheNodeIdsToRemove
-    , pmvEngineVersion
-    , pmvNumCacheNodes
-
-    -- * CacheParameterGroupNameMessage
-    , CacheParameterGroupNameMessage
-    , cacheParameterGroupNameMessage
-    , cpgnmCacheParameterGroupName
-
-    -- * Parameter
-    , Parameter
-    , parameter
-    , pAllowedValues
-    , pDataType
-    , pDescription
-    , pIsModifiable
-    , pMinimumEngineVersion
-    , pParameterName
-    , pParameterValue
-    , pSource
-    ) where
-
-import Network.AWS.Prelude
-import Network.AWS.Signing
-import qualified GHC.Exts
-
--- | Version @2015-02-02@ of the Amazon ElastiCache service.
-data ElastiCache
-
-instance AWSService ElastiCache where
-    type Sg ElastiCache = V4
-    type Er ElastiCache = RESTError
-
-    service = service'
-      where
-        service' :: Service ElastiCache
-        service' = Service
-            { _svcAbbrev       = "ElastiCache"
-            , _svcPrefix       = "elasticache"
-            , _svcVersion      = "2015-02-02"
-            , _svcTargetPrefix = Nothing
-            , _svcJSONVersion  = Nothing
-            , _svcHandle       = handle
-            , _svcRetry        = retry
-            }
-
-        handle :: Status
-               -> Maybe (LazyByteString -> ServiceError RESTError)
-        handle = restError statusSuccess service'
-
-        retry :: Retry ElastiCache
-        retry = Exponential
-            { _retryBase     = 0.05
-            , _retryGrowth   = 2
-            , _retryAttempts = 5
-            , _retryCheck    = check
-            }
-
-        check :: Status
-              -> RESTError
-              -> Bool
-        check (statusCode -> s) (awsErrorCode -> e)
-            | s == 400 && (Just "Throttling") == e = True -- Throttling
-            | s == 500  = True -- General Server Error
-            | s == 509  = True -- Limit Exceeded
-            | s == 503  = True -- Service Unavailable
-            | otherwise = False
-
-ns :: Text
-ns = "http://elasticache.amazonaws.com/doc/2015-02-02/"
-{-# INLINE ns #-}
-
-data NodeSnapshot = NodeSnapshot
-    { _nsCacheNodeCreateTime :: Maybe ISO8601
-    , _nsCacheNodeId         :: Maybe Text
-    , _nsCacheSize           :: Maybe Text
-    , _nsSnapshotCreateTime  :: Maybe ISO8601
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'NodeSnapshot' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'nsCacheNodeCreateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'nsCacheNodeId' @::@ 'Maybe' 'Text'
---
--- * 'nsCacheSize' @::@ 'Maybe' 'Text'
---
--- * 'nsSnapshotCreateTime' @::@ 'Maybe' 'UTCTime'
---
-nodeSnapshot :: NodeSnapshot
-nodeSnapshot = NodeSnapshot
-    { _nsCacheNodeId         = Nothing
-    , _nsCacheSize           = Nothing
-    , _nsCacheNodeCreateTime = Nothing
-    , _nsSnapshotCreateTime  = Nothing
-    }
-
--- | The date and time when the cache node was created in the source cache cluster.
-nsCacheNodeCreateTime :: Lens' NodeSnapshot (Maybe UTCTime)
-nsCacheNodeCreateTime =
-    lens _nsCacheNodeCreateTime (\s a -> s { _nsCacheNodeCreateTime = a })
-        . mapping _Time
-
--- | The cache node identifier for the node in the source cache cluster.
-nsCacheNodeId :: Lens' NodeSnapshot (Maybe Text)
-nsCacheNodeId = lens _nsCacheNodeId (\s a -> s { _nsCacheNodeId = a })
-
--- | The size of the cache on the source cache node.
-nsCacheSize :: Lens' NodeSnapshot (Maybe Text)
-nsCacheSize = lens _nsCacheSize (\s a -> s { _nsCacheSize = a })
-
--- | The date and time when the source node's metadata and cache data set was
--- obtained for the snapshot.
-nsSnapshotCreateTime :: Lens' NodeSnapshot (Maybe UTCTime)
-nsSnapshotCreateTime =
-    lens _nsSnapshotCreateTime (\s a -> s { _nsSnapshotCreateTime = a })
-        . mapping _Time
-
-instance FromXML NodeSnapshot where
-    parseXML x = NodeSnapshot
-        <$> x .@? "CacheNodeCreateTime"
-        <*> x .@? "CacheNodeId"
-        <*> x .@? "CacheSize"
-        <*> x .@? "SnapshotCreateTime"
-
-instance ToQuery NodeSnapshot where
-    toQuery NodeSnapshot{..} = mconcat
-        [ "CacheNodeCreateTime" =? _nsCacheNodeCreateTime
-        , "CacheNodeId"         =? _nsCacheNodeId
-        , "CacheSize"           =? _nsCacheSize
-        , "SnapshotCreateTime"  =? _nsSnapshotCreateTime
-        ]
-
-data Snapshot = Snapshot
-    { _sAutoMinorVersionUpgrade    :: Maybe Bool
-    , _sCacheClusterCreateTime     :: Maybe ISO8601
-    , _sCacheClusterId             :: Maybe Text
-    , _sCacheNodeType              :: Maybe Text
-    , _sCacheParameterGroupName    :: Maybe Text
-    , _sCacheSubnetGroupName       :: Maybe Text
-    , _sEngine                     :: Maybe Text
-    , _sEngineVersion              :: Maybe Text
-    , _sNodeSnapshots              :: List "member" NodeSnapshot
-    , _sNumCacheNodes              :: Maybe Int
-    , _sPort                       :: Maybe Int
-    , _sPreferredAvailabilityZone  :: Maybe Text
-    , _sPreferredMaintenanceWindow :: Maybe Text
-    , _sSnapshotName               :: Maybe Text
-    , _sSnapshotRetentionLimit     :: Maybe Int
-    , _sSnapshotSource             :: Maybe Text
-    , _sSnapshotStatus             :: Maybe Text
-    , _sSnapshotWindow             :: Maybe Text
-    , _sTopicArn                   :: Maybe Text
-    , _sVpcId                      :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'Snapshot' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
---
--- * 'sCacheClusterCreateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'sCacheClusterId' @::@ 'Maybe' 'Text'
---
--- * 'sCacheNodeType' @::@ 'Maybe' 'Text'
---
--- * 'sCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
--- * 'sCacheSubnetGroupName' @::@ 'Maybe' 'Text'
---
--- * 'sEngine' @::@ 'Maybe' 'Text'
---
--- * 'sEngineVersion' @::@ 'Maybe' 'Text'
---
--- * 'sNodeSnapshots' @::@ ['NodeSnapshot']
---
--- * 'sNumCacheNodes' @::@ 'Maybe' 'Int'
---
--- * 'sPort' @::@ 'Maybe' 'Int'
---
--- * 'sPreferredAvailabilityZone' @::@ 'Maybe' 'Text'
---
--- * 'sPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
---
--- * 'sSnapshotName' @::@ 'Maybe' 'Text'
---
--- * 'sSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
---
--- * 'sSnapshotSource' @::@ 'Maybe' 'Text'
---
--- * 'sSnapshotStatus' @::@ 'Maybe' 'Text'
---
--- * 'sSnapshotWindow' @::@ 'Maybe' 'Text'
---
--- * 'sTopicArn' @::@ 'Maybe' 'Text'
---
--- * 'sVpcId' @::@ 'Maybe' 'Text'
---
-snapshot :: Snapshot
-snapshot = Snapshot
-    { _sSnapshotName               = Nothing
-    , _sCacheClusterId             = Nothing
-    , _sSnapshotStatus             = Nothing
-    , _sSnapshotSource             = Nothing
-    , _sCacheNodeType              = Nothing
-    , _sEngine                     = Nothing
-    , _sEngineVersion              = Nothing
-    , _sNumCacheNodes              = Nothing
-    , _sPreferredAvailabilityZone  = Nothing
-    , _sCacheClusterCreateTime     = Nothing
-    , _sPreferredMaintenanceWindow = Nothing
-    , _sTopicArn                   = Nothing
-    , _sPort                       = Nothing
-    , _sCacheParameterGroupName    = Nothing
-    , _sCacheSubnetGroupName       = Nothing
-    , _sVpcId                      = Nothing
-    , _sAutoMinorVersionUpgrade    = Nothing
-    , _sSnapshotRetentionLimit     = Nothing
-    , _sSnapshotWindow             = Nothing
-    , _sNodeSnapshots              = mempty
-    }
-
--- | This parameter is currently disabled.
-sAutoMinorVersionUpgrade :: Lens' Snapshot (Maybe Bool)
-sAutoMinorVersionUpgrade =
-    lens _sAutoMinorVersionUpgrade
-        (\s a -> s { _sAutoMinorVersionUpgrade = a })
-
--- | The date and time when the source cache cluster was created.
-sCacheClusterCreateTime :: Lens' Snapshot (Maybe UTCTime)
-sCacheClusterCreateTime =
-    lens _sCacheClusterCreateTime (\s a -> s { _sCacheClusterCreateTime = a })
-        . mapping _Time
-
--- | The user-supplied identifier of the source cache cluster.
-sCacheClusterId :: Lens' Snapshot (Maybe Text)
-sCacheClusterId = lens _sCacheClusterId (\s a -> s { _sCacheClusterId = a })
-
--- | The name of the compute and memory capacity node type for the source cache
--- cluster.
---
--- Valid node types are as follows:
---
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
---
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-sCacheNodeType :: Lens' Snapshot (Maybe Text)
-sCacheNodeType = lens _sCacheNodeType (\s a -> s { _sCacheNodeType = a })
-
--- | The cache parameter group that is associated with the source cache cluster.
-sCacheParameterGroupName :: Lens' Snapshot (Maybe Text)
-sCacheParameterGroupName =
-    lens _sCacheParameterGroupName
-        (\s a -> s { _sCacheParameterGroupName = a })
-
--- | The name of the cache subnet group associated with the source cache cluster.
-sCacheSubnetGroupName :: Lens' Snapshot (Maybe Text)
-sCacheSubnetGroupName =
-    lens _sCacheSubnetGroupName (\s a -> s { _sCacheSubnetGroupName = a })
-
--- | The name of the cache engine (/memcached/ or /redis/) used by the source cache
--- cluster.
-sEngine :: Lens' Snapshot (Maybe Text)
-sEngine = lens _sEngine (\s a -> s { _sEngine = a })
-
--- | The version of the cache engine version that is used by the source cache
--- cluster.
-sEngineVersion :: Lens' Snapshot (Maybe Text)
-sEngineVersion = lens _sEngineVersion (\s a -> s { _sEngineVersion = a })
-
--- | A list of the cache nodes in the source cache cluster.
-sNodeSnapshots :: Lens' Snapshot [NodeSnapshot]
-sNodeSnapshots = lens _sNodeSnapshots (\s a -> s { _sNodeSnapshots = a }) . _List
-
--- | The number of cache nodes in the source cache cluster.
---
--- For clusters running Redis, this value must be 1. For clusters running
--- Memcached, this value must be between 1 and 20.
-sNumCacheNodes :: Lens' Snapshot (Maybe Int)
-sNumCacheNodes = lens _sNumCacheNodes (\s a -> s { _sNumCacheNodes = a })
-
--- | The port number used by each cache nodes in the source cache cluster.
-sPort :: Lens' Snapshot (Maybe Int)
-sPort = lens _sPort (\s a -> s { _sPort = a })
-
--- | The name of the Availability Zone in which the source cache cluster is
--- located.
-sPreferredAvailabilityZone :: Lens' Snapshot (Maybe Text)
-sPreferredAvailabilityZone =
-    lens _sPreferredAvailabilityZone
-        (\s a -> s { _sPreferredAvailabilityZone = a })
-
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
---
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
-sPreferredMaintenanceWindow :: Lens' Snapshot (Maybe Text)
-sPreferredMaintenanceWindow =
-    lens _sPreferredMaintenanceWindow
-        (\s a -> s { _sPreferredMaintenanceWindow = a })
-
--- | The name of a snapshot. For an automatic snapshot, the name is
--- system-generated; for a manual snapshot, this is the user-provided name.
-sSnapshotName :: Lens' Snapshot (Maybe Text)
-sSnapshotName = lens _sSnapshotName (\s a -> s { _sSnapshotName = a })
-
--- | For an automatic snapshot, the number of days for which ElastiCache will
--- retain the snapshot before deleting it.
---
--- For manual snapshots, this field reflects the /SnapshotRetentionLimit/ for the
--- source cache cluster when the snapshot was created. This field is otherwise
--- ignored: Manual snapshots do not expire, and can only be deleted using the /DeleteSnapshot/ action.
---
--- Important
--- If the value of SnapshotRetentionLimit is set to zero (0), backups
--- are turned off.
-sSnapshotRetentionLimit :: Lens' Snapshot (Maybe Int)
-sSnapshotRetentionLimit =
-    lens _sSnapshotRetentionLimit (\s a -> s { _sSnapshotRetentionLimit = a })
-
--- | Indicates whether the snapshot is from an automatic backup ('automated') or was
--- created manually ('manual').
-sSnapshotSource :: Lens' Snapshot (Maybe Text)
-sSnapshotSource = lens _sSnapshotSource (\s a -> s { _sSnapshotSource = a })
-
--- | The status of the snapshot. Valid values: 'creating' | 'available' | 'restoring' | 'copying' | 'deleting'.
-sSnapshotStatus :: Lens' Snapshot (Maybe Text)
-sSnapshotStatus = lens _sSnapshotStatus (\s a -> s { _sSnapshotStatus = a })
-
--- | The daily time range during which ElastiCache takes daily snapshots of the
--- source cache cluster.
-sSnapshotWindow :: Lens' Snapshot (Maybe Text)
-sSnapshotWindow = lens _sSnapshotWindow (\s a -> s { _sSnapshotWindow = a })
-
--- | The Amazon Resource Name (ARN) for the topic used by the source cache cluster
--- for publishing notifications.
-sTopicArn :: Lens' Snapshot (Maybe Text)
-sTopicArn = lens _sTopicArn (\s a -> s { _sTopicArn = a })
-
--- | The Amazon Virtual Private Cloud identifier (VPC ID) of the cache subnet
--- group for the source cache cluster.
-sVpcId :: Lens' Snapshot (Maybe Text)
-sVpcId = lens _sVpcId (\s a -> s { _sVpcId = a })
-
-instance FromXML Snapshot where
-    parseXML x = Snapshot
-        <$> x .@? "AutoMinorVersionUpgrade"
-        <*> x .@? "CacheClusterCreateTime"
-        <*> x .@? "CacheClusterId"
-        <*> x .@? "CacheNodeType"
-        <*> x .@? "CacheParameterGroupName"
-        <*> x .@? "CacheSubnetGroupName"
-        <*> x .@? "Engine"
-        <*> x .@? "EngineVersion"
-        <*> x .@? "NodeSnapshots" .!@ mempty
-        <*> x .@? "NumCacheNodes"
-        <*> x .@? "Port"
-        <*> x .@? "PreferredAvailabilityZone"
-        <*> x .@? "PreferredMaintenanceWindow"
-        <*> x .@? "SnapshotName"
-        <*> x .@? "SnapshotRetentionLimit"
-        <*> x .@? "SnapshotSource"
-        <*> x .@? "SnapshotStatus"
-        <*> x .@? "SnapshotWindow"
-        <*> x .@? "TopicArn"
-        <*> x .@? "VpcId"
-
-instance ToQuery Snapshot where
-    toQuery Snapshot{..} = mconcat
-        [ "AutoMinorVersionUpgrade"    =? _sAutoMinorVersionUpgrade
-        , "CacheClusterCreateTime"     =? _sCacheClusterCreateTime
-        , "CacheClusterId"             =? _sCacheClusterId
-        , "CacheNodeType"              =? _sCacheNodeType
-        , "CacheParameterGroupName"    =? _sCacheParameterGroupName
-        , "CacheSubnetGroupName"       =? _sCacheSubnetGroupName
-        , "Engine"                     =? _sEngine
-        , "EngineVersion"              =? _sEngineVersion
-        , "NodeSnapshots"              =? _sNodeSnapshots
-        , "NumCacheNodes"              =? _sNumCacheNodes
-        , "Port"                       =? _sPort
-        , "PreferredAvailabilityZone"  =? _sPreferredAvailabilityZone
-        , "PreferredMaintenanceWindow" =? _sPreferredMaintenanceWindow
-        , "SnapshotName"               =? _sSnapshotName
-        , "SnapshotRetentionLimit"     =? _sSnapshotRetentionLimit
-        , "SnapshotSource"             =? _sSnapshotSource
-        , "SnapshotStatus"             =? _sSnapshotStatus
-        , "SnapshotWindow"             =? _sSnapshotWindow
-        , "TopicArn"                   =? _sTopicArn
-        , "VpcId"                      =? _sVpcId
-        ]
-
-data Event = Event
-    { _eDate             :: Maybe ISO8601
-    , _eMessage          :: Maybe Text
-    , _eSourceIdentifier :: Maybe Text
-    , _eSourceType       :: Maybe SourceType
-    } deriving (Eq, Read, Show)
-
--- | 'Event' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'eDate' @::@ 'Maybe' 'UTCTime'
---
--- * 'eMessage' @::@ 'Maybe' 'Text'
---
--- * 'eSourceIdentifier' @::@ 'Maybe' 'Text'
---
--- * 'eSourceType' @::@ 'Maybe' 'SourceType'
---
-event :: Event
-event = Event
-    { _eSourceIdentifier = Nothing
-    , _eSourceType       = Nothing
-    , _eMessage          = Nothing
-    , _eDate             = Nothing
-    }
-
--- | The date and time when the event occurred.
-eDate :: Lens' Event (Maybe UTCTime)
-eDate = lens _eDate (\s a -> s { _eDate = a }) . mapping _Time
-
--- | The text of the event.
-eMessage :: Lens' Event (Maybe Text)
-eMessage = lens _eMessage (\s a -> s { _eMessage = a })
-
--- | The identifier for the source of the event. For example, if the event
--- occurred at the cache cluster level, the identifier would be the name of the
--- cache cluster.
-eSourceIdentifier :: Lens' Event (Maybe Text)
-eSourceIdentifier =
-    lens _eSourceIdentifier (\s a -> s { _eSourceIdentifier = a })
-
--- | Specifies the origin of this event - a cache cluster, a parameter group, a
--- security group, etc.
-eSourceType :: Lens' Event (Maybe SourceType)
-eSourceType = lens _eSourceType (\s a -> s { _eSourceType = a })
-
-instance FromXML Event where
-    parseXML x = Event
-        <$> x .@? "Date"
-        <*> x .@? "Message"
-        <*> x .@? "SourceIdentifier"
-        <*> x .@? "SourceType"
-
-instance ToQuery Event where
-    toQuery Event{..} = mconcat
-        [ "Date"             =? _eDate
-        , "Message"          =? _eMessage
-        , "SourceIdentifier" =? _eSourceIdentifier
-        , "SourceType"       =? _eSourceType
-        ]
-
-data NodeGroup = NodeGroup
-    { _ngNodeGroupId      :: Maybe Text
-    , _ngNodeGroupMembers :: List "member" NodeGroupMember
-    , _ngPrimaryEndpoint  :: Maybe Endpoint
-    , _ngStatus           :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'NodeGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ngNodeGroupId' @::@ 'Maybe' 'Text'
---
--- * 'ngNodeGroupMembers' @::@ ['NodeGroupMember']
---
--- * 'ngPrimaryEndpoint' @::@ 'Maybe' 'Endpoint'
---
--- * 'ngStatus' @::@ 'Maybe' 'Text'
---
-nodeGroup :: NodeGroup
-nodeGroup = NodeGroup
-    { _ngNodeGroupId      = Nothing
-    , _ngStatus           = Nothing
-    , _ngPrimaryEndpoint  = Nothing
-    , _ngNodeGroupMembers = mempty
-    }
-
--- | The identifier for the node group. A replication group contains only one node
--- group; therefore, the node group ID is 0001.
-ngNodeGroupId :: Lens' NodeGroup (Maybe Text)
-ngNodeGroupId = lens _ngNodeGroupId (\s a -> s { _ngNodeGroupId = a })
-
--- | A list containing information about individual nodes within the node group.
-ngNodeGroupMembers :: Lens' NodeGroup [NodeGroupMember]
-ngNodeGroupMembers =
-    lens _ngNodeGroupMembers (\s a -> s { _ngNodeGroupMembers = a })
-        . _List
-
-ngPrimaryEndpoint :: Lens' NodeGroup (Maybe Endpoint)
-ngPrimaryEndpoint =
-    lens _ngPrimaryEndpoint (\s a -> s { _ngPrimaryEndpoint = a })
-
--- | The current state of this replication group - /creating/, /available/, etc.
-ngStatus :: Lens' NodeGroup (Maybe Text)
-ngStatus = lens _ngStatus (\s a -> s { _ngStatus = a })
-
-instance FromXML NodeGroup where
-    parseXML x = NodeGroup
-        <$> x .@? "NodeGroupId"
-        <*> x .@? "NodeGroupMembers" .!@ mempty
-        <*> x .@? "PrimaryEndpoint"
-        <*> x .@? "Status"
-
-instance ToQuery NodeGroup where
-    toQuery NodeGroup{..} = mconcat
-        [ "NodeGroupId"      =? _ngNodeGroupId
-        , "NodeGroupMembers" =? _ngNodeGroupMembers
-        , "PrimaryEndpoint"  =? _ngPrimaryEndpoint
-        , "Status"           =? _ngStatus
-        ]
-
-data CacheNodeTypeSpecificValue = CacheNodeTypeSpecificValue
-    { _cntsvCacheNodeType :: Maybe Text
-    , _cntsvValue         :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'CacheNodeTypeSpecificValue' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cntsvCacheNodeType' @::@ 'Maybe' 'Text'
---
--- * 'cntsvValue' @::@ 'Maybe' 'Text'
---
-cacheNodeTypeSpecificValue :: CacheNodeTypeSpecificValue
-cacheNodeTypeSpecificValue = CacheNodeTypeSpecificValue
-    { _cntsvCacheNodeType = Nothing
-    , _cntsvValue         = Nothing
-    }
-
--- | The cache node type for which this value applies.
-cntsvCacheNodeType :: Lens' CacheNodeTypeSpecificValue (Maybe Text)
-cntsvCacheNodeType =
-    lens _cntsvCacheNodeType (\s a -> s { _cntsvCacheNodeType = a })
-
--- | The value for the cache node type.
-cntsvValue :: Lens' CacheNodeTypeSpecificValue (Maybe Text)
-cntsvValue = lens _cntsvValue (\s a -> s { _cntsvValue = a })
-
-instance FromXML CacheNodeTypeSpecificValue where
-    parseXML x = CacheNodeTypeSpecificValue
-        <$> x .@? "CacheNodeType"
-        <*> x .@? "Value"
-
-instance ToQuery CacheNodeTypeSpecificValue where
-    toQuery CacheNodeTypeSpecificValue{..} = mconcat
-        [ "CacheNodeType" =? _cntsvCacheNodeType
-        , "Value"         =? _cntsvValue
-        ]
-
-data Tag = Tag
-    { _tagKey   :: Maybe Text
-    , _tagValue :: Maybe Text
-    } deriving (Eq, Ord, Read, 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 for the tag.
-tagKey :: Lens' Tag (Maybe Text)
-tagKey = lens _tagKey (\s a -> s { _tagKey = a })
-
--- | The tag's value. May not be null.
-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 PendingAutomaticFailoverStatus
-    = Disabled -- ^ disabled
-    | Enabled  -- ^ enabled
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable PendingAutomaticFailoverStatus
-
-instance FromText PendingAutomaticFailoverStatus where
-    parser = takeLowerText >>= \case
-        "disabled" -> pure Disabled
-        "enabled"  -> pure Enabled
-        e          -> fail $
-            "Failure parsing PendingAutomaticFailoverStatus from " ++ show e
-
-instance ToText PendingAutomaticFailoverStatus where
-    toText = \case
-        Disabled -> "disabled"
-        Enabled  -> "enabled"
-
-instance ToByteString PendingAutomaticFailoverStatus
-instance ToHeader     PendingAutomaticFailoverStatus
-instance ToQuery      PendingAutomaticFailoverStatus
-
-instance FromXML PendingAutomaticFailoverStatus where
-    parseXML = parseXMLText "PendingAutomaticFailoverStatus"
-
-data NotificationConfiguration = NotificationConfiguration
-    { _ncTopicArn    :: Maybe Text
-    , _ncTopicStatus :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'NotificationConfiguration' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ncTopicArn' @::@ 'Maybe' 'Text'
---
--- * 'ncTopicStatus' @::@ 'Maybe' 'Text'
---
-notificationConfiguration :: NotificationConfiguration
-notificationConfiguration = NotificationConfiguration
-    { _ncTopicArn    = Nothing
-    , _ncTopicStatus = Nothing
-    }
-
--- | The Amazon Resource Name (ARN) that identifies the topic.
-ncTopicArn :: Lens' NotificationConfiguration (Maybe Text)
-ncTopicArn = lens _ncTopicArn (\s a -> s { _ncTopicArn = a })
-
--- | The current state of the topic.
-ncTopicStatus :: Lens' NotificationConfiguration (Maybe Text)
-ncTopicStatus = lens _ncTopicStatus (\s a -> s { _ncTopicStatus = a })
-
-instance FromXML NotificationConfiguration where
-    parseXML x = NotificationConfiguration
-        <$> x .@? "TopicArn"
-        <*> x .@? "TopicStatus"
-
-instance ToQuery NotificationConfiguration where
-    toQuery NotificationConfiguration{..} = mconcat
-        [ "TopicArn"    =? _ncTopicArn
-        , "TopicStatus" =? _ncTopicStatus
-        ]
-
-data ReplicationGroupPendingModifiedValues = ReplicationGroupPendingModifiedValues
-    { _rgpmvAutomaticFailoverStatus :: Maybe PendingAutomaticFailoverStatus
-    , _rgpmvPrimaryClusterId        :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'ReplicationGroupPendingModifiedValues' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rgpmvAutomaticFailoverStatus' @::@ 'Maybe' 'PendingAutomaticFailoverStatus'
---
--- * 'rgpmvPrimaryClusterId' @::@ 'Maybe' 'Text'
---
-replicationGroupPendingModifiedValues :: ReplicationGroupPendingModifiedValues
-replicationGroupPendingModifiedValues = ReplicationGroupPendingModifiedValues
-    { _rgpmvPrimaryClusterId        = Nothing
-    , _rgpmvAutomaticFailoverStatus = Nothing
-    }
-
--- | Indicates the status of Multi-AZ for this replication group.
---
--- ElastiCache Multi-AZ replication groups are not supported on:
---
--- Redis versions earlier than 2.8.6. T1 and T2 cache node types.
-rgpmvAutomaticFailoverStatus :: Lens' ReplicationGroupPendingModifiedValues (Maybe PendingAutomaticFailoverStatus)
-rgpmvAutomaticFailoverStatus =
-    lens _rgpmvAutomaticFailoverStatus
-        (\s a -> s { _rgpmvAutomaticFailoverStatus = a })
-
--- | The primary cluster ID which will be applied immediately (if '--apply-immediately' was specified), or during the next maintenance window.
-rgpmvPrimaryClusterId :: Lens' ReplicationGroupPendingModifiedValues (Maybe Text)
-rgpmvPrimaryClusterId =
-    lens _rgpmvPrimaryClusterId (\s a -> s { _rgpmvPrimaryClusterId = a })
-
-instance FromXML ReplicationGroupPendingModifiedValues where
-    parseXML x = ReplicationGroupPendingModifiedValues
-        <$> x .@? "AutomaticFailoverStatus"
-        <*> x .@? "PrimaryClusterId"
-
-instance ToQuery ReplicationGroupPendingModifiedValues where
-    toQuery ReplicationGroupPendingModifiedValues{..} = mconcat
-        [ "AutomaticFailoverStatus" =? _rgpmvAutomaticFailoverStatus
-        , "PrimaryClusterId"        =? _rgpmvPrimaryClusterId
-        ]
-
-data EC2SecurityGroup = EC2SecurityGroup
-    { _ecsgEC2SecurityGroupName    :: Maybe Text
-    , _ecsgEC2SecurityGroupOwnerId :: Maybe Text
-    , _ecsgStatus                  :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'EC2SecurityGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ecsgEC2SecurityGroupName' @::@ 'Maybe' 'Text'
---
--- * 'ecsgEC2SecurityGroupOwnerId' @::@ 'Maybe' 'Text'
---
--- * 'ecsgStatus' @::@ 'Maybe' 'Text'
---
-ec2SecurityGroup :: EC2SecurityGroup
-ec2SecurityGroup = EC2SecurityGroup
-    { _ecsgStatus                  = Nothing
-    , _ecsgEC2SecurityGroupName    = Nothing
-    , _ecsgEC2SecurityGroupOwnerId = Nothing
-    }
-
--- | The name of the Amazon EC2 security group.
-ecsgEC2SecurityGroupName :: Lens' EC2SecurityGroup (Maybe Text)
-ecsgEC2SecurityGroupName =
-    lens _ecsgEC2SecurityGroupName
-        (\s a -> s { _ecsgEC2SecurityGroupName = a })
-
--- | The AWS account ID of the Amazon EC2 security group owner.
-ecsgEC2SecurityGroupOwnerId :: Lens' EC2SecurityGroup (Maybe Text)
-ecsgEC2SecurityGroupOwnerId =
-    lens _ecsgEC2SecurityGroupOwnerId
-        (\s a -> s { _ecsgEC2SecurityGroupOwnerId = a })
-
--- | The status of the Amazon EC2 security group.
-ecsgStatus :: Lens' EC2SecurityGroup (Maybe Text)
-ecsgStatus = lens _ecsgStatus (\s a -> s { _ecsgStatus = a })
-
-instance FromXML EC2SecurityGroup where
-    parseXML x = EC2SecurityGroup
-        <$> x .@? "EC2SecurityGroupName"
-        <*> x .@? "EC2SecurityGroupOwnerId"
-        <*> x .@? "Status"
-
-instance ToQuery EC2SecurityGroup where
-    toQuery EC2SecurityGroup{..} = mconcat
-        [ "EC2SecurityGroupName"    =? _ecsgEC2SecurityGroupName
-        , "EC2SecurityGroupOwnerId" =? _ecsgEC2SecurityGroupOwnerId
-        , "Status"                  =? _ecsgStatus
-        ]
-
-data ParameterNameValue = ParameterNameValue
-    { _pnvParameterName  :: Maybe Text
-    , _pnvParameterValue :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'ParameterNameValue' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'pnvParameterName' @::@ 'Maybe' 'Text'
---
--- * 'pnvParameterValue' @::@ 'Maybe' 'Text'
---
-parameterNameValue :: ParameterNameValue
-parameterNameValue = ParameterNameValue
-    { _pnvParameterName  = Nothing
-    , _pnvParameterValue = Nothing
-    }
-
--- | The name of the parameter.
-pnvParameterName :: Lens' ParameterNameValue (Maybe Text)
-pnvParameterName = lens _pnvParameterName (\s a -> s { _pnvParameterName = a })
-
--- | The value of the parameter.
-pnvParameterValue :: Lens' ParameterNameValue (Maybe Text)
-pnvParameterValue =
-    lens _pnvParameterValue (\s a -> s { _pnvParameterValue = a })
-
-instance FromXML ParameterNameValue where
-    parseXML x = ParameterNameValue
-        <$> x .@? "ParameterName"
-        <*> x .@? "ParameterValue"
-
-instance ToQuery ParameterNameValue where
-    toQuery ParameterNameValue{..} = mconcat
-        [ "ParameterName"  =? _pnvParameterName
-        , "ParameterValue" =? _pnvParameterValue
-        ]
-
-data SourceType
-    = STCacheCluster        -- ^ cache-cluster
-    | STCacheParameterGroup -- ^ cache-parameter-group
-    | STCacheSecurityGroup  -- ^ cache-security-group
-    | STCacheSubnetGroup    -- ^ cache-subnet-group
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable SourceType
-
-instance FromText SourceType where
-    parser = takeLowerText >>= \case
-        "cache-cluster"         -> pure STCacheCluster
-        "cache-parameter-group" -> pure STCacheParameterGroup
-        "cache-security-group"  -> pure STCacheSecurityGroup
-        "cache-subnet-group"    -> pure STCacheSubnetGroup
-        e                       -> fail $
-            "Failure parsing SourceType from " ++ show e
-
-instance ToText SourceType where
-    toText = \case
-        STCacheCluster        -> "cache-cluster"
-        STCacheParameterGroup -> "cache-parameter-group"
-        STCacheSecurityGroup  -> "cache-security-group"
-        STCacheSubnetGroup    -> "cache-subnet-group"
-
-instance ToByteString SourceType
-instance ToHeader     SourceType
-instance ToQuery      SourceType
-
-instance FromXML SourceType where
-    parseXML = parseXMLText "SourceType"
-
-data CacheSubnetGroup = CacheSubnetGroup
-    { _csgCacheSubnetGroupDescription :: Maybe Text
-    , _csgCacheSubnetGroupName        :: Maybe Text
-    , _csgSubnets                     :: List "member" Subnet
-    , _csgVpcId                       :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'CacheSubnetGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csgCacheSubnetGroupDescription' @::@ 'Maybe' 'Text'
---
--- * 'csgCacheSubnetGroupName' @::@ 'Maybe' 'Text'
---
--- * 'csgSubnets' @::@ ['Subnet']
---
--- * 'csgVpcId' @::@ 'Maybe' 'Text'
---
-cacheSubnetGroup :: CacheSubnetGroup
-cacheSubnetGroup = CacheSubnetGroup
-    { _csgCacheSubnetGroupName        = Nothing
-    , _csgCacheSubnetGroupDescription = Nothing
-    , _csgVpcId                       = Nothing
-    , _csgSubnets                     = mempty
-    }
-
--- | The description of the cache subnet group.
-csgCacheSubnetGroupDescription :: Lens' CacheSubnetGroup (Maybe Text)
-csgCacheSubnetGroupDescription =
-    lens _csgCacheSubnetGroupDescription
-        (\s a -> s { _csgCacheSubnetGroupDescription = a })
-
--- | The name of the cache subnet group.
-csgCacheSubnetGroupName :: Lens' CacheSubnetGroup (Maybe Text)
-csgCacheSubnetGroupName =
-    lens _csgCacheSubnetGroupName (\s a -> s { _csgCacheSubnetGroupName = a })
-
--- | A list of subnets associated with the cache subnet group.
-csgSubnets :: Lens' CacheSubnetGroup [Subnet]
-csgSubnets = lens _csgSubnets (\s a -> s { _csgSubnets = a }) . _List
-
--- | The Amazon Virtual Private Cloud identifier (VPC ID) of the cache subnet
--- group.
-csgVpcId :: Lens' CacheSubnetGroup (Maybe Text)
-csgVpcId = lens _csgVpcId (\s a -> s { _csgVpcId = a })
-
-instance FromXML CacheSubnetGroup where
-    parseXML x = CacheSubnetGroup
-        <$> x .@? "CacheSubnetGroupDescription"
-        <*> x .@? "CacheSubnetGroupName"
-        <*> x .@? "Subnets" .!@ mempty
-        <*> x .@? "VpcId"
-
-instance ToQuery CacheSubnetGroup where
-    toQuery CacheSubnetGroup{..} = mconcat
-        [ "CacheSubnetGroupDescription" =? _csgCacheSubnetGroupDescription
-        , "CacheSubnetGroupName"        =? _csgCacheSubnetGroupName
-        , "Subnets"                     =? _csgSubnets
-        , "VpcId"                       =? _csgVpcId
-        ]
-
-data ReservedCacheNode = ReservedCacheNode
-    { _rcnCacheNodeCount               :: Maybe Int
-    , _rcnCacheNodeType                :: Maybe Text
-    , _rcnDuration                     :: Maybe Int
-    , _rcnFixedPrice                   :: Maybe Double
-    , _rcnOfferingType                 :: Maybe Text
-    , _rcnProductDescription           :: Maybe Text
-    , _rcnRecurringCharges             :: List "member" RecurringCharge
-    , _rcnReservedCacheNodeId          :: Maybe Text
-    , _rcnReservedCacheNodesOfferingId :: Maybe Text
-    , _rcnStartTime                    :: Maybe ISO8601
-    , _rcnState                        :: Maybe Text
-    , _rcnUsagePrice                   :: Maybe Double
-    } deriving (Eq, Read, Show)
-
--- | 'ReservedCacheNode' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rcnCacheNodeCount' @::@ 'Maybe' 'Int'
---
--- * 'rcnCacheNodeType' @::@ 'Maybe' 'Text'
---
--- * 'rcnDuration' @::@ 'Maybe' 'Int'
---
--- * 'rcnFixedPrice' @::@ 'Maybe' 'Double'
---
--- * 'rcnOfferingType' @::@ 'Maybe' 'Text'
---
--- * 'rcnProductDescription' @::@ 'Maybe' 'Text'
---
--- * 'rcnRecurringCharges' @::@ ['RecurringCharge']
---
--- * 'rcnReservedCacheNodeId' @::@ 'Maybe' 'Text'
---
--- * 'rcnReservedCacheNodesOfferingId' @::@ 'Maybe' 'Text'
---
--- * 'rcnStartTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'rcnState' @::@ 'Maybe' 'Text'
---
--- * 'rcnUsagePrice' @::@ 'Maybe' 'Double'
---
-reservedCacheNode :: ReservedCacheNode
-reservedCacheNode = ReservedCacheNode
-    { _rcnReservedCacheNodeId          = Nothing
-    , _rcnReservedCacheNodesOfferingId = Nothing
-    , _rcnCacheNodeType                = Nothing
-    , _rcnStartTime                    = Nothing
-    , _rcnDuration                     = Nothing
-    , _rcnFixedPrice                   = Nothing
-    , _rcnUsagePrice                   = Nothing
-    , _rcnCacheNodeCount               = Nothing
-    , _rcnProductDescription           = Nothing
-    , _rcnOfferingType                 = Nothing
-    , _rcnState                        = Nothing
-    , _rcnRecurringCharges             = mempty
-    }
-
--- | The number of cache nodes that have been reserved.
-rcnCacheNodeCount :: Lens' ReservedCacheNode (Maybe Int)
-rcnCacheNodeCount =
-    lens _rcnCacheNodeCount (\s a -> s { _rcnCacheNodeCount = a })
-
--- | The cache node type for the reserved cache nodes.
---
--- Valid node types are as follows:
---
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
---
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-rcnCacheNodeType :: Lens' ReservedCacheNode (Maybe Text)
-rcnCacheNodeType = lens _rcnCacheNodeType (\s a -> s { _rcnCacheNodeType = a })
-
--- | The duration of the reservation in seconds.
-rcnDuration :: Lens' ReservedCacheNode (Maybe Int)
-rcnDuration = lens _rcnDuration (\s a -> s { _rcnDuration = a })
-
--- | The fixed price charged for this reserved cache node.
-rcnFixedPrice :: Lens' ReservedCacheNode (Maybe Double)
-rcnFixedPrice = lens _rcnFixedPrice (\s a -> s { _rcnFixedPrice = a })
-
--- | The offering type of this reserved cache node.
-rcnOfferingType :: Lens' ReservedCacheNode (Maybe Text)
-rcnOfferingType = lens _rcnOfferingType (\s a -> s { _rcnOfferingType = a })
-
--- | The description of the reserved cache node.
-rcnProductDescription :: Lens' ReservedCacheNode (Maybe Text)
-rcnProductDescription =
-    lens _rcnProductDescription (\s a -> s { _rcnProductDescription = a })
-
--- | The recurring price charged to run this reserved cache node.
-rcnRecurringCharges :: Lens' ReservedCacheNode [RecurringCharge]
-rcnRecurringCharges =
-    lens _rcnRecurringCharges (\s a -> s { _rcnRecurringCharges = a })
-        . _List
-
--- | The unique identifier for the reservation.
-rcnReservedCacheNodeId :: Lens' ReservedCacheNode (Maybe Text)
-rcnReservedCacheNodeId =
-    lens _rcnReservedCacheNodeId (\s a -> s { _rcnReservedCacheNodeId = a })
-
--- | The offering identifier.
-rcnReservedCacheNodesOfferingId :: Lens' ReservedCacheNode (Maybe Text)
-rcnReservedCacheNodesOfferingId =
-    lens _rcnReservedCacheNodesOfferingId
-        (\s a -> s { _rcnReservedCacheNodesOfferingId = a })
-
--- | The time the reservation started.
-rcnStartTime :: Lens' ReservedCacheNode (Maybe UTCTime)
-rcnStartTime = lens _rcnStartTime (\s a -> s { _rcnStartTime = a }) . mapping _Time
-
--- | The state of the reserved cache node.
-rcnState :: Lens' ReservedCacheNode (Maybe Text)
-rcnState = lens _rcnState (\s a -> s { _rcnState = a })
-
--- | The hourly price charged for this reserved cache node.
-rcnUsagePrice :: Lens' ReservedCacheNode (Maybe Double)
-rcnUsagePrice = lens _rcnUsagePrice (\s a -> s { _rcnUsagePrice = a })
-
-instance FromXML ReservedCacheNode where
-    parseXML x = ReservedCacheNode
-        <$> x .@? "CacheNodeCount"
-        <*> x .@? "CacheNodeType"
-        <*> x .@? "Duration"
-        <*> x .@? "FixedPrice"
-        <*> x .@? "OfferingType"
-        <*> x .@? "ProductDescription"
-        <*> x .@? "RecurringCharges" .!@ mempty
-        <*> x .@? "ReservedCacheNodeId"
-        <*> x .@? "ReservedCacheNodesOfferingId"
-        <*> x .@? "StartTime"
-        <*> x .@? "State"
-        <*> x .@? "UsagePrice"
-
-instance ToQuery ReservedCacheNode where
-    toQuery ReservedCacheNode{..} = mconcat
-        [ "CacheNodeCount"               =? _rcnCacheNodeCount
-        , "CacheNodeType"                =? _rcnCacheNodeType
-        , "Duration"                     =? _rcnDuration
-        , "FixedPrice"                   =? _rcnFixedPrice
-        , "OfferingType"                 =? _rcnOfferingType
-        , "ProductDescription"           =? _rcnProductDescription
-        , "RecurringCharges"             =? _rcnRecurringCharges
-        , "ReservedCacheNodeId"          =? _rcnReservedCacheNodeId
-        , "ReservedCacheNodesOfferingId" =? _rcnReservedCacheNodesOfferingId
-        , "StartTime"                    =? _rcnStartTime
-        , "State"                        =? _rcnState
-        , "UsagePrice"                   =? _rcnUsagePrice
-        ]
-
-data Subnet = Subnet
-    { _sSubnetAvailabilityZone :: Maybe AvailabilityZone
-    , _sSubnetIdentifier       :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'Subnet' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sSubnetAvailabilityZone' @::@ 'Maybe' 'AvailabilityZone'
---
--- * 'sSubnetIdentifier' @::@ 'Maybe' 'Text'
---
-subnet :: Subnet
-subnet = Subnet
-    { _sSubnetIdentifier       = Nothing
-    , _sSubnetAvailabilityZone = Nothing
-    }
-
--- | The Availability Zone associated with the subnet.
-sSubnetAvailabilityZone :: Lens' Subnet (Maybe AvailabilityZone)
-sSubnetAvailabilityZone =
-    lens _sSubnetAvailabilityZone (\s a -> s { _sSubnetAvailabilityZone = a })
-
--- | The unique identifier for the subnet.
-sSubnetIdentifier :: Lens' Subnet (Maybe Text)
-sSubnetIdentifier =
-    lens _sSubnetIdentifier (\s a -> s { _sSubnetIdentifier = a })
-
-instance FromXML Subnet where
-    parseXML x = Subnet
-        <$> x .@? "SubnetAvailabilityZone"
-        <*> x .@? "SubnetIdentifier"
-
-instance ToQuery Subnet where
-    toQuery Subnet{..} = mconcat
-        [ "SubnetAvailabilityZone" =? _sSubnetAvailabilityZone
-        , "SubnetIdentifier"       =? _sSubnetIdentifier
-        ]
-
-data SecurityGroupMembership = SecurityGroupMembership
-    { _sgmSecurityGroupId :: Maybe Text
-    , _sgmStatus          :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'SecurityGroupMembership' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sgmSecurityGroupId' @::@ 'Maybe' 'Text'
---
--- * 'sgmStatus' @::@ 'Maybe' 'Text'
---
-securityGroupMembership :: SecurityGroupMembership
-securityGroupMembership = SecurityGroupMembership
-    { _sgmSecurityGroupId = Nothing
-    , _sgmStatus          = Nothing
-    }
-
--- | The identifier of the cache security group.
-sgmSecurityGroupId :: Lens' SecurityGroupMembership (Maybe Text)
-sgmSecurityGroupId =
-    lens _sgmSecurityGroupId (\s a -> s { _sgmSecurityGroupId = a })
-
--- | The status of the cache security group membership. The status changes
--- whenever a cache security group is modified, or when the cache security
--- groups assigned to a cache cluster are modified.
-sgmStatus :: Lens' SecurityGroupMembership (Maybe Text)
-sgmStatus = lens _sgmStatus (\s a -> s { _sgmStatus = a })
-
-instance FromXML SecurityGroupMembership where
-    parseXML x = SecurityGroupMembership
-        <$> x .@? "SecurityGroupId"
-        <*> x .@? "Status"
-
-instance ToQuery SecurityGroupMembership where
-    toQuery SecurityGroupMembership{..} = mconcat
-        [ "SecurityGroupId" =? _sgmSecurityGroupId
-        , "Status"          =? _sgmStatus
-        ]
-
-data CacheCluster = CacheCluster
-    { _ccAutoMinorVersionUpgrade    :: Maybe Bool
-    , _ccCacheClusterCreateTime     :: Maybe ISO8601
-    , _ccCacheClusterId             :: Maybe Text
-    , _ccCacheClusterStatus         :: Maybe Text
-    , _ccCacheNodeType              :: Maybe Text
-    , _ccCacheNodes                 :: List "member" CacheNode
-    , _ccCacheParameterGroup        :: Maybe CacheParameterGroupStatus
-    , _ccCacheSecurityGroups        :: List "member" CacheSecurityGroupMembership
-    , _ccCacheSubnetGroupName       :: Maybe Text
-    , _ccClientDownloadLandingPage  :: Maybe Text
-    , _ccConfigurationEndpoint      :: Maybe Endpoint
-    , _ccEngine                     :: Maybe Text
-    , _ccEngineVersion              :: Maybe Text
-    , _ccNotificationConfiguration  :: Maybe NotificationConfiguration
-    , _ccNumCacheNodes              :: Maybe Int
-    , _ccPendingModifiedValues      :: Maybe PendingModifiedValues
-    , _ccPreferredAvailabilityZone  :: Maybe Text
-    , _ccPreferredMaintenanceWindow :: Maybe Text
-    , _ccReplicationGroupId         :: Maybe Text
-    , _ccSecurityGroups             :: List "member" SecurityGroupMembership
-    , _ccSnapshotRetentionLimit     :: Maybe Int
-    , _ccSnapshotWindow             :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'CacheCluster' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ccAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
---
--- * 'ccCacheClusterCreateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'ccCacheClusterId' @::@ 'Maybe' 'Text'
---
--- * 'ccCacheClusterStatus' @::@ 'Maybe' 'Text'
---
--- * 'ccCacheNodeType' @::@ 'Maybe' 'Text'
---
--- * 'ccCacheNodes' @::@ ['CacheNode']
---
--- * 'ccCacheParameterGroup' @::@ 'Maybe' 'CacheParameterGroupStatus'
---
--- * 'ccCacheSecurityGroups' @::@ ['CacheSecurityGroupMembership']
---
--- * 'ccCacheSubnetGroupName' @::@ 'Maybe' 'Text'
---
--- * 'ccClientDownloadLandingPage' @::@ 'Maybe' 'Text'
---
--- * 'ccConfigurationEndpoint' @::@ 'Maybe' 'Endpoint'
---
--- * 'ccEngine' @::@ 'Maybe' 'Text'
---
--- * 'ccEngineVersion' @::@ 'Maybe' 'Text'
---
--- * 'ccNotificationConfiguration' @::@ 'Maybe' 'NotificationConfiguration'
---
--- * 'ccNumCacheNodes' @::@ 'Maybe' 'Int'
---
--- * 'ccPendingModifiedValues' @::@ 'Maybe' 'PendingModifiedValues'
---
--- * 'ccPreferredAvailabilityZone' @::@ 'Maybe' 'Text'
---
--- * 'ccPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
---
--- * 'ccReplicationGroupId' @::@ 'Maybe' 'Text'
---
--- * 'ccSecurityGroups' @::@ ['SecurityGroupMembership']
---
--- * 'ccSnapshotRetentionLimit' @::@ 'Maybe' 'Int'
---
--- * 'ccSnapshotWindow' @::@ 'Maybe' 'Text'
---
-cacheCluster :: CacheCluster
-cacheCluster = CacheCluster
-    { _ccCacheClusterId             = Nothing
-    , _ccConfigurationEndpoint      = Nothing
-    , _ccClientDownloadLandingPage  = Nothing
-    , _ccCacheNodeType              = Nothing
-    , _ccEngine                     = Nothing
-    , _ccEngineVersion              = Nothing
-    , _ccCacheClusterStatus         = Nothing
-    , _ccNumCacheNodes              = Nothing
-    , _ccPreferredAvailabilityZone  = Nothing
-    , _ccCacheClusterCreateTime     = Nothing
-    , _ccPreferredMaintenanceWindow = Nothing
-    , _ccPendingModifiedValues      = Nothing
-    , _ccNotificationConfiguration  = Nothing
-    , _ccCacheSecurityGroups        = mempty
-    , _ccCacheParameterGroup        = Nothing
-    , _ccCacheSubnetGroupName       = Nothing
-    , _ccCacheNodes                 = mempty
-    , _ccAutoMinorVersionUpgrade    = Nothing
-    , _ccSecurityGroups             = mempty
-    , _ccReplicationGroupId         = Nothing
-    , _ccSnapshotRetentionLimit     = Nothing
-    , _ccSnapshotWindow             = Nothing
-    }
-
--- | This parameter is currently disabled.
-ccAutoMinorVersionUpgrade :: Lens' CacheCluster (Maybe Bool)
-ccAutoMinorVersionUpgrade =
-    lens _ccAutoMinorVersionUpgrade
-        (\s a -> s { _ccAutoMinorVersionUpgrade = a })
-
--- | The date and time when the cache cluster was created.
-ccCacheClusterCreateTime :: Lens' CacheCluster (Maybe UTCTime)
-ccCacheClusterCreateTime =
-    lens _ccCacheClusterCreateTime
-        (\s a -> s { _ccCacheClusterCreateTime = a })
-            . mapping _Time
-
--- | The user-supplied identifier of the cache cluster. This identifier is a
--- unique key that identifies a cache cluster.
-ccCacheClusterId :: Lens' CacheCluster (Maybe Text)
-ccCacheClusterId = lens _ccCacheClusterId (\s a -> s { _ccCacheClusterId = a })
-
--- | The current state of this cache cluster, one of the following values: /available/, /creating/, /deleted/, /deleting/, /incompatible-network/, /modifying/, /rebootingcache cluster nodes/, /restore-failed/, or /snapshotting/.
-ccCacheClusterStatus :: Lens' CacheCluster (Maybe Text)
-ccCacheClusterStatus =
-    lens _ccCacheClusterStatus (\s a -> s { _ccCacheClusterStatus = a })
-
--- | The name of the compute and memory capacity node type for the cache cluster.
---
--- Valid node types are as follows:
---
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
---
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-ccCacheNodeType :: Lens' CacheCluster (Maybe Text)
-ccCacheNodeType = lens _ccCacheNodeType (\s a -> s { _ccCacheNodeType = a })
-
--- | A list of cache nodes that are members of the cache cluster.
-ccCacheNodes :: Lens' CacheCluster [CacheNode]
-ccCacheNodes = lens _ccCacheNodes (\s a -> s { _ccCacheNodes = a }) . _List
-
-ccCacheParameterGroup :: Lens' CacheCluster (Maybe CacheParameterGroupStatus)
-ccCacheParameterGroup =
-    lens _ccCacheParameterGroup (\s a -> s { _ccCacheParameterGroup = a })
-
--- | A list of cache security group elements, composed of name and status
--- sub-elements.
-ccCacheSecurityGroups :: Lens' CacheCluster [CacheSecurityGroupMembership]
-ccCacheSecurityGroups =
-    lens _ccCacheSecurityGroups (\s a -> s { _ccCacheSecurityGroups = a })
-        . _List
-
--- | The name of the cache subnet group associated with the cache cluster.
-ccCacheSubnetGroupName :: Lens' CacheCluster (Maybe Text)
-ccCacheSubnetGroupName =
-    lens _ccCacheSubnetGroupName (\s a -> s { _ccCacheSubnetGroupName = a })
-
--- | The URL of the web page where you can download the latest ElastiCache client
--- library.
-ccClientDownloadLandingPage :: Lens' CacheCluster (Maybe Text)
-ccClientDownloadLandingPage =
-    lens _ccClientDownloadLandingPage
-        (\s a -> s { _ccClientDownloadLandingPage = a })
-
-ccConfigurationEndpoint :: Lens' CacheCluster (Maybe Endpoint)
-ccConfigurationEndpoint =
-    lens _ccConfigurationEndpoint (\s a -> s { _ccConfigurationEndpoint = a })
-
--- | The name of the cache engine (/memcached/ or /redis/) to be used for this cache
--- cluster.
-ccEngine :: Lens' CacheCluster (Maybe Text)
-ccEngine = lens _ccEngine (\s a -> s { _ccEngine = a })
-
--- | The version of the cache engine version that is used in this cache cluster.
-ccEngineVersion :: Lens' CacheCluster (Maybe Text)
-ccEngineVersion = lens _ccEngineVersion (\s a -> s { _ccEngineVersion = a })
-
-ccNotificationConfiguration :: Lens' CacheCluster (Maybe NotificationConfiguration)
-ccNotificationConfiguration =
-    lens _ccNotificationConfiguration
-        (\s a -> s { _ccNotificationConfiguration = a })
-
--- | The number of cache nodes in the cache cluster.
---
--- For clusters running Redis, this value must be 1. For clusters running
--- Memcached, this value must be between 1 and 20.
-ccNumCacheNodes :: Lens' CacheCluster (Maybe Int)
-ccNumCacheNodes = lens _ccNumCacheNodes (\s a -> s { _ccNumCacheNodes = a })
-
-ccPendingModifiedValues :: Lens' CacheCluster (Maybe PendingModifiedValues)
-ccPendingModifiedValues =
-    lens _ccPendingModifiedValues (\s a -> s { _ccPendingModifiedValues = a })
-
--- | The name of the Availability Zone in which the cache cluster is located or
--- "Multiple" if the cache nodes are located in different Availability Zones.
-ccPreferredAvailabilityZone :: Lens' CacheCluster (Maybe Text)
-ccPreferredAvailabilityZone =
-    lens _ccPreferredAvailabilityZone
-        (\s a -> s { _ccPreferredAvailabilityZone = a })
-
--- | Specifies the weekly time range during which maintenance on the cache cluster
--- is performed. It is specified as a range in the format
--- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a
--- 60 minute period. Valid values for 'ddd' are:
---
--- 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat'  Example: 'sun:05:00-sun:09:00'
-ccPreferredMaintenanceWindow :: Lens' CacheCluster (Maybe Text)
-ccPreferredMaintenanceWindow =
-    lens _ccPreferredMaintenanceWindow
-        (\s a -> s { _ccPreferredMaintenanceWindow = a })
-
--- | The replication group to which this cache cluster belongs. If this field is
--- empty, the cache cluster is not associated with any replication group.
-ccReplicationGroupId :: Lens' CacheCluster (Maybe Text)
-ccReplicationGroupId =
-    lens _ccReplicationGroupId (\s a -> s { _ccReplicationGroupId = a })
-
--- | A list of VPC Security Groups associated with the cache cluster.
-ccSecurityGroups :: Lens' CacheCluster [SecurityGroupMembership]
-ccSecurityGroups = lens _ccSecurityGroups (\s a -> s { _ccSecurityGroups = a }) . _List
-
--- | The number of days for which ElastiCache will retain automatic cache cluster
--- snapshots before deleting them. For example, if you set /SnapshotRetentionLimit/
--- to 5, then a snapshot that was taken today will be retained for 5 days
--- before being deleted.
---
--- Important
--- If the value of SnapshotRetentionLimit is set to zero (0), backups
--- are turned off.
-ccSnapshotRetentionLimit :: Lens' CacheCluster (Maybe Int)
-ccSnapshotRetentionLimit =
-    lens _ccSnapshotRetentionLimit
-        (\s a -> s { _ccSnapshotRetentionLimit = a })
-
--- | The daily time range (in UTC) during which ElastiCache will begin taking a
--- daily snapshot of your cache cluster.
---
--- Example: '05:00-09:00'
-ccSnapshotWindow :: Lens' CacheCluster (Maybe Text)
-ccSnapshotWindow = lens _ccSnapshotWindow (\s a -> s { _ccSnapshotWindow = a })
-
-instance FromXML CacheCluster where
-    parseXML x = CacheCluster
-        <$> x .@? "AutoMinorVersionUpgrade"
-        <*> x .@? "CacheClusterCreateTime"
-        <*> x .@? "CacheClusterId"
-        <*> x .@? "CacheClusterStatus"
-        <*> x .@? "CacheNodeType"
-        <*> x .@? "CacheNodes" .!@ mempty
-        <*> x .@? "CacheParameterGroup"
-        <*> x .@? "CacheSecurityGroups" .!@ mempty
-        <*> x .@? "CacheSubnetGroupName"
-        <*> x .@? "ClientDownloadLandingPage"
-        <*> x .@? "ConfigurationEndpoint"
-        <*> x .@? "Engine"
-        <*> x .@? "EngineVersion"
-        <*> x .@? "NotificationConfiguration"
-        <*> x .@? "NumCacheNodes"
-        <*> x .@? "PendingModifiedValues"
-        <*> x .@? "PreferredAvailabilityZone"
-        <*> x .@? "PreferredMaintenanceWindow"
-        <*> x .@? "ReplicationGroupId"
-        <*> x .@? "SecurityGroups" .!@ mempty
-        <*> x .@? "SnapshotRetentionLimit"
-        <*> x .@? "SnapshotWindow"
-
-instance ToQuery CacheCluster where
-    toQuery CacheCluster{..} = mconcat
-        [ "AutoMinorVersionUpgrade"    =? _ccAutoMinorVersionUpgrade
-        , "CacheClusterCreateTime"     =? _ccCacheClusterCreateTime
-        , "CacheClusterId"             =? _ccCacheClusterId
-        , "CacheClusterStatus"         =? _ccCacheClusterStatus
-        , "CacheNodeType"              =? _ccCacheNodeType
-        , "CacheNodes"                 =? _ccCacheNodes
-        , "CacheParameterGroup"        =? _ccCacheParameterGroup
-        , "CacheSecurityGroups"        =? _ccCacheSecurityGroups
-        , "CacheSubnetGroupName"       =? _ccCacheSubnetGroupName
-        , "ClientDownloadLandingPage"  =? _ccClientDownloadLandingPage
-        , "ConfigurationEndpoint"      =? _ccConfigurationEndpoint
-        , "Engine"                     =? _ccEngine
-        , "EngineVersion"              =? _ccEngineVersion
-        , "NotificationConfiguration"  =? _ccNotificationConfiguration
-        , "NumCacheNodes"              =? _ccNumCacheNodes
-        , "PendingModifiedValues"      =? _ccPendingModifiedValues
-        , "PreferredAvailabilityZone"  =? _ccPreferredAvailabilityZone
-        , "PreferredMaintenanceWindow" =? _ccPreferredMaintenanceWindow
-        , "ReplicationGroupId"         =? _ccReplicationGroupId
-        , "SecurityGroups"             =? _ccSecurityGroups
-        , "SnapshotRetentionLimit"     =? _ccSnapshotRetentionLimit
-        , "SnapshotWindow"             =? _ccSnapshotWindow
-        ]
-
-data EngineDefaults = EngineDefaults
-    { _edCacheNodeTypeSpecificParameters :: List "member" CacheNodeTypeSpecificParameter
-    , _edCacheParameterGroupFamily       :: Maybe Text
-    , _edMarker                          :: Maybe Text
-    , _edParameters                      :: List "member" Parameter
-    } deriving (Eq, Read, Show)
-
--- | 'EngineDefaults' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'edCacheNodeTypeSpecificParameters' @::@ ['CacheNodeTypeSpecificParameter']
---
--- * 'edCacheParameterGroupFamily' @::@ 'Maybe' 'Text'
---
--- * 'edMarker' @::@ 'Maybe' 'Text'
---
--- * 'edParameters' @::@ ['Parameter']
---
-engineDefaults :: EngineDefaults
-engineDefaults = EngineDefaults
-    { _edCacheParameterGroupFamily       = Nothing
-    , _edMarker                          = Nothing
-    , _edParameters                      = mempty
-    , _edCacheNodeTypeSpecificParameters = mempty
-    }
-
--- | A list of parameters specific to a particular cache node type. Each element
--- in the list contains detailed information about one parameter.
-edCacheNodeTypeSpecificParameters :: Lens' EngineDefaults [CacheNodeTypeSpecificParameter]
-edCacheNodeTypeSpecificParameters =
-    lens _edCacheNodeTypeSpecificParameters
-        (\s a -> s { _edCacheNodeTypeSpecificParameters = a })
-            . _List
-
--- | Specifies the name of the cache parameter group family to which the engine
--- default parameters apply.
-edCacheParameterGroupFamily :: Lens' EngineDefaults (Maybe Text)
-edCacheParameterGroupFamily =
-    lens _edCacheParameterGroupFamily
-        (\s a -> s { _edCacheParameterGroupFamily = a })
-
--- | Provides an identifier to allow retrieval of paginated results.
-edMarker :: Lens' EngineDefaults (Maybe Text)
-edMarker = lens _edMarker (\s a -> s { _edMarker = a })
-
--- | Contains a list of engine default parameters.
-edParameters :: Lens' EngineDefaults [Parameter]
-edParameters = lens _edParameters (\s a -> s { _edParameters = a }) . _List
-
-instance FromXML EngineDefaults where
-    parseXML x = EngineDefaults
-        <$> x .@? "CacheNodeTypeSpecificParameters" .!@ mempty
-        <*> x .@? "CacheParameterGroupFamily"
-        <*> x .@? "Marker"
-        <*> x .@? "Parameters" .!@ mempty
-
-instance ToQuery EngineDefaults where
-    toQuery EngineDefaults{..} = mconcat
-        [ "CacheNodeTypeSpecificParameters" =? _edCacheNodeTypeSpecificParameters
-        , "CacheParameterGroupFamily"       =? _edCacheParameterGroupFamily
-        , "Marker"                          =? _edMarker
-        , "Parameters"                      =? _edParameters
-        ]
-
-data CacheParameterGroupStatus = CacheParameterGroupStatus
-    { _cpgsCacheNodeIdsToReboot    :: List "member" Text
-    , _cpgsCacheParameterGroupName :: Maybe Text
-    , _cpgsParameterApplyStatus    :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'CacheParameterGroupStatus' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cpgsCacheNodeIdsToReboot' @::@ ['Text']
---
--- * 'cpgsCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
--- * 'cpgsParameterApplyStatus' @::@ 'Maybe' 'Text'
---
-cacheParameterGroupStatus :: CacheParameterGroupStatus
-cacheParameterGroupStatus = CacheParameterGroupStatus
-    { _cpgsCacheParameterGroupName = Nothing
-    , _cpgsParameterApplyStatus    = Nothing
-    , _cpgsCacheNodeIdsToReboot    = mempty
-    }
-
--- | A list of the cache node IDs which need to be rebooted for parameter changes
--- to be applied. A node ID is a numeric identifier (0001, 0002, etc.).
-cpgsCacheNodeIdsToReboot :: Lens' CacheParameterGroupStatus [Text]
-cpgsCacheNodeIdsToReboot =
-    lens _cpgsCacheNodeIdsToReboot
-        (\s a -> s { _cpgsCacheNodeIdsToReboot = a })
-            . _List
-
--- | The name of the cache parameter group.
-cpgsCacheParameterGroupName :: Lens' CacheParameterGroupStatus (Maybe Text)
-cpgsCacheParameterGroupName =
-    lens _cpgsCacheParameterGroupName
-        (\s a -> s { _cpgsCacheParameterGroupName = a })
-
--- | The status of parameter updates.
-cpgsParameterApplyStatus :: Lens' CacheParameterGroupStatus (Maybe Text)
-cpgsParameterApplyStatus =
-    lens _cpgsParameterApplyStatus
-        (\s a -> s { _cpgsParameterApplyStatus = a })
-
-instance FromXML CacheParameterGroupStatus where
-    parseXML x = CacheParameterGroupStatus
-        <$> x .@? "CacheNodeIdsToReboot" .!@ mempty
-        <*> x .@? "CacheParameterGroupName"
-        <*> x .@? "ParameterApplyStatus"
-
-instance ToQuery CacheParameterGroupStatus where
-    toQuery CacheParameterGroupStatus{..} = mconcat
-        [ "CacheNodeIdsToReboot"    =? _cpgsCacheNodeIdsToReboot
-        , "CacheParameterGroupName" =? _cpgsCacheParameterGroupName
-        , "ParameterApplyStatus"    =? _cpgsParameterApplyStatus
-        ]
-
-data CacheNode = CacheNode
-    { _cnCacheNodeCreateTime      :: Maybe ISO8601
-    , _cnCacheNodeId              :: Maybe Text
-    , _cnCacheNodeStatus          :: Maybe Text
-    , _cnCustomerAvailabilityZone :: Maybe Text
-    , _cnEndpoint                 :: Maybe Endpoint
-    , _cnParameterGroupStatus     :: Maybe Text
-    , _cnSourceCacheNodeId        :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'CacheNode' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cnCacheNodeCreateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'cnCacheNodeId' @::@ 'Maybe' 'Text'
---
--- * 'cnCacheNodeStatus' @::@ 'Maybe' 'Text'
---
--- * 'cnCustomerAvailabilityZone' @::@ 'Maybe' 'Text'
---
--- * 'cnEndpoint' @::@ 'Maybe' 'Endpoint'
---
--- * 'cnParameterGroupStatus' @::@ 'Maybe' 'Text'
---
--- * 'cnSourceCacheNodeId' @::@ 'Maybe' 'Text'
---
-cacheNode :: CacheNode
-cacheNode = CacheNode
-    { _cnCacheNodeId              = Nothing
-    , _cnCacheNodeStatus          = Nothing
-    , _cnCacheNodeCreateTime      = Nothing
-    , _cnEndpoint                 = Nothing
-    , _cnParameterGroupStatus     = Nothing
-    , _cnSourceCacheNodeId        = Nothing
-    , _cnCustomerAvailabilityZone = Nothing
-    }
-
--- | The date and time when the cache node was created.
-cnCacheNodeCreateTime :: Lens' CacheNode (Maybe UTCTime)
-cnCacheNodeCreateTime =
-    lens _cnCacheNodeCreateTime (\s a -> s { _cnCacheNodeCreateTime = a })
-        . mapping _Time
-
--- | The cache node identifier. A node ID is a numeric identifier (0001, 0002,
--- etc.). The combination of cluster ID and node ID uniquely identifies every
--- cache node used in a customer's AWS account.
-cnCacheNodeId :: Lens' CacheNode (Maybe Text)
-cnCacheNodeId = lens _cnCacheNodeId (\s a -> s { _cnCacheNodeId = a })
-
--- | The current state of this cache node.
-cnCacheNodeStatus :: Lens' CacheNode (Maybe Text)
-cnCacheNodeStatus =
-    lens _cnCacheNodeStatus (\s a -> s { _cnCacheNodeStatus = a })
-
--- | The Availability Zone where this node was created and now resides.
-cnCustomerAvailabilityZone :: Lens' CacheNode (Maybe Text)
-cnCustomerAvailabilityZone =
-    lens _cnCustomerAvailabilityZone
-        (\s a -> s { _cnCustomerAvailabilityZone = a })
-
--- | The hostname for connecting to this cache node.
-cnEndpoint :: Lens' CacheNode (Maybe Endpoint)
-cnEndpoint = lens _cnEndpoint (\s a -> s { _cnEndpoint = a })
-
--- | The status of the parameter group applied to this cache node.
-cnParameterGroupStatus :: Lens' CacheNode (Maybe Text)
-cnParameterGroupStatus =
-    lens _cnParameterGroupStatus (\s a -> s { _cnParameterGroupStatus = a })
-
--- | The ID of the primary node to which this read replica node is synchronized.
--- If this field is empty, then this node is not associated with a primary cache
--- cluster.
-cnSourceCacheNodeId :: Lens' CacheNode (Maybe Text)
-cnSourceCacheNodeId =
-    lens _cnSourceCacheNodeId (\s a -> s { _cnSourceCacheNodeId = a })
-
-instance FromXML CacheNode where
-    parseXML x = CacheNode
-        <$> x .@? "CacheNodeCreateTime"
-        <*> x .@? "CacheNodeId"
-        <*> x .@? "CacheNodeStatus"
-        <*> x .@? "CustomerAvailabilityZone"
-        <*> x .@? "Endpoint"
-        <*> x .@? "ParameterGroupStatus"
-        <*> x .@? "SourceCacheNodeId"
-
-instance ToQuery CacheNode where
-    toQuery CacheNode{..} = mconcat
-        [ "CacheNodeCreateTime"      =? _cnCacheNodeCreateTime
-        , "CacheNodeId"              =? _cnCacheNodeId
-        , "CacheNodeStatus"          =? _cnCacheNodeStatus
-        , "CustomerAvailabilityZone" =? _cnCustomerAvailabilityZone
-        , "Endpoint"                 =? _cnEndpoint
-        , "ParameterGroupStatus"     =? _cnParameterGroupStatus
-        , "SourceCacheNodeId"        =? _cnSourceCacheNodeId
-        ]
-
-data CacheSecurityGroupMembership = CacheSecurityGroupMembership
-    { _csgmCacheSecurityGroupName :: Maybe Text
-    , _csgmStatus                 :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'CacheSecurityGroupMembership' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csgmCacheSecurityGroupName' @::@ 'Maybe' 'Text'
---
--- * 'csgmStatus' @::@ 'Maybe' 'Text'
---
-cacheSecurityGroupMembership :: CacheSecurityGroupMembership
-cacheSecurityGroupMembership = CacheSecurityGroupMembership
-    { _csgmCacheSecurityGroupName = Nothing
-    , _csgmStatus                 = Nothing
-    }
-
--- | The name of the cache security group.
-csgmCacheSecurityGroupName :: Lens' CacheSecurityGroupMembership (Maybe Text)
-csgmCacheSecurityGroupName =
-    lens _csgmCacheSecurityGroupName
-        (\s a -> s { _csgmCacheSecurityGroupName = a })
-
--- | The membership status in the cache security group. The status changes when a
--- cache security group is modified, or when the cache security groups assigned
--- to a cache cluster are modified.
-csgmStatus :: Lens' CacheSecurityGroupMembership (Maybe Text)
-csgmStatus = lens _csgmStatus (\s a -> s { _csgmStatus = a })
-
-instance FromXML CacheSecurityGroupMembership where
-    parseXML x = CacheSecurityGroupMembership
-        <$> x .@? "CacheSecurityGroupName"
-        <*> x .@? "Status"
-
-instance ToQuery CacheSecurityGroupMembership where
-    toQuery CacheSecurityGroupMembership{..} = mconcat
-        [ "CacheSecurityGroupName" =? _csgmCacheSecurityGroupName
-        , "Status"                 =? _csgmStatus
-        ]
-
-newtype AvailabilityZone = AvailabilityZone
-    { _azName :: Maybe Text
-    } deriving (Eq, Ord, Read, 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 NodeGroupMember = NodeGroupMember
-    { _ngmCacheClusterId            :: Maybe Text
-    , _ngmCacheNodeId               :: Maybe Text
-    , _ngmCurrentRole               :: Maybe Text
-    , _ngmPreferredAvailabilityZone :: Maybe Text
-    , _ngmReadEndpoint              :: Maybe Endpoint
-    } deriving (Eq, Read, Show)
-
--- | 'NodeGroupMember' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ngmCacheClusterId' @::@ 'Maybe' 'Text'
---
--- * 'ngmCacheNodeId' @::@ 'Maybe' 'Text'
---
--- * 'ngmCurrentRole' @::@ 'Maybe' 'Text'
---
--- * 'ngmPreferredAvailabilityZone' @::@ 'Maybe' 'Text'
---
--- * 'ngmReadEndpoint' @::@ 'Maybe' 'Endpoint'
---
-nodeGroupMember :: NodeGroupMember
-nodeGroupMember = NodeGroupMember
-    { _ngmCacheClusterId            = Nothing
-    , _ngmCacheNodeId               = Nothing
-    , _ngmReadEndpoint              = Nothing
-    , _ngmPreferredAvailabilityZone = Nothing
-    , _ngmCurrentRole               = Nothing
-    }
-
--- | The ID of the cache cluster to which the node belongs.
-ngmCacheClusterId :: Lens' NodeGroupMember (Maybe Text)
-ngmCacheClusterId =
-    lens _ngmCacheClusterId (\s a -> s { _ngmCacheClusterId = a })
-
--- | The ID of the node within its cache cluster. A node ID is a numeric
--- identifier (0001, 0002, etc.).
-ngmCacheNodeId :: Lens' NodeGroupMember (Maybe Text)
-ngmCacheNodeId = lens _ngmCacheNodeId (\s a -> s { _ngmCacheNodeId = a })
-
--- | The role that is currently assigned to the node - /primary/ or /replica/.
-ngmCurrentRole :: Lens' NodeGroupMember (Maybe Text)
-ngmCurrentRole = lens _ngmCurrentRole (\s a -> s { _ngmCurrentRole = a })
-
--- | The name of the Availability Zone in which the node is located.
-ngmPreferredAvailabilityZone :: Lens' NodeGroupMember (Maybe Text)
-ngmPreferredAvailabilityZone =
-    lens _ngmPreferredAvailabilityZone
-        (\s a -> s { _ngmPreferredAvailabilityZone = a })
-
-ngmReadEndpoint :: Lens' NodeGroupMember (Maybe Endpoint)
-ngmReadEndpoint = lens _ngmReadEndpoint (\s a -> s { _ngmReadEndpoint = a })
-
-instance FromXML NodeGroupMember where
-    parseXML x = NodeGroupMember
-        <$> x .@? "CacheClusterId"
-        <*> x .@? "CacheNodeId"
-        <*> x .@? "CurrentRole"
-        <*> x .@? "PreferredAvailabilityZone"
-        <*> x .@? "ReadEndpoint"
-
-instance ToQuery NodeGroupMember where
-    toQuery NodeGroupMember{..} = mconcat
-        [ "CacheClusterId"            =? _ngmCacheClusterId
-        , "CacheNodeId"               =? _ngmCacheNodeId
-        , "CurrentRole"               =? _ngmCurrentRole
-        , "PreferredAvailabilityZone" =? _ngmPreferredAvailabilityZone
-        , "ReadEndpoint"              =? _ngmReadEndpoint
-        ]
-
-data CacheParameterGroup = CacheParameterGroup
-    { _cpgCacheParameterGroupFamily :: Maybe Text
-    , _cpgCacheParameterGroupName   :: Maybe Text
-    , _cpgDescription               :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'CacheParameterGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cpgCacheParameterGroupFamily' @::@ 'Maybe' 'Text'
---
--- * 'cpgCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
--- * 'cpgDescription' @::@ 'Maybe' 'Text'
---
-cacheParameterGroup :: CacheParameterGroup
-cacheParameterGroup = CacheParameterGroup
-    { _cpgCacheParameterGroupName   = Nothing
-    , _cpgCacheParameterGroupFamily = Nothing
-    , _cpgDescription               = Nothing
-    }
-
--- | The name of the cache parameter group family that this cache parameter group
--- is compatible with.
-cpgCacheParameterGroupFamily :: Lens' CacheParameterGroup (Maybe Text)
-cpgCacheParameterGroupFamily =
-    lens _cpgCacheParameterGroupFamily
-        (\s a -> s { _cpgCacheParameterGroupFamily = a })
-
--- | The name of the cache parameter group.
-cpgCacheParameterGroupName :: Lens' CacheParameterGroup (Maybe Text)
-cpgCacheParameterGroupName =
-    lens _cpgCacheParameterGroupName
-        (\s a -> s { _cpgCacheParameterGroupName = a })
-
--- | The description for this cache parameter group.
-cpgDescription :: Lens' CacheParameterGroup (Maybe Text)
-cpgDescription = lens _cpgDescription (\s a -> s { _cpgDescription = a })
-
-instance FromXML CacheParameterGroup where
-    parseXML x = CacheParameterGroup
-        <$> x .@? "CacheParameterGroupFamily"
-        <*> x .@? "CacheParameterGroupName"
-        <*> x .@? "Description"
-
-instance ToQuery CacheParameterGroup where
-    toQuery CacheParameterGroup{..} = mconcat
-        [ "CacheParameterGroupFamily" =? _cpgCacheParameterGroupFamily
-        , "CacheParameterGroupName"   =? _cpgCacheParameterGroupName
-        , "Description"               =? _cpgDescription
-        ]
-
-data AutomaticFailoverStatus
-    = AFSDisabled  -- ^ disabled
-    | AFSDisabling -- ^ disabling
-    | AFSEnabled   -- ^ enabled
-    | AFSEnabling  -- ^ enabling
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable AutomaticFailoverStatus
-
-instance FromText AutomaticFailoverStatus where
-    parser = takeLowerText >>= \case
-        "disabled"  -> pure AFSDisabled
-        "disabling" -> pure AFSDisabling
-        "enabled"   -> pure AFSEnabled
-        "enabling"  -> pure AFSEnabling
-        e           -> fail $
-            "Failure parsing AutomaticFailoverStatus from " ++ show e
-
-instance ToText AutomaticFailoverStatus where
-    toText = \case
-        AFSDisabled  -> "disabled"
-        AFSDisabling -> "disabling"
-        AFSEnabled   -> "enabled"
-        AFSEnabling  -> "enabling"
-
-instance ToByteString AutomaticFailoverStatus
-instance ToHeader     AutomaticFailoverStatus
-instance ToQuery      AutomaticFailoverStatus
-
-instance FromXML AutomaticFailoverStatus where
-    parseXML = parseXMLText "AutomaticFailoverStatus"
-
-data CacheSecurityGroup = CacheSecurityGroup
-    { _csgCacheSecurityGroupName :: Maybe Text
-    , _csgDescription            :: Maybe Text
-    , _csgEC2SecurityGroups      :: List "member" EC2SecurityGroup
-    , _csgOwnerId                :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'CacheSecurityGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csgCacheSecurityGroupName' @::@ 'Maybe' 'Text'
---
--- * 'csgDescription' @::@ 'Maybe' 'Text'
---
--- * 'csgEC2SecurityGroups' @::@ ['EC2SecurityGroup']
---
--- * 'csgOwnerId' @::@ 'Maybe' 'Text'
---
-cacheSecurityGroup :: CacheSecurityGroup
-cacheSecurityGroup = CacheSecurityGroup
-    { _csgOwnerId                = Nothing
-    , _csgCacheSecurityGroupName = Nothing
-    , _csgDescription            = Nothing
-    , _csgEC2SecurityGroups      = mempty
-    }
-
--- | The name of the cache security group.
-csgCacheSecurityGroupName :: Lens' CacheSecurityGroup (Maybe Text)
-csgCacheSecurityGroupName =
-    lens _csgCacheSecurityGroupName
-        (\s a -> s { _csgCacheSecurityGroupName = a })
-
--- | The description of the cache security group.
-csgDescription :: Lens' CacheSecurityGroup (Maybe Text)
-csgDescription = lens _csgDescription (\s a -> s { _csgDescription = a })
-
--- | A list of Amazon EC2 security groups that are associated with this cache
--- security group.
-csgEC2SecurityGroups :: Lens' CacheSecurityGroup [EC2SecurityGroup]
-csgEC2SecurityGroups =
-    lens _csgEC2SecurityGroups (\s a -> s { _csgEC2SecurityGroups = a })
-        . _List
-
--- | The AWS account ID of the cache security group owner.
-csgOwnerId :: Lens' CacheSecurityGroup (Maybe Text)
-csgOwnerId = lens _csgOwnerId (\s a -> s { _csgOwnerId = a })
-
-instance FromXML CacheSecurityGroup where
-    parseXML x = CacheSecurityGroup
-        <$> x .@? "CacheSecurityGroupName"
-        <*> x .@? "Description"
-        <*> x .@? "EC2SecurityGroups" .!@ mempty
-        <*> x .@? "OwnerId"
-
-instance ToQuery CacheSecurityGroup where
-    toQuery CacheSecurityGroup{..} = mconcat
-        [ "CacheSecurityGroupName" =? _csgCacheSecurityGroupName
-        , "Description"            =? _csgDescription
-        , "EC2SecurityGroups"      =? _csgEC2SecurityGroups
-        , "OwnerId"                =? _csgOwnerId
-        ]
-
-data CacheNodeTypeSpecificParameter = CacheNodeTypeSpecificParameter
-    { _cntspAllowedValues               :: Maybe Text
-    , _cntspCacheNodeTypeSpecificValues :: List "member" CacheNodeTypeSpecificValue
-    , _cntspDataType                    :: Maybe Text
-    , _cntspDescription                 :: Maybe Text
-    , _cntspIsModifiable                :: Maybe Bool
-    , _cntspMinimumEngineVersion        :: Maybe Text
-    , _cntspParameterName               :: Maybe Text
-    , _cntspSource                      :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'CacheNodeTypeSpecificParameter' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cntspAllowedValues' @::@ 'Maybe' 'Text'
---
--- * 'cntspCacheNodeTypeSpecificValues' @::@ ['CacheNodeTypeSpecificValue']
---
--- * 'cntspDataType' @::@ 'Maybe' 'Text'
---
--- * 'cntspDescription' @::@ 'Maybe' 'Text'
---
--- * 'cntspIsModifiable' @::@ 'Maybe' 'Bool'
---
--- * 'cntspMinimumEngineVersion' @::@ 'Maybe' 'Text'
---
--- * 'cntspParameterName' @::@ 'Maybe' 'Text'
---
--- * 'cntspSource' @::@ 'Maybe' 'Text'
---
-cacheNodeTypeSpecificParameter :: CacheNodeTypeSpecificParameter
-cacheNodeTypeSpecificParameter = CacheNodeTypeSpecificParameter
-    { _cntspParameterName               = Nothing
-    , _cntspDescription                 = Nothing
-    , _cntspSource                      = Nothing
-    , _cntspDataType                    = Nothing
-    , _cntspAllowedValues               = Nothing
-    , _cntspIsModifiable                = Nothing
-    , _cntspMinimumEngineVersion        = Nothing
-    , _cntspCacheNodeTypeSpecificValues = mempty
-    }
-
--- | The valid range of values for the parameter.
-cntspAllowedValues :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspAllowedValues =
-    lens _cntspAllowedValues (\s a -> s { _cntspAllowedValues = a })
-
--- | A list of cache node types and their corresponding values for this parameter.
-cntspCacheNodeTypeSpecificValues :: Lens' CacheNodeTypeSpecificParameter [CacheNodeTypeSpecificValue]
-cntspCacheNodeTypeSpecificValues =
-    lens _cntspCacheNodeTypeSpecificValues
-        (\s a -> s { _cntspCacheNodeTypeSpecificValues = a })
-            . _List
-
--- | The valid data type for the parameter.
-cntspDataType :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspDataType = lens _cntspDataType (\s a -> s { _cntspDataType = a })
-
--- | A description of the parameter.
-cntspDescription :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspDescription = lens _cntspDescription (\s a -> s { _cntspDescription = a })
-
--- | Indicates whether ('true') or not ('false') the parameter can be modified. Some
--- parameters have security or operational implications that prevent them from
--- being changed.
-cntspIsModifiable :: Lens' CacheNodeTypeSpecificParameter (Maybe Bool)
-cntspIsModifiable =
-    lens _cntspIsModifiable (\s a -> s { _cntspIsModifiable = a })
-
--- | The earliest cache engine version to which the parameter can apply.
-cntspMinimumEngineVersion :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspMinimumEngineVersion =
-    lens _cntspMinimumEngineVersion
-        (\s a -> s { _cntspMinimumEngineVersion = a })
-
--- | The name of the parameter.
-cntspParameterName :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspParameterName =
-    lens _cntspParameterName (\s a -> s { _cntspParameterName = a })
-
--- | The source of the parameter value.
-cntspSource :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
-cntspSource = lens _cntspSource (\s a -> s { _cntspSource = a })
-
-instance FromXML CacheNodeTypeSpecificParameter where
-    parseXML x = CacheNodeTypeSpecificParameter
-        <$> x .@? "AllowedValues"
-        <*> x .@? "CacheNodeTypeSpecificValues" .!@ mempty
-        <*> x .@? "DataType"
-        <*> x .@? "Description"
-        <*> x .@? "IsModifiable"
-        <*> x .@? "MinimumEngineVersion"
-        <*> x .@? "ParameterName"
-        <*> x .@? "Source"
-
-instance ToQuery CacheNodeTypeSpecificParameter where
-    toQuery CacheNodeTypeSpecificParameter{..} = mconcat
-        [ "AllowedValues"               =? _cntspAllowedValues
-        , "CacheNodeTypeSpecificValues" =? _cntspCacheNodeTypeSpecificValues
-        , "DataType"                    =? _cntspDataType
-        , "Description"                 =? _cntspDescription
-        , "IsModifiable"                =? _cntspIsModifiable
-        , "MinimumEngineVersion"        =? _cntspMinimumEngineVersion
-        , "ParameterName"               =? _cntspParameterName
-        , "Source"                      =? _cntspSource
-        ]
-
-data AZMode
-    = CrossAz  -- ^ cross-az
-    | SingleAz -- ^ single-az
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable AZMode
-
-instance FromText AZMode where
-    parser = takeLowerText >>= \case
-        "cross-az"  -> pure CrossAz
-        "single-az" -> pure SingleAz
-        e           -> fail $
-            "Failure parsing AZMode from " ++ show e
-
-instance ToText AZMode where
-    toText = \case
-        CrossAz  -> "cross-az"
-        SingleAz -> "single-az"
-
-instance ToByteString AZMode
-instance ToHeader     AZMode
-instance ToQuery      AZMode
-
-instance FromXML AZMode where
-    parseXML = parseXMLText "AZMode"
-
-data CacheEngineVersion = CacheEngineVersion
-    { _cevCacheEngineDescription        :: Maybe Text
-    , _cevCacheEngineVersionDescription :: Maybe Text
-    , _cevCacheParameterGroupFamily     :: Maybe Text
-    , _cevEngine                        :: Maybe Text
-    , _cevEngineVersion                 :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'CacheEngineVersion' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cevCacheEngineDescription' @::@ 'Maybe' 'Text'
---
--- * 'cevCacheEngineVersionDescription' @::@ 'Maybe' 'Text'
---
--- * 'cevCacheParameterGroupFamily' @::@ 'Maybe' 'Text'
---
--- * 'cevEngine' @::@ 'Maybe' 'Text'
---
--- * 'cevEngineVersion' @::@ 'Maybe' 'Text'
---
-cacheEngineVersion :: CacheEngineVersion
-cacheEngineVersion = CacheEngineVersion
-    { _cevEngine                        = Nothing
-    , _cevEngineVersion                 = Nothing
-    , _cevCacheParameterGroupFamily     = Nothing
-    , _cevCacheEngineDescription        = Nothing
-    , _cevCacheEngineVersionDescription = Nothing
-    }
-
--- | The description of the cache engine.
-cevCacheEngineDescription :: Lens' CacheEngineVersion (Maybe Text)
-cevCacheEngineDescription =
-    lens _cevCacheEngineDescription
-        (\s a -> s { _cevCacheEngineDescription = a })
-
--- | The description of the cache engine version.
-cevCacheEngineVersionDescription :: Lens' CacheEngineVersion (Maybe Text)
-cevCacheEngineVersionDescription =
-    lens _cevCacheEngineVersionDescription
-        (\s a -> s { _cevCacheEngineVersionDescription = a })
-
--- | The name of the cache parameter group family associated with this cache
--- engine.
-cevCacheParameterGroupFamily :: Lens' CacheEngineVersion (Maybe Text)
-cevCacheParameterGroupFamily =
-    lens _cevCacheParameterGroupFamily
-        (\s a -> s { _cevCacheParameterGroupFamily = a })
-
--- | The name of the cache engine.
-cevEngine :: Lens' CacheEngineVersion (Maybe Text)
-cevEngine = lens _cevEngine (\s a -> s { _cevEngine = a })
-
--- | The version number of the cache engine.
-cevEngineVersion :: Lens' CacheEngineVersion (Maybe Text)
-cevEngineVersion = lens _cevEngineVersion (\s a -> s { _cevEngineVersion = a })
-
-instance FromXML CacheEngineVersion where
-    parseXML x = CacheEngineVersion
-        <$> x .@? "CacheEngineDescription"
-        <*> x .@? "CacheEngineVersionDescription"
-        <*> x .@? "CacheParameterGroupFamily"
-        <*> x .@? "Engine"
-        <*> x .@? "EngineVersion"
-
-instance ToQuery CacheEngineVersion where
-    toQuery CacheEngineVersion{..} = mconcat
-        [ "CacheEngineDescription"        =? _cevCacheEngineDescription
-        , "CacheEngineVersionDescription" =? _cevCacheEngineVersionDescription
-        , "CacheParameterGroupFamily"     =? _cevCacheParameterGroupFamily
-        , "Engine"                        =? _cevEngine
-        , "EngineVersion"                 =? _cevEngineVersion
-        ]
-
-data ReplicationGroup = ReplicationGroup
-    { _rgAutomaticFailover     :: Maybe AutomaticFailoverStatus
-    , _rgDescription           :: Maybe Text
-    , _rgMemberClusters        :: List "member" Text
-    , _rgNodeGroups            :: List "member" NodeGroup
-    , _rgPendingModifiedValues :: Maybe ReplicationGroupPendingModifiedValues
-    , _rgReplicationGroupId    :: Maybe Text
-    , _rgSnapshottingClusterId :: Maybe Text
-    , _rgStatus                :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'ReplicationGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rgAutomaticFailover' @::@ 'Maybe' 'AutomaticFailoverStatus'
---
--- * 'rgDescription' @::@ 'Maybe' 'Text'
---
--- * 'rgMemberClusters' @::@ ['Text']
---
--- * 'rgNodeGroups' @::@ ['NodeGroup']
---
--- * 'rgPendingModifiedValues' @::@ 'Maybe' 'ReplicationGroupPendingModifiedValues'
---
--- * 'rgReplicationGroupId' @::@ 'Maybe' 'Text'
---
--- * 'rgSnapshottingClusterId' @::@ 'Maybe' 'Text'
---
--- * 'rgStatus' @::@ 'Maybe' 'Text'
---
-replicationGroup :: ReplicationGroup
-replicationGroup = ReplicationGroup
-    { _rgReplicationGroupId    = Nothing
-    , _rgDescription           = Nothing
-    , _rgStatus                = Nothing
-    , _rgPendingModifiedValues = Nothing
-    , _rgMemberClusters        = mempty
-    , _rgNodeGroups            = mempty
-    , _rgSnapshottingClusterId = Nothing
-    , _rgAutomaticFailover     = Nothing
-    }
-
--- | Indicates the status of Multi-AZ for this replication group.
---
--- ElastiCache Multi-AZ replication groups are not supported on:
---
--- Redis versions earlier than 2.8.6. T1 and T2 cache node types.
-rgAutomaticFailover :: Lens' ReplicationGroup (Maybe AutomaticFailoverStatus)
-rgAutomaticFailover =
-    lens _rgAutomaticFailover (\s a -> s { _rgAutomaticFailover = a })
-
--- | The description of the replication group.
-rgDescription :: Lens' ReplicationGroup (Maybe Text)
-rgDescription = lens _rgDescription (\s a -> s { _rgDescription = a })
-
--- | The names of all the cache clusters that are part of this replication group.
-rgMemberClusters :: Lens' ReplicationGroup [Text]
-rgMemberClusters = lens _rgMemberClusters (\s a -> s { _rgMemberClusters = a }) . _List
-
--- | A single element list with information about the nodes in the replication
--- group.
-rgNodeGroups :: Lens' ReplicationGroup [NodeGroup]
-rgNodeGroups = lens _rgNodeGroups (\s a -> s { _rgNodeGroups = a }) . _List
-
--- | A group of settings to be applied to the replication group, either
--- immediately or during the next maintenance window.
-rgPendingModifiedValues :: Lens' ReplicationGroup (Maybe ReplicationGroupPendingModifiedValues)
-rgPendingModifiedValues =
-    lens _rgPendingModifiedValues (\s a -> s { _rgPendingModifiedValues = a })
-
--- | The identifier for the replication group.
-rgReplicationGroupId :: Lens' ReplicationGroup (Maybe Text)
-rgReplicationGroupId =
-    lens _rgReplicationGroupId (\s a -> s { _rgReplicationGroupId = a })
-
--- | The cache cluster ID that is used as the daily snapshot source for the
--- replication group.
-rgSnapshottingClusterId :: Lens' ReplicationGroup (Maybe Text)
-rgSnapshottingClusterId =
-    lens _rgSnapshottingClusterId (\s a -> s { _rgSnapshottingClusterId = a })
-
--- | The current state of this replication group - /creating/, /available/, etc.
-rgStatus :: Lens' ReplicationGroup (Maybe Text)
-rgStatus = lens _rgStatus (\s a -> s { _rgStatus = a })
-
-instance FromXML ReplicationGroup where
-    parseXML x = ReplicationGroup
-        <$> x .@? "AutomaticFailover"
-        <*> x .@? "Description"
-        <*> x .@? "MemberClusters" .!@ mempty
-        <*> x .@? "NodeGroups" .!@ mempty
-        <*> x .@? "PendingModifiedValues"
-        <*> x .@? "ReplicationGroupId"
-        <*> x .@? "SnapshottingClusterId"
-        <*> x .@? "Status"
-
-instance ToQuery ReplicationGroup where
-    toQuery ReplicationGroup{..} = mconcat
-        [ "AutomaticFailover"     =? _rgAutomaticFailover
-        , "Description"           =? _rgDescription
-        , "MemberClusters"        =? _rgMemberClusters
-        , "NodeGroups"            =? _rgNodeGroups
-        , "PendingModifiedValues" =? _rgPendingModifiedValues
-        , "ReplicationGroupId"    =? _rgReplicationGroupId
-        , "SnapshottingClusterId" =? _rgSnapshottingClusterId
-        , "Status"                =? _rgStatus
-        ]
-
-data RecurringCharge = RecurringCharge
-    { _rcRecurringChargeAmount    :: Maybe Double
-    , _rcRecurringChargeFrequency :: Maybe Text
-    } deriving (Eq, Ord, Read, 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 monetary amount of the recurring charge.
-rcRecurringChargeAmount :: Lens' RecurringCharge (Maybe Double)
-rcRecurringChargeAmount =
-    lens _rcRecurringChargeAmount (\s a -> s { _rcRecurringChargeAmount = a })
-
--- | The frequency of the recurring charge.
-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 ReservedCacheNodesOffering = ReservedCacheNodesOffering
-    { _rcnoCacheNodeType                :: Maybe Text
-    , _rcnoDuration                     :: Maybe Int
-    , _rcnoFixedPrice                   :: Maybe Double
-    , _rcnoOfferingType                 :: Maybe Text
-    , _rcnoProductDescription           :: Maybe Text
-    , _rcnoRecurringCharges             :: List "member" RecurringCharge
-    , _rcnoReservedCacheNodesOfferingId :: Maybe Text
-    , _rcnoUsagePrice                   :: Maybe Double
-    } deriving (Eq, Read, Show)
-
--- | 'ReservedCacheNodesOffering' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rcnoCacheNodeType' @::@ 'Maybe' 'Text'
---
--- * 'rcnoDuration' @::@ 'Maybe' 'Int'
---
--- * 'rcnoFixedPrice' @::@ 'Maybe' 'Double'
---
--- * 'rcnoOfferingType' @::@ 'Maybe' 'Text'
---
--- * 'rcnoProductDescription' @::@ 'Maybe' 'Text'
---
--- * 'rcnoRecurringCharges' @::@ ['RecurringCharge']
---
--- * 'rcnoReservedCacheNodesOfferingId' @::@ 'Maybe' 'Text'
---
--- * 'rcnoUsagePrice' @::@ 'Maybe' 'Double'
---
-reservedCacheNodesOffering :: ReservedCacheNodesOffering
-reservedCacheNodesOffering = ReservedCacheNodesOffering
-    { _rcnoReservedCacheNodesOfferingId = Nothing
-    , _rcnoCacheNodeType                = Nothing
-    , _rcnoDuration                     = Nothing
-    , _rcnoFixedPrice                   = Nothing
-    , _rcnoUsagePrice                   = Nothing
-    , _rcnoProductDescription           = Nothing
-    , _rcnoOfferingType                 = Nothing
-    , _rcnoRecurringCharges             = mempty
-    }
-
--- | The cache node type for the reserved cache node.
---
--- Valid node types are as follows:
---
--- General purpose:  Current generation: 'cache.t2.micro', 'cache.t2.small', 'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large', 'cache.m3.xlarge', 'cache.m3.2xlarge' Previous
--- generation: 'cache.t1.micro', 'cache.m1.small', 'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'  Compute optimized: 'cache.c1.xlarge' Memory optimized  Current generation: 'cache.r3.large', 'cache.r3.xlarge', 'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge' Previous generation:
--- 'cache.m2.xlarge', 'cache.m2.2xlarge', 'cache.m2.4xlarge'   Notes:
---
--- All t2 instances are created in an Amazon Virtual Private Cloud (VPC). Redis backup/restore is not supported for t2 instances.
--- Redis Append-only files (AOF) functionality is not supported for t1 or t2
--- instances.  For a complete listing of cache node types and specifications,
--- see <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details> and <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache NodeType-Specific Parameters for Memcached> or <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parametersfor Redis>.
-rcnoCacheNodeType :: Lens' ReservedCacheNodesOffering (Maybe Text)
-rcnoCacheNodeType =
-    lens _rcnoCacheNodeType (\s a -> s { _rcnoCacheNodeType = a })
-
--- | The duration of the offering. in seconds.
-rcnoDuration :: Lens' ReservedCacheNodesOffering (Maybe Int)
-rcnoDuration = lens _rcnoDuration (\s a -> s { _rcnoDuration = a })
-
--- | The fixed price charged for this offering.
-rcnoFixedPrice :: Lens' ReservedCacheNodesOffering (Maybe Double)
-rcnoFixedPrice = lens _rcnoFixedPrice (\s a -> s { _rcnoFixedPrice = a })
-
--- | The offering type.
-rcnoOfferingType :: Lens' ReservedCacheNodesOffering (Maybe Text)
-rcnoOfferingType = lens _rcnoOfferingType (\s a -> s { _rcnoOfferingType = a })
-
--- | The cache engine used by the offering.
-rcnoProductDescription :: Lens' ReservedCacheNodesOffering (Maybe Text)
-rcnoProductDescription =
-    lens _rcnoProductDescription (\s a -> s { _rcnoProductDescription = a })
-
--- | The recurring price charged to run this reserved cache node.
-rcnoRecurringCharges :: Lens' ReservedCacheNodesOffering [RecurringCharge]
-rcnoRecurringCharges =
-    lens _rcnoRecurringCharges (\s a -> s { _rcnoRecurringCharges = a })
-        . _List
-
--- | A unique identifier for the reserved cache node offering.
-rcnoReservedCacheNodesOfferingId :: Lens' ReservedCacheNodesOffering (Maybe Text)
-rcnoReservedCacheNodesOfferingId =
-    lens _rcnoReservedCacheNodesOfferingId
-        (\s a -> s { _rcnoReservedCacheNodesOfferingId = a })
-
--- | The hourly price charged for this offering.
-rcnoUsagePrice :: Lens' ReservedCacheNodesOffering (Maybe Double)
-rcnoUsagePrice = lens _rcnoUsagePrice (\s a -> s { _rcnoUsagePrice = a })
-
-instance FromXML ReservedCacheNodesOffering where
-    parseXML x = ReservedCacheNodesOffering
-        <$> x .@? "CacheNodeType"
-        <*> x .@? "Duration"
-        <*> x .@? "FixedPrice"
-        <*> x .@? "OfferingType"
-        <*> x .@? "ProductDescription"
-        <*> x .@? "RecurringCharges" .!@ mempty
-        <*> x .@? "ReservedCacheNodesOfferingId"
-        <*> x .@? "UsagePrice"
-
-instance ToQuery ReservedCacheNodesOffering where
-    toQuery ReservedCacheNodesOffering{..} = mconcat
-        [ "CacheNodeType"                =? _rcnoCacheNodeType
-        , "Duration"                     =? _rcnoDuration
-        , "FixedPrice"                   =? _rcnoFixedPrice
-        , "OfferingType"                 =? _rcnoOfferingType
-        , "ProductDescription"           =? _rcnoProductDescription
-        , "RecurringCharges"             =? _rcnoRecurringCharges
-        , "ReservedCacheNodesOfferingId" =? _rcnoReservedCacheNodesOfferingId
-        , "UsagePrice"                   =? _rcnoUsagePrice
-        ]
-
-newtype TagListMessage = TagListMessage
-    { _tlmTagList :: List "member" Tag
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList TagListMessage where
-    type Item TagListMessage = Tag
-
-    fromList = TagListMessage . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _tlmTagList
-
--- | 'TagListMessage' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'tlmTagList' @::@ ['Tag']
---
-tagListMessage :: TagListMessage
-tagListMessage = TagListMessage
-    { _tlmTagList = mempty
-    }
-
--- | A list of cost allocation tags as key-value pairs.
-tlmTagList :: Lens' TagListMessage [Tag]
-tlmTagList = lens _tlmTagList (\s a -> s { _tlmTagList = a }) . _List
-
-instance FromXML TagListMessage where
-    parseXML x = TagListMessage
-        <$> x .@? "TagList" .!@ mempty
-
-instance ToQuery TagListMessage where
-    toQuery TagListMessage{..} = mconcat
-        [ "TagList" =? _tlmTagList
-        ]
-
-data Endpoint = Endpoint
-    { _eAddress :: Maybe Text
-    , _ePort    :: Maybe Int
-    } deriving (Eq, Ord, Read, 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 hostname of the cache node.
-eAddress :: Lens' Endpoint (Maybe Text)
-eAddress = lens _eAddress (\s a -> s { _eAddress = a })
-
--- | The port number that the cache 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 PendingModifiedValues = PendingModifiedValues
-    { _pmvCacheNodeIdsToRemove :: List "member" Text
-    , _pmvEngineVersion        :: Maybe Text
-    , _pmvNumCacheNodes        :: Maybe Int
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'PendingModifiedValues' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'pmvCacheNodeIdsToRemove' @::@ ['Text']
---
--- * 'pmvEngineVersion' @::@ 'Maybe' 'Text'
---
--- * 'pmvNumCacheNodes' @::@ 'Maybe' 'Int'
---
-pendingModifiedValues :: PendingModifiedValues
-pendingModifiedValues = PendingModifiedValues
-    { _pmvNumCacheNodes        = Nothing
-    , _pmvCacheNodeIdsToRemove = mempty
-    , _pmvEngineVersion        = Nothing
-    }
-
--- | A list of cache node IDs that are being removed (or will be removed) from the
--- cache cluster. A node ID is a numeric identifier (0001, 0002, etc.).
-pmvCacheNodeIdsToRemove :: Lens' PendingModifiedValues [Text]
-pmvCacheNodeIdsToRemove =
-    lens _pmvCacheNodeIdsToRemove (\s a -> s { _pmvCacheNodeIdsToRemove = a })
-        . _List
-
--- | The new cache engine version that the cache cluster will run.
-pmvEngineVersion :: Lens' PendingModifiedValues (Maybe Text)
-pmvEngineVersion = lens _pmvEngineVersion (\s a -> s { _pmvEngineVersion = a })
-
--- | The new number of cache nodes for the cache cluster.
---
--- For clusters running Redis, this value must be 1. For clusters running
--- Memcached, this value must be between 1 and 20.
-pmvNumCacheNodes :: Lens' PendingModifiedValues (Maybe Int)
-pmvNumCacheNodes = lens _pmvNumCacheNodes (\s a -> s { _pmvNumCacheNodes = a })
-
-instance FromXML PendingModifiedValues where
-    parseXML x = PendingModifiedValues
-        <$> x .@? "CacheNodeIdsToRemove" .!@ mempty
-        <*> x .@? "EngineVersion"
-        <*> x .@? "NumCacheNodes"
-
-instance ToQuery PendingModifiedValues where
-    toQuery PendingModifiedValues{..} = mconcat
-        [ "CacheNodeIdsToRemove" =? _pmvCacheNodeIdsToRemove
-        , "EngineVersion"        =? _pmvEngineVersion
-        , "NumCacheNodes"        =? _pmvNumCacheNodes
-        ]
-
-newtype CacheParameterGroupNameMessage = CacheParameterGroupNameMessage
-    { _cpgnmCacheParameterGroupName :: Maybe Text
-    } deriving (Eq, Ord, Read, Show, Monoid)
-
--- | 'CacheParameterGroupNameMessage' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cpgnmCacheParameterGroupName' @::@ 'Maybe' 'Text'
---
-cacheParameterGroupNameMessage :: CacheParameterGroupNameMessage
-cacheParameterGroupNameMessage = CacheParameterGroupNameMessage
-    { _cpgnmCacheParameterGroupName = Nothing
-    }
-
--- | The name of the cache parameter group.
-cpgnmCacheParameterGroupName :: Lens' CacheParameterGroupNameMessage (Maybe Text)
-cpgnmCacheParameterGroupName =
-    lens _cpgnmCacheParameterGroupName
-        (\s a -> s { _cpgnmCacheParameterGroupName = a })
-
-instance FromXML CacheParameterGroupNameMessage where
-    parseXML x = CacheParameterGroupNameMessage
-        <$> x .@? "CacheParameterGroupName"
-
-instance ToQuery CacheParameterGroupNameMessage where
-    toQuery CacheParameterGroupNameMessage{..} = mconcat
-        [ "CacheParameterGroupName" =? _cpgnmCacheParameterGroupName
-        ]
-
-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, Read, 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 valid data type for 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 })
-
--- | Indicates whether ('true') or not ('false') 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 cache 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.
-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
-        ]
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElastiCache.Types
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.ElastiCache.Types
+    (
+    -- * Service
+      ElastiCache
+
+    -- * Errors
+    , _CacheSubnetGroupAlreadyExistsFault
+    , _CacheSubnetGroupInUse
+    , _CacheSecurityGroupNotFoundFault
+    , _ReservedCacheNodeAlreadyExistsFault
+    , _AuthorizationAlreadyExistsFault
+    , _ReservedCacheNodeQuotaExceededFault
+    , _CacheSubnetGroupQuotaExceededFault
+    , _ReplicationGroupNotFoundFault
+    , _ReservedCacheNodesOfferingNotFoundFault
+    , _TagQuotaPerResourceExceeded
+    , _InvalidSubnet
+    , _SnapshotNotFoundFault
+    , _InsufficientCacheClusterCapacityFault
+    , _InvalidSnapshotStateFault
+    , _SnapshotAlreadyExistsFault
+    , _TagNotFoundFault
+    , _SnapshotQuotaExceededFault
+    , _CacheParameterGroupAlreadyExistsFault
+    , _NodeQuotaForClusterExceededFault
+    , _SnapshotFeatureNotSupportedFault
+    , _CacheSubnetGroupNotFoundFault
+    , _ReservedCacheNodeNotFoundFault
+    , _InvalidParameterValueException
+    , _InvalidVPCNetworkStateFault
+    , _CacheClusterNotFoundFault
+    , _InvalidReplicationGroupStateFault
+    , _ReplicationGroupAlreadyExistsFault
+    , _SubnetInUse
+    , _CacheClusterAlreadyExistsFault
+    , _ClusterQuotaForCustomerExceededFault
+    , _AuthorizationNotFoundFault
+    , _CacheSecurityGroupQuotaExceededFault
+    , _InvalidCacheClusterStateFault
+    , _CacheParameterGroupQuotaExceededFault
+    , _NodeQuotaForCustomerExceededFault
+    , _CacheSubnetQuotaExceededFault
+    , _CacheParameterGroupNotFoundFault
+    , _InvalidParameterCombinationException
+    , _InvalidARNFault
+    , _InvalidCacheParameterGroupStateFault
+    , _CacheSecurityGroupAlreadyExistsFault
+    , _InvalidCacheSecurityGroupStateFault
+
+    -- * AZMode
+    , AZMode (..)
+
+    -- * AutomaticFailoverStatus
+    , AutomaticFailoverStatus (..)
+
+    -- * PendingAutomaticFailoverStatus
+    , PendingAutomaticFailoverStatus (..)
+
+    -- * SourceType
+    , SourceType (..)
+
+    -- * AvailabilityZone
+    , AvailabilityZone
+    , availabilityZone
+    , azName
+
+    -- * CacheCluster
+    , CacheCluster
+    , cacheCluster
+    , ccCacheNodeType
+    , ccEngineVersion
+    , ccCacheNodes
+    , ccCacheClusterCreateTime
+    , ccAutoMinorVersionUpgrade
+    , ccSecurityGroups
+    , ccNotificationConfiguration
+    , ccSnapshotWindow
+    , ccCacheClusterId
+    , ccConfigurationEndpoint
+    , ccEngine
+    , ccCacheSecurityGroups
+    , ccClientDownloadLandingPage
+    , ccPreferredMaintenanceWindow
+    , ccCacheSubnetGroupName
+    , ccCacheClusterStatus
+    , ccPreferredAvailabilityZone
+    , ccCacheParameterGroup
+    , ccSnapshotRetentionLimit
+    , ccReplicationGroupId
+    , ccPendingModifiedValues
+    , ccNumCacheNodes
+
+    -- * CacheEngineVersion
+    , CacheEngineVersion
+    , cacheEngineVersion
+    , cevCacheEngineDescription
+    , cevCacheParameterGroupFamily
+    , cevEngineVersion
+    , cevCacheEngineVersionDescription
+    , cevEngine
+
+    -- * CacheNode
+    , CacheNode
+    , cacheNode
+    , cnSourceCacheNodeId
+    , cnParameterGroupStatus
+    , cnCacheNodeCreateTime
+    , cnCustomerAvailabilityZone
+    , cnCacheNodeId
+    , cnCacheNodeStatus
+    , cnEndpoint
+
+    -- * CacheNodeTypeSpecificParameter
+    , CacheNodeTypeSpecificParameter
+    , cacheNodeTypeSpecificParameter
+    , cntspCacheNodeTypeSpecificValues
+    , cntspMinimumEngineVersion
+    , cntspSource
+    , cntspIsModifiable
+    , cntspAllowedValues
+    , cntspDataType
+    , cntspParameterName
+    , cntspDescription
+
+    -- * CacheNodeTypeSpecificValue
+    , CacheNodeTypeSpecificValue
+    , cacheNodeTypeSpecificValue
+    , cntsvCacheNodeType
+    , cntsvValue
+
+    -- * CacheParameterGroup
+    , CacheParameterGroup
+    , cacheParameterGroup
+    , cpgCacheParameterGroupFamily
+    , cpgCacheParameterGroupName
+    , cpgDescription
+
+    -- * CacheParameterGroupNameMessage
+    , CacheParameterGroupNameMessage
+    , cacheParameterGroupNameMessage
+    , cpgnmCacheParameterGroupName
+
+    -- * CacheParameterGroupStatus
+    , CacheParameterGroupStatus
+    , cacheParameterGroupStatus
+    , cpgsCacheParameterGroupName
+    , cpgsCacheNodeIdsToReboot
+    , cpgsParameterApplyStatus
+
+    -- * CacheSecurityGroup
+    , CacheSecurityGroup
+    , cacheSecurityGroup
+    , csgCacheSecurityGroupName
+    , csgOwnerId
+    , csgEC2SecurityGroups
+    , csgDescription
+
+    -- * CacheSecurityGroupMembership
+    , CacheSecurityGroupMembership
+    , cacheSecurityGroupMembership
+    , csgmStatus
+    , csgmCacheSecurityGroupName
+
+    -- * CacheSubnetGroup
+    , CacheSubnetGroup
+    , cacheSubnetGroup
+    , csgVPCId
+    , csgSubnets
+    , csgCacheSubnetGroupName
+    , csgCacheSubnetGroupDescription
+
+    -- * EC2SecurityGroup
+    , EC2SecurityGroup
+    , ec2SecurityGroup
+    , esgStatus
+    , esgEC2SecurityGroupOwnerId
+    , esgEC2SecurityGroupName
+
+    -- * Endpoint
+    , Endpoint
+    , endpoint
+    , eAddress
+    , ePort
+
+    -- * EngineDefaults
+    , EngineDefaults
+    , engineDefaults
+    , edCacheParameterGroupFamily
+    , edCacheNodeTypeSpecificParameters
+    , edParameters
+    , edMarker
+
+    -- * Event
+    , Event
+    , event
+    , eSourceType
+    , eSourceIdentifier
+    , eDate
+    , eMessage
+
+    -- * NodeGroup
+    , NodeGroup
+    , nodeGroup
+    , ngStatus
+    , ngPrimaryEndpoint
+    , ngNodeGroupMembers
+    , ngNodeGroupId
+
+    -- * NodeGroupMember
+    , NodeGroupMember
+    , nodeGroupMember
+    , ngmCacheClusterId
+    , ngmCacheNodeId
+    , ngmPreferredAvailabilityZone
+    , ngmCurrentRole
+    , ngmReadEndpoint
+
+    -- * NodeSnapshot
+    , NodeSnapshot
+    , nodeSnapshot
+    , nsCacheNodeCreateTime
+    , nsCacheNodeId
+    , nsSnapshotCreateTime
+    , nsCacheSize
+
+    -- * NotificationConfiguration
+    , NotificationConfiguration
+    , notificationConfiguration
+    , ncTopicStatus
+    , ncTopicARN
+
+    -- * Parameter
+    , Parameter
+    , parameter
+    , pParameterValue
+    , pMinimumEngineVersion
+    , pSource
+    , pIsModifiable
+    , pAllowedValues
+    , pDataType
+    , pParameterName
+    , pDescription
+
+    -- * ParameterNameValue
+    , ParameterNameValue
+    , parameterNameValue
+    , pnvParameterValue
+    , pnvParameterName
+
+    -- * PendingModifiedValues
+    , PendingModifiedValues
+    , pendingModifiedValues
+    , pmvEngineVersion
+    , pmvCacheNodeIdsToRemove
+    , pmvNumCacheNodes
+
+    -- * RecurringCharge
+    , RecurringCharge
+    , recurringCharge
+    , rcRecurringChargeFrequency
+    , rcRecurringChargeAmount
+
+    -- * ReplicationGroup
+    , ReplicationGroup
+    , replicationGroup
+    , rgNodeGroups
+    , rgStatus
+    , rgSnapshottingClusterId
+    , rgMemberClusters
+    , rgReplicationGroupId
+    , rgPendingModifiedValues
+    , rgDescription
+    , rgAutomaticFailover
+
+    -- * ReplicationGroupPendingModifiedValues
+    , ReplicationGroupPendingModifiedValues
+    , replicationGroupPendingModifiedValues
+    , rgpmvPrimaryClusterId
+    , rgpmvAutomaticFailoverStatus
+
+    -- * ReservedCacheNode
+    , ReservedCacheNode
+    , reservedCacheNode
+    , rcnCacheNodeType
+    , rcnState
+    , rcnProductDescription
+    , rcnStartTime
+    , rcnCacheNodeCount
+    , rcnReservedCacheNodeId
+    , rcnOfferingType
+    , rcnUsagePrice
+    , rcnRecurringCharges
+    , rcnFixedPrice
+    , rcnDuration
+    , rcnReservedCacheNodesOfferingId
+
+    -- * ReservedCacheNodesOffering
+    , ReservedCacheNodesOffering
+    , reservedCacheNodesOffering
+    , rcnoCacheNodeType
+    , rcnoProductDescription
+    , rcnoOfferingType
+    , rcnoUsagePrice
+    , rcnoRecurringCharges
+    , rcnoFixedPrice
+    , rcnoDuration
+    , rcnoReservedCacheNodesOfferingId
+
+    -- * SecurityGroupMembership
+    , SecurityGroupMembership
+    , securityGroupMembership
+    , sgmStatus
+    , sgmSecurityGroupId
+
+    -- * Snapshot
+    , Snapshot
+    , snapshot
+    , sCacheNodeType
+    , sEngineVersion
+    , sCacheClusterCreateTime
+    , sAutoMinorVersionUpgrade
+    , sCacheParameterGroupName
+    , sSnapshotStatus
+    , sSnapshotWindow
+    , sVPCId
+    , sCacheClusterId
+    , sEngine
+    , sPreferredMaintenanceWindow
+    , sTopicARN
+    , sCacheSubnetGroupName
+    , sNodeSnapshots
+    , sPreferredAvailabilityZone
+    , sSnapshotRetentionLimit
+    , sSnapshotName
+    , sSnapshotSource
+    , sNumCacheNodes
+    , sPort
+
+    -- * Subnet
+    , Subnet
+    , subnet
+    , sSubnetIdentifier
+    , sSubnetAvailabilityZone
+
+    -- * Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
+
+    -- * TagListMessage
+    , TagListMessage
+    , tagListMessage
+    , tlmTagList
+    ) where
+
+import           Network.AWS.ElastiCache.Types.Product
+import           Network.AWS.ElastiCache.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | Version @2015-02-02@ of the Amazon ElastiCache SDK.
+data ElastiCache
+
+instance AWSService ElastiCache where
+    type Sg ElastiCache = V4
+    service = const svc
+      where
+        svc =
+            Service
+            { _svcAbbrev = "ElastiCache"
+            , _svcPrefix = "elasticache"
+            , _svcVersion = "2015-02-02"
+            , _svcEndpoint = defaultEndpoint svc
+            , _svcTimeout = Just 70
+            , _svcStatus = statusSuccess
+            , _svcError = parseXMLError
+            , _svcRetry = retry
+            }
+        retry =
+            Exponential
+            { _retryBase = 5.0e-2
+            , _retryGrowth = 2
+            , _retryAttempts = 5
+            , _retryCheck = check
+            }
+        check e
+          | has (hasCode "ThrottlingException" . hasStatus 400) e =
+              Just "throttling_exception"
+          | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+          | has (hasStatus 503) e = Just "service_unavailable"
+          | has (hasStatus 500) e = Just "general_server_error"
+          | has (hasStatus 509) e = Just "limit_exceeded"
+          | otherwise = Nothing
+
+-- | The requested cache subnet group name is already in use by an existing
+-- cache subnet group.
+_CacheSubnetGroupAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSubnetGroupAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheSubnetGroupAlreadyExists"
+
+-- | The requested cache subnet group is currently in use.
+_CacheSubnetGroupInUse :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSubnetGroupInUse =
+    _ServiceError . hasStatus 400 . hasCode "CacheSubnetGroupInUse"
+
+-- | The requested cache security group name does not refer to an existing
+-- cache security group.
+_CacheSecurityGroupNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSecurityGroupNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "CacheSecurityGroupNotFound"
+
+-- | You already have a reservation with the given identifier.
+_ReservedCacheNodeAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReservedCacheNodeAlreadyExistsFault =
+    _ServiceError . hasStatus 404 . hasCode "ReservedCacheNodeAlreadyExists"
+
+-- | The specified Amazon EC2 security group is already authorized for the
+-- specified cache security group.
+_AuthorizationAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_AuthorizationAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "AuthorizationAlreadyExists"
+
+-- | The request cannot be processed because it would exceed the user\'s
+-- cache node quota.
+_ReservedCacheNodeQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReservedCacheNodeQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "ReservedCacheNodeQuotaExceeded"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of cache subnet groups.
+_CacheSubnetGroupQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSubnetGroupQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheSubnetGroupQuotaExceeded"
+
+-- | The specified replication group does not exist.
+_ReplicationGroupNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReplicationGroupNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "ReplicationGroupNotFoundFault"
+
+-- | The requested cache node offering does not exist.
+_ReservedCacheNodesOfferingNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReservedCacheNodesOfferingNotFoundFault =
+    _ServiceError .
+    hasStatus 404 . hasCode "ReservedCacheNodesOfferingNotFound"
+
+-- | The request cannot be processed because it would cause the resource to
+-- have more than the allowed number of tags. The maximum number of tags
+-- permitted on a resource is 10.
+_TagQuotaPerResourceExceeded :: AsError a => Getting (First ServiceError) a ServiceError
+_TagQuotaPerResourceExceeded =
+    _ServiceError . hasStatus 400 . hasCode "TagQuotaPerResourceExceeded"
+
+-- | An invalid subnet identifier was specified.
+_InvalidSubnet :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidSubnet = _ServiceError . hasStatus 400 . hasCode "InvalidSubnet"
+
+-- | The requested snapshot name does not refer to an existing snapshot.
+_SnapshotNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_SnapshotNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "SnapshotNotFoundFault"
+
+-- | The requested cache node type is not available in the specified
+-- Availability Zone.
+_InsufficientCacheClusterCapacityFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InsufficientCacheClusterCapacityFault =
+    _ServiceError . hasStatus 400 . hasCode "InsufficientCacheClusterCapacity"
+
+-- | The current state of the snapshot does not allow the requested action to
+-- occur.
+_InvalidSnapshotStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidSnapshotStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidSnapshotState"
+
+-- | You already have a snapshot with the given name.
+_SnapshotAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_SnapshotAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "SnapshotAlreadyExistsFault"
+
+-- | The requested tag was not found on this resource.
+_TagNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_TagNotFoundFault = _ServiceError . hasStatus 404 . hasCode "TagNotFound"
+
+-- | The request cannot be processed because it would exceed the maximum
+-- number of snapshots.
+_SnapshotQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_SnapshotQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "SnapshotQuotaExceededFault"
+
+-- | A cache parameter group with the requested name already exists.
+_CacheParameterGroupAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheParameterGroupAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheParameterGroupAlreadyExists"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of cache nodes in a single cache cluster.
+_NodeQuotaForClusterExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_NodeQuotaForClusterExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "NodeQuotaForClusterExceeded"
+
+-- | You attempted one of the following actions:
+--
+-- -   Creating a snapshot of a Redis cache cluster running on a /t1.micro/
+--     cache node.
+--
+-- -   Creating a snapshot of a cache cluster that is running Memcached
+--     rather than Redis.
+--
+-- Neither of these are supported by ElastiCache.
+_SnapshotFeatureNotSupportedFault :: AsError a => Getting (First ServiceError) a ServiceError
+_SnapshotFeatureNotSupportedFault =
+    _ServiceError . hasStatus 400 . hasCode "SnapshotFeatureNotSupportedFault"
+
+-- | The requested cache subnet group name does not refer to an existing
+-- cache subnet group.
+_CacheSubnetGroupNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSubnetGroupNotFoundFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheSubnetGroupNotFoundFault"
+
+-- | The requested reserved cache node was not found.
+_ReservedCacheNodeNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReservedCacheNodeNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "ReservedCacheNodeNotFound"
+
+-- | The value for a parameter is invalid.
+_InvalidParameterValueException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidParameterValueException =
+    _ServiceError . hasStatus 400 . hasCode "InvalidParameterValue"
+
+-- | The VPC network is in an invalid state.
+_InvalidVPCNetworkStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidVPCNetworkStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidVPCNetworkStateFault"
+
+-- | The requested cache cluster ID does not refer to an existing cache
+-- cluster.
+_CacheClusterNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheClusterNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "CacheClusterNotFound"
+
+-- | The requested replication group is not in the /available/ state.
+_InvalidReplicationGroupStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidReplicationGroupStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidReplicationGroupState"
+
+-- | The specified replication group already exists.
+_ReplicationGroupAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ReplicationGroupAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "ReplicationGroupAlreadyExists"
+
+-- | The requested subnet is being used by another cache subnet group.
+_SubnetInUse :: AsError a => Getting (First ServiceError) a ServiceError
+_SubnetInUse = _ServiceError . hasStatus 400 . hasCode "SubnetInUse"
+
+-- | You already have a cache cluster with the given identifier.
+_CacheClusterAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheClusterAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheClusterAlreadyExists"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of cache clusters per customer.
+_ClusterQuotaForCustomerExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_ClusterQuotaForCustomerExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "ClusterQuotaForCustomerExceeded"
+
+-- | The specified Amazon EC2 security group is not authorized for the
+-- specified cache security group.
+_AuthorizationNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_AuthorizationNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "AuthorizationNotFound"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of cache security groups.
+_CacheSecurityGroupQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSecurityGroupQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "QuotaExceeded.CacheSecurityGroup"
+
+-- | The requested cache cluster is not in the /available/ state.
+_InvalidCacheClusterStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidCacheClusterStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidCacheClusterState"
+
+-- | The request cannot be processed because it would exceed the maximum
+-- number of cache security groups.
+_CacheParameterGroupQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheParameterGroupQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheParameterGroupQuotaExceeded"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of cache nodes per customer.
+_NodeQuotaForCustomerExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_NodeQuotaForCustomerExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "NodeQuotaForCustomerExceeded"
+
+-- | The request cannot be processed because it would exceed the allowed
+-- number of subnets in a cache subnet group.
+_CacheSubnetQuotaExceededFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSubnetQuotaExceededFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheSubnetQuotaExceededFault"
+
+-- | The requested cache parameter group name does not refer to an existing
+-- cache parameter group.
+_CacheParameterGroupNotFoundFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheParameterGroupNotFoundFault =
+    _ServiceError . hasStatus 404 . hasCode "CacheParameterGroupNotFound"
+
+-- | Two or more incompatible parameters were specified.
+_InvalidParameterCombinationException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidParameterCombinationException =
+    _ServiceError . hasStatus 400 . hasCode "InvalidParameterCombination"
+
+-- | The requested Amazon Resource Name (ARN) does not refer to an existing
+-- resource.
+_InvalidARNFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidARNFault = _ServiceError . hasStatus 400 . hasCode "InvalidARN"
+
+-- | The current state of the cache parameter group does not allow the
+-- requested action to occur.
+_InvalidCacheParameterGroupStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidCacheParameterGroupStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidCacheParameterGroupState"
+
+-- | A cache security group with the specified name already exists.
+_CacheSecurityGroupAlreadyExistsFault :: AsError a => Getting (First ServiceError) a ServiceError
+_CacheSecurityGroupAlreadyExistsFault =
+    _ServiceError . hasStatus 400 . hasCode "CacheSecurityGroupAlreadyExists"
+
+-- | The current state of the cache security group does not allow deletion.
+_InvalidCacheSecurityGroupStateFault :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidCacheSecurityGroupStateFault =
+    _ServiceError . hasStatus 400 . hasCode "InvalidCacheSecurityGroupState"
diff --git a/gen/Network/AWS/ElastiCache/Types/Product.hs b/gen/Network/AWS/ElastiCache/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElastiCache/Types/Product.hs
@@ -0,0 +1,2436 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElastiCache.Types.Product
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.ElastiCache.Types.Product where
+
+import           Network.AWS.ElastiCache.Types.Sum
+import           Network.AWS.Prelude
+
+-- | Describes an Availability Zone in which the cache cluster is launched.
+--
+-- /See:/ 'availabilityZone' smart constructor.
+newtype AvailabilityZone = AvailabilityZone'
+    { _azName :: Maybe Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AvailabilityZone' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'azName'
+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")
+
+-- | Contains all of the attributes of a specific cache cluster.
+--
+-- /See:/ 'cacheCluster' smart constructor.
+data CacheCluster = CacheCluster'
+    { _ccCacheNodeType              :: !(Maybe Text)
+    , _ccEngineVersion              :: !(Maybe Text)
+    , _ccCacheNodes                 :: !(Maybe [CacheNode])
+    , _ccCacheClusterCreateTime     :: !(Maybe ISO8601)
+    , _ccAutoMinorVersionUpgrade    :: !(Maybe Bool)
+    , _ccSecurityGroups             :: !(Maybe [SecurityGroupMembership])
+    , _ccNotificationConfiguration  :: !(Maybe NotificationConfiguration)
+    , _ccSnapshotWindow             :: !(Maybe Text)
+    , _ccCacheClusterId             :: !(Maybe Text)
+    , _ccConfigurationEndpoint      :: !(Maybe Endpoint)
+    , _ccEngine                     :: !(Maybe Text)
+    , _ccCacheSecurityGroups        :: !(Maybe [CacheSecurityGroupMembership])
+    , _ccClientDownloadLandingPage  :: !(Maybe Text)
+    , _ccPreferredMaintenanceWindow :: !(Maybe Text)
+    , _ccCacheSubnetGroupName       :: !(Maybe Text)
+    , _ccCacheClusterStatus         :: !(Maybe Text)
+    , _ccPreferredAvailabilityZone  :: !(Maybe Text)
+    , _ccCacheParameterGroup        :: !(Maybe CacheParameterGroupStatus)
+    , _ccSnapshotRetentionLimit     :: !(Maybe Int)
+    , _ccReplicationGroupId         :: !(Maybe Text)
+    , _ccPendingModifiedValues      :: !(Maybe PendingModifiedValues)
+    , _ccNumCacheNodes              :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheCluster' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ccCacheNodeType'
+--
+-- * 'ccEngineVersion'
+--
+-- * 'ccCacheNodes'
+--
+-- * 'ccCacheClusterCreateTime'
+--
+-- * 'ccAutoMinorVersionUpgrade'
+--
+-- * 'ccSecurityGroups'
+--
+-- * 'ccNotificationConfiguration'
+--
+-- * 'ccSnapshotWindow'
+--
+-- * 'ccCacheClusterId'
+--
+-- * 'ccConfigurationEndpoint'
+--
+-- * 'ccEngine'
+--
+-- * 'ccCacheSecurityGroups'
+--
+-- * 'ccClientDownloadLandingPage'
+--
+-- * 'ccPreferredMaintenanceWindow'
+--
+-- * 'ccCacheSubnetGroupName'
+--
+-- * 'ccCacheClusterStatus'
+--
+-- * 'ccPreferredAvailabilityZone'
+--
+-- * 'ccCacheParameterGroup'
+--
+-- * 'ccSnapshotRetentionLimit'
+--
+-- * 'ccReplicationGroupId'
+--
+-- * 'ccPendingModifiedValues'
+--
+-- * 'ccNumCacheNodes'
+cacheCluster
+    :: CacheCluster
+cacheCluster =
+    CacheCluster'
+    { _ccCacheNodeType = Nothing
+    , _ccEngineVersion = Nothing
+    , _ccCacheNodes = Nothing
+    , _ccCacheClusterCreateTime = Nothing
+    , _ccAutoMinorVersionUpgrade = Nothing
+    , _ccSecurityGroups = Nothing
+    , _ccNotificationConfiguration = Nothing
+    , _ccSnapshotWindow = Nothing
+    , _ccCacheClusterId = Nothing
+    , _ccConfigurationEndpoint = Nothing
+    , _ccEngine = Nothing
+    , _ccCacheSecurityGroups = Nothing
+    , _ccClientDownloadLandingPage = Nothing
+    , _ccPreferredMaintenanceWindow = Nothing
+    , _ccCacheSubnetGroupName = Nothing
+    , _ccCacheClusterStatus = Nothing
+    , _ccPreferredAvailabilityZone = Nothing
+    , _ccCacheParameterGroup = Nothing
+    , _ccSnapshotRetentionLimit = Nothing
+    , _ccReplicationGroupId = Nothing
+    , _ccPendingModifiedValues = Nothing
+    , _ccNumCacheNodes = Nothing
+    }
+
+-- | The name of the compute and memory capacity node type for the cache
+-- cluster.
+--
+-- Valid node types are as follows:
+--
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
+--
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+ccCacheNodeType :: Lens' CacheCluster (Maybe Text)
+ccCacheNodeType = lens _ccCacheNodeType (\ s a -> s{_ccCacheNodeType = a});
+
+-- | The version of the cache engine version that is used in this cache
+-- cluster.
+ccEngineVersion :: Lens' CacheCluster (Maybe Text)
+ccEngineVersion = lens _ccEngineVersion (\ s a -> s{_ccEngineVersion = a});
+
+-- | A list of cache nodes that are members of the cache cluster.
+ccCacheNodes :: Lens' CacheCluster [CacheNode]
+ccCacheNodes = lens _ccCacheNodes (\ s a -> s{_ccCacheNodes = a}) . _Default . _Coerce;
+
+-- | The date and time when the cache cluster was created.
+ccCacheClusterCreateTime :: Lens' CacheCluster (Maybe UTCTime)
+ccCacheClusterCreateTime = lens _ccCacheClusterCreateTime (\ s a -> s{_ccCacheClusterCreateTime = a}) . mapping _Time;
+
+-- | This parameter is currently disabled.
+ccAutoMinorVersionUpgrade :: Lens' CacheCluster (Maybe Bool)
+ccAutoMinorVersionUpgrade = lens _ccAutoMinorVersionUpgrade (\ s a -> s{_ccAutoMinorVersionUpgrade = a});
+
+-- | A list of VPC Security Groups associated with the cache cluster.
+ccSecurityGroups :: Lens' CacheCluster [SecurityGroupMembership]
+ccSecurityGroups = lens _ccSecurityGroups (\ s a -> s{_ccSecurityGroups = a}) . _Default . _Coerce;
+
+-- | Undocumented member.
+ccNotificationConfiguration :: Lens' CacheCluster (Maybe NotificationConfiguration)
+ccNotificationConfiguration = lens _ccNotificationConfiguration (\ s a -> s{_ccNotificationConfiguration = a});
+
+-- | The daily time range (in UTC) during which ElastiCache will begin taking
+-- a daily snapshot of your cache cluster.
+--
+-- Example: '05:00-09:00'
+ccSnapshotWindow :: Lens' CacheCluster (Maybe Text)
+ccSnapshotWindow = lens _ccSnapshotWindow (\ s a -> s{_ccSnapshotWindow = a});
+
+-- | The user-supplied identifier of the cache cluster. This identifier is a
+-- unique key that identifies a cache cluster.
+ccCacheClusterId :: Lens' CacheCluster (Maybe Text)
+ccCacheClusterId = lens _ccCacheClusterId (\ s a -> s{_ccCacheClusterId = a});
+
+-- | Undocumented member.
+ccConfigurationEndpoint :: Lens' CacheCluster (Maybe Endpoint)
+ccConfigurationEndpoint = lens _ccConfigurationEndpoint (\ s a -> s{_ccConfigurationEndpoint = a});
+
+-- | The name of the cache engine (/memcached/ or /redis/) to be used for
+-- this cache cluster.
+ccEngine :: Lens' CacheCluster (Maybe Text)
+ccEngine = lens _ccEngine (\ s a -> s{_ccEngine = a});
+
+-- | A list of cache security group elements, composed of name and status
+-- sub-elements.
+ccCacheSecurityGroups :: Lens' CacheCluster [CacheSecurityGroupMembership]
+ccCacheSecurityGroups = lens _ccCacheSecurityGroups (\ s a -> s{_ccCacheSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The URL of the web page where you can download the latest ElastiCache
+-- client library.
+ccClientDownloadLandingPage :: Lens' CacheCluster (Maybe Text)
+ccClientDownloadLandingPage = lens _ccClientDownloadLandingPage (\ s a -> s{_ccClientDownloadLandingPage = a});
+
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
+--
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
+--
+-- Example: 'sun:05:00-sun:09:00'
+ccPreferredMaintenanceWindow :: Lens' CacheCluster (Maybe Text)
+ccPreferredMaintenanceWindow = lens _ccPreferredMaintenanceWindow (\ s a -> s{_ccPreferredMaintenanceWindow = a});
+
+-- | The name of the cache subnet group associated with the cache cluster.
+ccCacheSubnetGroupName :: Lens' CacheCluster (Maybe Text)
+ccCacheSubnetGroupName = lens _ccCacheSubnetGroupName (\ s a -> s{_ccCacheSubnetGroupName = a});
+
+-- | The current state of this cache cluster, one of the following values:
+-- /available/, /creating/, /deleted/, /deleting/, /incompatible-network/,
+-- /modifying/, /rebooting cache cluster nodes/, /restore-failed/, or
+-- /snapshotting/.
+ccCacheClusterStatus :: Lens' CacheCluster (Maybe Text)
+ccCacheClusterStatus = lens _ccCacheClusterStatus (\ s a -> s{_ccCacheClusterStatus = a});
+
+-- | The name of the Availability Zone in which the cache cluster is located
+-- or \"Multiple\" if the cache nodes are located in different Availability
+-- Zones.
+ccPreferredAvailabilityZone :: Lens' CacheCluster (Maybe Text)
+ccPreferredAvailabilityZone = lens _ccPreferredAvailabilityZone (\ s a -> s{_ccPreferredAvailabilityZone = a});
+
+-- | Undocumented member.
+ccCacheParameterGroup :: Lens' CacheCluster (Maybe CacheParameterGroupStatus)
+ccCacheParameterGroup = lens _ccCacheParameterGroup (\ s a -> s{_ccCacheParameterGroup = a});
+
+-- | The number of days for which ElastiCache will retain automatic cache
+-- cluster snapshots before deleting them. For example, if you set
+-- /SnapshotRetentionLimit/ to 5, then a snapshot that was taken today will
+-- be retained for 5 days before being deleted.
+--
+-- __Important__
+-- If the value of SnapshotRetentionLimit is set to zero (0), backups are
+-- turned off.
+ccSnapshotRetentionLimit :: Lens' CacheCluster (Maybe Int)
+ccSnapshotRetentionLimit = lens _ccSnapshotRetentionLimit (\ s a -> s{_ccSnapshotRetentionLimit = a});
+
+-- | The replication group to which this cache cluster belongs. If this field
+-- is empty, the cache cluster is not associated with any replication
+-- group.
+ccReplicationGroupId :: Lens' CacheCluster (Maybe Text)
+ccReplicationGroupId = lens _ccReplicationGroupId (\ s a -> s{_ccReplicationGroupId = a});
+
+-- | Undocumented member.
+ccPendingModifiedValues :: Lens' CacheCluster (Maybe PendingModifiedValues)
+ccPendingModifiedValues = lens _ccPendingModifiedValues (\ s a -> s{_ccPendingModifiedValues = a});
+
+-- | The number of cache nodes in the cache cluster.
+--
+-- For clusters running Redis, this value must be 1. For clusters running
+-- Memcached, this value must be between 1 and 20.
+ccNumCacheNodes :: Lens' CacheCluster (Maybe Int)
+ccNumCacheNodes = lens _ccNumCacheNodes (\ s a -> s{_ccNumCacheNodes = a});
+
+instance FromXML CacheCluster where
+        parseXML x
+          = CacheCluster' <$>
+              (x .@? "CacheNodeType") <*> (x .@? "EngineVersion")
+                <*>
+                (x .@? "CacheNodes" .!@ mempty >>=
+                   may (parseXMLList "CacheNode"))
+                <*> (x .@? "CacheClusterCreateTime")
+                <*> (x .@? "AutoMinorVersionUpgrade")
+                <*>
+                (x .@? "SecurityGroups" .!@ mempty >>=
+                   may (parseXMLList "member"))
+                <*> (x .@? "NotificationConfiguration")
+                <*> (x .@? "SnapshotWindow")
+                <*> (x .@? "CacheClusterId")
+                <*> (x .@? "ConfigurationEndpoint")
+                <*> (x .@? "Engine")
+                <*>
+                (x .@? "CacheSecurityGroups" .!@ mempty >>=
+                   may (parseXMLList "CacheSecurityGroup"))
+                <*> (x .@? "ClientDownloadLandingPage")
+                <*> (x .@? "PreferredMaintenanceWindow")
+                <*> (x .@? "CacheSubnetGroupName")
+                <*> (x .@? "CacheClusterStatus")
+                <*> (x .@? "PreferredAvailabilityZone")
+                <*> (x .@? "CacheParameterGroup")
+                <*> (x .@? "SnapshotRetentionLimit")
+                <*> (x .@? "ReplicationGroupId")
+                <*> (x .@? "PendingModifiedValues")
+                <*> (x .@? "NumCacheNodes")
+
+-- | Provides all of the details about a particular cache engine version.
+--
+-- /See:/ 'cacheEngineVersion' smart constructor.
+data CacheEngineVersion = CacheEngineVersion'
+    { _cevCacheEngineDescription        :: !(Maybe Text)
+    , _cevCacheParameterGroupFamily     :: !(Maybe Text)
+    , _cevEngineVersion                 :: !(Maybe Text)
+    , _cevCacheEngineVersionDescription :: !(Maybe Text)
+    , _cevEngine                        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheEngineVersion' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cevCacheEngineDescription'
+--
+-- * 'cevCacheParameterGroupFamily'
+--
+-- * 'cevEngineVersion'
+--
+-- * 'cevCacheEngineVersionDescription'
+--
+-- * 'cevEngine'
+cacheEngineVersion
+    :: CacheEngineVersion
+cacheEngineVersion =
+    CacheEngineVersion'
+    { _cevCacheEngineDescription = Nothing
+    , _cevCacheParameterGroupFamily = Nothing
+    , _cevEngineVersion = Nothing
+    , _cevCacheEngineVersionDescription = Nothing
+    , _cevEngine = Nothing
+    }
+
+-- | The description of the cache engine.
+cevCacheEngineDescription :: Lens' CacheEngineVersion (Maybe Text)
+cevCacheEngineDescription = lens _cevCacheEngineDescription (\ s a -> s{_cevCacheEngineDescription = a});
+
+-- | The name of the cache parameter group family associated with this cache
+-- engine.
+cevCacheParameterGroupFamily :: Lens' CacheEngineVersion (Maybe Text)
+cevCacheParameterGroupFamily = lens _cevCacheParameterGroupFamily (\ s a -> s{_cevCacheParameterGroupFamily = a});
+
+-- | The version number of the cache engine.
+cevEngineVersion :: Lens' CacheEngineVersion (Maybe Text)
+cevEngineVersion = lens _cevEngineVersion (\ s a -> s{_cevEngineVersion = a});
+
+-- | The description of the cache engine version.
+cevCacheEngineVersionDescription :: Lens' CacheEngineVersion (Maybe Text)
+cevCacheEngineVersionDescription = lens _cevCacheEngineVersionDescription (\ s a -> s{_cevCacheEngineVersionDescription = a});
+
+-- | The name of the cache engine.
+cevEngine :: Lens' CacheEngineVersion (Maybe Text)
+cevEngine = lens _cevEngine (\ s a -> s{_cevEngine = a});
+
+instance FromXML CacheEngineVersion where
+        parseXML x
+          = CacheEngineVersion' <$>
+              (x .@? "CacheEngineDescription") <*>
+                (x .@? "CacheParameterGroupFamily")
+                <*> (x .@? "EngineVersion")
+                <*> (x .@? "CacheEngineVersionDescription")
+                <*> (x .@? "Engine")
+
+-- | Represents an individual cache node within a cache cluster. Each cache
+-- node runs its own instance of the cluster\'s protocol-compliant caching
+-- software - either Memcached or Redis.
+--
+-- Valid node types are as follows:
+--
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
+--
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+--
+-- /See:/ 'cacheNode' smart constructor.
+data CacheNode = CacheNode'
+    { _cnSourceCacheNodeId        :: !(Maybe Text)
+    , _cnParameterGroupStatus     :: !(Maybe Text)
+    , _cnCacheNodeCreateTime      :: !(Maybe ISO8601)
+    , _cnCustomerAvailabilityZone :: !(Maybe Text)
+    , _cnCacheNodeId              :: !(Maybe Text)
+    , _cnCacheNodeStatus          :: !(Maybe Text)
+    , _cnEndpoint                 :: !(Maybe Endpoint)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheNode' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cnSourceCacheNodeId'
+--
+-- * 'cnParameterGroupStatus'
+--
+-- * 'cnCacheNodeCreateTime'
+--
+-- * 'cnCustomerAvailabilityZone'
+--
+-- * 'cnCacheNodeId'
+--
+-- * 'cnCacheNodeStatus'
+--
+-- * 'cnEndpoint'
+cacheNode
+    :: CacheNode
+cacheNode =
+    CacheNode'
+    { _cnSourceCacheNodeId = Nothing
+    , _cnParameterGroupStatus = Nothing
+    , _cnCacheNodeCreateTime = Nothing
+    , _cnCustomerAvailabilityZone = Nothing
+    , _cnCacheNodeId = Nothing
+    , _cnCacheNodeStatus = Nothing
+    , _cnEndpoint = Nothing
+    }
+
+-- | The ID of the primary node to which this read replica node is
+-- synchronized. If this field is empty, then this node is not associated
+-- with a primary cache cluster.
+cnSourceCacheNodeId :: Lens' CacheNode (Maybe Text)
+cnSourceCacheNodeId = lens _cnSourceCacheNodeId (\ s a -> s{_cnSourceCacheNodeId = a});
+
+-- | The status of the parameter group applied to this cache node.
+cnParameterGroupStatus :: Lens' CacheNode (Maybe Text)
+cnParameterGroupStatus = lens _cnParameterGroupStatus (\ s a -> s{_cnParameterGroupStatus = a});
+
+-- | The date and time when the cache node was created.
+cnCacheNodeCreateTime :: Lens' CacheNode (Maybe UTCTime)
+cnCacheNodeCreateTime = lens _cnCacheNodeCreateTime (\ s a -> s{_cnCacheNodeCreateTime = a}) . mapping _Time;
+
+-- | The Availability Zone where this node was created and now resides.
+cnCustomerAvailabilityZone :: Lens' CacheNode (Maybe Text)
+cnCustomerAvailabilityZone = lens _cnCustomerAvailabilityZone (\ s a -> s{_cnCustomerAvailabilityZone = a});
+
+-- | The cache node identifier. A node ID is a numeric identifier (0001,
+-- 0002, etc.). The combination of cluster ID and node ID uniquely
+-- identifies every cache node used in a customer\'s AWS account.
+cnCacheNodeId :: Lens' CacheNode (Maybe Text)
+cnCacheNodeId = lens _cnCacheNodeId (\ s a -> s{_cnCacheNodeId = a});
+
+-- | The current state of this cache node.
+cnCacheNodeStatus :: Lens' CacheNode (Maybe Text)
+cnCacheNodeStatus = lens _cnCacheNodeStatus (\ s a -> s{_cnCacheNodeStatus = a});
+
+-- | The hostname for connecting to this cache node.
+cnEndpoint :: Lens' CacheNode (Maybe Endpoint)
+cnEndpoint = lens _cnEndpoint (\ s a -> s{_cnEndpoint = a});
+
+instance FromXML CacheNode where
+        parseXML x
+          = CacheNode' <$>
+              (x .@? "SourceCacheNodeId") <*>
+                (x .@? "ParameterGroupStatus")
+                <*> (x .@? "CacheNodeCreateTime")
+                <*> (x .@? "CustomerAvailabilityZone")
+                <*> (x .@? "CacheNodeId")
+                <*> (x .@? "CacheNodeStatus")
+                <*> (x .@? "Endpoint")
+
+-- | A parameter that has a different value for each cache node type it is
+-- applied to. For example, in a Redis cache cluster, a /cache.m1.large/
+-- cache node type would have a larger /maxmemory/ value than a
+-- /cache.m1.small/ type.
+--
+-- /See:/ 'cacheNodeTypeSpecificParameter' smart constructor.
+data CacheNodeTypeSpecificParameter = CacheNodeTypeSpecificParameter'
+    { _cntspCacheNodeTypeSpecificValues :: !(Maybe [CacheNodeTypeSpecificValue])
+    , _cntspMinimumEngineVersion        :: !(Maybe Text)
+    , _cntspSource                      :: !(Maybe Text)
+    , _cntspIsModifiable                :: !(Maybe Bool)
+    , _cntspAllowedValues               :: !(Maybe Text)
+    , _cntspDataType                    :: !(Maybe Text)
+    , _cntspParameterName               :: !(Maybe Text)
+    , _cntspDescription                 :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheNodeTypeSpecificParameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cntspCacheNodeTypeSpecificValues'
+--
+-- * 'cntspMinimumEngineVersion'
+--
+-- * 'cntspSource'
+--
+-- * 'cntspIsModifiable'
+--
+-- * 'cntspAllowedValues'
+--
+-- * 'cntspDataType'
+--
+-- * 'cntspParameterName'
+--
+-- * 'cntspDescription'
+cacheNodeTypeSpecificParameter
+    :: CacheNodeTypeSpecificParameter
+cacheNodeTypeSpecificParameter =
+    CacheNodeTypeSpecificParameter'
+    { _cntspCacheNodeTypeSpecificValues = Nothing
+    , _cntspMinimumEngineVersion = Nothing
+    , _cntspSource = Nothing
+    , _cntspIsModifiable = Nothing
+    , _cntspAllowedValues = Nothing
+    , _cntspDataType = Nothing
+    , _cntspParameterName = Nothing
+    , _cntspDescription = Nothing
+    }
+
+-- | A list of cache node types and their corresponding values for this
+-- parameter.
+cntspCacheNodeTypeSpecificValues :: Lens' CacheNodeTypeSpecificParameter [CacheNodeTypeSpecificValue]
+cntspCacheNodeTypeSpecificValues = lens _cntspCacheNodeTypeSpecificValues (\ s a -> s{_cntspCacheNodeTypeSpecificValues = a}) . _Default . _Coerce;
+
+-- | The earliest cache engine version to which the parameter can apply.
+cntspMinimumEngineVersion :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspMinimumEngineVersion = lens _cntspMinimumEngineVersion (\ s a -> s{_cntspMinimumEngineVersion = a});
+
+-- | The source of the parameter value.
+cntspSource :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspSource = lens _cntspSource (\ s a -> s{_cntspSource = a});
+
+-- | Indicates whether ('true') or not ('false') the parameter can be
+-- modified. Some parameters have security or operational implications that
+-- prevent them from being changed.
+cntspIsModifiable :: Lens' CacheNodeTypeSpecificParameter (Maybe Bool)
+cntspIsModifiable = lens _cntspIsModifiable (\ s a -> s{_cntspIsModifiable = a});
+
+-- | The valid range of values for the parameter.
+cntspAllowedValues :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspAllowedValues = lens _cntspAllowedValues (\ s a -> s{_cntspAllowedValues = a});
+
+-- | The valid data type for the parameter.
+cntspDataType :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspDataType = lens _cntspDataType (\ s a -> s{_cntspDataType = a});
+
+-- | The name of the parameter.
+cntspParameterName :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspParameterName = lens _cntspParameterName (\ s a -> s{_cntspParameterName = a});
+
+-- | A description of the parameter.
+cntspDescription :: Lens' CacheNodeTypeSpecificParameter (Maybe Text)
+cntspDescription = lens _cntspDescription (\ s a -> s{_cntspDescription = a});
+
+instance FromXML CacheNodeTypeSpecificParameter where
+        parseXML x
+          = CacheNodeTypeSpecificParameter' <$>
+              (x .@? "CacheNodeTypeSpecificValues" .!@ mempty >>=
+                 may (parseXMLList "CacheNodeTypeSpecificValue"))
+                <*> (x .@? "MinimumEngineVersion")
+                <*> (x .@? "Source")
+                <*> (x .@? "IsModifiable")
+                <*> (x .@? "AllowedValues")
+                <*> (x .@? "DataType")
+                <*> (x .@? "ParameterName")
+                <*> (x .@? "Description")
+
+-- | A value that applies only to a certain cache node type.
+--
+-- /See:/ 'cacheNodeTypeSpecificValue' smart constructor.
+data CacheNodeTypeSpecificValue = CacheNodeTypeSpecificValue'
+    { _cntsvCacheNodeType :: !(Maybe Text)
+    , _cntsvValue         :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheNodeTypeSpecificValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cntsvCacheNodeType'
+--
+-- * 'cntsvValue'
+cacheNodeTypeSpecificValue
+    :: CacheNodeTypeSpecificValue
+cacheNodeTypeSpecificValue =
+    CacheNodeTypeSpecificValue'
+    { _cntsvCacheNodeType = Nothing
+    , _cntsvValue = Nothing
+    }
+
+-- | The cache node type for which this value applies.
+cntsvCacheNodeType :: Lens' CacheNodeTypeSpecificValue (Maybe Text)
+cntsvCacheNodeType = lens _cntsvCacheNodeType (\ s a -> s{_cntsvCacheNodeType = a});
+
+-- | The value for the cache node type.
+cntsvValue :: Lens' CacheNodeTypeSpecificValue (Maybe Text)
+cntsvValue = lens _cntsvValue (\ s a -> s{_cntsvValue = a});
+
+instance FromXML CacheNodeTypeSpecificValue where
+        parseXML x
+          = CacheNodeTypeSpecificValue' <$>
+              (x .@? "CacheNodeType") <*> (x .@? "Value")
+
+-- | Represents the output of a /CreateCacheParameterGroup/ action.
+--
+-- /See:/ 'cacheParameterGroup' smart constructor.
+data CacheParameterGroup = CacheParameterGroup'
+    { _cpgCacheParameterGroupFamily :: !(Maybe Text)
+    , _cpgCacheParameterGroupName   :: !(Maybe Text)
+    , _cpgDescription               :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheParameterGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpgCacheParameterGroupFamily'
+--
+-- * 'cpgCacheParameterGroupName'
+--
+-- * 'cpgDescription'
+cacheParameterGroup
+    :: CacheParameterGroup
+cacheParameterGroup =
+    CacheParameterGroup'
+    { _cpgCacheParameterGroupFamily = Nothing
+    , _cpgCacheParameterGroupName = Nothing
+    , _cpgDescription = Nothing
+    }
+
+-- | The name of the cache parameter group family that this cache parameter
+-- group is compatible with.
+cpgCacheParameterGroupFamily :: Lens' CacheParameterGroup (Maybe Text)
+cpgCacheParameterGroupFamily = lens _cpgCacheParameterGroupFamily (\ s a -> s{_cpgCacheParameterGroupFamily = a});
+
+-- | The name of the cache parameter group.
+cpgCacheParameterGroupName :: Lens' CacheParameterGroup (Maybe Text)
+cpgCacheParameterGroupName = lens _cpgCacheParameterGroupName (\ s a -> s{_cpgCacheParameterGroupName = a});
+
+-- | The description for this cache parameter group.
+cpgDescription :: Lens' CacheParameterGroup (Maybe Text)
+cpgDescription = lens _cpgDescription (\ s a -> s{_cpgDescription = a});
+
+instance FromXML CacheParameterGroup where
+        parseXML x
+          = CacheParameterGroup' <$>
+              (x .@? "CacheParameterGroupFamily") <*>
+                (x .@? "CacheParameterGroupName")
+                <*> (x .@? "Description")
+
+-- | Represents the output of one of the following actions:
+--
+-- -   /ModifyCacheParameterGroup/
+-- -   /ResetCacheParameterGroup/
+--
+-- /See:/ 'cacheParameterGroupNameMessage' smart constructor.
+newtype CacheParameterGroupNameMessage = CacheParameterGroupNameMessage'
+    { _cpgnmCacheParameterGroupName :: Maybe Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheParameterGroupNameMessage' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpgnmCacheParameterGroupName'
+cacheParameterGroupNameMessage
+    :: CacheParameterGroupNameMessage
+cacheParameterGroupNameMessage =
+    CacheParameterGroupNameMessage'
+    { _cpgnmCacheParameterGroupName = Nothing
+    }
+
+-- | The name of the cache parameter group.
+cpgnmCacheParameterGroupName :: Lens' CacheParameterGroupNameMessage (Maybe Text)
+cpgnmCacheParameterGroupName = lens _cpgnmCacheParameterGroupName (\ s a -> s{_cpgnmCacheParameterGroupName = a});
+
+instance FromXML CacheParameterGroupNameMessage where
+        parseXML x
+          = CacheParameterGroupNameMessage' <$>
+              (x .@? "CacheParameterGroupName")
+
+-- | The status of the cache parameter group.
+--
+-- /See:/ 'cacheParameterGroupStatus' smart constructor.
+data CacheParameterGroupStatus = CacheParameterGroupStatus'
+    { _cpgsCacheParameterGroupName :: !(Maybe Text)
+    , _cpgsCacheNodeIdsToReboot    :: !(Maybe [Text])
+    , _cpgsParameterApplyStatus    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheParameterGroupStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cpgsCacheParameterGroupName'
+--
+-- * 'cpgsCacheNodeIdsToReboot'
+--
+-- * 'cpgsParameterApplyStatus'
+cacheParameterGroupStatus
+    :: CacheParameterGroupStatus
+cacheParameterGroupStatus =
+    CacheParameterGroupStatus'
+    { _cpgsCacheParameterGroupName = Nothing
+    , _cpgsCacheNodeIdsToReboot = Nothing
+    , _cpgsParameterApplyStatus = Nothing
+    }
+
+-- | The name of the cache parameter group.
+cpgsCacheParameterGroupName :: Lens' CacheParameterGroupStatus (Maybe Text)
+cpgsCacheParameterGroupName = lens _cpgsCacheParameterGroupName (\ s a -> s{_cpgsCacheParameterGroupName = a});
+
+-- | A list of the cache node IDs which need to be rebooted for parameter
+-- changes to be applied. A node ID is a numeric identifier (0001, 0002,
+-- etc.).
+cpgsCacheNodeIdsToReboot :: Lens' CacheParameterGroupStatus [Text]
+cpgsCacheNodeIdsToReboot = lens _cpgsCacheNodeIdsToReboot (\ s a -> s{_cpgsCacheNodeIdsToReboot = a}) . _Default . _Coerce;
+
+-- | The status of parameter updates.
+cpgsParameterApplyStatus :: Lens' CacheParameterGroupStatus (Maybe Text)
+cpgsParameterApplyStatus = lens _cpgsParameterApplyStatus (\ s a -> s{_cpgsParameterApplyStatus = a});
+
+instance FromXML CacheParameterGroupStatus where
+        parseXML x
+          = CacheParameterGroupStatus' <$>
+              (x .@? "CacheParameterGroupName") <*>
+                (x .@? "CacheNodeIdsToReboot" .!@ mempty >>=
+                   may (parseXMLList "CacheNodeId"))
+                <*> (x .@? "ParameterApplyStatus")
+
+-- | Represents the output of one of the following actions:
+--
+-- -   /AuthorizeCacheSecurityGroupIngress/
+-- -   /CreateCacheSecurityGroup/
+-- -   /RevokeCacheSecurityGroupIngress/
+--
+-- /See:/ 'cacheSecurityGroup' smart constructor.
+data CacheSecurityGroup = CacheSecurityGroup'
+    { _csgCacheSecurityGroupName :: !(Maybe Text)
+    , _csgOwnerId                :: !(Maybe Text)
+    , _csgEC2SecurityGroups      :: !(Maybe [EC2SecurityGroup])
+    , _csgDescription            :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheSecurityGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csgCacheSecurityGroupName'
+--
+-- * 'csgOwnerId'
+--
+-- * 'csgEC2SecurityGroups'
+--
+-- * 'csgDescription'
+cacheSecurityGroup
+    :: CacheSecurityGroup
+cacheSecurityGroup =
+    CacheSecurityGroup'
+    { _csgCacheSecurityGroupName = Nothing
+    , _csgOwnerId = Nothing
+    , _csgEC2SecurityGroups = Nothing
+    , _csgDescription = Nothing
+    }
+
+-- | The name of the cache security group.
+csgCacheSecurityGroupName :: Lens' CacheSecurityGroup (Maybe Text)
+csgCacheSecurityGroupName = lens _csgCacheSecurityGroupName (\ s a -> s{_csgCacheSecurityGroupName = a});
+
+-- | The AWS account ID of the cache security group owner.
+csgOwnerId :: Lens' CacheSecurityGroup (Maybe Text)
+csgOwnerId = lens _csgOwnerId (\ s a -> s{_csgOwnerId = a});
+
+-- | A list of Amazon EC2 security groups that are associated with this cache
+-- security group.
+csgEC2SecurityGroups :: Lens' CacheSecurityGroup [EC2SecurityGroup]
+csgEC2SecurityGroups = lens _csgEC2SecurityGroups (\ s a -> s{_csgEC2SecurityGroups = a}) . _Default . _Coerce;
+
+-- | The description of the cache security group.
+csgDescription :: Lens' CacheSecurityGroup (Maybe Text)
+csgDescription = lens _csgDescription (\ s a -> s{_csgDescription = a});
+
+instance FromXML CacheSecurityGroup where
+        parseXML x
+          = CacheSecurityGroup' <$>
+              (x .@? "CacheSecurityGroupName") <*>
+                (x .@? "OwnerId")
+                <*>
+                (x .@? "EC2SecurityGroups" .!@ mempty >>=
+                   may (parseXMLList "EC2SecurityGroup"))
+                <*> (x .@? "Description")
+
+-- | Represents a cache cluster\'s status within a particular cache security
+-- group.
+--
+-- /See:/ 'cacheSecurityGroupMembership' smart constructor.
+data CacheSecurityGroupMembership = CacheSecurityGroupMembership'
+    { _csgmStatus                 :: !(Maybe Text)
+    , _csgmCacheSecurityGroupName :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheSecurityGroupMembership' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csgmStatus'
+--
+-- * 'csgmCacheSecurityGroupName'
+cacheSecurityGroupMembership
+    :: CacheSecurityGroupMembership
+cacheSecurityGroupMembership =
+    CacheSecurityGroupMembership'
+    { _csgmStatus = Nothing
+    , _csgmCacheSecurityGroupName = Nothing
+    }
+
+-- | The membership status in the cache security group. The status changes
+-- when a cache security group is modified, or when the cache security
+-- groups assigned to a cache cluster are modified.
+csgmStatus :: Lens' CacheSecurityGroupMembership (Maybe Text)
+csgmStatus = lens _csgmStatus (\ s a -> s{_csgmStatus = a});
+
+-- | The name of the cache security group.
+csgmCacheSecurityGroupName :: Lens' CacheSecurityGroupMembership (Maybe Text)
+csgmCacheSecurityGroupName = lens _csgmCacheSecurityGroupName (\ s a -> s{_csgmCacheSecurityGroupName = a});
+
+instance FromXML CacheSecurityGroupMembership where
+        parseXML x
+          = CacheSecurityGroupMembership' <$>
+              (x .@? "Status") <*> (x .@? "CacheSecurityGroupName")
+
+-- | Represents the output of one of the following actions:
+--
+-- -   /CreateCacheSubnetGroup/
+-- -   /ModifyCacheSubnetGroup/
+--
+-- /See:/ 'cacheSubnetGroup' smart constructor.
+data CacheSubnetGroup = CacheSubnetGroup'
+    { _csgVPCId                       :: !(Maybe Text)
+    , _csgSubnets                     :: !(Maybe [Subnet])
+    , _csgCacheSubnetGroupName        :: !(Maybe Text)
+    , _csgCacheSubnetGroupDescription :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CacheSubnetGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csgVPCId'
+--
+-- * 'csgSubnets'
+--
+-- * 'csgCacheSubnetGroupName'
+--
+-- * 'csgCacheSubnetGroupDescription'
+cacheSubnetGroup
+    :: CacheSubnetGroup
+cacheSubnetGroup =
+    CacheSubnetGroup'
+    { _csgVPCId = Nothing
+    , _csgSubnets = Nothing
+    , _csgCacheSubnetGroupName = Nothing
+    , _csgCacheSubnetGroupDescription = Nothing
+    }
+
+-- | The Amazon Virtual Private Cloud identifier (VPC ID) of the cache subnet
+-- group.
+csgVPCId :: Lens' CacheSubnetGroup (Maybe Text)
+csgVPCId = lens _csgVPCId (\ s a -> s{_csgVPCId = a});
+
+-- | A list of subnets associated with the cache subnet group.
+csgSubnets :: Lens' CacheSubnetGroup [Subnet]
+csgSubnets = lens _csgSubnets (\ s a -> s{_csgSubnets = a}) . _Default . _Coerce;
+
+-- | The name of the cache subnet group.
+csgCacheSubnetGroupName :: Lens' CacheSubnetGroup (Maybe Text)
+csgCacheSubnetGroupName = lens _csgCacheSubnetGroupName (\ s a -> s{_csgCacheSubnetGroupName = a});
+
+-- | The description of the cache subnet group.
+csgCacheSubnetGroupDescription :: Lens' CacheSubnetGroup (Maybe Text)
+csgCacheSubnetGroupDescription = lens _csgCacheSubnetGroupDescription (\ s a -> s{_csgCacheSubnetGroupDescription = a});
+
+instance FromXML CacheSubnetGroup where
+        parseXML x
+          = CacheSubnetGroup' <$>
+              (x .@? "VpcId") <*>
+                (x .@? "Subnets" .!@ mempty >>=
+                   may (parseXMLList "Subnet"))
+                <*> (x .@? "CacheSubnetGroupName")
+                <*> (x .@? "CacheSubnetGroupDescription")
+
+-- | Provides ownership and status information for an Amazon EC2 security
+-- group.
+--
+-- /See:/ 'ec2SecurityGroup' smart constructor.
+data EC2SecurityGroup = EC2SecurityGroup'
+    { _esgStatus                  :: !(Maybe Text)
+    , _esgEC2SecurityGroupOwnerId :: !(Maybe Text)
+    , _esgEC2SecurityGroupName    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EC2SecurityGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'esgStatus'
+--
+-- * 'esgEC2SecurityGroupOwnerId'
+--
+-- * 'esgEC2SecurityGroupName'
+ec2SecurityGroup
+    :: EC2SecurityGroup
+ec2SecurityGroup =
+    EC2SecurityGroup'
+    { _esgStatus = Nothing
+    , _esgEC2SecurityGroupOwnerId = Nothing
+    , _esgEC2SecurityGroupName = Nothing
+    }
+
+-- | The status of the Amazon EC2 security group.
+esgStatus :: Lens' EC2SecurityGroup (Maybe Text)
+esgStatus = lens _esgStatus (\ s a -> s{_esgStatus = a});
+
+-- | The AWS account ID of the Amazon EC2 security group owner.
+esgEC2SecurityGroupOwnerId :: Lens' EC2SecurityGroup (Maybe Text)
+esgEC2SecurityGroupOwnerId = lens _esgEC2SecurityGroupOwnerId (\ s a -> s{_esgEC2SecurityGroupOwnerId = a});
+
+-- | The name of the Amazon EC2 security group.
+esgEC2SecurityGroupName :: Lens' EC2SecurityGroup (Maybe Text)
+esgEC2SecurityGroupName = lens _esgEC2SecurityGroupName (\ s a -> s{_esgEC2SecurityGroupName = a});
+
+instance FromXML EC2SecurityGroup where
+        parseXML x
+          = EC2SecurityGroup' <$>
+              (x .@? "Status") <*>
+                (x .@? "EC2SecurityGroupOwnerId")
+                <*> (x .@? "EC2SecurityGroupName")
+
+-- | Represents the information required for client programs to connect to a
+-- cache node.
+--
+-- /See:/ 'endpoint' smart constructor.
+data Endpoint = Endpoint'
+    { _eAddress :: !(Maybe Text)
+    , _ePort    :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Endpoint' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eAddress'
+--
+-- * 'ePort'
+endpoint
+    :: Endpoint
+endpoint =
+    Endpoint'
+    { _eAddress = Nothing
+    , _ePort = Nothing
+    }
+
+-- | The DNS hostname of the cache node.
+eAddress :: Lens' Endpoint (Maybe Text)
+eAddress = lens _eAddress (\ s a -> s{_eAddress = a});
+
+-- | The port number that the cache 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")
+
+-- | Represents the output of a /DescribeEngineDefaultParameters/ action.
+--
+-- /See:/ 'engineDefaults' smart constructor.
+data EngineDefaults = EngineDefaults'
+    { _edCacheParameterGroupFamily       :: !(Maybe Text)
+    , _edCacheNodeTypeSpecificParameters :: !(Maybe [CacheNodeTypeSpecificParameter])
+    , _edParameters                      :: !(Maybe [Parameter])
+    , _edMarker                          :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EngineDefaults' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'edCacheParameterGroupFamily'
+--
+-- * 'edCacheNodeTypeSpecificParameters'
+--
+-- * 'edParameters'
+--
+-- * 'edMarker'
+engineDefaults
+    :: EngineDefaults
+engineDefaults =
+    EngineDefaults'
+    { _edCacheParameterGroupFamily = Nothing
+    , _edCacheNodeTypeSpecificParameters = Nothing
+    , _edParameters = Nothing
+    , _edMarker = Nothing
+    }
+
+-- | Specifies the name of the cache parameter group family to which the
+-- engine default parameters apply.
+edCacheParameterGroupFamily :: Lens' EngineDefaults (Maybe Text)
+edCacheParameterGroupFamily = lens _edCacheParameterGroupFamily (\ s a -> s{_edCacheParameterGroupFamily = a});
+
+-- | A list of parameters specific to a particular cache node type. Each
+-- element in the list contains detailed information about one parameter.
+edCacheNodeTypeSpecificParameters :: Lens' EngineDefaults [CacheNodeTypeSpecificParameter]
+edCacheNodeTypeSpecificParameters = lens _edCacheNodeTypeSpecificParameters (\ s a -> s{_edCacheNodeTypeSpecificParameters = a}) . _Default . _Coerce;
+
+-- | Contains a list of engine default parameters.
+edParameters :: Lens' EngineDefaults [Parameter]
+edParameters = lens _edParameters (\ s a -> s{_edParameters = a}) . _Default . _Coerce;
+
+-- | Provides an identifier to allow retrieval of paginated results.
+edMarker :: Lens' EngineDefaults (Maybe Text)
+edMarker = lens _edMarker (\ s a -> s{_edMarker = a});
+
+instance FromXML EngineDefaults where
+        parseXML x
+          = EngineDefaults' <$>
+              (x .@? "CacheParameterGroupFamily") <*>
+                (x .@? "CacheNodeTypeSpecificParameters" .!@ mempty
+                   >>=
+                   may (parseXMLList "CacheNodeTypeSpecificParameter"))
+                <*>
+                (x .@? "Parameters" .!@ mempty >>=
+                   may (parseXMLList "Parameter"))
+                <*> (x .@? "Marker")
+
+-- | Represents a single occurrence of something interesting within the
+-- system. Some examples of events are creating a cache cluster, adding or
+-- removing a cache node, or rebooting a node.
+--
+-- /See:/ 'event' smart constructor.
+data Event = Event'
+    { _eSourceType       :: !(Maybe SourceType)
+    , _eSourceIdentifier :: !(Maybe Text)
+    , _eDate             :: !(Maybe ISO8601)
+    , _eMessage          :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Event' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eSourceType'
+--
+-- * 'eSourceIdentifier'
+--
+-- * 'eDate'
+--
+-- * 'eMessage'
+event
+    :: Event
+event =
+    Event'
+    { _eSourceType = Nothing
+    , _eSourceIdentifier = Nothing
+    , _eDate = Nothing
+    , _eMessage = Nothing
+    }
+
+-- | Specifies the origin of this event - a cache cluster, a parameter group,
+-- a security group, etc.
+eSourceType :: Lens' Event (Maybe SourceType)
+eSourceType = lens _eSourceType (\ s a -> s{_eSourceType = a});
+
+-- | The identifier for the source of the event. For example, if the event
+-- occurred at the cache cluster level, the identifier would be the name of
+-- the cache cluster.
+eSourceIdentifier :: Lens' Event (Maybe Text)
+eSourceIdentifier = lens _eSourceIdentifier (\ s a -> s{_eSourceIdentifier = a});
+
+-- | The date and time when the event occurred.
+eDate :: Lens' Event (Maybe UTCTime)
+eDate = lens _eDate (\ s a -> s{_eDate = a}) . mapping _Time;
+
+-- | The text of the event.
+eMessage :: Lens' Event (Maybe Text)
+eMessage = lens _eMessage (\ s a -> s{_eMessage = a});
+
+instance FromXML Event where
+        parseXML x
+          = Event' <$>
+              (x .@? "SourceType") <*> (x .@? "SourceIdentifier")
+                <*> (x .@? "Date")
+                <*> (x .@? "Message")
+
+-- | Represents a collection of cache nodes in a replication group.
+--
+-- /See:/ 'nodeGroup' smart constructor.
+data NodeGroup = NodeGroup'
+    { _ngStatus           :: !(Maybe Text)
+    , _ngPrimaryEndpoint  :: !(Maybe Endpoint)
+    , _ngNodeGroupMembers :: !(Maybe [NodeGroupMember])
+    , _ngNodeGroupId      :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NodeGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ngStatus'
+--
+-- * 'ngPrimaryEndpoint'
+--
+-- * 'ngNodeGroupMembers'
+--
+-- * 'ngNodeGroupId'
+nodeGroup
+    :: NodeGroup
+nodeGroup =
+    NodeGroup'
+    { _ngStatus = Nothing
+    , _ngPrimaryEndpoint = Nothing
+    , _ngNodeGroupMembers = Nothing
+    , _ngNodeGroupId = Nothing
+    }
+
+-- | The current state of this replication group - /creating/, /available/,
+-- etc.
+ngStatus :: Lens' NodeGroup (Maybe Text)
+ngStatus = lens _ngStatus (\ s a -> s{_ngStatus = a});
+
+-- | Undocumented member.
+ngPrimaryEndpoint :: Lens' NodeGroup (Maybe Endpoint)
+ngPrimaryEndpoint = lens _ngPrimaryEndpoint (\ s a -> s{_ngPrimaryEndpoint = a});
+
+-- | A list containing information about individual nodes within the node
+-- group.
+ngNodeGroupMembers :: Lens' NodeGroup [NodeGroupMember]
+ngNodeGroupMembers = lens _ngNodeGroupMembers (\ s a -> s{_ngNodeGroupMembers = a}) . _Default . _Coerce;
+
+-- | The identifier for the node group. A replication group contains only one
+-- node group; therefore, the node group ID is 0001.
+ngNodeGroupId :: Lens' NodeGroup (Maybe Text)
+ngNodeGroupId = lens _ngNodeGroupId (\ s a -> s{_ngNodeGroupId = a});
+
+instance FromXML NodeGroup where
+        parseXML x
+          = NodeGroup' <$>
+              (x .@? "Status") <*> (x .@? "PrimaryEndpoint") <*>
+                (x .@? "NodeGroupMembers" .!@ mempty >>=
+                   may (parseXMLList "NodeGroupMember"))
+                <*> (x .@? "NodeGroupId")
+
+-- | Represents a single node within a node group.
+--
+-- /See:/ 'nodeGroupMember' smart constructor.
+data NodeGroupMember = NodeGroupMember'
+    { _ngmCacheClusterId            :: !(Maybe Text)
+    , _ngmCacheNodeId               :: !(Maybe Text)
+    , _ngmPreferredAvailabilityZone :: !(Maybe Text)
+    , _ngmCurrentRole               :: !(Maybe Text)
+    , _ngmReadEndpoint              :: !(Maybe Endpoint)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NodeGroupMember' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ngmCacheClusterId'
+--
+-- * 'ngmCacheNodeId'
+--
+-- * 'ngmPreferredAvailabilityZone'
+--
+-- * 'ngmCurrentRole'
+--
+-- * 'ngmReadEndpoint'
+nodeGroupMember
+    :: NodeGroupMember
+nodeGroupMember =
+    NodeGroupMember'
+    { _ngmCacheClusterId = Nothing
+    , _ngmCacheNodeId = Nothing
+    , _ngmPreferredAvailabilityZone = Nothing
+    , _ngmCurrentRole = Nothing
+    , _ngmReadEndpoint = Nothing
+    }
+
+-- | The ID of the cache cluster to which the node belongs.
+ngmCacheClusterId :: Lens' NodeGroupMember (Maybe Text)
+ngmCacheClusterId = lens _ngmCacheClusterId (\ s a -> s{_ngmCacheClusterId = a});
+
+-- | The ID of the node within its cache cluster. A node ID is a numeric
+-- identifier (0001, 0002, etc.).
+ngmCacheNodeId :: Lens' NodeGroupMember (Maybe Text)
+ngmCacheNodeId = lens _ngmCacheNodeId (\ s a -> s{_ngmCacheNodeId = a});
+
+-- | The name of the Availability Zone in which the node is located.
+ngmPreferredAvailabilityZone :: Lens' NodeGroupMember (Maybe Text)
+ngmPreferredAvailabilityZone = lens _ngmPreferredAvailabilityZone (\ s a -> s{_ngmPreferredAvailabilityZone = a});
+
+-- | The role that is currently assigned to the node - /primary/ or
+-- /replica/.
+ngmCurrentRole :: Lens' NodeGroupMember (Maybe Text)
+ngmCurrentRole = lens _ngmCurrentRole (\ s a -> s{_ngmCurrentRole = a});
+
+-- | Undocumented member.
+ngmReadEndpoint :: Lens' NodeGroupMember (Maybe Endpoint)
+ngmReadEndpoint = lens _ngmReadEndpoint (\ s a -> s{_ngmReadEndpoint = a});
+
+instance FromXML NodeGroupMember where
+        parseXML x
+          = NodeGroupMember' <$>
+              (x .@? "CacheClusterId") <*> (x .@? "CacheNodeId")
+                <*> (x .@? "PreferredAvailabilityZone")
+                <*> (x .@? "CurrentRole")
+                <*> (x .@? "ReadEndpoint")
+
+-- | Represents an individual cache node in a snapshot of a cache cluster.
+--
+-- /See:/ 'nodeSnapshot' smart constructor.
+data NodeSnapshot = NodeSnapshot'
+    { _nsCacheNodeCreateTime :: !(Maybe ISO8601)
+    , _nsCacheNodeId         :: !(Maybe Text)
+    , _nsSnapshotCreateTime  :: !(Maybe ISO8601)
+    , _nsCacheSize           :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NodeSnapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'nsCacheNodeCreateTime'
+--
+-- * 'nsCacheNodeId'
+--
+-- * 'nsSnapshotCreateTime'
+--
+-- * 'nsCacheSize'
+nodeSnapshot
+    :: NodeSnapshot
+nodeSnapshot =
+    NodeSnapshot'
+    { _nsCacheNodeCreateTime = Nothing
+    , _nsCacheNodeId = Nothing
+    , _nsSnapshotCreateTime = Nothing
+    , _nsCacheSize = Nothing
+    }
+
+-- | The date and time when the cache node was created in the source cache
+-- cluster.
+nsCacheNodeCreateTime :: Lens' NodeSnapshot (Maybe UTCTime)
+nsCacheNodeCreateTime = lens _nsCacheNodeCreateTime (\ s a -> s{_nsCacheNodeCreateTime = a}) . mapping _Time;
+
+-- | The cache node identifier for the node in the source cache cluster.
+nsCacheNodeId :: Lens' NodeSnapshot (Maybe Text)
+nsCacheNodeId = lens _nsCacheNodeId (\ s a -> s{_nsCacheNodeId = a});
+
+-- | The date and time when the source node\'s metadata and cache data set
+-- was obtained for the snapshot.
+nsSnapshotCreateTime :: Lens' NodeSnapshot (Maybe UTCTime)
+nsSnapshotCreateTime = lens _nsSnapshotCreateTime (\ s a -> s{_nsSnapshotCreateTime = a}) . mapping _Time;
+
+-- | The size of the cache on the source cache node.
+nsCacheSize :: Lens' NodeSnapshot (Maybe Text)
+nsCacheSize = lens _nsCacheSize (\ s a -> s{_nsCacheSize = a});
+
+instance FromXML NodeSnapshot where
+        parseXML x
+          = NodeSnapshot' <$>
+              (x .@? "CacheNodeCreateTime") <*>
+                (x .@? "CacheNodeId")
+                <*> (x .@? "SnapshotCreateTime")
+                <*> (x .@? "CacheSize")
+
+-- | Describes a notification topic and its status. Notification topics are
+-- used for publishing ElastiCache events to subscribers using Amazon
+-- Simple Notification Service (SNS).
+--
+-- /See:/ 'notificationConfiguration' smart constructor.
+data NotificationConfiguration = NotificationConfiguration'
+    { _ncTopicStatus :: !(Maybe Text)
+    , _ncTopicARN    :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'NotificationConfiguration' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ncTopicStatus'
+--
+-- * 'ncTopicARN'
+notificationConfiguration
+    :: NotificationConfiguration
+notificationConfiguration =
+    NotificationConfiguration'
+    { _ncTopicStatus = Nothing
+    , _ncTopicARN = Nothing
+    }
+
+-- | The current state of the topic.
+ncTopicStatus :: Lens' NotificationConfiguration (Maybe Text)
+ncTopicStatus = lens _ncTopicStatus (\ s a -> s{_ncTopicStatus = a});
+
+-- | The Amazon Resource Name (ARN) that identifies the topic.
+ncTopicARN :: Lens' NotificationConfiguration (Maybe Text)
+ncTopicARN = lens _ncTopicARN (\ s a -> s{_ncTopicARN = a});
+
+instance FromXML NotificationConfiguration where
+        parseXML x
+          = NotificationConfiguration' <$>
+              (x .@? "TopicStatus") <*> (x .@? "TopicArn")
+
+-- | Describes an individual setting that controls some aspect of ElastiCache
+-- behavior.
+--
+-- /See:/ 'parameter' smart constructor.
+data Parameter = Parameter'
+    { _pParameterValue       :: !(Maybe Text)
+    , _pMinimumEngineVersion :: !(Maybe Text)
+    , _pSource               :: !(Maybe Text)
+    , _pIsModifiable         :: !(Maybe Bool)
+    , _pAllowedValues        :: !(Maybe Text)
+    , _pDataType             :: !(Maybe Text)
+    , _pParameterName        :: !(Maybe Text)
+    , _pDescription          :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Parameter' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pParameterValue'
+--
+-- * 'pMinimumEngineVersion'
+--
+-- * 'pSource'
+--
+-- * 'pIsModifiable'
+--
+-- * 'pAllowedValues'
+--
+-- * 'pDataType'
+--
+-- * 'pParameterName'
+--
+-- * 'pDescription'
+parameter
+    :: Parameter
+parameter =
+    Parameter'
+    { _pParameterValue = Nothing
+    , _pMinimumEngineVersion = Nothing
+    , _pSource = Nothing
+    , _pIsModifiable = Nothing
+    , _pAllowedValues = Nothing
+    , _pDataType = Nothing
+    , _pParameterName = Nothing
+    , _pDescription = Nothing
+    }
+
+-- | The value of the parameter.
+pParameterValue :: Lens' Parameter (Maybe Text)
+pParameterValue = lens _pParameterValue (\ s a -> s{_pParameterValue = a});
+
+-- | The earliest cache engine version to which the parameter can apply.
+pMinimumEngineVersion :: Lens' Parameter (Maybe Text)
+pMinimumEngineVersion = lens _pMinimumEngineVersion (\ s a -> s{_pMinimumEngineVersion = a});
+
+-- | The source of the parameter.
+pSource :: Lens' Parameter (Maybe Text)
+pSource = lens _pSource (\ s a -> s{_pSource = a});
+
+-- | Indicates whether ('true') or not ('false') 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 valid range of values for the parameter.
+pAllowedValues :: Lens' Parameter (Maybe Text)
+pAllowedValues = lens _pAllowedValues (\ s a -> s{_pAllowedValues = a});
+
+-- | The valid data type for the parameter.
+pDataType :: Lens' Parameter (Maybe Text)
+pDataType = lens _pDataType (\ s a -> s{_pDataType = a});
+
+-- | The name of the parameter.
+pParameterName :: Lens' Parameter (Maybe Text)
+pParameterName = lens _pParameterName (\ s a -> s{_pParameterName = a});
+
+-- | A description of the parameter.
+pDescription :: Lens' Parameter (Maybe Text)
+pDescription = lens _pDescription (\ s a -> s{_pDescription = a});
+
+instance FromXML Parameter where
+        parseXML x
+          = Parameter' <$>
+              (x .@? "ParameterValue") <*>
+                (x .@? "MinimumEngineVersion")
+                <*> (x .@? "Source")
+                <*> (x .@? "IsModifiable")
+                <*> (x .@? "AllowedValues")
+                <*> (x .@? "DataType")
+                <*> (x .@? "ParameterName")
+                <*> (x .@? "Description")
+
+-- | Describes a name-value pair that is used to update the value of a
+-- parameter.
+--
+-- /See:/ 'parameterNameValue' smart constructor.
+data ParameterNameValue = ParameterNameValue'
+    { _pnvParameterValue :: !(Maybe Text)
+    , _pnvParameterName  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ParameterNameValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pnvParameterValue'
+--
+-- * 'pnvParameterName'
+parameterNameValue
+    :: ParameterNameValue
+parameterNameValue =
+    ParameterNameValue'
+    { _pnvParameterValue = Nothing
+    , _pnvParameterName = Nothing
+    }
+
+-- | The value of the parameter.
+pnvParameterValue :: Lens' ParameterNameValue (Maybe Text)
+pnvParameterValue = lens _pnvParameterValue (\ s a -> s{_pnvParameterValue = a});
+
+-- | The name of the parameter.
+pnvParameterName :: Lens' ParameterNameValue (Maybe Text)
+pnvParameterName = lens _pnvParameterName (\ s a -> s{_pnvParameterName = a});
+
+instance ToQuery ParameterNameValue where
+        toQuery ParameterNameValue'{..}
+          = mconcat
+              ["ParameterValue" =: _pnvParameterValue,
+               "ParameterName" =: _pnvParameterName]
+
+-- | A group of settings that will be applied to the cache cluster in the
+-- future, or that are currently being applied.
+--
+-- /See:/ 'pendingModifiedValues' smart constructor.
+data PendingModifiedValues = PendingModifiedValues'
+    { _pmvEngineVersion        :: !(Maybe Text)
+    , _pmvCacheNodeIdsToRemove :: !(Maybe [Text])
+    , _pmvNumCacheNodes        :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PendingModifiedValues' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'pmvEngineVersion'
+--
+-- * 'pmvCacheNodeIdsToRemove'
+--
+-- * 'pmvNumCacheNodes'
+pendingModifiedValues
+    :: PendingModifiedValues
+pendingModifiedValues =
+    PendingModifiedValues'
+    { _pmvEngineVersion = Nothing
+    , _pmvCacheNodeIdsToRemove = Nothing
+    , _pmvNumCacheNodes = Nothing
+    }
+
+-- | The new cache engine version that the cache cluster will run.
+pmvEngineVersion :: Lens' PendingModifiedValues (Maybe Text)
+pmvEngineVersion = lens _pmvEngineVersion (\ s a -> s{_pmvEngineVersion = a});
+
+-- | A list of cache node IDs that are being removed (or will be removed)
+-- from the cache cluster. A node ID is a numeric identifier (0001, 0002,
+-- etc.).
+pmvCacheNodeIdsToRemove :: Lens' PendingModifiedValues [Text]
+pmvCacheNodeIdsToRemove = lens _pmvCacheNodeIdsToRemove (\ s a -> s{_pmvCacheNodeIdsToRemove = a}) . _Default . _Coerce;
+
+-- | The new number of cache nodes for the cache cluster.
+--
+-- For clusters running Redis, this value must be 1. For clusters running
+-- Memcached, this value must be between 1 and 20.
+pmvNumCacheNodes :: Lens' PendingModifiedValues (Maybe Int)
+pmvNumCacheNodes = lens _pmvNumCacheNodes (\ s a -> s{_pmvNumCacheNodes = a});
+
+instance FromXML PendingModifiedValues where
+        parseXML x
+          = PendingModifiedValues' <$>
+              (x .@? "EngineVersion") <*>
+                (x .@? "CacheNodeIdsToRemove" .!@ mempty >>=
+                   may (parseXMLList "CacheNodeId"))
+                <*> (x .@? "NumCacheNodes")
+
+-- | Contains the specific price and frequency of a recurring charges for a
+-- reserved cache node, or for a reserved cache node offering.
+--
+-- /See:/ 'recurringCharge' smart constructor.
+data RecurringCharge = RecurringCharge'
+    { _rcRecurringChargeFrequency :: !(Maybe Text)
+    , _rcRecurringChargeAmount    :: !(Maybe Double)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RecurringCharge' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcRecurringChargeFrequency'
+--
+-- * 'rcRecurringChargeAmount'
+recurringCharge
+    :: RecurringCharge
+recurringCharge =
+    RecurringCharge'
+    { _rcRecurringChargeFrequency = Nothing
+    , _rcRecurringChargeAmount = Nothing
+    }
+
+-- | The frequency of the recurring charge.
+rcRecurringChargeFrequency :: Lens' RecurringCharge (Maybe Text)
+rcRecurringChargeFrequency = lens _rcRecurringChargeFrequency (\ s a -> s{_rcRecurringChargeFrequency = a});
+
+-- | The monetary amount of the recurring charge.
+rcRecurringChargeAmount :: Lens' RecurringCharge (Maybe Double)
+rcRecurringChargeAmount = lens _rcRecurringChargeAmount (\ s a -> s{_rcRecurringChargeAmount = a});
+
+instance FromXML RecurringCharge where
+        parseXML x
+          = RecurringCharge' <$>
+              (x .@? "RecurringChargeFrequency") <*>
+                (x .@? "RecurringChargeAmount")
+
+-- | Contains all of the attributes of a specific replication group.
+--
+-- /See:/ 'replicationGroup' smart constructor.
+data ReplicationGroup = ReplicationGroup'
+    { _rgNodeGroups            :: !(Maybe [NodeGroup])
+    , _rgStatus                :: !(Maybe Text)
+    , _rgSnapshottingClusterId :: !(Maybe Text)
+    , _rgMemberClusters        :: !(Maybe [Text])
+    , _rgReplicationGroupId    :: !(Maybe Text)
+    , _rgPendingModifiedValues :: !(Maybe ReplicationGroupPendingModifiedValues)
+    , _rgDescription           :: !(Maybe Text)
+    , _rgAutomaticFailover     :: !(Maybe AutomaticFailoverStatus)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ReplicationGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rgNodeGroups'
+--
+-- * 'rgStatus'
+--
+-- * 'rgSnapshottingClusterId'
+--
+-- * 'rgMemberClusters'
+--
+-- * 'rgReplicationGroupId'
+--
+-- * 'rgPendingModifiedValues'
+--
+-- * 'rgDescription'
+--
+-- * 'rgAutomaticFailover'
+replicationGroup
+    :: ReplicationGroup
+replicationGroup =
+    ReplicationGroup'
+    { _rgNodeGroups = Nothing
+    , _rgStatus = Nothing
+    , _rgSnapshottingClusterId = Nothing
+    , _rgMemberClusters = Nothing
+    , _rgReplicationGroupId = Nothing
+    , _rgPendingModifiedValues = Nothing
+    , _rgDescription = Nothing
+    , _rgAutomaticFailover = Nothing
+    }
+
+-- | A single element list with information about the nodes in the
+-- replication group.
+rgNodeGroups :: Lens' ReplicationGroup [NodeGroup]
+rgNodeGroups = lens _rgNodeGroups (\ s a -> s{_rgNodeGroups = a}) . _Default . _Coerce;
+
+-- | The current state of this replication group - /creating/, /available/,
+-- etc.
+rgStatus :: Lens' ReplicationGroup (Maybe Text)
+rgStatus = lens _rgStatus (\ s a -> s{_rgStatus = a});
+
+-- | The cache cluster ID that is used as the daily snapshot source for the
+-- replication group.
+rgSnapshottingClusterId :: Lens' ReplicationGroup (Maybe Text)
+rgSnapshottingClusterId = lens _rgSnapshottingClusterId (\ s a -> s{_rgSnapshottingClusterId = a});
+
+-- | The names of all the cache clusters that are part of this replication
+-- group.
+rgMemberClusters :: Lens' ReplicationGroup [Text]
+rgMemberClusters = lens _rgMemberClusters (\ s a -> s{_rgMemberClusters = a}) . _Default . _Coerce;
+
+-- | The identifier for the replication group.
+rgReplicationGroupId :: Lens' ReplicationGroup (Maybe Text)
+rgReplicationGroupId = lens _rgReplicationGroupId (\ s a -> s{_rgReplicationGroupId = a});
+
+-- | A group of settings to be applied to the replication group, either
+-- immediately or during the next maintenance window.
+rgPendingModifiedValues :: Lens' ReplicationGroup (Maybe ReplicationGroupPendingModifiedValues)
+rgPendingModifiedValues = lens _rgPendingModifiedValues (\ s a -> s{_rgPendingModifiedValues = a});
+
+-- | The description of the replication group.
+rgDescription :: Lens' ReplicationGroup (Maybe Text)
+rgDescription = lens _rgDescription (\ s a -> s{_rgDescription = a});
+
+-- | Indicates the status of Multi-AZ for this replication group.
+--
+-- ElastiCache Multi-AZ replication groups are not supported on:
+--
+-- -   Redis versions earlier than 2.8.6.
+-- -   T1 and T2 cache node types.
+rgAutomaticFailover :: Lens' ReplicationGroup (Maybe AutomaticFailoverStatus)
+rgAutomaticFailover = lens _rgAutomaticFailover (\ s a -> s{_rgAutomaticFailover = a});
+
+instance FromXML ReplicationGroup where
+        parseXML x
+          = ReplicationGroup' <$>
+              (x .@? "NodeGroups" .!@ mempty >>=
+                 may (parseXMLList "NodeGroup"))
+                <*> (x .@? "Status")
+                <*> (x .@? "SnapshottingClusterId")
+                <*>
+                (x .@? "MemberClusters" .!@ mempty >>=
+                   may (parseXMLList "ClusterId"))
+                <*> (x .@? "ReplicationGroupId")
+                <*> (x .@? "PendingModifiedValues")
+                <*> (x .@? "Description")
+                <*> (x .@? "AutomaticFailover")
+
+-- | The settings to be applied to the replication group, either immediately
+-- or during the next maintenance window.
+--
+-- /See:/ 'replicationGroupPendingModifiedValues' smart constructor.
+data ReplicationGroupPendingModifiedValues = ReplicationGroupPendingModifiedValues'
+    { _rgpmvPrimaryClusterId        :: !(Maybe Text)
+    , _rgpmvAutomaticFailoverStatus :: !(Maybe PendingAutomaticFailoverStatus)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ReplicationGroupPendingModifiedValues' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rgpmvPrimaryClusterId'
+--
+-- * 'rgpmvAutomaticFailoverStatus'
+replicationGroupPendingModifiedValues
+    :: ReplicationGroupPendingModifiedValues
+replicationGroupPendingModifiedValues =
+    ReplicationGroupPendingModifiedValues'
+    { _rgpmvPrimaryClusterId = Nothing
+    , _rgpmvAutomaticFailoverStatus = Nothing
+    }
+
+-- | The primary cluster ID which will be applied immediately (if
+-- '--apply-immediately' was specified), or during the next maintenance
+-- window.
+rgpmvPrimaryClusterId :: Lens' ReplicationGroupPendingModifiedValues (Maybe Text)
+rgpmvPrimaryClusterId = lens _rgpmvPrimaryClusterId (\ s a -> s{_rgpmvPrimaryClusterId = a});
+
+-- | Indicates the status of Multi-AZ for this replication group.
+--
+-- ElastiCache Multi-AZ replication groups are not supported on:
+--
+-- -   Redis versions earlier than 2.8.6.
+-- -   T1 and T2 cache node types.
+rgpmvAutomaticFailoverStatus :: Lens' ReplicationGroupPendingModifiedValues (Maybe PendingAutomaticFailoverStatus)
+rgpmvAutomaticFailoverStatus = lens _rgpmvAutomaticFailoverStatus (\ s a -> s{_rgpmvAutomaticFailoverStatus = a});
+
+instance FromXML
+         ReplicationGroupPendingModifiedValues where
+        parseXML x
+          = ReplicationGroupPendingModifiedValues' <$>
+              (x .@? "PrimaryClusterId") <*>
+                (x .@? "AutomaticFailoverStatus")
+
+-- | Represents the output of a /PurchaseReservedCacheNodesOffering/ action.
+--
+-- /See:/ 'reservedCacheNode' smart constructor.
+data ReservedCacheNode = ReservedCacheNode'
+    { _rcnCacheNodeType                :: !(Maybe Text)
+    , _rcnState                        :: !(Maybe Text)
+    , _rcnProductDescription           :: !(Maybe Text)
+    , _rcnStartTime                    :: !(Maybe ISO8601)
+    , _rcnCacheNodeCount               :: !(Maybe Int)
+    , _rcnReservedCacheNodeId          :: !(Maybe Text)
+    , _rcnOfferingType                 :: !(Maybe Text)
+    , _rcnUsagePrice                   :: !(Maybe Double)
+    , _rcnRecurringCharges             :: !(Maybe [RecurringCharge])
+    , _rcnFixedPrice                   :: !(Maybe Double)
+    , _rcnDuration                     :: !(Maybe Int)
+    , _rcnReservedCacheNodesOfferingId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ReservedCacheNode' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcnCacheNodeType'
+--
+-- * 'rcnState'
+--
+-- * 'rcnProductDescription'
+--
+-- * 'rcnStartTime'
+--
+-- * 'rcnCacheNodeCount'
+--
+-- * 'rcnReservedCacheNodeId'
+--
+-- * 'rcnOfferingType'
+--
+-- * 'rcnUsagePrice'
+--
+-- * 'rcnRecurringCharges'
+--
+-- * 'rcnFixedPrice'
+--
+-- * 'rcnDuration'
+--
+-- * 'rcnReservedCacheNodesOfferingId'
+reservedCacheNode
+    :: ReservedCacheNode
+reservedCacheNode =
+    ReservedCacheNode'
+    { _rcnCacheNodeType = Nothing
+    , _rcnState = Nothing
+    , _rcnProductDescription = Nothing
+    , _rcnStartTime = Nothing
+    , _rcnCacheNodeCount = Nothing
+    , _rcnReservedCacheNodeId = Nothing
+    , _rcnOfferingType = Nothing
+    , _rcnUsagePrice = Nothing
+    , _rcnRecurringCharges = Nothing
+    , _rcnFixedPrice = Nothing
+    , _rcnDuration = Nothing
+    , _rcnReservedCacheNodesOfferingId = Nothing
+    }
+
+-- | The cache node type for the reserved cache nodes.
+--
+-- Valid node types are as follows:
+--
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
+--
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+rcnCacheNodeType :: Lens' ReservedCacheNode (Maybe Text)
+rcnCacheNodeType = lens _rcnCacheNodeType (\ s a -> s{_rcnCacheNodeType = a});
+
+-- | The state of the reserved cache node.
+rcnState :: Lens' ReservedCacheNode (Maybe Text)
+rcnState = lens _rcnState (\ s a -> s{_rcnState = a});
+
+-- | The description of the reserved cache node.
+rcnProductDescription :: Lens' ReservedCacheNode (Maybe Text)
+rcnProductDescription = lens _rcnProductDescription (\ s a -> s{_rcnProductDescription = a});
+
+-- | The time the reservation started.
+rcnStartTime :: Lens' ReservedCacheNode (Maybe UTCTime)
+rcnStartTime = lens _rcnStartTime (\ s a -> s{_rcnStartTime = a}) . mapping _Time;
+
+-- | The number of cache nodes that have been reserved.
+rcnCacheNodeCount :: Lens' ReservedCacheNode (Maybe Int)
+rcnCacheNodeCount = lens _rcnCacheNodeCount (\ s a -> s{_rcnCacheNodeCount = a});
+
+-- | The unique identifier for the reservation.
+rcnReservedCacheNodeId :: Lens' ReservedCacheNode (Maybe Text)
+rcnReservedCacheNodeId = lens _rcnReservedCacheNodeId (\ s a -> s{_rcnReservedCacheNodeId = a});
+
+-- | The offering type of this reserved cache node.
+rcnOfferingType :: Lens' ReservedCacheNode (Maybe Text)
+rcnOfferingType = lens _rcnOfferingType (\ s a -> s{_rcnOfferingType = a});
+
+-- | The hourly price charged for this reserved cache node.
+rcnUsagePrice :: Lens' ReservedCacheNode (Maybe Double)
+rcnUsagePrice = lens _rcnUsagePrice (\ s a -> s{_rcnUsagePrice = a});
+
+-- | The recurring price charged to run this reserved cache node.
+rcnRecurringCharges :: Lens' ReservedCacheNode [RecurringCharge]
+rcnRecurringCharges = lens _rcnRecurringCharges (\ s a -> s{_rcnRecurringCharges = a}) . _Default . _Coerce;
+
+-- | The fixed price charged for this reserved cache node.
+rcnFixedPrice :: Lens' ReservedCacheNode (Maybe Double)
+rcnFixedPrice = lens _rcnFixedPrice (\ s a -> s{_rcnFixedPrice = a});
+
+-- | The duration of the reservation in seconds.
+rcnDuration :: Lens' ReservedCacheNode (Maybe Int)
+rcnDuration = lens _rcnDuration (\ s a -> s{_rcnDuration = a});
+
+-- | The offering identifier.
+rcnReservedCacheNodesOfferingId :: Lens' ReservedCacheNode (Maybe Text)
+rcnReservedCacheNodesOfferingId = lens _rcnReservedCacheNodesOfferingId (\ s a -> s{_rcnReservedCacheNodesOfferingId = a});
+
+instance FromXML ReservedCacheNode where
+        parseXML x
+          = ReservedCacheNode' <$>
+              (x .@? "CacheNodeType") <*> (x .@? "State") <*>
+                (x .@? "ProductDescription")
+                <*> (x .@? "StartTime")
+                <*> (x .@? "CacheNodeCount")
+                <*> (x .@? "ReservedCacheNodeId")
+                <*> (x .@? "OfferingType")
+                <*> (x .@? "UsagePrice")
+                <*>
+                (x .@? "RecurringCharges" .!@ mempty >>=
+                   may (parseXMLList "RecurringCharge"))
+                <*> (x .@? "FixedPrice")
+                <*> (x .@? "Duration")
+                <*> (x .@? "ReservedCacheNodesOfferingId")
+
+-- | Describes all of the attributes of a reserved cache node offering.
+--
+-- /See:/ 'reservedCacheNodesOffering' smart constructor.
+data ReservedCacheNodesOffering = ReservedCacheNodesOffering'
+    { _rcnoCacheNodeType                :: !(Maybe Text)
+    , _rcnoProductDescription           :: !(Maybe Text)
+    , _rcnoOfferingType                 :: !(Maybe Text)
+    , _rcnoUsagePrice                   :: !(Maybe Double)
+    , _rcnoRecurringCharges             :: !(Maybe [RecurringCharge])
+    , _rcnoFixedPrice                   :: !(Maybe Double)
+    , _rcnoDuration                     :: !(Maybe Int)
+    , _rcnoReservedCacheNodesOfferingId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ReservedCacheNodesOffering' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rcnoCacheNodeType'
+--
+-- * 'rcnoProductDescription'
+--
+-- * 'rcnoOfferingType'
+--
+-- * 'rcnoUsagePrice'
+--
+-- * 'rcnoRecurringCharges'
+--
+-- * 'rcnoFixedPrice'
+--
+-- * 'rcnoDuration'
+--
+-- * 'rcnoReservedCacheNodesOfferingId'
+reservedCacheNodesOffering
+    :: ReservedCacheNodesOffering
+reservedCacheNodesOffering =
+    ReservedCacheNodesOffering'
+    { _rcnoCacheNodeType = Nothing
+    , _rcnoProductDescription = Nothing
+    , _rcnoOfferingType = Nothing
+    , _rcnoUsagePrice = Nothing
+    , _rcnoRecurringCharges = Nothing
+    , _rcnoFixedPrice = Nothing
+    , _rcnoDuration = Nothing
+    , _rcnoReservedCacheNodesOfferingId = Nothing
+    }
+
+-- | The cache node type for the reserved cache node.
+--
+-- Valid node types are as follows:
+--
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
+--
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+rcnoCacheNodeType :: Lens' ReservedCacheNodesOffering (Maybe Text)
+rcnoCacheNodeType = lens _rcnoCacheNodeType (\ s a -> s{_rcnoCacheNodeType = a});
+
+-- | The cache engine used by the offering.
+rcnoProductDescription :: Lens' ReservedCacheNodesOffering (Maybe Text)
+rcnoProductDescription = lens _rcnoProductDescription (\ s a -> s{_rcnoProductDescription = a});
+
+-- | The offering type.
+rcnoOfferingType :: Lens' ReservedCacheNodesOffering (Maybe Text)
+rcnoOfferingType = lens _rcnoOfferingType (\ s a -> s{_rcnoOfferingType = a});
+
+-- | The hourly price charged for this offering.
+rcnoUsagePrice :: Lens' ReservedCacheNodesOffering (Maybe Double)
+rcnoUsagePrice = lens _rcnoUsagePrice (\ s a -> s{_rcnoUsagePrice = a});
+
+-- | The recurring price charged to run this reserved cache node.
+rcnoRecurringCharges :: Lens' ReservedCacheNodesOffering [RecurringCharge]
+rcnoRecurringCharges = lens _rcnoRecurringCharges (\ s a -> s{_rcnoRecurringCharges = a}) . _Default . _Coerce;
+
+-- | The fixed price charged for this offering.
+rcnoFixedPrice :: Lens' ReservedCacheNodesOffering (Maybe Double)
+rcnoFixedPrice = lens _rcnoFixedPrice (\ s a -> s{_rcnoFixedPrice = a});
+
+-- | The duration of the offering. in seconds.
+rcnoDuration :: Lens' ReservedCacheNodesOffering (Maybe Int)
+rcnoDuration = lens _rcnoDuration (\ s a -> s{_rcnoDuration = a});
+
+-- | A unique identifier for the reserved cache node offering.
+rcnoReservedCacheNodesOfferingId :: Lens' ReservedCacheNodesOffering (Maybe Text)
+rcnoReservedCacheNodesOfferingId = lens _rcnoReservedCacheNodesOfferingId (\ s a -> s{_rcnoReservedCacheNodesOfferingId = a});
+
+instance FromXML ReservedCacheNodesOffering where
+        parseXML x
+          = ReservedCacheNodesOffering' <$>
+              (x .@? "CacheNodeType") <*>
+                (x .@? "ProductDescription")
+                <*> (x .@? "OfferingType")
+                <*> (x .@? "UsagePrice")
+                <*>
+                (x .@? "RecurringCharges" .!@ mempty >>=
+                   may (parseXMLList "RecurringCharge"))
+                <*> (x .@? "FixedPrice")
+                <*> (x .@? "Duration")
+                <*> (x .@? "ReservedCacheNodesOfferingId")
+
+-- | Represents a single cache security group and its status.
+--
+-- /See:/ 'securityGroupMembership' smart constructor.
+data SecurityGroupMembership = SecurityGroupMembership'
+    { _sgmStatus          :: !(Maybe Text)
+    , _sgmSecurityGroupId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SecurityGroupMembership' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sgmStatus'
+--
+-- * 'sgmSecurityGroupId'
+securityGroupMembership
+    :: SecurityGroupMembership
+securityGroupMembership =
+    SecurityGroupMembership'
+    { _sgmStatus = Nothing
+    , _sgmSecurityGroupId = Nothing
+    }
+
+-- | The status of the cache security group membership. The status changes
+-- whenever a cache security group is modified, or when the cache security
+-- groups assigned to a cache cluster are modified.
+sgmStatus :: Lens' SecurityGroupMembership (Maybe Text)
+sgmStatus = lens _sgmStatus (\ s a -> s{_sgmStatus = a});
+
+-- | The identifier of the cache security group.
+sgmSecurityGroupId :: Lens' SecurityGroupMembership (Maybe Text)
+sgmSecurityGroupId = lens _sgmSecurityGroupId (\ s a -> s{_sgmSecurityGroupId = a});
+
+instance FromXML SecurityGroupMembership where
+        parseXML x
+          = SecurityGroupMembership' <$>
+              (x .@? "Status") <*> (x .@? "SecurityGroupId")
+
+-- | Represents a copy of an entire cache cluster as of the time when the
+-- snapshot was taken.
+--
+-- /See:/ 'snapshot' smart constructor.
+data Snapshot = Snapshot'
+    { _sCacheNodeType              :: !(Maybe Text)
+    , _sEngineVersion              :: !(Maybe Text)
+    , _sCacheClusterCreateTime     :: !(Maybe ISO8601)
+    , _sAutoMinorVersionUpgrade    :: !(Maybe Bool)
+    , _sCacheParameterGroupName    :: !(Maybe Text)
+    , _sSnapshotStatus             :: !(Maybe Text)
+    , _sSnapshotWindow             :: !(Maybe Text)
+    , _sVPCId                      :: !(Maybe Text)
+    , _sCacheClusterId             :: !(Maybe Text)
+    , _sEngine                     :: !(Maybe Text)
+    , _sPreferredMaintenanceWindow :: !(Maybe Text)
+    , _sTopicARN                   :: !(Maybe Text)
+    , _sCacheSubnetGroupName       :: !(Maybe Text)
+    , _sNodeSnapshots              :: !(Maybe [NodeSnapshot])
+    , _sPreferredAvailabilityZone  :: !(Maybe Text)
+    , _sSnapshotRetentionLimit     :: !(Maybe Int)
+    , _sSnapshotName               :: !(Maybe Text)
+    , _sSnapshotSource             :: !(Maybe Text)
+    , _sNumCacheNodes              :: !(Maybe Int)
+    , _sPort                       :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Snapshot' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sCacheNodeType'
+--
+-- * 'sEngineVersion'
+--
+-- * 'sCacheClusterCreateTime'
+--
+-- * 'sAutoMinorVersionUpgrade'
+--
+-- * 'sCacheParameterGroupName'
+--
+-- * 'sSnapshotStatus'
+--
+-- * 'sSnapshotWindow'
+--
+-- * 'sVPCId'
+--
+-- * 'sCacheClusterId'
+--
+-- * 'sEngine'
+--
+-- * 'sPreferredMaintenanceWindow'
+--
+-- * 'sTopicARN'
+--
+-- * 'sCacheSubnetGroupName'
+--
+-- * 'sNodeSnapshots'
+--
+-- * 'sPreferredAvailabilityZone'
+--
+-- * 'sSnapshotRetentionLimit'
+--
+-- * 'sSnapshotName'
+--
+-- * 'sSnapshotSource'
+--
+-- * 'sNumCacheNodes'
+--
+-- * 'sPort'
+snapshot
+    :: Snapshot
+snapshot =
+    Snapshot'
+    { _sCacheNodeType = Nothing
+    , _sEngineVersion = Nothing
+    , _sCacheClusterCreateTime = Nothing
+    , _sAutoMinorVersionUpgrade = Nothing
+    , _sCacheParameterGroupName = Nothing
+    , _sSnapshotStatus = Nothing
+    , _sSnapshotWindow = Nothing
+    , _sVPCId = Nothing
+    , _sCacheClusterId = Nothing
+    , _sEngine = Nothing
+    , _sPreferredMaintenanceWindow = Nothing
+    , _sTopicARN = Nothing
+    , _sCacheSubnetGroupName = Nothing
+    , _sNodeSnapshots = Nothing
+    , _sPreferredAvailabilityZone = Nothing
+    , _sSnapshotRetentionLimit = Nothing
+    , _sSnapshotName = Nothing
+    , _sSnapshotSource = Nothing
+    , _sNumCacheNodes = Nothing
+    , _sPort = Nothing
+    }
+
+-- | The name of the compute and memory capacity node type for the source
+-- cache cluster.
+--
+-- Valid node types are as follows:
+--
+-- -   General purpose:
+--     -   Current generation: 'cache.t2.micro', 'cache.t2.small',
+--         'cache.t2.medium', 'cache.m3.medium', 'cache.m3.large',
+--         'cache.m3.xlarge', 'cache.m3.2xlarge'
+--     -   Previous generation: 'cache.t1.micro', 'cache.m1.small',
+--         'cache.m1.medium', 'cache.m1.large', 'cache.m1.xlarge'
+-- -   Compute optimized: 'cache.c1.xlarge'
+-- -   Memory optimized
+--     -   Current generation: 'cache.r3.large', 'cache.r3.xlarge',
+--         'cache.r3.2xlarge', 'cache.r3.4xlarge', 'cache.r3.8xlarge'
+--     -   Previous generation: 'cache.m2.xlarge', 'cache.m2.2xlarge',
+--         'cache.m2.4xlarge'
+--
+-- __Notes:__
+--
+-- -   All t2 instances are created in an Amazon Virtual Private Cloud
+--     (VPC).
+-- -   Redis backup\/restore is not supported for t2 instances.
+-- -   Redis Append-only files (AOF) functionality is not supported for t1
+--     or t2 instances.
+--
+-- For a complete listing of cache node types and specifications, see
+-- <http://aws.amazon.com/elasticache/details Amazon ElastiCache Product Features and Details>
+-- and
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Memcached.html#CacheParameterGroups.Memcached.NodeSpecific Cache Node Type-Specific Parameters for Memcached>
+-- or
+-- <http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/CacheParameterGroups.Redis.html#CacheParameterGroups.Redis.NodeSpecific Cache Node Type-Specific Parameters for Redis>.
+sCacheNodeType :: Lens' Snapshot (Maybe Text)
+sCacheNodeType = lens _sCacheNodeType (\ s a -> s{_sCacheNodeType = a});
+
+-- | The version of the cache engine version that is used by the source cache
+-- cluster.
+sEngineVersion :: Lens' Snapshot (Maybe Text)
+sEngineVersion = lens _sEngineVersion (\ s a -> s{_sEngineVersion = a});
+
+-- | The date and time when the source cache cluster was created.
+sCacheClusterCreateTime :: Lens' Snapshot (Maybe UTCTime)
+sCacheClusterCreateTime = lens _sCacheClusterCreateTime (\ s a -> s{_sCacheClusterCreateTime = a}) . mapping _Time;
+
+-- | This parameter is currently disabled.
+sAutoMinorVersionUpgrade :: Lens' Snapshot (Maybe Bool)
+sAutoMinorVersionUpgrade = lens _sAutoMinorVersionUpgrade (\ s a -> s{_sAutoMinorVersionUpgrade = a});
+
+-- | The cache parameter group that is associated with the source cache
+-- cluster.
+sCacheParameterGroupName :: Lens' Snapshot (Maybe Text)
+sCacheParameterGroupName = lens _sCacheParameterGroupName (\ s a -> s{_sCacheParameterGroupName = a});
+
+-- | The status of the snapshot. Valid values: 'creating' | 'available' |
+-- 'restoring' | 'copying' | 'deleting'.
+sSnapshotStatus :: Lens' Snapshot (Maybe Text)
+sSnapshotStatus = lens _sSnapshotStatus (\ s a -> s{_sSnapshotStatus = a});
+
+-- | The daily time range during which ElastiCache takes daily snapshots of
+-- the source cache cluster.
+sSnapshotWindow :: Lens' Snapshot (Maybe Text)
+sSnapshotWindow = lens _sSnapshotWindow (\ s a -> s{_sSnapshotWindow = a});
+
+-- | The Amazon Virtual Private Cloud identifier (VPC ID) of the cache subnet
+-- group for the source cache cluster.
+sVPCId :: Lens' Snapshot (Maybe Text)
+sVPCId = lens _sVPCId (\ s a -> s{_sVPCId = a});
+
+-- | The user-supplied identifier of the source cache cluster.
+sCacheClusterId :: Lens' Snapshot (Maybe Text)
+sCacheClusterId = lens _sCacheClusterId (\ s a -> s{_sCacheClusterId = a});
+
+-- | The name of the cache engine (/memcached/ or /redis/) used by the source
+-- cache cluster.
+sEngine :: Lens' Snapshot (Maybe Text)
+sEngine = lens _sEngine (\ s a -> s{_sEngine = a});
+
+-- | Specifies the weekly time range during which maintenance on the cache
+-- cluster is performed. It is specified as a range in the format
+-- ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window
+-- is a 60 minute period. Valid values for 'ddd' are:
+--
+-- -   'sun'
+-- -   'mon'
+-- -   'tue'
+-- -   'wed'
+-- -   'thu'
+-- -   'fri'
+-- -   'sat'
+--
+-- Example: 'sun:05:00-sun:09:00'
+sPreferredMaintenanceWindow :: Lens' Snapshot (Maybe Text)
+sPreferredMaintenanceWindow = lens _sPreferredMaintenanceWindow (\ s a -> s{_sPreferredMaintenanceWindow = a});
+
+-- | The Amazon Resource Name (ARN) for the topic used by the source cache
+-- cluster for publishing notifications.
+sTopicARN :: Lens' Snapshot (Maybe Text)
+sTopicARN = lens _sTopicARN (\ s a -> s{_sTopicARN = a});
+
+-- | The name of the cache subnet group associated with the source cache
+-- cluster.
+sCacheSubnetGroupName :: Lens' Snapshot (Maybe Text)
+sCacheSubnetGroupName = lens _sCacheSubnetGroupName (\ s a -> s{_sCacheSubnetGroupName = a});
+
+-- | A list of the cache nodes in the source cache cluster.
+sNodeSnapshots :: Lens' Snapshot [NodeSnapshot]
+sNodeSnapshots = lens _sNodeSnapshots (\ s a -> s{_sNodeSnapshots = a}) . _Default . _Coerce;
+
+-- | The name of the Availability Zone in which the source cache cluster is
+-- located.
+sPreferredAvailabilityZone :: Lens' Snapshot (Maybe Text)
+sPreferredAvailabilityZone = lens _sPreferredAvailabilityZone (\ s a -> s{_sPreferredAvailabilityZone = a});
+
+-- | For an automatic snapshot, the number of days for which ElastiCache will
+-- retain the snapshot before deleting it.
+--
+-- For manual snapshots, this field reflects the /SnapshotRetentionLimit/
+-- for the source cache cluster when the snapshot was created. This field
+-- is otherwise ignored: Manual snapshots do not expire, and can only be
+-- deleted using the /DeleteSnapshot/ action.
+--
+-- __Important__
+-- If the value of SnapshotRetentionLimit is set to zero (0), backups are
+-- turned off.
+sSnapshotRetentionLimit :: Lens' Snapshot (Maybe Int)
+sSnapshotRetentionLimit = lens _sSnapshotRetentionLimit (\ s a -> s{_sSnapshotRetentionLimit = a});
+
+-- | The name of a snapshot. For an automatic snapshot, the name is
+-- system-generated; for a manual snapshot, this is the user-provided name.
+sSnapshotName :: Lens' Snapshot (Maybe Text)
+sSnapshotName = lens _sSnapshotName (\ s a -> s{_sSnapshotName = a});
+
+-- | Indicates whether the snapshot is from an automatic backup ('automated')
+-- or was created manually ('manual').
+sSnapshotSource :: Lens' Snapshot (Maybe Text)
+sSnapshotSource = lens _sSnapshotSource (\ s a -> s{_sSnapshotSource = a});
+
+-- | The number of cache nodes in the source cache cluster.
+--
+-- For clusters running Redis, this value must be 1. For clusters running
+-- Memcached, this value must be between 1 and 20.
+sNumCacheNodes :: Lens' Snapshot (Maybe Int)
+sNumCacheNodes = lens _sNumCacheNodes (\ s a -> s{_sNumCacheNodes = a});
+
+-- | The port number used by each cache nodes in the source cache cluster.
+sPort :: Lens' Snapshot (Maybe Int)
+sPort = lens _sPort (\ s a -> s{_sPort = a});
+
+instance FromXML Snapshot where
+        parseXML x
+          = Snapshot' <$>
+              (x .@? "CacheNodeType") <*> (x .@? "EngineVersion")
+                <*> (x .@? "CacheClusterCreateTime")
+                <*> (x .@? "AutoMinorVersionUpgrade")
+                <*> (x .@? "CacheParameterGroupName")
+                <*> (x .@? "SnapshotStatus")
+                <*> (x .@? "SnapshotWindow")
+                <*> (x .@? "VpcId")
+                <*> (x .@? "CacheClusterId")
+                <*> (x .@? "Engine")
+                <*> (x .@? "PreferredMaintenanceWindow")
+                <*> (x .@? "TopicArn")
+                <*> (x .@? "CacheSubnetGroupName")
+                <*>
+                (x .@? "NodeSnapshots" .!@ mempty >>=
+                   may (parseXMLList "NodeSnapshot"))
+                <*> (x .@? "PreferredAvailabilityZone")
+                <*> (x .@? "SnapshotRetentionLimit")
+                <*> (x .@? "SnapshotName")
+                <*> (x .@? "SnapshotSource")
+                <*> (x .@? "NumCacheNodes")
+                <*> (x .@? "Port")
+
+-- | Represents the subnet associated with a cache cluster. This parameter
+-- refers to subnets defined in Amazon Virtual Private Cloud (Amazon VPC)
+-- and used with ElastiCache.
+--
+-- /See:/ 'subnet' smart constructor.
+data Subnet = Subnet'
+    { _sSubnetIdentifier       :: !(Maybe Text)
+    , _sSubnetAvailabilityZone :: !(Maybe AvailabilityZone)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Subnet' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sSubnetIdentifier'
+--
+-- * 'sSubnetAvailabilityZone'
+subnet
+    :: Subnet
+subnet =
+    Subnet'
+    { _sSubnetIdentifier = Nothing
+    , _sSubnetAvailabilityZone = Nothing
+    }
+
+-- | The unique identifier for the subnet.
+sSubnetIdentifier :: Lens' Subnet (Maybe Text)
+sSubnetIdentifier = lens _sSubnetIdentifier (\ s a -> s{_sSubnetIdentifier = a});
+
+-- | The Availability Zone associated with the subnet.
+sSubnetAvailabilityZone :: Lens' Subnet (Maybe AvailabilityZone)
+sSubnetAvailabilityZone = lens _sSubnetAvailabilityZone (\ s a -> s{_sSubnetAvailabilityZone = a});
+
+instance FromXML Subnet where
+        parseXML x
+          = Subnet' <$>
+              (x .@? "SubnetIdentifier") <*>
+                (x .@? "SubnetAvailabilityZone")
+
+-- | A cost allocation Tag that can be added to an ElastiCache cluster or
+-- replication group. Tags are composed of a Key\/Value pair. A tag with a
+-- null Value is permitted.
+--
+-- /See:/ 'tag' smart constructor.
+data Tag = Tag'
+    { _tagValue :: !(Maybe Text)
+    , _tagKey   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Tag' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tagValue'
+--
+-- * 'tagKey'
+tag
+    :: Tag
+tag =
+    Tag'
+    { _tagValue = Nothing
+    , _tagKey = Nothing
+    }
+
+-- | The tag\'s value. May not be null.
+tagValue :: Lens' Tag (Maybe Text)
+tagValue = lens _tagValue (\ s a -> s{_tagValue = a});
+
+-- | The key for the tag.
+tagKey :: Lens' Tag (Maybe Text)
+tagKey = lens _tagKey (\ s a -> s{_tagKey = a});
+
+instance FromXML Tag where
+        parseXML x
+          = Tag' <$> (x .@? "Value") <*> (x .@? "Key")
+
+instance ToQuery Tag where
+        toQuery Tag'{..}
+          = mconcat ["Value" =: _tagValue, "Key" =: _tagKey]
+
+-- | Represents the output from the /AddTagsToResource/,
+-- /ListTagsOnResource/, and /RemoveTagsFromResource/ actions.
+--
+-- /See:/ 'tagListMessage' smart constructor.
+newtype TagListMessage = TagListMessage'
+    { _tlmTagList :: Maybe [Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TagListMessage' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'tlmTagList'
+tagListMessage
+    :: TagListMessage
+tagListMessage =
+    TagListMessage'
+    { _tlmTagList = Nothing
+    }
+
+-- | A list of cost allocation tags as key-value pairs.
+tlmTagList :: Lens' TagListMessage [Tag]
+tlmTagList = lens _tlmTagList (\ s a -> s{_tlmTagList = a}) . _Default . _Coerce;
+
+instance FromXML TagListMessage where
+        parseXML x
+          = TagListMessage' <$>
+              (x .@? "TagList" .!@ mempty >>=
+                 may (parseXMLList "Tag"))
diff --git a/gen/Network/AWS/ElastiCache/Types/Sum.hs b/gen/Network/AWS/ElastiCache/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElastiCache/Types/Sum.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElastiCache.Types.Sum
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Network.AWS.ElastiCache.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data AZMode
+    = CrossAz
+    | SingleAz
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText AZMode where
+    parser = takeLowerText >>= \case
+        "cross-az" -> pure CrossAz
+        "single-az" -> pure SingleAz
+        e -> fromTextError $ "Failure parsing AZMode from value: '" <> e
+           <> "'. Accepted values: cross-az, single-az"
+
+instance ToText AZMode where
+    toText = \case
+        CrossAz -> "cross-az"
+        SingleAz -> "single-az"
+
+instance Hashable     AZMode
+instance ToByteString AZMode
+instance ToQuery      AZMode
+instance ToHeader     AZMode
+
+data AutomaticFailoverStatus
+    = AFSDisabled
+    | AFSDisabling
+    | AFSEnabled
+    | AFSEnabling
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText AutomaticFailoverStatus where
+    parser = takeLowerText >>= \case
+        "disabled" -> pure AFSDisabled
+        "disabling" -> pure AFSDisabling
+        "enabled" -> pure AFSEnabled
+        "enabling" -> pure AFSEnabling
+        e -> fromTextError $ "Failure parsing AutomaticFailoverStatus from value: '" <> e
+           <> "'. Accepted values: disabled, disabling, enabled, enabling"
+
+instance ToText AutomaticFailoverStatus where
+    toText = \case
+        AFSDisabled -> "disabled"
+        AFSDisabling -> "disabling"
+        AFSEnabled -> "enabled"
+        AFSEnabling -> "enabling"
+
+instance Hashable     AutomaticFailoverStatus
+instance ToByteString AutomaticFailoverStatus
+instance ToQuery      AutomaticFailoverStatus
+instance ToHeader     AutomaticFailoverStatus
+
+instance FromXML AutomaticFailoverStatus where
+    parseXML = parseXMLText "AutomaticFailoverStatus"
+
+data PendingAutomaticFailoverStatus
+    = Disabled
+    | Enabled
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText PendingAutomaticFailoverStatus where
+    parser = takeLowerText >>= \case
+        "disabled" -> pure Disabled
+        "enabled" -> pure Enabled
+        e -> fromTextError $ "Failure parsing PendingAutomaticFailoverStatus from value: '" <> e
+           <> "'. Accepted values: disabled, enabled"
+
+instance ToText PendingAutomaticFailoverStatus where
+    toText = \case
+        Disabled -> "disabled"
+        Enabled -> "enabled"
+
+instance Hashable     PendingAutomaticFailoverStatus
+instance ToByteString PendingAutomaticFailoverStatus
+instance ToQuery      PendingAutomaticFailoverStatus
+instance ToHeader     PendingAutomaticFailoverStatus
+
+instance FromXML PendingAutomaticFailoverStatus where
+    parseXML = parseXMLText "PendingAutomaticFailoverStatus"
+
+data SourceType
+    = CacheCluster
+    | CacheParameterGroup
+    | CacheSecurityGroup
+    | CacheSubnetGroup
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText SourceType where
+    parser = takeLowerText >>= \case
+        "cache-cluster" -> pure CacheCluster
+        "cache-parameter-group" -> pure CacheParameterGroup
+        "cache-security-group" -> pure CacheSecurityGroup
+        "cache-subnet-group" -> pure CacheSubnetGroup
+        e -> fromTextError $ "Failure parsing SourceType from value: '" <> e
+           <> "'. Accepted values: cache-cluster, cache-parameter-group, cache-security-group, cache-subnet-group"
+
+instance ToText SourceType where
+    toText = \case
+        CacheCluster -> "cache-cluster"
+        CacheParameterGroup -> "cache-parameter-group"
+        CacheSecurityGroup -> "cache-security-group"
+        CacheSubnetGroup -> "cache-subnet-group"
+
+instance Hashable     SourceType
+instance ToByteString SourceType
+instance ToQuery      SourceType
+instance ToHeader     SourceType
+
+instance FromXML SourceType where
+    parseXML = parseXMLText "SourceType"
diff --git a/gen/Network/AWS/ElastiCache/Waiters.hs b/gen/Network/AWS/ElastiCache/Waiters.hs
--- a/gen/Network/AWS/ElastiCache/Waiters.hs
+++ b/gen/Network/AWS/ElastiCache/Waiters.hs
@@ -1,91 +1,148 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeFamilies      #-}
 
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.ElastiCache.Waiters
--- 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/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
 module Network.AWS.ElastiCache.Waiters where
 
-import Network.AWS.ElastiCache.DescribeCacheClusters
-import Network.AWS.ElastiCache.DescribeReplicationGroups
-import Network.AWS.ElastiCache.Types
-import Network.AWS.Waiters
+import           Network.AWS.ElastiCache.DescribeCacheClusters
+import           Network.AWS.ElastiCache.DescribeCacheClusters
+import           Network.AWS.ElastiCache.DescribeReplicationGroups
+import           Network.AWS.ElastiCache.DescribeReplicationGroups
+import           Network.AWS.ElastiCache.Types
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
 
+-- | Polls 'Network.AWS.ElastiCache.DescribeCacheClusters' every 30 seconds until a
+-- successful state is reached. An error is returned after 60 failed checks.
 cacheClusterAvailable :: Wait DescribeCacheClusters
-cacheClusterAvailable = Wait
-    { _waitName      = "CacheClusterAvailable"
-    , _waitAttempts  = 60
-    , _waitDelay     = 30
-    , _waitAcceptors =
-        [ matchAll "available" AcceptSuccess
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "deleted" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "deleting" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "incompatible-network" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "restore-failed" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        ]
+cacheClusterAvailable =
+    Wait
+    { _waitName = "CacheClusterAvailable"
+    , _waitAttempts = 60
+    , _waitDelay = 30
+    , _waitAcceptors = [ matchAll
+                             "available"
+                             AcceptSuccess
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "deleted"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "deleting"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "incompatible-network"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "restore-failed"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)]
     }
 
+-- | Polls 'Network.AWS.ElastiCache.DescribeCacheClusters' every 30 seconds until a
+-- successful state is reached. An error is returned after 60 failed checks.
 cacheClusterDeleted :: Wait DescribeCacheClusters
-cacheClusterDeleted = Wait
-    { _waitName      = "CacheClusterDeleted"
-    , _waitAttempts  = 60
-    , _waitDelay     = 30
-    , _waitAcceptors =
-        [ matchError "CacheClusterNotFound" AcceptSuccess
-        , matchAny "creating" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "modifying" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        , matchAny "rebooting" AcceptFailure
-            (folding (concatOf dccrCacheClusters) . ccCacheClusterStatus . _Just)
-        ]
+cacheClusterDeleted =
+    Wait
+    { _waitName = "CacheClusterDeleted"
+    , _waitAttempts = 60
+    , _waitDelay = 30
+    , _waitAcceptors = [ matchError "CacheClusterNotFound" AcceptSuccess
+                       , matchAny
+                             "creating"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "modifying"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)
+                       , matchAny
+                             "rebooting"
+                             AcceptFailure
+                             (folding (concatOf drsCacheClusters) .
+                              ccCacheClusterStatus . _Just . to toTextCI)]
     }
 
-replicationGroupAvailable :: Wait DescribeReplicationGroups
-replicationGroupAvailable = Wait
-    { _waitName      = "ReplicationGroupAvailable"
-    , _waitAttempts  = 60
-    , _waitDelay     = 30
-    , _waitAcceptors =
-        [ matchAll "available" AcceptSuccess
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "deleted" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "deleting" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "incompatible-network" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "restore-failed" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        ]
+-- | Polls 'Network.AWS.ElastiCache.DescribeReplicationGroups' every 30 seconds until a
+-- successful state is reached. An error is returned after 60 failed checks.
+replicationGroupDeleted :: Wait DescribeReplicationGroups
+replicationGroupDeleted =
+    Wait
+    { _waitName = "ReplicationGroupDeleted"
+    , _waitAttempts = 60
+    , _waitDelay = 30
+    , _waitAcceptors = [ matchError
+                             "ReplicationGroupNotFoundFault"
+                             AcceptSuccess
+                       , matchAny
+                             "creating"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "modifying"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "rebooting"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)]
     }
 
-replicationGroupDeleted :: Wait DescribeReplicationGroups
-replicationGroupDeleted = Wait
-    { _waitName      = "ReplicationGroupDeleted"
-    , _waitAttempts  = 60
-    , _waitDelay     = 30
-    , _waitAcceptors =
-        [ matchError "ReplicationGroupNotFoundFault" AcceptSuccess
-        , matchAny "creating" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "modifying" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        , matchAny "rebooting" AcceptFailure
-            (folding (concatOf drgrReplicationGroups) . rgStatus . _Just)
-        ]
+-- | Polls 'Network.AWS.ElastiCache.DescribeReplicationGroups' every 30 seconds until a
+-- successful state is reached. An error is returned after 60 failed checks.
+replicationGroupAvailable :: Wait DescribeReplicationGroups
+replicationGroupAvailable =
+    Wait
+    { _waitName = "ReplicationGroupAvailable"
+    , _waitAttempts = 60
+    , _waitDelay = 30
+    , _waitAcceptors = [ matchAll
+                             "available"
+                             AcceptSuccess
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "deleted"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "deleting"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "incompatible-network"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)
+                       , matchAny
+                             "restore-failed"
+                             AcceptFailure
+                             (folding (concatOf drgrsReplicationGroups) .
+                              rgStatus . _Just . to toTextCI)]
     }
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.ElastiCache
+import Test.AWS.ElastiCache.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "ElastiCache"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/ElastiCache.hs b/test/Test/AWS/ElastiCache.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/ElastiCache.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Test.AWS.ElastiCache
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- 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 Test.AWS.ElastiCache
+    ( tests
+    , fixtures
+    ) where
+
+import           Network.AWS.ElastiCache
+import           Test.AWS.Gen.ElastiCache
+import           Test.Tasty
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/ElastiCache/Internal.hs b/test/Test/AWS/ElastiCache/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/ElastiCache/Internal.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Test.AWS.ElastiCache.Internal
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- 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 Test.AWS.ElastiCache.Internal where
+
+import Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/ElastiCache.hs b/test/Test/AWS/Gen/ElastiCache.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/ElastiCache.hs
@@ -0,0 +1,668 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-orphans        #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.AWS.Gen.ElastiCache
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+module Test.AWS.Gen.ElastiCache where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.ElastiCache
+import Test.AWS.ElastiCache.Internal
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ testDeleteCacheSecurityGroup $
+--             deleteCacheSecurityGroup
+--
+--         , testCreateReplicationGroup $
+--             createReplicationGroup
+--
+--         , testDeleteCacheCluster $
+--             deleteCacheCluster
+--
+--         , testRebootCacheCluster $
+--             rebootCacheCluster
+--
+--         , testRevokeCacheSecurityGroupIngress $
+--             revokeCacheSecurityGroupIngress
+--
+--         , testDescribeEvents $
+--             describeEvents
+--
+--         , testDescribeEngineDefaultParameters $
+--             describeEngineDefaultParameters
+--
+--         , testModifyCacheParameterGroup $
+--             modifyCacheParameterGroup
+--
+--         , testCreateCacheCluster $
+--             createCacheCluster
+--
+--         , testListTagsForResource $
+--             listTagsForResource
+--
+--         , testDeleteReplicationGroup $
+--             deleteReplicationGroup
+--
+--         , testPurchaseReservedCacheNodesOffering $
+--             purchaseReservedCacheNodesOffering
+--
+--         , testDescribeCacheClusters $
+--             describeCacheClusters
+--
+--         , testModifyReplicationGroup $
+--             modifyReplicationGroup
+--
+--         , testRemoveTagsFromResource $
+--             removeTagsFromResource
+--
+--         , testDescribeCacheParameters $
+--             describeCacheParameters
+--
+--         , testDescribeCacheSubnetGroups $
+--             describeCacheSubnetGroups
+--
+--         , testCreateCacheSecurityGroup $
+--             createCacheSecurityGroup
+--
+--         , testAddTagsToResource $
+--             addTagsToResource
+--
+--         , testAuthorizeCacheSecurityGroupIngress $
+--             authorizeCacheSecurityGroupIngress
+--
+--         , testCopySnapshot $
+--             copySnapshot
+--
+--         , testCreateCacheSubnetGroup $
+--             createCacheSubnetGroup
+--
+--         , testDescribeCacheParameterGroups $
+--             describeCacheParameterGroups
+--
+--         , testResetCacheParameterGroup $
+--             resetCacheParameterGroup
+--
+--         , testDescribeSnapshots $
+--             describeSnapshots
+--
+--         , testDescribeReservedCacheNodesOfferings $
+--             describeReservedCacheNodesOfferings
+--
+--         , testDeleteSnapshot $
+--             deleteSnapshot
+--
+--         , testDescribeReplicationGroups $
+--             describeReplicationGroups
+--
+--         , testModifyCacheSubnetGroup $
+--             modifyCacheSubnetGroup
+--
+--         , testCreateSnapshot $
+--             createSnapshot
+--
+--         , testDescribeCacheSecurityGroups $
+--             describeCacheSecurityGroups
+--
+--         , testDeleteCacheParameterGroup $
+--             deleteCacheParameterGroup
+--
+--         , testDescribeReservedCacheNodes $
+--             describeReservedCacheNodes
+--
+--         , testDescribeCacheEngineVersions $
+--             describeCacheEngineVersions
+--
+--         , testModifyCacheCluster $
+--             modifyCacheCluster
+--
+--         , testCreateCacheParameterGroup $
+--             createCacheParameterGroup
+--
+--         , testDeleteCacheSubnetGroup $
+--             deleteCacheSubnetGroup
+--
+--           ]
+
+--     , testGroup "response"
+--         [ testDeleteCacheSecurityGroupResponse $
+--             deleteCacheSecurityGroupResponse
+--
+--         , testCreateReplicationGroupResponse $
+--             createReplicationGroupResponse
+--
+--         , testDeleteCacheClusterResponse $
+--             deleteCacheClusterResponse
+--
+--         , testRebootCacheClusterResponse $
+--             rebootCacheClusterResponse
+--
+--         , testRevokeCacheSecurityGroupIngressResponse $
+--             revokeCacheSecurityGroupIngressResponse
+--
+--         , testDescribeEventsResponse $
+--             describeEventsResponse
+--
+--         , testDescribeEngineDefaultParametersResponse $
+--             describeEngineDefaultParametersResponse
+--
+--         , testModifyCacheParameterGroupResponse $
+--             cacheParameterGroupNameMessage
+--
+--         , testCreateCacheClusterResponse $
+--             createCacheClusterResponse
+--
+--         , testListTagsForResourceResponse $
+--             tagListMessage
+--
+--         , testDeleteReplicationGroupResponse $
+--             deleteReplicationGroupResponse
+--
+--         , testPurchaseReservedCacheNodesOfferingResponse $
+--             purchaseReservedCacheNodesOfferingResponse
+--
+--         , testDescribeCacheClustersResponse $
+--             describeCacheClustersResponse
+--
+--         , testModifyReplicationGroupResponse $
+--             modifyReplicationGroupResponse
+--
+--         , testRemoveTagsFromResourceResponse $
+--             tagListMessage
+--
+--         , testDescribeCacheParametersResponse $
+--             describeCacheParametersResponse
+--
+--         , testDescribeCacheSubnetGroupsResponse $
+--             describeCacheSubnetGroupsResponse
+--
+--         , testCreateCacheSecurityGroupResponse $
+--             createCacheSecurityGroupResponse
+--
+--         , testAddTagsToResourceResponse $
+--             tagListMessage
+--
+--         , testAuthorizeCacheSecurityGroupIngressResponse $
+--             authorizeCacheSecurityGroupIngressResponse
+--
+--         , testCopySnapshotResponse $
+--             copySnapshotResponse
+--
+--         , testCreateCacheSubnetGroupResponse $
+--             createCacheSubnetGroupResponse
+--
+--         , testDescribeCacheParameterGroupsResponse $
+--             describeCacheParameterGroupsResponse
+--
+--         , testResetCacheParameterGroupResponse $
+--             cacheParameterGroupNameMessage
+--
+--         , testDescribeSnapshotsResponse $
+--             describeSnapshotsResponse
+--
+--         , testDescribeReservedCacheNodesOfferingsResponse $
+--             describeReservedCacheNodesOfferingsResponse
+--
+--         , testDeleteSnapshotResponse $
+--             deleteSnapshotResponse
+--
+--         , testDescribeReplicationGroupsResponse $
+--             describeReplicationGroupsResponse
+--
+--         , testModifyCacheSubnetGroupResponse $
+--             modifyCacheSubnetGroupResponse
+--
+--         , testCreateSnapshotResponse $
+--             createSnapshotResponse
+--
+--         , testDescribeCacheSecurityGroupsResponse $
+--             describeCacheSecurityGroupsResponse
+--
+--         , testDeleteCacheParameterGroupResponse $
+--             deleteCacheParameterGroupResponse
+--
+--         , testDescribeReservedCacheNodesResponse $
+--             describeReservedCacheNodesResponse
+--
+--         , testDescribeCacheEngineVersionsResponse $
+--             describeCacheEngineVersionsResponse
+--
+--         , testModifyCacheClusterResponse $
+--             modifyCacheClusterResponse
+--
+--         , testCreateCacheParameterGroupResponse $
+--             createCacheParameterGroupResponse
+--
+--         , testDeleteCacheSubnetGroupResponse $
+--             deleteCacheSubnetGroupResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+testDeleteCacheSecurityGroup :: DeleteCacheSecurityGroup -> TestTree
+testDeleteCacheSecurityGroup = req
+    "DeleteCacheSecurityGroup"
+    "fixture/DeleteCacheSecurityGroup"
+
+testCreateReplicationGroup :: CreateReplicationGroup -> TestTree
+testCreateReplicationGroup = req
+    "CreateReplicationGroup"
+    "fixture/CreateReplicationGroup"
+
+testDeleteCacheCluster :: DeleteCacheCluster -> TestTree
+testDeleteCacheCluster = req
+    "DeleteCacheCluster"
+    "fixture/DeleteCacheCluster"
+
+testRebootCacheCluster :: RebootCacheCluster -> TestTree
+testRebootCacheCluster = req
+    "RebootCacheCluster"
+    "fixture/RebootCacheCluster"
+
+testRevokeCacheSecurityGroupIngress :: RevokeCacheSecurityGroupIngress -> TestTree
+testRevokeCacheSecurityGroupIngress = req
+    "RevokeCacheSecurityGroupIngress"
+    "fixture/RevokeCacheSecurityGroupIngress"
+
+testDescribeEvents :: DescribeEvents -> TestTree
+testDescribeEvents = req
+    "DescribeEvents"
+    "fixture/DescribeEvents"
+
+testDescribeEngineDefaultParameters :: DescribeEngineDefaultParameters -> TestTree
+testDescribeEngineDefaultParameters = req
+    "DescribeEngineDefaultParameters"
+    "fixture/DescribeEngineDefaultParameters"
+
+testModifyCacheParameterGroup :: ModifyCacheParameterGroup -> TestTree
+testModifyCacheParameterGroup = req
+    "ModifyCacheParameterGroup"
+    "fixture/ModifyCacheParameterGroup"
+
+testCreateCacheCluster :: CreateCacheCluster -> TestTree
+testCreateCacheCluster = req
+    "CreateCacheCluster"
+    "fixture/CreateCacheCluster"
+
+testListTagsForResource :: ListTagsForResource -> TestTree
+testListTagsForResource = req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource"
+
+testDeleteReplicationGroup :: DeleteReplicationGroup -> TestTree
+testDeleteReplicationGroup = req
+    "DeleteReplicationGroup"
+    "fixture/DeleteReplicationGroup"
+
+testPurchaseReservedCacheNodesOffering :: PurchaseReservedCacheNodesOffering -> TestTree
+testPurchaseReservedCacheNodesOffering = req
+    "PurchaseReservedCacheNodesOffering"
+    "fixture/PurchaseReservedCacheNodesOffering"
+
+testDescribeCacheClusters :: DescribeCacheClusters -> TestTree
+testDescribeCacheClusters = req
+    "DescribeCacheClusters"
+    "fixture/DescribeCacheClusters"
+
+testModifyReplicationGroup :: ModifyReplicationGroup -> TestTree
+testModifyReplicationGroup = req
+    "ModifyReplicationGroup"
+    "fixture/ModifyReplicationGroup"
+
+testRemoveTagsFromResource :: RemoveTagsFromResource -> TestTree
+testRemoveTagsFromResource = req
+    "RemoveTagsFromResource"
+    "fixture/RemoveTagsFromResource"
+
+testDescribeCacheParameters :: DescribeCacheParameters -> TestTree
+testDescribeCacheParameters = req
+    "DescribeCacheParameters"
+    "fixture/DescribeCacheParameters"
+
+testDescribeCacheSubnetGroups :: DescribeCacheSubnetGroups -> TestTree
+testDescribeCacheSubnetGroups = req
+    "DescribeCacheSubnetGroups"
+    "fixture/DescribeCacheSubnetGroups"
+
+testCreateCacheSecurityGroup :: CreateCacheSecurityGroup -> TestTree
+testCreateCacheSecurityGroup = req
+    "CreateCacheSecurityGroup"
+    "fixture/CreateCacheSecurityGroup"
+
+testAddTagsToResource :: AddTagsToResource -> TestTree
+testAddTagsToResource = req
+    "AddTagsToResource"
+    "fixture/AddTagsToResource"
+
+testAuthorizeCacheSecurityGroupIngress :: AuthorizeCacheSecurityGroupIngress -> TestTree
+testAuthorizeCacheSecurityGroupIngress = req
+    "AuthorizeCacheSecurityGroupIngress"
+    "fixture/AuthorizeCacheSecurityGroupIngress"
+
+testCopySnapshot :: CopySnapshot -> TestTree
+testCopySnapshot = req
+    "CopySnapshot"
+    "fixture/CopySnapshot"
+
+testCreateCacheSubnetGroup :: CreateCacheSubnetGroup -> TestTree
+testCreateCacheSubnetGroup = req
+    "CreateCacheSubnetGroup"
+    "fixture/CreateCacheSubnetGroup"
+
+testDescribeCacheParameterGroups :: DescribeCacheParameterGroups -> TestTree
+testDescribeCacheParameterGroups = req
+    "DescribeCacheParameterGroups"
+    "fixture/DescribeCacheParameterGroups"
+
+testResetCacheParameterGroup :: ResetCacheParameterGroup -> TestTree
+testResetCacheParameterGroup = req
+    "ResetCacheParameterGroup"
+    "fixture/ResetCacheParameterGroup"
+
+testDescribeSnapshots :: DescribeSnapshots -> TestTree
+testDescribeSnapshots = req
+    "DescribeSnapshots"
+    "fixture/DescribeSnapshots"
+
+testDescribeReservedCacheNodesOfferings :: DescribeReservedCacheNodesOfferings -> TestTree
+testDescribeReservedCacheNodesOfferings = req
+    "DescribeReservedCacheNodesOfferings"
+    "fixture/DescribeReservedCacheNodesOfferings"
+
+testDeleteSnapshot :: DeleteSnapshot -> TestTree
+testDeleteSnapshot = req
+    "DeleteSnapshot"
+    "fixture/DeleteSnapshot"
+
+testDescribeReplicationGroups :: DescribeReplicationGroups -> TestTree
+testDescribeReplicationGroups = req
+    "DescribeReplicationGroups"
+    "fixture/DescribeReplicationGroups"
+
+testModifyCacheSubnetGroup :: ModifyCacheSubnetGroup -> TestTree
+testModifyCacheSubnetGroup = req
+    "ModifyCacheSubnetGroup"
+    "fixture/ModifyCacheSubnetGroup"
+
+testCreateSnapshot :: CreateSnapshot -> TestTree
+testCreateSnapshot = req
+    "CreateSnapshot"
+    "fixture/CreateSnapshot"
+
+testDescribeCacheSecurityGroups :: DescribeCacheSecurityGroups -> TestTree
+testDescribeCacheSecurityGroups = req
+    "DescribeCacheSecurityGroups"
+    "fixture/DescribeCacheSecurityGroups"
+
+testDeleteCacheParameterGroup :: DeleteCacheParameterGroup -> TestTree
+testDeleteCacheParameterGroup = req
+    "DeleteCacheParameterGroup"
+    "fixture/DeleteCacheParameterGroup"
+
+testDescribeReservedCacheNodes :: DescribeReservedCacheNodes -> TestTree
+testDescribeReservedCacheNodes = req
+    "DescribeReservedCacheNodes"
+    "fixture/DescribeReservedCacheNodes"
+
+testDescribeCacheEngineVersions :: DescribeCacheEngineVersions -> TestTree
+testDescribeCacheEngineVersions = req
+    "DescribeCacheEngineVersions"
+    "fixture/DescribeCacheEngineVersions"
+
+testModifyCacheCluster :: ModifyCacheCluster -> TestTree
+testModifyCacheCluster = req
+    "ModifyCacheCluster"
+    "fixture/ModifyCacheCluster"
+
+testCreateCacheParameterGroup :: CreateCacheParameterGroup -> TestTree
+testCreateCacheParameterGroup = req
+    "CreateCacheParameterGroup"
+    "fixture/CreateCacheParameterGroup"
+
+testDeleteCacheSubnetGroup :: DeleteCacheSubnetGroup -> TestTree
+testDeleteCacheSubnetGroup = req
+    "DeleteCacheSubnetGroup"
+    "fixture/DeleteCacheSubnetGroup"
+
+-- Responses
+
+testDeleteCacheSecurityGroupResponse :: DeleteCacheSecurityGroupResponse -> TestTree
+testDeleteCacheSecurityGroupResponse = res
+    "DeleteCacheSecurityGroupResponse"
+    "fixture/DeleteCacheSecurityGroupResponse"
+    (Proxy :: Proxy DeleteCacheSecurityGroup)
+
+testCreateReplicationGroupResponse :: CreateReplicationGroupResponse -> TestTree
+testCreateReplicationGroupResponse = res
+    "CreateReplicationGroupResponse"
+    "fixture/CreateReplicationGroupResponse"
+    (Proxy :: Proxy CreateReplicationGroup)
+
+testDeleteCacheClusterResponse :: DeleteCacheClusterResponse -> TestTree
+testDeleteCacheClusterResponse = res
+    "DeleteCacheClusterResponse"
+    "fixture/DeleteCacheClusterResponse"
+    (Proxy :: Proxy DeleteCacheCluster)
+
+testRebootCacheClusterResponse :: RebootCacheClusterResponse -> TestTree
+testRebootCacheClusterResponse = res
+    "RebootCacheClusterResponse"
+    "fixture/RebootCacheClusterResponse"
+    (Proxy :: Proxy RebootCacheCluster)
+
+testRevokeCacheSecurityGroupIngressResponse :: RevokeCacheSecurityGroupIngressResponse -> TestTree
+testRevokeCacheSecurityGroupIngressResponse = res
+    "RevokeCacheSecurityGroupIngressResponse"
+    "fixture/RevokeCacheSecurityGroupIngressResponse"
+    (Proxy :: Proxy RevokeCacheSecurityGroupIngress)
+
+testDescribeEventsResponse :: DescribeEventsResponse -> TestTree
+testDescribeEventsResponse = res
+    "DescribeEventsResponse"
+    "fixture/DescribeEventsResponse"
+    (Proxy :: Proxy DescribeEvents)
+
+testDescribeEngineDefaultParametersResponse :: DescribeEngineDefaultParametersResponse -> TestTree
+testDescribeEngineDefaultParametersResponse = res
+    "DescribeEngineDefaultParametersResponse"
+    "fixture/DescribeEngineDefaultParametersResponse"
+    (Proxy :: Proxy DescribeEngineDefaultParameters)
+
+testModifyCacheParameterGroupResponse :: CacheParameterGroupNameMessage -> TestTree
+testModifyCacheParameterGroupResponse = res
+    "ModifyCacheParameterGroupResponse"
+    "fixture/ModifyCacheParameterGroupResponse"
+    (Proxy :: Proxy ModifyCacheParameterGroup)
+
+testCreateCacheClusterResponse :: CreateCacheClusterResponse -> TestTree
+testCreateCacheClusterResponse = res
+    "CreateCacheClusterResponse"
+    "fixture/CreateCacheClusterResponse"
+    (Proxy :: Proxy CreateCacheCluster)
+
+testListTagsForResourceResponse :: TagListMessage -> TestTree
+testListTagsForResourceResponse = res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse"
+    (Proxy :: Proxy ListTagsForResource)
+
+testDeleteReplicationGroupResponse :: DeleteReplicationGroupResponse -> TestTree
+testDeleteReplicationGroupResponse = res
+    "DeleteReplicationGroupResponse"
+    "fixture/DeleteReplicationGroupResponse"
+    (Proxy :: Proxy DeleteReplicationGroup)
+
+testPurchaseReservedCacheNodesOfferingResponse :: PurchaseReservedCacheNodesOfferingResponse -> TestTree
+testPurchaseReservedCacheNodesOfferingResponse = res
+    "PurchaseReservedCacheNodesOfferingResponse"
+    "fixture/PurchaseReservedCacheNodesOfferingResponse"
+    (Proxy :: Proxy PurchaseReservedCacheNodesOffering)
+
+testDescribeCacheClustersResponse :: DescribeCacheClustersResponse -> TestTree
+testDescribeCacheClustersResponse = res
+    "DescribeCacheClustersResponse"
+    "fixture/DescribeCacheClustersResponse"
+    (Proxy :: Proxy DescribeCacheClusters)
+
+testModifyReplicationGroupResponse :: ModifyReplicationGroupResponse -> TestTree
+testModifyReplicationGroupResponse = res
+    "ModifyReplicationGroupResponse"
+    "fixture/ModifyReplicationGroupResponse"
+    (Proxy :: Proxy ModifyReplicationGroup)
+
+testRemoveTagsFromResourceResponse :: TagListMessage -> TestTree
+testRemoveTagsFromResourceResponse = res
+    "RemoveTagsFromResourceResponse"
+    "fixture/RemoveTagsFromResourceResponse"
+    (Proxy :: Proxy RemoveTagsFromResource)
+
+testDescribeCacheParametersResponse :: DescribeCacheParametersResponse -> TestTree
+testDescribeCacheParametersResponse = res
+    "DescribeCacheParametersResponse"
+    "fixture/DescribeCacheParametersResponse"
+    (Proxy :: Proxy DescribeCacheParameters)
+
+testDescribeCacheSubnetGroupsResponse :: DescribeCacheSubnetGroupsResponse -> TestTree
+testDescribeCacheSubnetGroupsResponse = res
+    "DescribeCacheSubnetGroupsResponse"
+    "fixture/DescribeCacheSubnetGroupsResponse"
+    (Proxy :: Proxy DescribeCacheSubnetGroups)
+
+testCreateCacheSecurityGroupResponse :: CreateCacheSecurityGroupResponse -> TestTree
+testCreateCacheSecurityGroupResponse = res
+    "CreateCacheSecurityGroupResponse"
+    "fixture/CreateCacheSecurityGroupResponse"
+    (Proxy :: Proxy CreateCacheSecurityGroup)
+
+testAddTagsToResourceResponse :: TagListMessage -> TestTree
+testAddTagsToResourceResponse = res
+    "AddTagsToResourceResponse"
+    "fixture/AddTagsToResourceResponse"
+    (Proxy :: Proxy AddTagsToResource)
+
+testAuthorizeCacheSecurityGroupIngressResponse :: AuthorizeCacheSecurityGroupIngressResponse -> TestTree
+testAuthorizeCacheSecurityGroupIngressResponse = res
+    "AuthorizeCacheSecurityGroupIngressResponse"
+    "fixture/AuthorizeCacheSecurityGroupIngressResponse"
+    (Proxy :: Proxy AuthorizeCacheSecurityGroupIngress)
+
+testCopySnapshotResponse :: CopySnapshotResponse -> TestTree
+testCopySnapshotResponse = res
+    "CopySnapshotResponse"
+    "fixture/CopySnapshotResponse"
+    (Proxy :: Proxy CopySnapshot)
+
+testCreateCacheSubnetGroupResponse :: CreateCacheSubnetGroupResponse -> TestTree
+testCreateCacheSubnetGroupResponse = res
+    "CreateCacheSubnetGroupResponse"
+    "fixture/CreateCacheSubnetGroupResponse"
+    (Proxy :: Proxy CreateCacheSubnetGroup)
+
+testDescribeCacheParameterGroupsResponse :: DescribeCacheParameterGroupsResponse -> TestTree
+testDescribeCacheParameterGroupsResponse = res
+    "DescribeCacheParameterGroupsResponse"
+    "fixture/DescribeCacheParameterGroupsResponse"
+    (Proxy :: Proxy DescribeCacheParameterGroups)
+
+testResetCacheParameterGroupResponse :: CacheParameterGroupNameMessage -> TestTree
+testResetCacheParameterGroupResponse = res
+    "ResetCacheParameterGroupResponse"
+    "fixture/ResetCacheParameterGroupResponse"
+    (Proxy :: Proxy ResetCacheParameterGroup)
+
+testDescribeSnapshotsResponse :: DescribeSnapshotsResponse -> TestTree
+testDescribeSnapshotsResponse = res
+    "DescribeSnapshotsResponse"
+    "fixture/DescribeSnapshotsResponse"
+    (Proxy :: Proxy DescribeSnapshots)
+
+testDescribeReservedCacheNodesOfferingsResponse :: DescribeReservedCacheNodesOfferingsResponse -> TestTree
+testDescribeReservedCacheNodesOfferingsResponse = res
+    "DescribeReservedCacheNodesOfferingsResponse"
+    "fixture/DescribeReservedCacheNodesOfferingsResponse"
+    (Proxy :: Proxy DescribeReservedCacheNodesOfferings)
+
+testDeleteSnapshotResponse :: DeleteSnapshotResponse -> TestTree
+testDeleteSnapshotResponse = res
+    "DeleteSnapshotResponse"
+    "fixture/DeleteSnapshotResponse"
+    (Proxy :: Proxy DeleteSnapshot)
+
+testDescribeReplicationGroupsResponse :: DescribeReplicationGroupsResponse -> TestTree
+testDescribeReplicationGroupsResponse = res
+    "DescribeReplicationGroupsResponse"
+    "fixture/DescribeReplicationGroupsResponse"
+    (Proxy :: Proxy DescribeReplicationGroups)
+
+testModifyCacheSubnetGroupResponse :: ModifyCacheSubnetGroupResponse -> TestTree
+testModifyCacheSubnetGroupResponse = res
+    "ModifyCacheSubnetGroupResponse"
+    "fixture/ModifyCacheSubnetGroupResponse"
+    (Proxy :: Proxy ModifyCacheSubnetGroup)
+
+testCreateSnapshotResponse :: CreateSnapshotResponse -> TestTree
+testCreateSnapshotResponse = res
+    "CreateSnapshotResponse"
+    "fixture/CreateSnapshotResponse"
+    (Proxy :: Proxy CreateSnapshot)
+
+testDescribeCacheSecurityGroupsResponse :: DescribeCacheSecurityGroupsResponse -> TestTree
+testDescribeCacheSecurityGroupsResponse = res
+    "DescribeCacheSecurityGroupsResponse"
+    "fixture/DescribeCacheSecurityGroupsResponse"
+    (Proxy :: Proxy DescribeCacheSecurityGroups)
+
+testDeleteCacheParameterGroupResponse :: DeleteCacheParameterGroupResponse -> TestTree
+testDeleteCacheParameterGroupResponse = res
+    "DeleteCacheParameterGroupResponse"
+    "fixture/DeleteCacheParameterGroupResponse"
+    (Proxy :: Proxy DeleteCacheParameterGroup)
+
+testDescribeReservedCacheNodesResponse :: DescribeReservedCacheNodesResponse -> TestTree
+testDescribeReservedCacheNodesResponse = res
+    "DescribeReservedCacheNodesResponse"
+    "fixture/DescribeReservedCacheNodesResponse"
+    (Proxy :: Proxy DescribeReservedCacheNodes)
+
+testDescribeCacheEngineVersionsResponse :: DescribeCacheEngineVersionsResponse -> TestTree
+testDescribeCacheEngineVersionsResponse = res
+    "DescribeCacheEngineVersionsResponse"
+    "fixture/DescribeCacheEngineVersionsResponse"
+    (Proxy :: Proxy DescribeCacheEngineVersions)
+
+testModifyCacheClusterResponse :: ModifyCacheClusterResponse -> TestTree
+testModifyCacheClusterResponse = res
+    "ModifyCacheClusterResponse"
+    "fixture/ModifyCacheClusterResponse"
+    (Proxy :: Proxy ModifyCacheCluster)
+
+testCreateCacheParameterGroupResponse :: CreateCacheParameterGroupResponse -> TestTree
+testCreateCacheParameterGroupResponse = res
+    "CreateCacheParameterGroupResponse"
+    "fixture/CreateCacheParameterGroupResponse"
+    (Proxy :: Proxy CreateCacheParameterGroup)
+
+testDeleteCacheSubnetGroupResponse :: DeleteCacheSubnetGroupResponse -> TestTree
+testDeleteCacheSubnetGroupResponse = res
+    "DeleteCacheSubnetGroupResponse"
+    "fixture/DeleteCacheSubnetGroupResponse"
+    (Proxy :: Proxy DeleteCacheSubnetGroup)
