diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2016 David Reaver
+Copyright (c) 2022 Markus Schirp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster.hs b/gen/Stratosphere/ElastiCache/CacheCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster.hs
@@ -0,0 +1,277 @@
+module Stratosphere.ElastiCache.CacheCluster (
+        module Exports, CacheCluster(..), mkCacheCluster
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.CacheCluster.LogDeliveryConfigurationRequestProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data CacheCluster
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html>
+    CacheCluster {haddock_workaround_ :: (),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-azmode>
+                  aZMode :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-autominorversionupgrade>
+                  autoMinorVersionUpgrade :: (Prelude.Maybe (Value Prelude.Bool)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachenodetype>
+                  cacheNodeType :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cacheparametergroupname>
+                  cacheParameterGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachesecuritygroupnames>
+                  cacheSecurityGroupNames :: (Prelude.Maybe (ValueList Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachesubnetgroupname>
+                  cacheSubnetGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-clustername>
+                  clusterName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-engine>
+                  engine :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-engineversion>
+                  engineVersion :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-ipdiscovery>
+                  ipDiscovery :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-logdeliveryconfigurations>
+                  logDeliveryConfigurations :: (Prelude.Maybe [LogDeliveryConfigurationRequestProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-networktype>
+                  networkType :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-notificationtopicarn>
+                  notificationTopicArn :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-numcachenodes>
+                  numCacheNodes :: (Value Prelude.Integer),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-port>
+                  port :: (Prelude.Maybe (Value Prelude.Integer)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredavailabilityzone>
+                  preferredAvailabilityZone :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredavailabilityzones>
+                  preferredAvailabilityZones :: (Prelude.Maybe (ValueList Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredmaintenancewindow>
+                  preferredMaintenanceWindow :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotarns>
+                  snapshotArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotname>
+                  snapshotName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotretentionlimit>
+                  snapshotRetentionLimit :: (Prelude.Maybe (Value Prelude.Integer)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotwindow>
+                  snapshotWindow :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-tags>
+                  tags :: (Prelude.Maybe [Tag]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-transitencryptionenabled>
+                  transitEncryptionEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-vpcsecuritygroupids>
+                  vpcSecurityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCacheCluster ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> Value Prelude.Integer -> CacheCluster
+mkCacheCluster cacheNodeType engine numCacheNodes
+  = CacheCluster
+      {haddock_workaround_ = (), cacheNodeType = cacheNodeType,
+       engine = engine, numCacheNodes = numCacheNodes,
+       aZMode = Prelude.Nothing,
+       autoMinorVersionUpgrade = Prelude.Nothing,
+       cacheParameterGroupName = Prelude.Nothing,
+       cacheSecurityGroupNames = Prelude.Nothing,
+       cacheSubnetGroupName = Prelude.Nothing,
+       clusterName = Prelude.Nothing, engineVersion = Prelude.Nothing,
+       ipDiscovery = Prelude.Nothing,
+       logDeliveryConfigurations = Prelude.Nothing,
+       networkType = Prelude.Nothing,
+       notificationTopicArn = Prelude.Nothing, port = Prelude.Nothing,
+       preferredAvailabilityZone = Prelude.Nothing,
+       preferredAvailabilityZones = Prelude.Nothing,
+       preferredMaintenanceWindow = Prelude.Nothing,
+       snapshotArns = Prelude.Nothing, snapshotName = Prelude.Nothing,
+       snapshotRetentionLimit = Prelude.Nothing,
+       snapshotWindow = Prelude.Nothing, tags = Prelude.Nothing,
+       transitEncryptionEnabled = Prelude.Nothing,
+       vpcSecurityGroupIds = Prelude.Nothing}
+instance ToResourceProperties CacheCluster where
+  toResourceProperties CacheCluster {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::CacheCluster",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["CacheNodeType" JSON..= cacheNodeType, "Engine" JSON..= engine,
+                            "NumCacheNodes" JSON..= numCacheNodes]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AZMode" Prelude.<$> aZMode,
+                               (JSON..=) "AutoMinorVersionUpgrade"
+                                 Prelude.<$> autoMinorVersionUpgrade,
+                               (JSON..=) "CacheParameterGroupName"
+                                 Prelude.<$> cacheParameterGroupName,
+                               (JSON..=) "CacheSecurityGroupNames"
+                                 Prelude.<$> cacheSecurityGroupNames,
+                               (JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                               (JSON..=) "ClusterName" Prelude.<$> clusterName,
+                               (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                               (JSON..=) "IpDiscovery" Prelude.<$> ipDiscovery,
+                               (JSON..=) "LogDeliveryConfigurations"
+                                 Prelude.<$> logDeliveryConfigurations,
+                               (JSON..=) "NetworkType" Prelude.<$> networkType,
+                               (JSON..=) "NotificationTopicArn" Prelude.<$> notificationTopicArn,
+                               (JSON..=) "Port" Prelude.<$> port,
+                               (JSON..=) "PreferredAvailabilityZone"
+                                 Prelude.<$> preferredAvailabilityZone,
+                               (JSON..=) "PreferredAvailabilityZones"
+                                 Prelude.<$> preferredAvailabilityZones,
+                               (JSON..=) "PreferredMaintenanceWindow"
+                                 Prelude.<$> preferredMaintenanceWindow,
+                               (JSON..=) "SnapshotArns" Prelude.<$> snapshotArns,
+                               (JSON..=) "SnapshotName" Prelude.<$> snapshotName,
+                               (JSON..=) "SnapshotRetentionLimit"
+                                 Prelude.<$> snapshotRetentionLimit,
+                               (JSON..=) "SnapshotWindow" Prelude.<$> snapshotWindow,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "TransitEncryptionEnabled"
+                                 Prelude.<$> transitEncryptionEnabled,
+                               (JSON..=) "VpcSecurityGroupIds" Prelude.<$> vpcSecurityGroupIds]))}
+instance JSON.ToJSON CacheCluster where
+  toJSON CacheCluster {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["CacheNodeType" JSON..= cacheNodeType, "Engine" JSON..= engine,
+               "NumCacheNodes" JSON..= numCacheNodes]
+              (Prelude.catMaybes
+                 [(JSON..=) "AZMode" Prelude.<$> aZMode,
+                  (JSON..=) "AutoMinorVersionUpgrade"
+                    Prelude.<$> autoMinorVersionUpgrade,
+                  (JSON..=) "CacheParameterGroupName"
+                    Prelude.<$> cacheParameterGroupName,
+                  (JSON..=) "CacheSecurityGroupNames"
+                    Prelude.<$> cacheSecurityGroupNames,
+                  (JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                  (JSON..=) "ClusterName" Prelude.<$> clusterName,
+                  (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                  (JSON..=) "IpDiscovery" Prelude.<$> ipDiscovery,
+                  (JSON..=) "LogDeliveryConfigurations"
+                    Prelude.<$> logDeliveryConfigurations,
+                  (JSON..=) "NetworkType" Prelude.<$> networkType,
+                  (JSON..=) "NotificationTopicArn" Prelude.<$> notificationTopicArn,
+                  (JSON..=) "Port" Prelude.<$> port,
+                  (JSON..=) "PreferredAvailabilityZone"
+                    Prelude.<$> preferredAvailabilityZone,
+                  (JSON..=) "PreferredAvailabilityZones"
+                    Prelude.<$> preferredAvailabilityZones,
+                  (JSON..=) "PreferredMaintenanceWindow"
+                    Prelude.<$> preferredMaintenanceWindow,
+                  (JSON..=) "SnapshotArns" Prelude.<$> snapshotArns,
+                  (JSON..=) "SnapshotName" Prelude.<$> snapshotName,
+                  (JSON..=) "SnapshotRetentionLimit"
+                    Prelude.<$> snapshotRetentionLimit,
+                  (JSON..=) "SnapshotWindow" Prelude.<$> snapshotWindow,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "TransitEncryptionEnabled"
+                    Prelude.<$> transitEncryptionEnabled,
+                  (JSON..=) "VpcSecurityGroupIds" Prelude.<$> vpcSecurityGroupIds])))
+instance Property "AZMode" CacheCluster where
+  type PropertyType "AZMode" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {aZMode = Prelude.pure newValue, ..}
+instance Property "AutoMinorVersionUpgrade" CacheCluster where
+  type PropertyType "AutoMinorVersionUpgrade" CacheCluster = Value Prelude.Bool
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {autoMinorVersionUpgrade = Prelude.pure newValue, ..}
+instance Property "CacheNodeType" CacheCluster where
+  type PropertyType "CacheNodeType" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {cacheNodeType = newValue, ..}
+instance Property "CacheParameterGroupName" CacheCluster where
+  type PropertyType "CacheParameterGroupName" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {cacheParameterGroupName = Prelude.pure newValue, ..}
+instance Property "CacheSecurityGroupNames" CacheCluster where
+  type PropertyType "CacheSecurityGroupNames" CacheCluster = ValueList Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {cacheSecurityGroupNames = Prelude.pure newValue, ..}
+instance Property "CacheSubnetGroupName" CacheCluster where
+  type PropertyType "CacheSubnetGroupName" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {cacheSubnetGroupName = Prelude.pure newValue, ..}
+instance Property "ClusterName" CacheCluster where
+  type PropertyType "ClusterName" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {clusterName = Prelude.pure newValue, ..}
+instance Property "Engine" CacheCluster where
+  type PropertyType "Engine" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {engine = newValue, ..}
+instance Property "EngineVersion" CacheCluster where
+  type PropertyType "EngineVersion" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {engineVersion = Prelude.pure newValue, ..}
+instance Property "IpDiscovery" CacheCluster where
+  type PropertyType "IpDiscovery" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {ipDiscovery = Prelude.pure newValue, ..}
+instance Property "LogDeliveryConfigurations" CacheCluster where
+  type PropertyType "LogDeliveryConfigurations" CacheCluster = [LogDeliveryConfigurationRequestProperty]
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {logDeliveryConfigurations = Prelude.pure newValue, ..}
+instance Property "NetworkType" CacheCluster where
+  type PropertyType "NetworkType" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {networkType = Prelude.pure newValue, ..}
+instance Property "NotificationTopicArn" CacheCluster where
+  type PropertyType "NotificationTopicArn" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {notificationTopicArn = Prelude.pure newValue, ..}
+instance Property "NumCacheNodes" CacheCluster where
+  type PropertyType "NumCacheNodes" CacheCluster = Value Prelude.Integer
+  set newValue CacheCluster {..}
+    = CacheCluster {numCacheNodes = newValue, ..}
+instance Property "Port" CacheCluster where
+  type PropertyType "Port" CacheCluster = Value Prelude.Integer
+  set newValue CacheCluster {..}
+    = CacheCluster {port = Prelude.pure newValue, ..}
+instance Property "PreferredAvailabilityZone" CacheCluster where
+  type PropertyType "PreferredAvailabilityZone" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {preferredAvailabilityZone = Prelude.pure newValue, ..}
+instance Property "PreferredAvailabilityZones" CacheCluster where
+  type PropertyType "PreferredAvailabilityZones" CacheCluster = ValueList Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {preferredAvailabilityZones = Prelude.pure newValue, ..}
+instance Property "PreferredMaintenanceWindow" CacheCluster where
+  type PropertyType "PreferredMaintenanceWindow" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {preferredMaintenanceWindow = Prelude.pure newValue, ..}
+instance Property "SnapshotArns" CacheCluster where
+  type PropertyType "SnapshotArns" CacheCluster = ValueList Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {snapshotArns = Prelude.pure newValue, ..}
+instance Property "SnapshotName" CacheCluster where
+  type PropertyType "SnapshotName" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {snapshotName = Prelude.pure newValue, ..}
+instance Property "SnapshotRetentionLimit" CacheCluster where
+  type PropertyType "SnapshotRetentionLimit" CacheCluster = Value Prelude.Integer
+  set newValue CacheCluster {..}
+    = CacheCluster {snapshotRetentionLimit = Prelude.pure newValue, ..}
+instance Property "SnapshotWindow" CacheCluster where
+  type PropertyType "SnapshotWindow" CacheCluster = Value Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {snapshotWindow = Prelude.pure newValue, ..}
+instance Property "Tags" CacheCluster where
+  type PropertyType "Tags" CacheCluster = [Tag]
+  set newValue CacheCluster {..}
+    = CacheCluster {tags = Prelude.pure newValue, ..}
+instance Property "TransitEncryptionEnabled" CacheCluster where
+  type PropertyType "TransitEncryptionEnabled" CacheCluster = Value Prelude.Bool
+  set newValue CacheCluster {..}
+    = CacheCluster
+        {transitEncryptionEnabled = Prelude.pure newValue, ..}
+instance Property "VpcSecurityGroupIds" CacheCluster where
+  type PropertyType "VpcSecurityGroupIds" CacheCluster = ValueList Prelude.Text
+  set newValue CacheCluster {..}
+    = CacheCluster {vpcSecurityGroupIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.ElastiCache.CacheCluster.CloudWatchLogsDestinationDetailsProperty (
+        CloudWatchLogsDestinationDetailsProperty(..),
+        mkCloudWatchLogsDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CloudWatchLogsDestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-cloudwatchlogsdestinationdetails.html>
+    CloudWatchLogsDestinationDetailsProperty {haddock_workaround_ :: (),
+                                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-cloudwatchlogsdestinationdetails.html#cfn-elasticache-cachecluster-cloudwatchlogsdestinationdetails-loggroup>
+                                              logGroup :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCloudWatchLogsDestinationDetailsProperty ::
+  Value Prelude.Text -> CloudWatchLogsDestinationDetailsProperty
+mkCloudWatchLogsDestinationDetailsProperty logGroup
+  = CloudWatchLogsDestinationDetailsProperty
+      {haddock_workaround_ = (), logGroup = logGroup}
+instance ToResourceProperties CloudWatchLogsDestinationDetailsProperty where
+  toResourceProperties CloudWatchLogsDestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::CacheCluster.CloudWatchLogsDestinationDetails",
+         supportsTags = Prelude.False,
+         properties = ["LogGroup" JSON..= logGroup]}
+instance JSON.ToJSON CloudWatchLogsDestinationDetailsProperty where
+  toJSON CloudWatchLogsDestinationDetailsProperty {..}
+    = JSON.object ["LogGroup" JSON..= logGroup]
+instance Property "LogGroup" CloudWatchLogsDestinationDetailsProperty where
+  type PropertyType "LogGroup" CloudWatchLogsDestinationDetailsProperty = Value Prelude.Text
+  set newValue CloudWatchLogsDestinationDetailsProperty {..}
+    = CloudWatchLogsDestinationDetailsProperty
+        {logGroup = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/CloudWatchLogsDestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.CacheCluster.CloudWatchLogsDestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CloudWatchLogsDestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties CloudWatchLogsDestinationDetailsProperty
+instance Prelude.Eq CloudWatchLogsDestinationDetailsProperty
+instance Prelude.Show CloudWatchLogsDestinationDetailsProperty
+instance JSON.ToJSON CloudWatchLogsDestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs
@@ -0,0 +1,53 @@
+module Stratosphere.ElastiCache.CacheCluster.DestinationDetailsProperty (
+        module Exports, DestinationDetailsProperty(..),
+        mkDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.CacheCluster.CloudWatchLogsDestinationDetailsProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.CacheCluster.KinesisFirehoseDestinationDetailsProperty as Exports
+import Stratosphere.ResourceProperties
+data DestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html>
+    DestinationDetailsProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html#cfn-elasticache-cachecluster-destinationdetails-cloudwatchlogsdetails>
+                                cloudWatchLogsDetails :: (Prelude.Maybe CloudWatchLogsDestinationDetailsProperty),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html#cfn-elasticache-cachecluster-destinationdetails-kinesisfirehosedetails>
+                                kinesisFirehoseDetails :: (Prelude.Maybe KinesisFirehoseDestinationDetailsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDestinationDetailsProperty :: DestinationDetailsProperty
+mkDestinationDetailsProperty
+  = DestinationDetailsProperty
+      {haddock_workaround_ = (), cloudWatchLogsDetails = Prelude.Nothing,
+       kinesisFirehoseDetails = Prelude.Nothing}
+instance ToResourceProperties DestinationDetailsProperty where
+  toResourceProperties DestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::CacheCluster.DestinationDetails",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "CloudWatchLogsDetails"
+                              Prelude.<$> cloudWatchLogsDetails,
+                            (JSON..=) "KinesisFirehoseDetails"
+                              Prelude.<$> kinesisFirehoseDetails])}
+instance JSON.ToJSON DestinationDetailsProperty where
+  toJSON DestinationDetailsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "CloudWatchLogsDetails"
+                 Prelude.<$> cloudWatchLogsDetails,
+               (JSON..=) "KinesisFirehoseDetails"
+                 Prelude.<$> kinesisFirehoseDetails]))
+instance Property "CloudWatchLogsDetails" DestinationDetailsProperty where
+  type PropertyType "CloudWatchLogsDetails" DestinationDetailsProperty = CloudWatchLogsDestinationDetailsProperty
+  set newValue DestinationDetailsProperty {..}
+    = DestinationDetailsProperty
+        {cloudWatchLogsDetails = Prelude.pure newValue, ..}
+instance Property "KinesisFirehoseDetails" DestinationDetailsProperty where
+  type PropertyType "KinesisFirehoseDetails" DestinationDetailsProperty = KinesisFirehoseDestinationDetailsProperty
+  set newValue DestinationDetailsProperty {..}
+    = DestinationDetailsProperty
+        {kinesisFirehoseDetails = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/DestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.CacheCluster.DestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties DestinationDetailsProperty
+instance Prelude.Eq DestinationDetailsProperty
+instance Prelude.Show DestinationDetailsProperty
+instance JSON.ToJSON DestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.ElastiCache.CacheCluster.KinesisFirehoseDestinationDetailsProperty (
+        KinesisFirehoseDestinationDetailsProperty(..),
+        mkKinesisFirehoseDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data KinesisFirehoseDestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-kinesisfirehosedestinationdetails.html>
+    KinesisFirehoseDestinationDetailsProperty {haddock_workaround_ :: (),
+                                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-kinesisfirehosedestinationdetails.html#cfn-elasticache-cachecluster-kinesisfirehosedestinationdetails-deliverystream>
+                                               deliveryStream :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkKinesisFirehoseDestinationDetailsProperty ::
+  Value Prelude.Text -> KinesisFirehoseDestinationDetailsProperty
+mkKinesisFirehoseDestinationDetailsProperty deliveryStream
+  = KinesisFirehoseDestinationDetailsProperty
+      {haddock_workaround_ = (), deliveryStream = deliveryStream}
+instance ToResourceProperties KinesisFirehoseDestinationDetailsProperty where
+  toResourceProperties KinesisFirehoseDestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::CacheCluster.KinesisFirehoseDestinationDetails",
+         supportsTags = Prelude.False,
+         properties = ["DeliveryStream" JSON..= deliveryStream]}
+instance JSON.ToJSON KinesisFirehoseDestinationDetailsProperty where
+  toJSON KinesisFirehoseDestinationDetailsProperty {..}
+    = JSON.object ["DeliveryStream" JSON..= deliveryStream]
+instance Property "DeliveryStream" KinesisFirehoseDestinationDetailsProperty where
+  type PropertyType "DeliveryStream" KinesisFirehoseDestinationDetailsProperty = Value Prelude.Text
+  set newValue KinesisFirehoseDestinationDetailsProperty {..}
+    = KinesisFirehoseDestinationDetailsProperty
+        {deliveryStream = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/KinesisFirehoseDestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.CacheCluster.KinesisFirehoseDestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data KinesisFirehoseDestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties KinesisFirehoseDestinationDetailsProperty
+instance Prelude.Eq KinesisFirehoseDestinationDetailsProperty
+instance Prelude.Show KinesisFirehoseDestinationDetailsProperty
+instance JSON.ToJSON KinesisFirehoseDestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs b/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs
@@ -0,0 +1,69 @@
+module Stratosphere.ElastiCache.CacheCluster.LogDeliveryConfigurationRequestProperty (
+        module Exports, LogDeliveryConfigurationRequestProperty(..),
+        mkLogDeliveryConfigurationRequestProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.CacheCluster.DestinationDetailsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data LogDeliveryConfigurationRequestProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html>
+    LogDeliveryConfigurationRequestProperty {haddock_workaround_ :: (),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-destinationdetails>
+                                             destinationDetails :: DestinationDetailsProperty,
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-destinationtype>
+                                             destinationType :: (Value Prelude.Text),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logformat>
+                                             logFormat :: (Value Prelude.Text),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logtype>
+                                             logType :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLogDeliveryConfigurationRequestProperty ::
+  DestinationDetailsProperty
+  -> Value Prelude.Text
+     -> Value Prelude.Text
+        -> Value Prelude.Text -> LogDeliveryConfigurationRequestProperty
+mkLogDeliveryConfigurationRequestProperty
+  destinationDetails
+  destinationType
+  logFormat
+  logType
+  = LogDeliveryConfigurationRequestProperty
+      {haddock_workaround_ = (), destinationDetails = destinationDetails,
+       destinationType = destinationType, logFormat = logFormat,
+       logType = logType}
+instance ToResourceProperties LogDeliveryConfigurationRequestProperty where
+  toResourceProperties LogDeliveryConfigurationRequestProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::CacheCluster.LogDeliveryConfigurationRequest",
+         supportsTags = Prelude.False,
+         properties = ["DestinationDetails" JSON..= destinationDetails,
+                       "DestinationType" JSON..= destinationType,
+                       "LogFormat" JSON..= logFormat, "LogType" JSON..= logType]}
+instance JSON.ToJSON LogDeliveryConfigurationRequestProperty where
+  toJSON LogDeliveryConfigurationRequestProperty {..}
+    = JSON.object
+        ["DestinationDetails" JSON..= destinationDetails,
+         "DestinationType" JSON..= destinationType,
+         "LogFormat" JSON..= logFormat, "LogType" JSON..= logType]
+instance Property "DestinationDetails" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "DestinationDetails" LogDeliveryConfigurationRequestProperty = DestinationDetailsProperty
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {destinationDetails = newValue, ..}
+instance Property "DestinationType" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "DestinationType" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {destinationType = newValue, ..}
+instance Property "LogFormat" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "LogFormat" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {logFormat = newValue, ..}
+instance Property "LogType" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "LogType" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty {logType = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs-boot b/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/CacheCluster/LogDeliveryConfigurationRequestProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.CacheCluster.LogDeliveryConfigurationRequestProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LogDeliveryConfigurationRequestProperty :: Prelude.Type
+instance ToResourceProperties LogDeliveryConfigurationRequestProperty
+instance Prelude.Eq LogDeliveryConfigurationRequestProperty
+instance Prelude.Show LogDeliveryConfigurationRequestProperty
+instance JSON.ToJSON LogDeliveryConfigurationRequestProperty
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup.hs b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup.hs
@@ -0,0 +1,140 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup (
+        module Exports, GlobalReplicationGroup(..),
+        mkGlobalReplicationGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.GlobalReplicationGroup.GlobalReplicationGroupMemberProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.GlobalReplicationGroup.RegionalConfigurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GlobalReplicationGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html>
+    GlobalReplicationGroup {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-automaticfailoverenabled>
+                            automaticFailoverEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-cachenodetype>
+                            cacheNodeType :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-cacheparametergroupname>
+                            cacheParameterGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-engine>
+                            engine :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-engineversion>
+                            engineVersion :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalnodegroupcount>
+                            globalNodeGroupCount :: (Prelude.Maybe (Value Prelude.Integer)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupdescription>
+                            globalReplicationGroupDescription :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupidsuffix>
+                            globalReplicationGroupIdSuffix :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-members>
+                            members :: [GlobalReplicationGroupMemberProperty],
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-regionalconfigurations>
+                            regionalConfigurations :: (Prelude.Maybe [RegionalConfigurationProperty])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGlobalReplicationGroup ::
+  [GlobalReplicationGroupMemberProperty] -> GlobalReplicationGroup
+mkGlobalReplicationGroup members
+  = GlobalReplicationGroup
+      {haddock_workaround_ = (), members = members,
+       automaticFailoverEnabled = Prelude.Nothing,
+       cacheNodeType = Prelude.Nothing,
+       cacheParameterGroupName = Prelude.Nothing,
+       engine = Prelude.Nothing, engineVersion = Prelude.Nothing,
+       globalNodeGroupCount = Prelude.Nothing,
+       globalReplicationGroupDescription = Prelude.Nothing,
+       globalReplicationGroupIdSuffix = Prelude.Nothing,
+       regionalConfigurations = Prelude.Nothing}
+instance ToResourceProperties GlobalReplicationGroup where
+  toResourceProperties GlobalReplicationGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::GlobalReplicationGroup",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Members" JSON..= members]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AutomaticFailoverEnabled"
+                                 Prelude.<$> automaticFailoverEnabled,
+                               (JSON..=) "CacheNodeType" Prelude.<$> cacheNodeType,
+                               (JSON..=) "CacheParameterGroupName"
+                                 Prelude.<$> cacheParameterGroupName,
+                               (JSON..=) "Engine" Prelude.<$> engine,
+                               (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                               (JSON..=) "GlobalNodeGroupCount" Prelude.<$> globalNodeGroupCount,
+                               (JSON..=) "GlobalReplicationGroupDescription"
+                                 Prelude.<$> globalReplicationGroupDescription,
+                               (JSON..=) "GlobalReplicationGroupIdSuffix"
+                                 Prelude.<$> globalReplicationGroupIdSuffix,
+                               (JSON..=) "RegionalConfigurations"
+                                 Prelude.<$> regionalConfigurations]))}
+instance JSON.ToJSON GlobalReplicationGroup where
+  toJSON GlobalReplicationGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Members" JSON..= members]
+              (Prelude.catMaybes
+                 [(JSON..=) "AutomaticFailoverEnabled"
+                    Prelude.<$> automaticFailoverEnabled,
+                  (JSON..=) "CacheNodeType" Prelude.<$> cacheNodeType,
+                  (JSON..=) "CacheParameterGroupName"
+                    Prelude.<$> cacheParameterGroupName,
+                  (JSON..=) "Engine" Prelude.<$> engine,
+                  (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                  (JSON..=) "GlobalNodeGroupCount" Prelude.<$> globalNodeGroupCount,
+                  (JSON..=) "GlobalReplicationGroupDescription"
+                    Prelude.<$> globalReplicationGroupDescription,
+                  (JSON..=) "GlobalReplicationGroupIdSuffix"
+                    Prelude.<$> globalReplicationGroupIdSuffix,
+                  (JSON..=) "RegionalConfigurations"
+                    Prelude.<$> regionalConfigurations])))
+instance Property "AutomaticFailoverEnabled" GlobalReplicationGroup where
+  type PropertyType "AutomaticFailoverEnabled" GlobalReplicationGroup = Value Prelude.Bool
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {automaticFailoverEnabled = Prelude.pure newValue, ..}
+instance Property "CacheNodeType" GlobalReplicationGroup where
+  type PropertyType "CacheNodeType" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {cacheNodeType = Prelude.pure newValue, ..}
+instance Property "CacheParameterGroupName" GlobalReplicationGroup where
+  type PropertyType "CacheParameterGroupName" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {cacheParameterGroupName = Prelude.pure newValue, ..}
+instance Property "Engine" GlobalReplicationGroup where
+  type PropertyType "Engine" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup {engine = Prelude.pure newValue, ..}
+instance Property "EngineVersion" GlobalReplicationGroup where
+  type PropertyType "EngineVersion" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {engineVersion = Prelude.pure newValue, ..}
+instance Property "GlobalNodeGroupCount" GlobalReplicationGroup where
+  type PropertyType "GlobalNodeGroupCount" GlobalReplicationGroup = Value Prelude.Integer
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {globalNodeGroupCount = Prelude.pure newValue, ..}
+instance Property "GlobalReplicationGroupDescription" GlobalReplicationGroup where
+  type PropertyType "GlobalReplicationGroupDescription" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {globalReplicationGroupDescription = Prelude.pure newValue, ..}
+instance Property "GlobalReplicationGroupIdSuffix" GlobalReplicationGroup where
+  type PropertyType "GlobalReplicationGroupIdSuffix" GlobalReplicationGroup = Value Prelude.Text
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {globalReplicationGroupIdSuffix = Prelude.pure newValue, ..}
+instance Property "Members" GlobalReplicationGroup where
+  type PropertyType "Members" GlobalReplicationGroup = [GlobalReplicationGroupMemberProperty]
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup {members = newValue, ..}
+instance Property "RegionalConfigurations" GlobalReplicationGroup where
+  type PropertyType "RegionalConfigurations" GlobalReplicationGroup = [RegionalConfigurationProperty]
+  set newValue GlobalReplicationGroup {..}
+    = GlobalReplicationGroup
+        {regionalConfigurations = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.GlobalReplicationGroupMemberProperty (
+        GlobalReplicationGroupMemberProperty(..),
+        mkGlobalReplicationGroupMemberProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GlobalReplicationGroupMemberProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html>
+    GlobalReplicationGroupMemberProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-replicationgroupid>
+                                          replicationGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-replicationgroupregion>
+                                          replicationGroupRegion :: (Prelude.Maybe (Value Prelude.Text)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-role>
+                                          role :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGlobalReplicationGroupMemberProperty ::
+  GlobalReplicationGroupMemberProperty
+mkGlobalReplicationGroupMemberProperty
+  = GlobalReplicationGroupMemberProperty
+      {haddock_workaround_ = (), replicationGroupId = Prelude.Nothing,
+       replicationGroupRegion = Prelude.Nothing, role = Prelude.Nothing}
+instance ToResourceProperties GlobalReplicationGroupMemberProperty where
+  toResourceProperties GlobalReplicationGroupMemberProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::GlobalReplicationGroup.GlobalReplicationGroupMember",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+                            (JSON..=) "ReplicationGroupRegion"
+                              Prelude.<$> replicationGroupRegion,
+                            (JSON..=) "Role" Prelude.<$> role])}
+instance JSON.ToJSON GlobalReplicationGroupMemberProperty where
+  toJSON GlobalReplicationGroupMemberProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+               (JSON..=) "ReplicationGroupRegion"
+                 Prelude.<$> replicationGroupRegion,
+               (JSON..=) "Role" Prelude.<$> role]))
+instance Property "ReplicationGroupId" GlobalReplicationGroupMemberProperty where
+  type PropertyType "ReplicationGroupId" GlobalReplicationGroupMemberProperty = Value Prelude.Text
+  set newValue GlobalReplicationGroupMemberProperty {..}
+    = GlobalReplicationGroupMemberProperty
+        {replicationGroupId = Prelude.pure newValue, ..}
+instance Property "ReplicationGroupRegion" GlobalReplicationGroupMemberProperty where
+  type PropertyType "ReplicationGroupRegion" GlobalReplicationGroupMemberProperty = Value Prelude.Text
+  set newValue GlobalReplicationGroupMemberProperty {..}
+    = GlobalReplicationGroupMemberProperty
+        {replicationGroupRegion = Prelude.pure newValue, ..}
+instance Property "Role" GlobalReplicationGroupMemberProperty where
+  type PropertyType "Role" GlobalReplicationGroupMemberProperty = Value Prelude.Text
+  set newValue GlobalReplicationGroupMemberProperty {..}
+    = GlobalReplicationGroupMemberProperty
+        {role = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs-boot b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/GlobalReplicationGroupMemberProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.GlobalReplicationGroupMemberProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GlobalReplicationGroupMemberProperty :: Prelude.Type
+instance ToResourceProperties GlobalReplicationGroupMemberProperty
+instance Prelude.Eq GlobalReplicationGroupMemberProperty
+instance Prelude.Show GlobalReplicationGroupMemberProperty
+instance JSON.ToJSON GlobalReplicationGroupMemberProperty
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs
@@ -0,0 +1,63 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.RegionalConfigurationProperty (
+        module Exports, RegionalConfigurationProperty(..),
+        mkRegionalConfigurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.GlobalReplicationGroup.ReshardingConfigurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data RegionalConfigurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html>
+    RegionalConfigurationProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-replicationgroupid>
+                                   replicationGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-replicationgroupregion>
+                                   replicationGroupRegion :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-reshardingconfigurations>
+                                   reshardingConfigurations :: (Prelude.Maybe [ReshardingConfigurationProperty])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkRegionalConfigurationProperty :: RegionalConfigurationProperty
+mkRegionalConfigurationProperty
+  = RegionalConfigurationProperty
+      {haddock_workaround_ = (), replicationGroupId = Prelude.Nothing,
+       replicationGroupRegion = Prelude.Nothing,
+       reshardingConfigurations = Prelude.Nothing}
+instance ToResourceProperties RegionalConfigurationProperty where
+  toResourceProperties RegionalConfigurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::GlobalReplicationGroup.RegionalConfiguration",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+                            (JSON..=) "ReplicationGroupRegion"
+                              Prelude.<$> replicationGroupRegion,
+                            (JSON..=) "ReshardingConfigurations"
+                              Prelude.<$> reshardingConfigurations])}
+instance JSON.ToJSON RegionalConfigurationProperty where
+  toJSON RegionalConfigurationProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+               (JSON..=) "ReplicationGroupRegion"
+                 Prelude.<$> replicationGroupRegion,
+               (JSON..=) "ReshardingConfigurations"
+                 Prelude.<$> reshardingConfigurations]))
+instance Property "ReplicationGroupId" RegionalConfigurationProperty where
+  type PropertyType "ReplicationGroupId" RegionalConfigurationProperty = Value Prelude.Text
+  set newValue RegionalConfigurationProperty {..}
+    = RegionalConfigurationProperty
+        {replicationGroupId = Prelude.pure newValue, ..}
+instance Property "ReplicationGroupRegion" RegionalConfigurationProperty where
+  type PropertyType "ReplicationGroupRegion" RegionalConfigurationProperty = Value Prelude.Text
+  set newValue RegionalConfigurationProperty {..}
+    = RegionalConfigurationProperty
+        {replicationGroupRegion = Prelude.pure newValue, ..}
+instance Property "ReshardingConfigurations" RegionalConfigurationProperty where
+  type PropertyType "ReshardingConfigurations" RegionalConfigurationProperty = [ReshardingConfigurationProperty]
+  set newValue RegionalConfigurationProperty {..}
+    = RegionalConfigurationProperty
+        {reshardingConfigurations = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs-boot b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/RegionalConfigurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.RegionalConfigurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data RegionalConfigurationProperty :: Prelude.Type
+instance ToResourceProperties RegionalConfigurationProperty
+instance Prelude.Eq RegionalConfigurationProperty
+instance Prelude.Show RegionalConfigurationProperty
+instance JSON.ToJSON RegionalConfigurationProperty
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs
@@ -0,0 +1,51 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.ReshardingConfigurationProperty (
+        ReshardingConfigurationProperty(..),
+        mkReshardingConfigurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ReshardingConfigurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html>
+    ReshardingConfigurationProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html#cfn-elasticache-globalreplicationgroup-reshardingconfiguration-nodegroupid>
+                                     nodeGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html#cfn-elasticache-globalreplicationgroup-reshardingconfiguration-preferredavailabilityzones>
+                                     preferredAvailabilityZones :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkReshardingConfigurationProperty ::
+  ReshardingConfigurationProperty
+mkReshardingConfigurationProperty
+  = ReshardingConfigurationProperty
+      {haddock_workaround_ = (), nodeGroupId = Prelude.Nothing,
+       preferredAvailabilityZones = Prelude.Nothing}
+instance ToResourceProperties ReshardingConfigurationProperty where
+  toResourceProperties ReshardingConfigurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::GlobalReplicationGroup.ReshardingConfiguration",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "NodeGroupId" Prelude.<$> nodeGroupId,
+                            (JSON..=) "PreferredAvailabilityZones"
+                              Prelude.<$> preferredAvailabilityZones])}
+instance JSON.ToJSON ReshardingConfigurationProperty where
+  toJSON ReshardingConfigurationProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "NodeGroupId" Prelude.<$> nodeGroupId,
+               (JSON..=) "PreferredAvailabilityZones"
+                 Prelude.<$> preferredAvailabilityZones]))
+instance Property "NodeGroupId" ReshardingConfigurationProperty where
+  type PropertyType "NodeGroupId" ReshardingConfigurationProperty = Value Prelude.Text
+  set newValue ReshardingConfigurationProperty {..}
+    = ReshardingConfigurationProperty
+        {nodeGroupId = Prelude.pure newValue, ..}
+instance Property "PreferredAvailabilityZones" ReshardingConfigurationProperty where
+  type PropertyType "PreferredAvailabilityZones" ReshardingConfigurationProperty = ValueList Prelude.Text
+  set newValue ReshardingConfigurationProperty {..}
+    = ReshardingConfigurationProperty
+        {preferredAvailabilityZones = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs-boot b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/GlobalReplicationGroup/ReshardingConfigurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.GlobalReplicationGroup.ReshardingConfigurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ReshardingConfigurationProperty :: Prelude.Type
+instance ToResourceProperties ReshardingConfigurationProperty
+instance Prelude.Eq ReshardingConfigurationProperty
+instance Prelude.Show ReshardingConfigurationProperty
+instance JSON.ToJSON ReshardingConfigurationProperty
diff --git a/gen/Stratosphere/ElastiCache/ParameterGroup.hs b/gen/Stratosphere/ElastiCache/ParameterGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ParameterGroup.hs
@@ -0,0 +1,67 @@
+module Stratosphere.ElastiCache.ParameterGroup (
+        ParameterGroup(..), mkParameterGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data ParameterGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-parametergroup.html>
+    ParameterGroup {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-parametergroup.html#cfn-elasticache-parametergroup-cacheparametergroupfamily>
+                    cacheParameterGroupFamily :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-parametergroup.html#cfn-elasticache-parametergroup-description>
+                    description :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-parametergroup.html#cfn-elasticache-parametergroup-properties>
+                    properties :: (Prelude.Maybe (Prelude.Map Prelude.Text (Value Prelude.Text))),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-parametergroup.html#cfn-elasticache-parametergroup-tags>
+                    tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkParameterGroup ::
+  Value Prelude.Text -> Value Prelude.Text -> ParameterGroup
+mkParameterGroup cacheParameterGroupFamily description
+  = ParameterGroup
+      {haddock_workaround_ = (),
+       cacheParameterGroupFamily = cacheParameterGroupFamily,
+       description = description, properties = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties ParameterGroup where
+  toResourceProperties ParameterGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ParameterGroup",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["CacheParameterGroupFamily" JSON..= cacheParameterGroupFamily,
+                            "Description" JSON..= description]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Properties" Prelude.<$> properties,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON ParameterGroup where
+  toJSON ParameterGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["CacheParameterGroupFamily" JSON..= cacheParameterGroupFamily,
+               "Description" JSON..= description]
+              (Prelude.catMaybes
+                 [(JSON..=) "Properties" Prelude.<$> properties,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "CacheParameterGroupFamily" ParameterGroup where
+  type PropertyType "CacheParameterGroupFamily" ParameterGroup = Value Prelude.Text
+  set newValue ParameterGroup {..}
+    = ParameterGroup {cacheParameterGroupFamily = newValue, ..}
+instance Property "Description" ParameterGroup where
+  type PropertyType "Description" ParameterGroup = Value Prelude.Text
+  set newValue ParameterGroup {..}
+    = ParameterGroup {description = newValue, ..}
+instance Property "Properties" ParameterGroup where
+  type PropertyType "Properties" ParameterGroup = Prelude.Map Prelude.Text (Value Prelude.Text)
+  set newValue ParameterGroup {..}
+    = ParameterGroup {properties = Prelude.pure newValue, ..}
+instance Property "Tags" ParameterGroup where
+  type PropertyType "Tags" ParameterGroup = [Tag]
+  set newValue ParameterGroup {..}
+    = ParameterGroup {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup.hs
@@ -0,0 +1,423 @@
+module Stratosphere.ElastiCache.ReplicationGroup (
+        module Exports, ReplicationGroup(..), mkReplicationGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.ReplicationGroup.LogDeliveryConfigurationRequestProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.ReplicationGroup.NodeGroupConfigurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data ReplicationGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html>
+    ReplicationGroup {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-atrestencryptionenabled>
+                      atRestEncryptionEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-authtoken>
+                      authToken :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-autominorversionupgrade>
+                      autoMinorVersionUpgrade :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-automaticfailoverenabled>
+                      automaticFailoverEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachenodetype>
+                      cacheNodeType :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cacheparametergroupname>
+                      cacheParameterGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachesecuritygroupnames>
+                      cacheSecurityGroupNames :: (Prelude.Maybe (ValueList Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachesubnetgroupname>
+                      cacheSubnetGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-clustermode>
+                      clusterMode :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-datatieringenabled>
+                      dataTieringEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-engine>
+                      engine :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-engineversion>
+                      engineVersion :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-globalreplicationgroupid>
+                      globalReplicationGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-ipdiscovery>
+                      ipDiscovery :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-kmskeyid>
+                      kmsKeyId :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-logdeliveryconfigurations>
+                      logDeliveryConfigurations :: (Prelude.Maybe [LogDeliveryConfigurationRequestProperty]),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-multiazenabled>
+                      multiAZEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-networktype>
+                      networkType :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-nodegroupconfiguration>
+                      nodeGroupConfiguration :: (Prelude.Maybe [NodeGroupConfigurationProperty]),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-notificationtopicarn>
+                      notificationTopicArn :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-numcacheclusters>
+                      numCacheClusters :: (Prelude.Maybe (Value Prelude.Integer)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-numnodegroups>
+                      numNodeGroups :: (Prelude.Maybe (Value Prelude.Integer)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-port>
+                      port :: (Prelude.Maybe (Value Prelude.Integer)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-preferredcacheclusterazs>
+                      preferredCacheClusterAZs :: (Prelude.Maybe (ValueList Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-preferredmaintenancewindow>
+                      preferredMaintenanceWindow :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-primaryclusterid>
+                      primaryClusterId :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicaspernodegroup>
+                      replicasPerNodeGroup :: (Prelude.Maybe (Value Prelude.Integer)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicationgroupdescription>
+                      replicationGroupDescription :: (Value Prelude.Text),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicationgroupid>
+                      replicationGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-securitygroupids>
+                      securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotarns>
+                      snapshotArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotname>
+                      snapshotName :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotretentionlimit>
+                      snapshotRetentionLimit :: (Prelude.Maybe (Value Prelude.Integer)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotwindow>
+                      snapshotWindow :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshottingclusterid>
+                      snapshottingClusterId :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-tags>
+                      tags :: (Prelude.Maybe [Tag]),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-transitencryptionenabled>
+                      transitEncryptionEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-transitencryptionmode>
+                      transitEncryptionMode :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-usergroupids>
+                      userGroupIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkReplicationGroup :: Value Prelude.Text -> ReplicationGroup
+mkReplicationGroup replicationGroupDescription
+  = ReplicationGroup
+      {haddock_workaround_ = (),
+       replicationGroupDescription = replicationGroupDescription,
+       atRestEncryptionEnabled = Prelude.Nothing,
+       authToken = Prelude.Nothing,
+       autoMinorVersionUpgrade = Prelude.Nothing,
+       automaticFailoverEnabled = Prelude.Nothing,
+       cacheNodeType = Prelude.Nothing,
+       cacheParameterGroupName = Prelude.Nothing,
+       cacheSecurityGroupNames = Prelude.Nothing,
+       cacheSubnetGroupName = Prelude.Nothing,
+       clusterMode = Prelude.Nothing,
+       dataTieringEnabled = Prelude.Nothing, engine = Prelude.Nothing,
+       engineVersion = Prelude.Nothing,
+       globalReplicationGroupId = Prelude.Nothing,
+       ipDiscovery = Prelude.Nothing, kmsKeyId = Prelude.Nothing,
+       logDeliveryConfigurations = Prelude.Nothing,
+       multiAZEnabled = Prelude.Nothing, networkType = Prelude.Nothing,
+       nodeGroupConfiguration = Prelude.Nothing,
+       notificationTopicArn = Prelude.Nothing,
+       numCacheClusters = Prelude.Nothing,
+       numNodeGroups = Prelude.Nothing, port = Prelude.Nothing,
+       preferredCacheClusterAZs = Prelude.Nothing,
+       preferredMaintenanceWindow = Prelude.Nothing,
+       primaryClusterId = Prelude.Nothing,
+       replicasPerNodeGroup = Prelude.Nothing,
+       replicationGroupId = Prelude.Nothing,
+       securityGroupIds = Prelude.Nothing, snapshotArns = Prelude.Nothing,
+       snapshotName = Prelude.Nothing,
+       snapshotRetentionLimit = Prelude.Nothing,
+       snapshotWindow = Prelude.Nothing,
+       snapshottingClusterId = Prelude.Nothing, tags = Prelude.Nothing,
+       transitEncryptionEnabled = Prelude.Nothing,
+       transitEncryptionMode = Prelude.Nothing,
+       userGroupIds = Prelude.Nothing}
+instance ToResourceProperties ReplicationGroup where
+  toResourceProperties ReplicationGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ReplicationGroupDescription" JSON..= replicationGroupDescription]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AtRestEncryptionEnabled"
+                                 Prelude.<$> atRestEncryptionEnabled,
+                               (JSON..=) "AuthToken" Prelude.<$> authToken,
+                               (JSON..=) "AutoMinorVersionUpgrade"
+                                 Prelude.<$> autoMinorVersionUpgrade,
+                               (JSON..=) "AutomaticFailoverEnabled"
+                                 Prelude.<$> automaticFailoverEnabled,
+                               (JSON..=) "CacheNodeType" Prelude.<$> cacheNodeType,
+                               (JSON..=) "CacheParameterGroupName"
+                                 Prelude.<$> cacheParameterGroupName,
+                               (JSON..=) "CacheSecurityGroupNames"
+                                 Prelude.<$> cacheSecurityGroupNames,
+                               (JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                               (JSON..=) "ClusterMode" Prelude.<$> clusterMode,
+                               (JSON..=) "DataTieringEnabled" Prelude.<$> dataTieringEnabled,
+                               (JSON..=) "Engine" Prelude.<$> engine,
+                               (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                               (JSON..=) "GlobalReplicationGroupId"
+                                 Prelude.<$> globalReplicationGroupId,
+                               (JSON..=) "IpDiscovery" Prelude.<$> ipDiscovery,
+                               (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId,
+                               (JSON..=) "LogDeliveryConfigurations"
+                                 Prelude.<$> logDeliveryConfigurations,
+                               (JSON..=) "MultiAZEnabled" Prelude.<$> multiAZEnabled,
+                               (JSON..=) "NetworkType" Prelude.<$> networkType,
+                               (JSON..=) "NodeGroupConfiguration"
+                                 Prelude.<$> nodeGroupConfiguration,
+                               (JSON..=) "NotificationTopicArn" Prelude.<$> notificationTopicArn,
+                               (JSON..=) "NumCacheClusters" Prelude.<$> numCacheClusters,
+                               (JSON..=) "NumNodeGroups" Prelude.<$> numNodeGroups,
+                               (JSON..=) "Port" Prelude.<$> port,
+                               (JSON..=) "PreferredCacheClusterAZs"
+                                 Prelude.<$> preferredCacheClusterAZs,
+                               (JSON..=) "PreferredMaintenanceWindow"
+                                 Prelude.<$> preferredMaintenanceWindow,
+                               (JSON..=) "PrimaryClusterId" Prelude.<$> primaryClusterId,
+                               (JSON..=) "ReplicasPerNodeGroup" Prelude.<$> replicasPerNodeGroup,
+                               (JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+                               (JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                               (JSON..=) "SnapshotArns" Prelude.<$> snapshotArns,
+                               (JSON..=) "SnapshotName" Prelude.<$> snapshotName,
+                               (JSON..=) "SnapshotRetentionLimit"
+                                 Prelude.<$> snapshotRetentionLimit,
+                               (JSON..=) "SnapshotWindow" Prelude.<$> snapshotWindow,
+                               (JSON..=) "SnapshottingClusterId"
+                                 Prelude.<$> snapshottingClusterId,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "TransitEncryptionEnabled"
+                                 Prelude.<$> transitEncryptionEnabled,
+                               (JSON..=) "TransitEncryptionMode"
+                                 Prelude.<$> transitEncryptionMode,
+                               (JSON..=) "UserGroupIds" Prelude.<$> userGroupIds]))}
+instance JSON.ToJSON ReplicationGroup where
+  toJSON ReplicationGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ReplicationGroupDescription" JSON..= replicationGroupDescription]
+              (Prelude.catMaybes
+                 [(JSON..=) "AtRestEncryptionEnabled"
+                    Prelude.<$> atRestEncryptionEnabled,
+                  (JSON..=) "AuthToken" Prelude.<$> authToken,
+                  (JSON..=) "AutoMinorVersionUpgrade"
+                    Prelude.<$> autoMinorVersionUpgrade,
+                  (JSON..=) "AutomaticFailoverEnabled"
+                    Prelude.<$> automaticFailoverEnabled,
+                  (JSON..=) "CacheNodeType" Prelude.<$> cacheNodeType,
+                  (JSON..=) "CacheParameterGroupName"
+                    Prelude.<$> cacheParameterGroupName,
+                  (JSON..=) "CacheSecurityGroupNames"
+                    Prelude.<$> cacheSecurityGroupNames,
+                  (JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                  (JSON..=) "ClusterMode" Prelude.<$> clusterMode,
+                  (JSON..=) "DataTieringEnabled" Prelude.<$> dataTieringEnabled,
+                  (JSON..=) "Engine" Prelude.<$> engine,
+                  (JSON..=) "EngineVersion" Prelude.<$> engineVersion,
+                  (JSON..=) "GlobalReplicationGroupId"
+                    Prelude.<$> globalReplicationGroupId,
+                  (JSON..=) "IpDiscovery" Prelude.<$> ipDiscovery,
+                  (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId,
+                  (JSON..=) "LogDeliveryConfigurations"
+                    Prelude.<$> logDeliveryConfigurations,
+                  (JSON..=) "MultiAZEnabled" Prelude.<$> multiAZEnabled,
+                  (JSON..=) "NetworkType" Prelude.<$> networkType,
+                  (JSON..=) "NodeGroupConfiguration"
+                    Prelude.<$> nodeGroupConfiguration,
+                  (JSON..=) "NotificationTopicArn" Prelude.<$> notificationTopicArn,
+                  (JSON..=) "NumCacheClusters" Prelude.<$> numCacheClusters,
+                  (JSON..=) "NumNodeGroups" Prelude.<$> numNodeGroups,
+                  (JSON..=) "Port" Prelude.<$> port,
+                  (JSON..=) "PreferredCacheClusterAZs"
+                    Prelude.<$> preferredCacheClusterAZs,
+                  (JSON..=) "PreferredMaintenanceWindow"
+                    Prelude.<$> preferredMaintenanceWindow,
+                  (JSON..=) "PrimaryClusterId" Prelude.<$> primaryClusterId,
+                  (JSON..=) "ReplicasPerNodeGroup" Prelude.<$> replicasPerNodeGroup,
+                  (JSON..=) "ReplicationGroupId" Prelude.<$> replicationGroupId,
+                  (JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                  (JSON..=) "SnapshotArns" Prelude.<$> snapshotArns,
+                  (JSON..=) "SnapshotName" Prelude.<$> snapshotName,
+                  (JSON..=) "SnapshotRetentionLimit"
+                    Prelude.<$> snapshotRetentionLimit,
+                  (JSON..=) "SnapshotWindow" Prelude.<$> snapshotWindow,
+                  (JSON..=) "SnapshottingClusterId"
+                    Prelude.<$> snapshottingClusterId,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "TransitEncryptionEnabled"
+                    Prelude.<$> transitEncryptionEnabled,
+                  (JSON..=) "TransitEncryptionMode"
+                    Prelude.<$> transitEncryptionMode,
+                  (JSON..=) "UserGroupIds" Prelude.<$> userGroupIds])))
+instance Property "AtRestEncryptionEnabled" ReplicationGroup where
+  type PropertyType "AtRestEncryptionEnabled" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {atRestEncryptionEnabled = Prelude.pure newValue, ..}
+instance Property "AuthToken" ReplicationGroup where
+  type PropertyType "AuthToken" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {authToken = Prelude.pure newValue, ..}
+instance Property "AutoMinorVersionUpgrade" ReplicationGroup where
+  type PropertyType "AutoMinorVersionUpgrade" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {autoMinorVersionUpgrade = Prelude.pure newValue, ..}
+instance Property "AutomaticFailoverEnabled" ReplicationGroup where
+  type PropertyType "AutomaticFailoverEnabled" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {automaticFailoverEnabled = Prelude.pure newValue, ..}
+instance Property "CacheNodeType" ReplicationGroup where
+  type PropertyType "CacheNodeType" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {cacheNodeType = Prelude.pure newValue, ..}
+instance Property "CacheParameterGroupName" ReplicationGroup where
+  type PropertyType "CacheParameterGroupName" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {cacheParameterGroupName = Prelude.pure newValue, ..}
+instance Property "CacheSecurityGroupNames" ReplicationGroup where
+  type PropertyType "CacheSecurityGroupNames" ReplicationGroup = ValueList Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {cacheSecurityGroupNames = Prelude.pure newValue, ..}
+instance Property "CacheSubnetGroupName" ReplicationGroup where
+  type PropertyType "CacheSubnetGroupName" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {cacheSubnetGroupName = Prelude.pure newValue, ..}
+instance Property "ClusterMode" ReplicationGroup where
+  type PropertyType "ClusterMode" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {clusterMode = Prelude.pure newValue, ..}
+instance Property "DataTieringEnabled" ReplicationGroup where
+  type PropertyType "DataTieringEnabled" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {dataTieringEnabled = Prelude.pure newValue, ..}
+instance Property "Engine" ReplicationGroup where
+  type PropertyType "Engine" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {engine = Prelude.pure newValue, ..}
+instance Property "EngineVersion" ReplicationGroup where
+  type PropertyType "EngineVersion" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {engineVersion = Prelude.pure newValue, ..}
+instance Property "GlobalReplicationGroupId" ReplicationGroup where
+  type PropertyType "GlobalReplicationGroupId" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {globalReplicationGroupId = Prelude.pure newValue, ..}
+instance Property "IpDiscovery" ReplicationGroup where
+  type PropertyType "IpDiscovery" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {ipDiscovery = Prelude.pure newValue, ..}
+instance Property "KmsKeyId" ReplicationGroup where
+  type PropertyType "KmsKeyId" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {kmsKeyId = Prelude.pure newValue, ..}
+instance Property "LogDeliveryConfigurations" ReplicationGroup where
+  type PropertyType "LogDeliveryConfigurations" ReplicationGroup = [LogDeliveryConfigurationRequestProperty]
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {logDeliveryConfigurations = Prelude.pure newValue, ..}
+instance Property "MultiAZEnabled" ReplicationGroup where
+  type PropertyType "MultiAZEnabled" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {multiAZEnabled = Prelude.pure newValue, ..}
+instance Property "NetworkType" ReplicationGroup where
+  type PropertyType "NetworkType" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {networkType = Prelude.pure newValue, ..}
+instance Property "NodeGroupConfiguration" ReplicationGroup where
+  type PropertyType "NodeGroupConfiguration" ReplicationGroup = [NodeGroupConfigurationProperty]
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {nodeGroupConfiguration = Prelude.pure newValue, ..}
+instance Property "NotificationTopicArn" ReplicationGroup where
+  type PropertyType "NotificationTopicArn" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {notificationTopicArn = Prelude.pure newValue, ..}
+instance Property "NumCacheClusters" ReplicationGroup where
+  type PropertyType "NumCacheClusters" ReplicationGroup = Value Prelude.Integer
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {numCacheClusters = Prelude.pure newValue, ..}
+instance Property "NumNodeGroups" ReplicationGroup where
+  type PropertyType "NumNodeGroups" ReplicationGroup = Value Prelude.Integer
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {numNodeGroups = Prelude.pure newValue, ..}
+instance Property "Port" ReplicationGroup where
+  type PropertyType "Port" ReplicationGroup = Value Prelude.Integer
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {port = Prelude.pure newValue, ..}
+instance Property "PreferredCacheClusterAZs" ReplicationGroup where
+  type PropertyType "PreferredCacheClusterAZs" ReplicationGroup = ValueList Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {preferredCacheClusterAZs = Prelude.pure newValue, ..}
+instance Property "PreferredMaintenanceWindow" ReplicationGroup where
+  type PropertyType "PreferredMaintenanceWindow" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {preferredMaintenanceWindow = Prelude.pure newValue, ..}
+instance Property "PrimaryClusterId" ReplicationGroup where
+  type PropertyType "PrimaryClusterId" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {primaryClusterId = Prelude.pure newValue, ..}
+instance Property "ReplicasPerNodeGroup" ReplicationGroup where
+  type PropertyType "ReplicasPerNodeGroup" ReplicationGroup = Value Prelude.Integer
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {replicasPerNodeGroup = Prelude.pure newValue, ..}
+instance Property "ReplicationGroupDescription" ReplicationGroup where
+  type PropertyType "ReplicationGroupDescription" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {replicationGroupDescription = newValue, ..}
+instance Property "ReplicationGroupId" ReplicationGroup where
+  type PropertyType "ReplicationGroupId" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {replicationGroupId = Prelude.pure newValue, ..}
+instance Property "SecurityGroupIds" ReplicationGroup where
+  type PropertyType "SecurityGroupIds" ReplicationGroup = ValueList Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "SnapshotArns" ReplicationGroup where
+  type PropertyType "SnapshotArns" ReplicationGroup = ValueList Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {snapshotArns = Prelude.pure newValue, ..}
+instance Property "SnapshotName" ReplicationGroup where
+  type PropertyType "SnapshotName" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {snapshotName = Prelude.pure newValue, ..}
+instance Property "SnapshotRetentionLimit" ReplicationGroup where
+  type PropertyType "SnapshotRetentionLimit" ReplicationGroup = Value Prelude.Integer
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {snapshotRetentionLimit = Prelude.pure newValue, ..}
+instance Property "SnapshotWindow" ReplicationGroup where
+  type PropertyType "SnapshotWindow" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {snapshotWindow = Prelude.pure newValue, ..}
+instance Property "SnapshottingClusterId" ReplicationGroup where
+  type PropertyType "SnapshottingClusterId" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {snapshottingClusterId = Prelude.pure newValue, ..}
+instance Property "Tags" ReplicationGroup where
+  type PropertyType "Tags" ReplicationGroup = [Tag]
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {tags = Prelude.pure newValue, ..}
+instance Property "TransitEncryptionEnabled" ReplicationGroup where
+  type PropertyType "TransitEncryptionEnabled" ReplicationGroup = Value Prelude.Bool
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {transitEncryptionEnabled = Prelude.pure newValue, ..}
+instance Property "TransitEncryptionMode" ReplicationGroup where
+  type PropertyType "TransitEncryptionMode" ReplicationGroup = Value Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup
+        {transitEncryptionMode = Prelude.pure newValue, ..}
+instance Property "UserGroupIds" ReplicationGroup where
+  type PropertyType "UserGroupIds" ReplicationGroup = ValueList Prelude.Text
+  set newValue ReplicationGroup {..}
+    = ReplicationGroup {userGroupIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.ElastiCache.ReplicationGroup.CloudWatchLogsDestinationDetailsProperty (
+        CloudWatchLogsDestinationDetailsProperty(..),
+        mkCloudWatchLogsDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CloudWatchLogsDestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-cloudwatchlogsdestinationdetails.html>
+    CloudWatchLogsDestinationDetailsProperty {haddock_workaround_ :: (),
+                                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-cloudwatchlogsdestinationdetails.html#cfn-elasticache-replicationgroup-cloudwatchlogsdestinationdetails-loggroup>
+                                              logGroup :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCloudWatchLogsDestinationDetailsProperty ::
+  Value Prelude.Text -> CloudWatchLogsDestinationDetailsProperty
+mkCloudWatchLogsDestinationDetailsProperty logGroup
+  = CloudWatchLogsDestinationDetailsProperty
+      {haddock_workaround_ = (), logGroup = logGroup}
+instance ToResourceProperties CloudWatchLogsDestinationDetailsProperty where
+  toResourceProperties CloudWatchLogsDestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup.CloudWatchLogsDestinationDetails",
+         supportsTags = Prelude.False,
+         properties = ["LogGroup" JSON..= logGroup]}
+instance JSON.ToJSON CloudWatchLogsDestinationDetailsProperty where
+  toJSON CloudWatchLogsDestinationDetailsProperty {..}
+    = JSON.object ["LogGroup" JSON..= logGroup]
+instance Property "LogGroup" CloudWatchLogsDestinationDetailsProperty where
+  type PropertyType "LogGroup" CloudWatchLogsDestinationDetailsProperty = Value Prelude.Text
+  set newValue CloudWatchLogsDestinationDetailsProperty {..}
+    = CloudWatchLogsDestinationDetailsProperty
+        {logGroup = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/CloudWatchLogsDestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ReplicationGroup.CloudWatchLogsDestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CloudWatchLogsDestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties CloudWatchLogsDestinationDetailsProperty
+instance Prelude.Eq CloudWatchLogsDestinationDetailsProperty
+instance Prelude.Show CloudWatchLogsDestinationDetailsProperty
+instance JSON.ToJSON CloudWatchLogsDestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs
@@ -0,0 +1,53 @@
+module Stratosphere.ElastiCache.ReplicationGroup.DestinationDetailsProperty (
+        module Exports, DestinationDetailsProperty(..),
+        mkDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.ReplicationGroup.CloudWatchLogsDestinationDetailsProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.ReplicationGroup.KinesisFirehoseDestinationDetailsProperty as Exports
+import Stratosphere.ResourceProperties
+data DestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html>
+    DestinationDetailsProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html#cfn-elasticache-replicationgroup-destinationdetails-cloudwatchlogsdetails>
+                                cloudWatchLogsDetails :: (Prelude.Maybe CloudWatchLogsDestinationDetailsProperty),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html#cfn-elasticache-replicationgroup-destinationdetails-kinesisfirehosedetails>
+                                kinesisFirehoseDetails :: (Prelude.Maybe KinesisFirehoseDestinationDetailsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDestinationDetailsProperty :: DestinationDetailsProperty
+mkDestinationDetailsProperty
+  = DestinationDetailsProperty
+      {haddock_workaround_ = (), cloudWatchLogsDetails = Prelude.Nothing,
+       kinesisFirehoseDetails = Prelude.Nothing}
+instance ToResourceProperties DestinationDetailsProperty where
+  toResourceProperties DestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup.DestinationDetails",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "CloudWatchLogsDetails"
+                              Prelude.<$> cloudWatchLogsDetails,
+                            (JSON..=) "KinesisFirehoseDetails"
+                              Prelude.<$> kinesisFirehoseDetails])}
+instance JSON.ToJSON DestinationDetailsProperty where
+  toJSON DestinationDetailsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "CloudWatchLogsDetails"
+                 Prelude.<$> cloudWatchLogsDetails,
+               (JSON..=) "KinesisFirehoseDetails"
+                 Prelude.<$> kinesisFirehoseDetails]))
+instance Property "CloudWatchLogsDetails" DestinationDetailsProperty where
+  type PropertyType "CloudWatchLogsDetails" DestinationDetailsProperty = CloudWatchLogsDestinationDetailsProperty
+  set newValue DestinationDetailsProperty {..}
+    = DestinationDetailsProperty
+        {cloudWatchLogsDetails = Prelude.pure newValue, ..}
+instance Property "KinesisFirehoseDetails" DestinationDetailsProperty where
+  type PropertyType "KinesisFirehoseDetails" DestinationDetailsProperty = KinesisFirehoseDestinationDetailsProperty
+  set newValue DestinationDetailsProperty {..}
+    = DestinationDetailsProperty
+        {kinesisFirehoseDetails = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/DestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ReplicationGroup.DestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties DestinationDetailsProperty
+instance Prelude.Eq DestinationDetailsProperty
+instance Prelude.Show DestinationDetailsProperty
+instance JSON.ToJSON DestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.ElastiCache.ReplicationGroup.KinesisFirehoseDestinationDetailsProperty (
+        KinesisFirehoseDestinationDetailsProperty(..),
+        mkKinesisFirehoseDestinationDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data KinesisFirehoseDestinationDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-kinesisfirehosedestinationdetails.html>
+    KinesisFirehoseDestinationDetailsProperty {haddock_workaround_ :: (),
+                                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-kinesisfirehosedestinationdetails.html#cfn-elasticache-replicationgroup-kinesisfirehosedestinationdetails-deliverystream>
+                                               deliveryStream :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkKinesisFirehoseDestinationDetailsProperty ::
+  Value Prelude.Text -> KinesisFirehoseDestinationDetailsProperty
+mkKinesisFirehoseDestinationDetailsProperty deliveryStream
+  = KinesisFirehoseDestinationDetailsProperty
+      {haddock_workaround_ = (), deliveryStream = deliveryStream}
+instance ToResourceProperties KinesisFirehoseDestinationDetailsProperty where
+  toResourceProperties KinesisFirehoseDestinationDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup.KinesisFirehoseDestinationDetails",
+         supportsTags = Prelude.False,
+         properties = ["DeliveryStream" JSON..= deliveryStream]}
+instance JSON.ToJSON KinesisFirehoseDestinationDetailsProperty where
+  toJSON KinesisFirehoseDestinationDetailsProperty {..}
+    = JSON.object ["DeliveryStream" JSON..= deliveryStream]
+instance Property "DeliveryStream" KinesisFirehoseDestinationDetailsProperty where
+  type PropertyType "DeliveryStream" KinesisFirehoseDestinationDetailsProperty = Value Prelude.Text
+  set newValue KinesisFirehoseDestinationDetailsProperty {..}
+    = KinesisFirehoseDestinationDetailsProperty
+        {deliveryStream = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs-boot b/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/KinesisFirehoseDestinationDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ReplicationGroup.KinesisFirehoseDestinationDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data KinesisFirehoseDestinationDetailsProperty :: Prelude.Type
+instance ToResourceProperties KinesisFirehoseDestinationDetailsProperty
+instance Prelude.Eq KinesisFirehoseDestinationDetailsProperty
+instance Prelude.Show KinesisFirehoseDestinationDetailsProperty
+instance JSON.ToJSON KinesisFirehoseDestinationDetailsProperty
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs
@@ -0,0 +1,69 @@
+module Stratosphere.ElastiCache.ReplicationGroup.LogDeliveryConfigurationRequestProperty (
+        module Exports, LogDeliveryConfigurationRequestProperty(..),
+        mkLogDeliveryConfigurationRequestProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.ReplicationGroup.DestinationDetailsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data LogDeliveryConfigurationRequestProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html>
+    LogDeliveryConfigurationRequestProperty {haddock_workaround_ :: (),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-destinationdetails>
+                                             destinationDetails :: DestinationDetailsProperty,
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-destinationtype>
+                                             destinationType :: (Value Prelude.Text),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logformat>
+                                             logFormat :: (Value Prelude.Text),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logtype>
+                                             logType :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLogDeliveryConfigurationRequestProperty ::
+  DestinationDetailsProperty
+  -> Value Prelude.Text
+     -> Value Prelude.Text
+        -> Value Prelude.Text -> LogDeliveryConfigurationRequestProperty
+mkLogDeliveryConfigurationRequestProperty
+  destinationDetails
+  destinationType
+  logFormat
+  logType
+  = LogDeliveryConfigurationRequestProperty
+      {haddock_workaround_ = (), destinationDetails = destinationDetails,
+       destinationType = destinationType, logFormat = logFormat,
+       logType = logType}
+instance ToResourceProperties LogDeliveryConfigurationRequestProperty where
+  toResourceProperties LogDeliveryConfigurationRequestProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup.LogDeliveryConfigurationRequest",
+         supportsTags = Prelude.False,
+         properties = ["DestinationDetails" JSON..= destinationDetails,
+                       "DestinationType" JSON..= destinationType,
+                       "LogFormat" JSON..= logFormat, "LogType" JSON..= logType]}
+instance JSON.ToJSON LogDeliveryConfigurationRequestProperty where
+  toJSON LogDeliveryConfigurationRequestProperty {..}
+    = JSON.object
+        ["DestinationDetails" JSON..= destinationDetails,
+         "DestinationType" JSON..= destinationType,
+         "LogFormat" JSON..= logFormat, "LogType" JSON..= logType]
+instance Property "DestinationDetails" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "DestinationDetails" LogDeliveryConfigurationRequestProperty = DestinationDetailsProperty
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {destinationDetails = newValue, ..}
+instance Property "DestinationType" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "DestinationType" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {destinationType = newValue, ..}
+instance Property "LogFormat" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "LogFormat" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty
+        {logFormat = newValue, ..}
+instance Property "LogType" LogDeliveryConfigurationRequestProperty where
+  type PropertyType "LogType" LogDeliveryConfigurationRequestProperty = Value Prelude.Text
+  set newValue LogDeliveryConfigurationRequestProperty {..}
+    = LogDeliveryConfigurationRequestProperty {logType = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs-boot b/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/LogDeliveryConfigurationRequestProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ReplicationGroup.LogDeliveryConfigurationRequestProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LogDeliveryConfigurationRequestProperty :: Prelude.Type
+instance ToResourceProperties LogDeliveryConfigurationRequestProperty
+instance Prelude.Eq LogDeliveryConfigurationRequestProperty
+instance Prelude.Show LogDeliveryConfigurationRequestProperty
+instance JSON.ToJSON LogDeliveryConfigurationRequestProperty
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs b/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs
@@ -0,0 +1,81 @@
+module Stratosphere.ElastiCache.ReplicationGroup.NodeGroupConfigurationProperty (
+        NodeGroupConfigurationProperty(..),
+        mkNodeGroupConfigurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data NodeGroupConfigurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html>
+    NodeGroupConfigurationProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-nodegroupid>
+                                    nodeGroupId :: (Prelude.Maybe (Value Prelude.Text)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-primaryavailabilityzone>
+                                    primaryAvailabilityZone :: (Prelude.Maybe (Value Prelude.Text)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-replicaavailabilityzones>
+                                    replicaAvailabilityZones :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-replicacount>
+                                    replicaCount :: (Prelude.Maybe (Value Prelude.Integer)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-slots>
+                                    slots :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkNodeGroupConfigurationProperty :: NodeGroupConfigurationProperty
+mkNodeGroupConfigurationProperty
+  = NodeGroupConfigurationProperty
+      {haddock_workaround_ = (), nodeGroupId = Prelude.Nothing,
+       primaryAvailabilityZone = Prelude.Nothing,
+       replicaAvailabilityZones = Prelude.Nothing,
+       replicaCount = Prelude.Nothing, slots = Prelude.Nothing}
+instance ToResourceProperties NodeGroupConfigurationProperty where
+  toResourceProperties NodeGroupConfigurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ReplicationGroup.NodeGroupConfiguration",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "NodeGroupId" Prelude.<$> nodeGroupId,
+                            (JSON..=) "PrimaryAvailabilityZone"
+                              Prelude.<$> primaryAvailabilityZone,
+                            (JSON..=) "ReplicaAvailabilityZones"
+                              Prelude.<$> replicaAvailabilityZones,
+                            (JSON..=) "ReplicaCount" Prelude.<$> replicaCount,
+                            (JSON..=) "Slots" Prelude.<$> slots])}
+instance JSON.ToJSON NodeGroupConfigurationProperty where
+  toJSON NodeGroupConfigurationProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "NodeGroupId" Prelude.<$> nodeGroupId,
+               (JSON..=) "PrimaryAvailabilityZone"
+                 Prelude.<$> primaryAvailabilityZone,
+               (JSON..=) "ReplicaAvailabilityZones"
+                 Prelude.<$> replicaAvailabilityZones,
+               (JSON..=) "ReplicaCount" Prelude.<$> replicaCount,
+               (JSON..=) "Slots" Prelude.<$> slots]))
+instance Property "NodeGroupId" NodeGroupConfigurationProperty where
+  type PropertyType "NodeGroupId" NodeGroupConfigurationProperty = Value Prelude.Text
+  set newValue NodeGroupConfigurationProperty {..}
+    = NodeGroupConfigurationProperty
+        {nodeGroupId = Prelude.pure newValue, ..}
+instance Property "PrimaryAvailabilityZone" NodeGroupConfigurationProperty where
+  type PropertyType "PrimaryAvailabilityZone" NodeGroupConfigurationProperty = Value Prelude.Text
+  set newValue NodeGroupConfigurationProperty {..}
+    = NodeGroupConfigurationProperty
+        {primaryAvailabilityZone = Prelude.pure newValue, ..}
+instance Property "ReplicaAvailabilityZones" NodeGroupConfigurationProperty where
+  type PropertyType "ReplicaAvailabilityZones" NodeGroupConfigurationProperty = ValueList Prelude.Text
+  set newValue NodeGroupConfigurationProperty {..}
+    = NodeGroupConfigurationProperty
+        {replicaAvailabilityZones = Prelude.pure newValue, ..}
+instance Property "ReplicaCount" NodeGroupConfigurationProperty where
+  type PropertyType "ReplicaCount" NodeGroupConfigurationProperty = Value Prelude.Integer
+  set newValue NodeGroupConfigurationProperty {..}
+    = NodeGroupConfigurationProperty
+        {replicaCount = Prelude.pure newValue, ..}
+instance Property "Slots" NodeGroupConfigurationProperty where
+  type PropertyType "Slots" NodeGroupConfigurationProperty = Value Prelude.Text
+  set newValue NodeGroupConfigurationProperty {..}
+    = NodeGroupConfigurationProperty
+        {slots = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs-boot b/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ReplicationGroup/NodeGroupConfigurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ReplicationGroup.NodeGroupConfigurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data NodeGroupConfigurationProperty :: Prelude.Type
+instance ToResourceProperties NodeGroupConfigurationProperty
+instance Prelude.Eq NodeGroupConfigurationProperty
+instance Prelude.Show NodeGroupConfigurationProperty
+instance JSON.ToJSON NodeGroupConfigurationProperty
diff --git a/gen/Stratosphere/ElastiCache/SecurityGroup.hs b/gen/Stratosphere/ElastiCache/SecurityGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/SecurityGroup.hs
@@ -0,0 +1,46 @@
+module Stratosphere.ElastiCache.SecurityGroup (
+        SecurityGroup(..), mkSecurityGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data SecurityGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html>
+    SecurityGroup {haddock_workaround_ :: (),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html#cfn-elasticache-securitygroup-description>
+                   description :: (Value Prelude.Text),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html#cfn-elasticache-securitygroup-tags>
+                   tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSecurityGroup :: Value Prelude.Text -> SecurityGroup
+mkSecurityGroup description
+  = SecurityGroup
+      {haddock_workaround_ = (), description = description,
+       tags = Prelude.Nothing}
+instance ToResourceProperties SecurityGroup where
+  toResourceProperties SecurityGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::SecurityGroup",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Description" JSON..= description]
+                           (Prelude.catMaybes [(JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON SecurityGroup where
+  toJSON SecurityGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Description" JSON..= description]
+              (Prelude.catMaybes [(JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "Description" SecurityGroup where
+  type PropertyType "Description" SecurityGroup = Value Prelude.Text
+  set newValue SecurityGroup {..}
+    = SecurityGroup {description = newValue, ..}
+instance Property "Tags" SecurityGroup where
+  type PropertyType "Tags" SecurityGroup = [Tag]
+  set newValue SecurityGroup {..}
+    = SecurityGroup {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/SecurityGroupIngress.hs b/gen/Stratosphere/ElastiCache/SecurityGroupIngress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/SecurityGroupIngress.hs
@@ -0,0 +1,61 @@
+module Stratosphere.ElastiCache.SecurityGroupIngress (
+        SecurityGroupIngress(..), mkSecurityGroupIngress
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data SecurityGroupIngress
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html>
+    SecurityGroupIngress {haddock_workaround_ :: (),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-cachesecuritygroupname>
+                          cacheSecurityGroupName :: (Value Prelude.Text),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-ec2securitygroupname>
+                          eC2SecurityGroupName :: (Value Prelude.Text),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-ec2securitygroupownerid>
+                          eC2SecurityGroupOwnerId :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSecurityGroupIngress ::
+  Value Prelude.Text -> Value Prelude.Text -> SecurityGroupIngress
+mkSecurityGroupIngress cacheSecurityGroupName eC2SecurityGroupName
+  = SecurityGroupIngress
+      {haddock_workaround_ = (),
+       cacheSecurityGroupName = cacheSecurityGroupName,
+       eC2SecurityGroupName = eC2SecurityGroupName,
+       eC2SecurityGroupOwnerId = Prelude.Nothing}
+instance ToResourceProperties SecurityGroupIngress where
+  toResourceProperties SecurityGroupIngress {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::SecurityGroupIngress",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["CacheSecurityGroupName" JSON..= cacheSecurityGroupName,
+                            "EC2SecurityGroupName" JSON..= eC2SecurityGroupName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "EC2SecurityGroupOwnerId"
+                                 Prelude.<$> eC2SecurityGroupOwnerId]))}
+instance JSON.ToJSON SecurityGroupIngress where
+  toJSON SecurityGroupIngress {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["CacheSecurityGroupName" JSON..= cacheSecurityGroupName,
+               "EC2SecurityGroupName" JSON..= eC2SecurityGroupName]
+              (Prelude.catMaybes
+                 [(JSON..=) "EC2SecurityGroupOwnerId"
+                    Prelude.<$> eC2SecurityGroupOwnerId])))
+instance Property "CacheSecurityGroupName" SecurityGroupIngress where
+  type PropertyType "CacheSecurityGroupName" SecurityGroupIngress = Value Prelude.Text
+  set newValue SecurityGroupIngress {..}
+    = SecurityGroupIngress {cacheSecurityGroupName = newValue, ..}
+instance Property "EC2SecurityGroupName" SecurityGroupIngress where
+  type PropertyType "EC2SecurityGroupName" SecurityGroupIngress = Value Prelude.Text
+  set newValue SecurityGroupIngress {..}
+    = SecurityGroupIngress {eC2SecurityGroupName = newValue, ..}
+instance Property "EC2SecurityGroupOwnerId" SecurityGroupIngress where
+  type PropertyType "EC2SecurityGroupOwnerId" SecurityGroupIngress = Value Prelude.Text
+  set newValue SecurityGroupIngress {..}
+    = SecurityGroupIngress
+        {eC2SecurityGroupOwnerId = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache.hs b/gen/Stratosphere/ElastiCache/ServerlessCache.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache.hs
@@ -0,0 +1,179 @@
+module Stratosphere.ElastiCache.ServerlessCache (
+        module Exports, ServerlessCache(..), mkServerlessCache
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.ServerlessCache.CacheUsageLimitsProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.ServerlessCache.EndpointProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data ServerlessCache
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html>
+    ServerlessCache {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-cacheusagelimits>
+                     cacheUsageLimits :: (Prelude.Maybe CacheUsageLimitsProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-dailysnapshottime>
+                     dailySnapshotTime :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-description>
+                     description :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-endpoint>
+                     endpoint :: (Prelude.Maybe EndpointProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-engine>
+                     engine :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-finalsnapshotname>
+                     finalSnapshotName :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-kmskeyid>
+                     kmsKeyId :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-majorengineversion>
+                     majorEngineVersion :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-readerendpoint>
+                     readerEndpoint :: (Prelude.Maybe EndpointProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-securitygroupids>
+                     securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-serverlesscachename>
+                     serverlessCacheName :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-snapshotarnstorestore>
+                     snapshotArnsToRestore :: (Prelude.Maybe (ValueList Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-snapshotretentionlimit>
+                     snapshotRetentionLimit :: (Prelude.Maybe (Value Prelude.Integer)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-subnetids>
+                     subnetIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-tags>
+                     tags :: (Prelude.Maybe [Tag]),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html#cfn-elasticache-serverlesscache-usergroupid>
+                     userGroupId :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkServerlessCache ::
+  Value Prelude.Text -> Value Prelude.Text -> ServerlessCache
+mkServerlessCache engine serverlessCacheName
+  = ServerlessCache
+      {haddock_workaround_ = (), engine = engine,
+       serverlessCacheName = serverlessCacheName,
+       cacheUsageLimits = Prelude.Nothing,
+       dailySnapshotTime = Prelude.Nothing, description = Prelude.Nothing,
+       endpoint = Prelude.Nothing, finalSnapshotName = Prelude.Nothing,
+       kmsKeyId = Prelude.Nothing, majorEngineVersion = Prelude.Nothing,
+       readerEndpoint = Prelude.Nothing,
+       securityGroupIds = Prelude.Nothing,
+       snapshotArnsToRestore = Prelude.Nothing,
+       snapshotRetentionLimit = Prelude.Nothing,
+       subnetIds = Prelude.Nothing, tags = Prelude.Nothing,
+       userGroupId = Prelude.Nothing}
+instance ToResourceProperties ServerlessCache where
+  toResourceProperties ServerlessCache {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ServerlessCache",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Engine" JSON..= engine,
+                            "ServerlessCacheName" JSON..= serverlessCacheName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "CacheUsageLimits" Prelude.<$> cacheUsageLimits,
+                               (JSON..=) "DailySnapshotTime" Prelude.<$> dailySnapshotTime,
+                               (JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "Endpoint" Prelude.<$> endpoint,
+                               (JSON..=) "FinalSnapshotName" Prelude.<$> finalSnapshotName,
+                               (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId,
+                               (JSON..=) "MajorEngineVersion" Prelude.<$> majorEngineVersion,
+                               (JSON..=) "ReaderEndpoint" Prelude.<$> readerEndpoint,
+                               (JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                               (JSON..=) "SnapshotArnsToRestore"
+                                 Prelude.<$> snapshotArnsToRestore,
+                               (JSON..=) "SnapshotRetentionLimit"
+                                 Prelude.<$> snapshotRetentionLimit,
+                               (JSON..=) "SubnetIds" Prelude.<$> subnetIds,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "UserGroupId" Prelude.<$> userGroupId]))}
+instance JSON.ToJSON ServerlessCache where
+  toJSON ServerlessCache {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Engine" JSON..= engine,
+               "ServerlessCacheName" JSON..= serverlessCacheName]
+              (Prelude.catMaybes
+                 [(JSON..=) "CacheUsageLimits" Prelude.<$> cacheUsageLimits,
+                  (JSON..=) "DailySnapshotTime" Prelude.<$> dailySnapshotTime,
+                  (JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "Endpoint" Prelude.<$> endpoint,
+                  (JSON..=) "FinalSnapshotName" Prelude.<$> finalSnapshotName,
+                  (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId,
+                  (JSON..=) "MajorEngineVersion" Prelude.<$> majorEngineVersion,
+                  (JSON..=) "ReaderEndpoint" Prelude.<$> readerEndpoint,
+                  (JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                  (JSON..=) "SnapshotArnsToRestore"
+                    Prelude.<$> snapshotArnsToRestore,
+                  (JSON..=) "SnapshotRetentionLimit"
+                    Prelude.<$> snapshotRetentionLimit,
+                  (JSON..=) "SubnetIds" Prelude.<$> subnetIds,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "UserGroupId" Prelude.<$> userGroupId])))
+instance Property "CacheUsageLimits" ServerlessCache where
+  type PropertyType "CacheUsageLimits" ServerlessCache = CacheUsageLimitsProperty
+  set newValue ServerlessCache {..}
+    = ServerlessCache {cacheUsageLimits = Prelude.pure newValue, ..}
+instance Property "DailySnapshotTime" ServerlessCache where
+  type PropertyType "DailySnapshotTime" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {dailySnapshotTime = Prelude.pure newValue, ..}
+instance Property "Description" ServerlessCache where
+  type PropertyType "Description" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {description = Prelude.pure newValue, ..}
+instance Property "Endpoint" ServerlessCache where
+  type PropertyType "Endpoint" ServerlessCache = EndpointProperty
+  set newValue ServerlessCache {..}
+    = ServerlessCache {endpoint = Prelude.pure newValue, ..}
+instance Property "Engine" ServerlessCache where
+  type PropertyType "Engine" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {engine = newValue, ..}
+instance Property "FinalSnapshotName" ServerlessCache where
+  type PropertyType "FinalSnapshotName" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {finalSnapshotName = Prelude.pure newValue, ..}
+instance Property "KmsKeyId" ServerlessCache where
+  type PropertyType "KmsKeyId" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {kmsKeyId = Prelude.pure newValue, ..}
+instance Property "MajorEngineVersion" ServerlessCache where
+  type PropertyType "MajorEngineVersion" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {majorEngineVersion = Prelude.pure newValue, ..}
+instance Property "ReaderEndpoint" ServerlessCache where
+  type PropertyType "ReaderEndpoint" ServerlessCache = EndpointProperty
+  set newValue ServerlessCache {..}
+    = ServerlessCache {readerEndpoint = Prelude.pure newValue, ..}
+instance Property "SecurityGroupIds" ServerlessCache where
+  type PropertyType "SecurityGroupIds" ServerlessCache = ValueList Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "ServerlessCacheName" ServerlessCache where
+  type PropertyType "ServerlessCacheName" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {serverlessCacheName = newValue, ..}
+instance Property "SnapshotArnsToRestore" ServerlessCache where
+  type PropertyType "SnapshotArnsToRestore" ServerlessCache = ValueList Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache
+        {snapshotArnsToRestore = Prelude.pure newValue, ..}
+instance Property "SnapshotRetentionLimit" ServerlessCache where
+  type PropertyType "SnapshotRetentionLimit" ServerlessCache = Value Prelude.Integer
+  set newValue ServerlessCache {..}
+    = ServerlessCache
+        {snapshotRetentionLimit = Prelude.pure newValue, ..}
+instance Property "SubnetIds" ServerlessCache where
+  type PropertyType "SubnetIds" ServerlessCache = ValueList Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {subnetIds = Prelude.pure newValue, ..}
+instance Property "Tags" ServerlessCache where
+  type PropertyType "Tags" ServerlessCache = [Tag]
+  set newValue ServerlessCache {..}
+    = ServerlessCache {tags = Prelude.pure newValue, ..}
+instance Property "UserGroupId" ServerlessCache where
+  type PropertyType "UserGroupId" ServerlessCache = Value Prelude.Text
+  set newValue ServerlessCache {..}
+    = ServerlessCache {userGroupId = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs b/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.ElastiCache.ServerlessCache.CacheUsageLimitsProperty (
+        module Exports, CacheUsageLimitsProperty(..),
+        mkCacheUsageLimitsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.ServerlessCache.DataStorageProperty as Exports
+import {-# SOURCE #-} Stratosphere.ElastiCache.ServerlessCache.ECPUPerSecondProperty as Exports
+import Stratosphere.ResourceProperties
+data CacheUsageLimitsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-cacheusagelimits.html>
+    CacheUsageLimitsProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-cacheusagelimits.html#cfn-elasticache-serverlesscache-cacheusagelimits-datastorage>
+                              dataStorage :: (Prelude.Maybe DataStorageProperty),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-cacheusagelimits.html#cfn-elasticache-serverlesscache-cacheusagelimits-ecpupersecond>
+                              eCPUPerSecond :: (Prelude.Maybe ECPUPerSecondProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCacheUsageLimitsProperty :: CacheUsageLimitsProperty
+mkCacheUsageLimitsProperty
+  = CacheUsageLimitsProperty
+      {haddock_workaround_ = (), dataStorage = Prelude.Nothing,
+       eCPUPerSecond = Prelude.Nothing}
+instance ToResourceProperties CacheUsageLimitsProperty where
+  toResourceProperties CacheUsageLimitsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ServerlessCache.CacheUsageLimits",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DataStorage" Prelude.<$> dataStorage,
+                            (JSON..=) "ECPUPerSecond" Prelude.<$> eCPUPerSecond])}
+instance JSON.ToJSON CacheUsageLimitsProperty where
+  toJSON CacheUsageLimitsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DataStorage" Prelude.<$> dataStorage,
+               (JSON..=) "ECPUPerSecond" Prelude.<$> eCPUPerSecond]))
+instance Property "DataStorage" CacheUsageLimitsProperty where
+  type PropertyType "DataStorage" CacheUsageLimitsProperty = DataStorageProperty
+  set newValue CacheUsageLimitsProperty {..}
+    = CacheUsageLimitsProperty
+        {dataStorage = Prelude.pure newValue, ..}
+instance Property "ECPUPerSecond" CacheUsageLimitsProperty where
+  type PropertyType "ECPUPerSecond" CacheUsageLimitsProperty = ECPUPerSecondProperty
+  set newValue CacheUsageLimitsProperty {..}
+    = CacheUsageLimitsProperty
+        {eCPUPerSecond = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs-boot b/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/CacheUsageLimitsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ServerlessCache.CacheUsageLimitsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CacheUsageLimitsProperty :: Prelude.Type
+instance ToResourceProperties CacheUsageLimitsProperty
+instance Prelude.Eq CacheUsageLimitsProperty
+instance Prelude.Show CacheUsageLimitsProperty
+instance JSON.ToJSON CacheUsageLimitsProperty
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs b/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs
@@ -0,0 +1,55 @@
+module Stratosphere.ElastiCache.ServerlessCache.DataStorageProperty (
+        DataStorageProperty(..), mkDataStorageProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DataStorageProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-datastorage.html>
+    DataStorageProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-datastorage.html#cfn-elasticache-serverlesscache-datastorage-maximum>
+                         maximum :: (Prelude.Maybe (Value Prelude.Integer)),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-datastorage.html#cfn-elasticache-serverlesscache-datastorage-minimum>
+                         minimum :: (Prelude.Maybe (Value Prelude.Integer)),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-datastorage.html#cfn-elasticache-serverlesscache-datastorage-unit>
+                         unit :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDataStorageProperty :: Value Prelude.Text -> DataStorageProperty
+mkDataStorageProperty unit
+  = DataStorageProperty
+      {haddock_workaround_ = (), unit = unit, maximum = Prelude.Nothing,
+       minimum = Prelude.Nothing}
+instance ToResourceProperties DataStorageProperty where
+  toResourceProperties DataStorageProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ServerlessCache.DataStorage",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Unit" JSON..= unit]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Maximum" Prelude.<$> maximum,
+                               (JSON..=) "Minimum" Prelude.<$> minimum]))}
+instance JSON.ToJSON DataStorageProperty where
+  toJSON DataStorageProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Unit" JSON..= unit]
+              (Prelude.catMaybes
+                 [(JSON..=) "Maximum" Prelude.<$> maximum,
+                  (JSON..=) "Minimum" Prelude.<$> minimum])))
+instance Property "Maximum" DataStorageProperty where
+  type PropertyType "Maximum" DataStorageProperty = Value Prelude.Integer
+  set newValue DataStorageProperty {..}
+    = DataStorageProperty {maximum = Prelude.pure newValue, ..}
+instance Property "Minimum" DataStorageProperty where
+  type PropertyType "Minimum" DataStorageProperty = Value Prelude.Integer
+  set newValue DataStorageProperty {..}
+    = DataStorageProperty {minimum = Prelude.pure newValue, ..}
+instance Property "Unit" DataStorageProperty where
+  type PropertyType "Unit" DataStorageProperty = Value Prelude.Text
+  set newValue DataStorageProperty {..}
+    = DataStorageProperty {unit = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs-boot b/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/DataStorageProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ServerlessCache.DataStorageProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DataStorageProperty :: Prelude.Type
+instance ToResourceProperties DataStorageProperty
+instance Prelude.Eq DataStorageProperty
+instance Prelude.Show DataStorageProperty
+instance JSON.ToJSON DataStorageProperty
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs b/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.ElastiCache.ServerlessCache.ECPUPerSecondProperty (
+        ECPUPerSecondProperty(..), mkECPUPerSecondProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ECPUPerSecondProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-ecpupersecond.html>
+    ECPUPerSecondProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-ecpupersecond.html#cfn-elasticache-serverlesscache-ecpupersecond-maximum>
+                           maximum :: (Prelude.Maybe (Value Prelude.Integer)),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-ecpupersecond.html#cfn-elasticache-serverlesscache-ecpupersecond-minimum>
+                           minimum :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkECPUPerSecondProperty :: ECPUPerSecondProperty
+mkECPUPerSecondProperty
+  = ECPUPerSecondProperty
+      {haddock_workaround_ = (), maximum = Prelude.Nothing,
+       minimum = Prelude.Nothing}
+instance ToResourceProperties ECPUPerSecondProperty where
+  toResourceProperties ECPUPerSecondProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ServerlessCache.ECPUPerSecond",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Maximum" Prelude.<$> maximum,
+                            (JSON..=) "Minimum" Prelude.<$> minimum])}
+instance JSON.ToJSON ECPUPerSecondProperty where
+  toJSON ECPUPerSecondProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Maximum" Prelude.<$> maximum,
+               (JSON..=) "Minimum" Prelude.<$> minimum]))
+instance Property "Maximum" ECPUPerSecondProperty where
+  type PropertyType "Maximum" ECPUPerSecondProperty = Value Prelude.Integer
+  set newValue ECPUPerSecondProperty {..}
+    = ECPUPerSecondProperty {maximum = Prelude.pure newValue, ..}
+instance Property "Minimum" ECPUPerSecondProperty where
+  type PropertyType "Minimum" ECPUPerSecondProperty = Value Prelude.Integer
+  set newValue ECPUPerSecondProperty {..}
+    = ECPUPerSecondProperty {minimum = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs-boot b/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/ECPUPerSecondProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ServerlessCache.ECPUPerSecondProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ECPUPerSecondProperty :: Prelude.Type
+instance ToResourceProperties ECPUPerSecondProperty
+instance Prelude.Eq ECPUPerSecondProperty
+instance Prelude.Show ECPUPerSecondProperty
+instance JSON.ToJSON ECPUPerSecondProperty
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs b/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.ElastiCache.ServerlessCache.EndpointProperty (
+        EndpointProperty(..), mkEndpointProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data EndpointProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-endpoint.html>
+    EndpointProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-endpoint.html#cfn-elasticache-serverlesscache-endpoint-address>
+                      address :: (Prelude.Maybe (Value Prelude.Text)),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-serverlesscache-endpoint.html#cfn-elasticache-serverlesscache-endpoint-port>
+                      port :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEndpointProperty :: EndpointProperty
+mkEndpointProperty
+  = EndpointProperty
+      {haddock_workaround_ = (), address = Prelude.Nothing,
+       port = Prelude.Nothing}
+instance ToResourceProperties EndpointProperty where
+  toResourceProperties EndpointProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::ServerlessCache.Endpoint",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Address" Prelude.<$> address,
+                            (JSON..=) "Port" Prelude.<$> port])}
+instance JSON.ToJSON EndpointProperty where
+  toJSON EndpointProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Address" Prelude.<$> address,
+               (JSON..=) "Port" Prelude.<$> port]))
+instance Property "Address" EndpointProperty where
+  type PropertyType "Address" EndpointProperty = Value Prelude.Text
+  set newValue EndpointProperty {..}
+    = EndpointProperty {address = Prelude.pure newValue, ..}
+instance Property "Port" EndpointProperty where
+  type PropertyType "Port" EndpointProperty = Value Prelude.Text
+  set newValue EndpointProperty {..}
+    = EndpointProperty {port = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs-boot b/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/ServerlessCache/EndpointProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.ServerlessCache.EndpointProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data EndpointProperty :: Prelude.Type
+instance ToResourceProperties EndpointProperty
+instance Prelude.Eq EndpointProperty
+instance Prelude.Show EndpointProperty
+instance JSON.ToJSON EndpointProperty
diff --git a/gen/Stratosphere/ElastiCache/SubnetGroup.hs b/gen/Stratosphere/ElastiCache/SubnetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/SubnetGroup.hs
@@ -0,0 +1,64 @@
+module Stratosphere.ElastiCache.SubnetGroup (
+        SubnetGroup(..), mkSubnetGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data SubnetGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html>
+    SubnetGroup {haddock_workaround_ :: (),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-cachesubnetgroupname>
+                 cacheSubnetGroupName :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-description>
+                 description :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-subnetids>
+                 subnetIds :: (ValueList Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-tags>
+                 tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSubnetGroup ::
+  Value Prelude.Text -> ValueList Prelude.Text -> SubnetGroup
+mkSubnetGroup description subnetIds
+  = SubnetGroup
+      {haddock_workaround_ = (), description = description,
+       subnetIds = subnetIds, cacheSubnetGroupName = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties SubnetGroup where
+  toResourceProperties SubnetGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::SubnetGroup",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Description" JSON..= description, "SubnetIds" JSON..= subnetIds]
+                           (Prelude.catMaybes
+                              [(JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON SubnetGroup where
+  toJSON SubnetGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Description" JSON..= description, "SubnetIds" JSON..= subnetIds]
+              (Prelude.catMaybes
+                 [(JSON..=) "CacheSubnetGroupName" Prelude.<$> cacheSubnetGroupName,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "CacheSubnetGroupName" SubnetGroup where
+  type PropertyType "CacheSubnetGroupName" SubnetGroup = Value Prelude.Text
+  set newValue SubnetGroup {..}
+    = SubnetGroup {cacheSubnetGroupName = Prelude.pure newValue, ..}
+instance Property "Description" SubnetGroup where
+  type PropertyType "Description" SubnetGroup = Value Prelude.Text
+  set newValue SubnetGroup {..}
+    = SubnetGroup {description = newValue, ..}
+instance Property "SubnetIds" SubnetGroup where
+  type PropertyType "SubnetIds" SubnetGroup = ValueList Prelude.Text
+  set newValue SubnetGroup {..}
+    = SubnetGroup {subnetIds = newValue, ..}
+instance Property "Tags" SubnetGroup where
+  type PropertyType "Tags" SubnetGroup = [Tag]
+  set newValue SubnetGroup {..}
+    = SubnetGroup {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/User.hs b/gen/Stratosphere/ElastiCache/User.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/User.hs
@@ -0,0 +1,95 @@
+module Stratosphere.ElastiCache.User (
+        module Exports, User(..), mkUser
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.ElastiCache.User.AuthenticationModeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data User
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html>
+    User {haddock_workaround_ :: (),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-accessstring>
+          accessString :: (Prelude.Maybe (Value Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-authenticationmode>
+          authenticationMode :: (Prelude.Maybe AuthenticationModeProperty),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-engine>
+          engine :: (Value Prelude.Text),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-nopasswordrequired>
+          noPasswordRequired :: (Prelude.Maybe (Value Prelude.Bool)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-passwords>
+          passwords :: (Prelude.Maybe (ValueList Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-tags>
+          tags :: (Prelude.Maybe [Tag]),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-userid>
+          userId :: (Value Prelude.Text),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-username>
+          userName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkUser ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> Value Prelude.Text -> User
+mkUser engine userId userName
+  = User
+      {haddock_workaround_ = (), engine = engine, userId = userId,
+       userName = userName, accessString = Prelude.Nothing,
+       authenticationMode = Prelude.Nothing,
+       noPasswordRequired = Prelude.Nothing, passwords = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties User where
+  toResourceProperties User {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::User", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Engine" JSON..= engine, "UserId" JSON..= userId,
+                            "UserName" JSON..= userName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AccessString" Prelude.<$> accessString,
+                               (JSON..=) "AuthenticationMode" Prelude.<$> authenticationMode,
+                               (JSON..=) "NoPasswordRequired" Prelude.<$> noPasswordRequired,
+                               (JSON..=) "Passwords" Prelude.<$> passwords,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON User where
+  toJSON User {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Engine" JSON..= engine, "UserId" JSON..= userId,
+               "UserName" JSON..= userName]
+              (Prelude.catMaybes
+                 [(JSON..=) "AccessString" Prelude.<$> accessString,
+                  (JSON..=) "AuthenticationMode" Prelude.<$> authenticationMode,
+                  (JSON..=) "NoPasswordRequired" Prelude.<$> noPasswordRequired,
+                  (JSON..=) "Passwords" Prelude.<$> passwords,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "AccessString" User where
+  type PropertyType "AccessString" User = Value Prelude.Text
+  set newValue User {..}
+    = User {accessString = Prelude.pure newValue, ..}
+instance Property "AuthenticationMode" User where
+  type PropertyType "AuthenticationMode" User = AuthenticationModeProperty
+  set newValue User {..}
+    = User {authenticationMode = Prelude.pure newValue, ..}
+instance Property "Engine" User where
+  type PropertyType "Engine" User = Value Prelude.Text
+  set newValue User {..} = User {engine = newValue, ..}
+instance Property "NoPasswordRequired" User where
+  type PropertyType "NoPasswordRequired" User = Value Prelude.Bool
+  set newValue User {..}
+    = User {noPasswordRequired = Prelude.pure newValue, ..}
+instance Property "Passwords" User where
+  type PropertyType "Passwords" User = ValueList Prelude.Text
+  set newValue User {..}
+    = User {passwords = Prelude.pure newValue, ..}
+instance Property "Tags" User where
+  type PropertyType "Tags" User = [Tag]
+  set newValue User {..} = User {tags = Prelude.pure newValue, ..}
+instance Property "UserId" User where
+  type PropertyType "UserId" User = Value Prelude.Text
+  set newValue User {..} = User {userId = newValue, ..}
+instance Property "UserName" User where
+  type PropertyType "UserName" User = Value Prelude.Text
+  set newValue User {..} = User {userName = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs b/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs
@@ -0,0 +1,47 @@
+module Stratosphere.ElastiCache.User.AuthenticationModeProperty (
+        AuthenticationModeProperty(..), mkAuthenticationModeProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AuthenticationModeProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html>
+    AuthenticationModeProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html#cfn-elasticache-user-authenticationmode-passwords>
+                                passwords :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html#cfn-elasticache-user-authenticationmode-type>
+                                type' :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAuthenticationModeProperty ::
+  Value Prelude.Text -> AuthenticationModeProperty
+mkAuthenticationModeProperty type'
+  = AuthenticationModeProperty
+      {haddock_workaround_ = (), type' = type',
+       passwords = Prelude.Nothing}
+instance ToResourceProperties AuthenticationModeProperty where
+  toResourceProperties AuthenticationModeProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::User.AuthenticationMode",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Type" JSON..= type']
+                           (Prelude.catMaybes [(JSON..=) "Passwords" Prelude.<$> passwords]))}
+instance JSON.ToJSON AuthenticationModeProperty where
+  toJSON AuthenticationModeProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Type" JSON..= type']
+              (Prelude.catMaybes [(JSON..=) "Passwords" Prelude.<$> passwords])))
+instance Property "Passwords" AuthenticationModeProperty where
+  type PropertyType "Passwords" AuthenticationModeProperty = ValueList Prelude.Text
+  set newValue AuthenticationModeProperty {..}
+    = AuthenticationModeProperty
+        {passwords = Prelude.pure newValue, ..}
+instance Property "Type" AuthenticationModeProperty where
+  type PropertyType "Type" AuthenticationModeProperty = Value Prelude.Text
+  set newValue AuthenticationModeProperty {..}
+    = AuthenticationModeProperty {type' = newValue, ..}
diff --git a/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs-boot b/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/User/AuthenticationModeProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.ElastiCache.User.AuthenticationModeProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AuthenticationModeProperty :: Prelude.Type
+instance ToResourceProperties AuthenticationModeProperty
+instance Prelude.Eq AuthenticationModeProperty
+instance Prelude.Show AuthenticationModeProperty
+instance JSON.ToJSON AuthenticationModeProperty
diff --git a/gen/Stratosphere/ElastiCache/UserGroup.hs b/gen/Stratosphere/ElastiCache/UserGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/ElastiCache/UserGroup.hs
@@ -0,0 +1,61 @@
+module Stratosphere.ElastiCache.UserGroup (
+        UserGroup(..), mkUserGroup
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data UserGroup
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html>
+    UserGroup {haddock_workaround_ :: (),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-engine>
+               engine :: (Value Prelude.Text),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-tags>
+               tags :: (Prelude.Maybe [Tag]),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-usergroupid>
+               userGroupId :: (Value Prelude.Text),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-userids>
+               userIds :: (ValueList Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkUserGroup ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> ValueList Prelude.Text -> UserGroup
+mkUserGroup engine userGroupId userIds
+  = UserGroup
+      {haddock_workaround_ = (), engine = engine,
+       userGroupId = userGroupId, userIds = userIds,
+       tags = Prelude.Nothing}
+instance ToResourceProperties UserGroup where
+  toResourceProperties UserGroup {..}
+    = ResourceProperties
+        {awsType = "AWS::ElastiCache::UserGroup",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Engine" JSON..= engine, "UserGroupId" JSON..= userGroupId,
+                            "UserIds" JSON..= userIds]
+                           (Prelude.catMaybes [(JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON UserGroup where
+  toJSON UserGroup {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Engine" JSON..= engine, "UserGroupId" JSON..= userGroupId,
+               "UserIds" JSON..= userIds]
+              (Prelude.catMaybes [(JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "Engine" UserGroup where
+  type PropertyType "Engine" UserGroup = Value Prelude.Text
+  set newValue UserGroup {..} = UserGroup {engine = newValue, ..}
+instance Property "Tags" UserGroup where
+  type PropertyType "Tags" UserGroup = [Tag]
+  set newValue UserGroup {..}
+    = UserGroup {tags = Prelude.pure newValue, ..}
+instance Property "UserGroupId" UserGroup where
+  type PropertyType "UserGroupId" UserGroup = Value Prelude.Text
+  set newValue UserGroup {..}
+    = UserGroup {userGroupId = newValue, ..}
+instance Property "UserIds" UserGroup where
+  type PropertyType "UserIds" UserGroup = ValueList Prelude.Text
+  set newValue UserGroup {..} = UserGroup {userIds = newValue, ..}
diff --git a/stratosphere-elasticache.cabal b/stratosphere-elasticache.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-elasticache.cabal
@@ -0,0 +1,99 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.38.2.
+--
+-- see: https://github.com/sol/hpack
+
+name:           stratosphere-elasticache
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS ElastiCache.
+description:    Integration into stratosphere to generate resources and properties for AWS ElastiCache
+category:       AWS, Cloud, ElastiCache
+stability:      experimental
+homepage:       https://github.com/mbj/stratosphere#readme
+bug-reports:    https://github.com/mbj/stratosphere/issues
+maintainer:     Markus Schirp
+license:        MIT
+license-file:   LICENSE.md
+build-type:     Simple
+
+source-repository head
+  type: git
+  location: https://github.com/mbj/stratosphere
+
+flag development
+  description: Run GHC with development flags
+  manual: True
+  default: False
+
+library
+  exposed-modules:
+      Stratosphere.ElastiCache.CacheCluster
+      Stratosphere.ElastiCache.CacheCluster.CloudWatchLogsDestinationDetailsProperty
+      Stratosphere.ElastiCache.CacheCluster.DestinationDetailsProperty
+      Stratosphere.ElastiCache.CacheCluster.KinesisFirehoseDestinationDetailsProperty
+      Stratosphere.ElastiCache.CacheCluster.LogDeliveryConfigurationRequestProperty
+      Stratosphere.ElastiCache.GlobalReplicationGroup
+      Stratosphere.ElastiCache.GlobalReplicationGroup.GlobalReplicationGroupMemberProperty
+      Stratosphere.ElastiCache.GlobalReplicationGroup.RegionalConfigurationProperty
+      Stratosphere.ElastiCache.GlobalReplicationGroup.ReshardingConfigurationProperty
+      Stratosphere.ElastiCache.ParameterGroup
+      Stratosphere.ElastiCache.ReplicationGroup
+      Stratosphere.ElastiCache.ReplicationGroup.CloudWatchLogsDestinationDetailsProperty
+      Stratosphere.ElastiCache.ReplicationGroup.DestinationDetailsProperty
+      Stratosphere.ElastiCache.ReplicationGroup.KinesisFirehoseDestinationDetailsProperty
+      Stratosphere.ElastiCache.ReplicationGroup.LogDeliveryConfigurationRequestProperty
+      Stratosphere.ElastiCache.ReplicationGroup.NodeGroupConfigurationProperty
+      Stratosphere.ElastiCache.SecurityGroup
+      Stratosphere.ElastiCache.SecurityGroupIngress
+      Stratosphere.ElastiCache.ServerlessCache
+      Stratosphere.ElastiCache.ServerlessCache.CacheUsageLimitsProperty
+      Stratosphere.ElastiCache.ServerlessCache.DataStorageProperty
+      Stratosphere.ElastiCache.ServerlessCache.ECPUPerSecondProperty
+      Stratosphere.ElastiCache.ServerlessCache.EndpointProperty
+      Stratosphere.ElastiCache.SubnetGroup
+      Stratosphere.ElastiCache.User
+      Stratosphere.ElastiCache.User.AuthenticationModeProperty
+      Stratosphere.ElastiCache.UserGroup
+  other-modules:
+      Paths_stratosphere_elasticache
+  hs-source-dirs:
+      gen
+  default-extensions:
+      DataKinds
+      DeriveGeneric
+      DerivingStrategies
+      DerivingVia
+      DuplicateRecordFields
+      FlexibleContexts
+      FlexibleInstances
+      GADTs
+      GeneralizedNewtypeDeriving
+      InstanceSigs
+      LambdaCase
+      MultiParamTypeClasses
+      NoFieldSelectors
+      NoImplicitPrelude
+      NumericUnderscores
+      OverloadedLists
+      OverloadedRecordDot
+      OverloadedStrings
+      PolyKinds
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      Strict
+      TemplateHaskell
+      TupleSections
+      TypeApplications
+      TypeFamilies
+  ghc-options: -Wall -Wcompat -Widentities -Wimplicit-prelude -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-local-signatures -Wmissing-signatures -Wmonomorphism-restriction -Wredundant-constraints -fhide-source-paths -funbox-strict-fields -optP-Wno-nonportable-include-path -Wno-unused-imports
+  build-depends:
+      aeson ==2.*
+    , base >=4.8 && <4.22
+    , stratosphere ==1.0.0
+  default-language: Haskell2010
+  if flag(development)
+    ghc-options: -Werror
+  else
+    ghc-options: -Wwarn
