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/CloudWatch/Alarm.hs b/gen/Stratosphere/CloudWatch/Alarm.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm.hs
@@ -0,0 +1,222 @@
+module Stratosphere.CloudWatch.Alarm (
+        module Exports, Alarm(..), mkAlarm
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.Alarm.DimensionProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.Alarm.MetricDataQueryProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Alarm
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html>
+    Alarm {haddock_workaround_ :: (),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-actionsenabled>
+           actionsEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-alarmactions>
+           alarmActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-alarmdescription>
+           alarmDescription :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-alarmname>
+           alarmName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-comparisonoperator>
+           comparisonOperator :: (Value Prelude.Text),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-datapointstoalarm>
+           datapointsToAlarm :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-dimensions>
+           dimensions :: (Prelude.Maybe [DimensionProperty]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-evaluatelowsamplecountpercentile>
+           evaluateLowSampleCountPercentile :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-evaluationperiods>
+           evaluationPeriods :: (Value Prelude.Integer),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-extendedstatistic>
+           extendedStatistic :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-insufficientdataactions>
+           insufficientDataActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-metricname>
+           metricName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-metrics>
+           metrics :: (Prelude.Maybe [MetricDataQueryProperty]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-namespace>
+           namespace :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-okactions>
+           oKActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-period>
+           period :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-statistic>
+           statistic :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-tags>
+           tags :: (Prelude.Maybe [Tag]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-threshold>
+           threshold :: (Prelude.Maybe (Value Prelude.Double)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-thresholdmetricid>
+           thresholdMetricId :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-treatmissingdata>
+           treatMissingData :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-unit>
+           unit :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAlarm :: Value Prelude.Text -> Value Prelude.Integer -> Alarm
+mkAlarm comparisonOperator evaluationPeriods
+  = Alarm
+      {haddock_workaround_ = (), comparisonOperator = comparisonOperator,
+       evaluationPeriods = evaluationPeriods,
+       actionsEnabled = Prelude.Nothing, alarmActions = Prelude.Nothing,
+       alarmDescription = Prelude.Nothing, alarmName = Prelude.Nothing,
+       datapointsToAlarm = Prelude.Nothing, dimensions = Prelude.Nothing,
+       evaluateLowSampleCountPercentile = Prelude.Nothing,
+       extendedStatistic = Prelude.Nothing,
+       insufficientDataActions = Prelude.Nothing,
+       metricName = Prelude.Nothing, metrics = Prelude.Nothing,
+       namespace = Prelude.Nothing, oKActions = Prelude.Nothing,
+       period = Prelude.Nothing, statistic = Prelude.Nothing,
+       tags = Prelude.Nothing, threshold = Prelude.Nothing,
+       thresholdMetricId = Prelude.Nothing,
+       treatMissingData = Prelude.Nothing, unit = Prelude.Nothing}
+instance ToResourceProperties Alarm where
+  toResourceProperties Alarm {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Alarm", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ComparisonOperator" JSON..= comparisonOperator,
+                            "EvaluationPeriods" JSON..= evaluationPeriods]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ActionsEnabled" Prelude.<$> actionsEnabled,
+                               (JSON..=) "AlarmActions" Prelude.<$> alarmActions,
+                               (JSON..=) "AlarmDescription" Prelude.<$> alarmDescription,
+                               (JSON..=) "AlarmName" Prelude.<$> alarmName,
+                               (JSON..=) "DatapointsToAlarm" Prelude.<$> datapointsToAlarm,
+                               (JSON..=) "Dimensions" Prelude.<$> dimensions,
+                               (JSON..=) "EvaluateLowSampleCountPercentile"
+                                 Prelude.<$> evaluateLowSampleCountPercentile,
+                               (JSON..=) "ExtendedStatistic" Prelude.<$> extendedStatistic,
+                               (JSON..=) "InsufficientDataActions"
+                                 Prelude.<$> insufficientDataActions,
+                               (JSON..=) "MetricName" Prelude.<$> metricName,
+                               (JSON..=) "Metrics" Prelude.<$> metrics,
+                               (JSON..=) "Namespace" Prelude.<$> namespace,
+                               (JSON..=) "OKActions" Prelude.<$> oKActions,
+                               (JSON..=) "Period" Prelude.<$> period,
+                               (JSON..=) "Statistic" Prelude.<$> statistic,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "Threshold" Prelude.<$> threshold,
+                               (JSON..=) "ThresholdMetricId" Prelude.<$> thresholdMetricId,
+                               (JSON..=) "TreatMissingData" Prelude.<$> treatMissingData,
+                               (JSON..=) "Unit" Prelude.<$> unit]))}
+instance JSON.ToJSON Alarm where
+  toJSON Alarm {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ComparisonOperator" JSON..= comparisonOperator,
+               "EvaluationPeriods" JSON..= evaluationPeriods]
+              (Prelude.catMaybes
+                 [(JSON..=) "ActionsEnabled" Prelude.<$> actionsEnabled,
+                  (JSON..=) "AlarmActions" Prelude.<$> alarmActions,
+                  (JSON..=) "AlarmDescription" Prelude.<$> alarmDescription,
+                  (JSON..=) "AlarmName" Prelude.<$> alarmName,
+                  (JSON..=) "DatapointsToAlarm" Prelude.<$> datapointsToAlarm,
+                  (JSON..=) "Dimensions" Prelude.<$> dimensions,
+                  (JSON..=) "EvaluateLowSampleCountPercentile"
+                    Prelude.<$> evaluateLowSampleCountPercentile,
+                  (JSON..=) "ExtendedStatistic" Prelude.<$> extendedStatistic,
+                  (JSON..=) "InsufficientDataActions"
+                    Prelude.<$> insufficientDataActions,
+                  (JSON..=) "MetricName" Prelude.<$> metricName,
+                  (JSON..=) "Metrics" Prelude.<$> metrics,
+                  (JSON..=) "Namespace" Prelude.<$> namespace,
+                  (JSON..=) "OKActions" Prelude.<$> oKActions,
+                  (JSON..=) "Period" Prelude.<$> period,
+                  (JSON..=) "Statistic" Prelude.<$> statistic,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "Threshold" Prelude.<$> threshold,
+                  (JSON..=) "ThresholdMetricId" Prelude.<$> thresholdMetricId,
+                  (JSON..=) "TreatMissingData" Prelude.<$> treatMissingData,
+                  (JSON..=) "Unit" Prelude.<$> unit])))
+instance Property "ActionsEnabled" Alarm where
+  type PropertyType "ActionsEnabled" Alarm = Value Prelude.Bool
+  set newValue Alarm {..}
+    = Alarm {actionsEnabled = Prelude.pure newValue, ..}
+instance Property "AlarmActions" Alarm where
+  type PropertyType "AlarmActions" Alarm = ValueList Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {alarmActions = Prelude.pure newValue, ..}
+instance Property "AlarmDescription" Alarm where
+  type PropertyType "AlarmDescription" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {alarmDescription = Prelude.pure newValue, ..}
+instance Property "AlarmName" Alarm where
+  type PropertyType "AlarmName" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {alarmName = Prelude.pure newValue, ..}
+instance Property "ComparisonOperator" Alarm where
+  type PropertyType "ComparisonOperator" Alarm = Value Prelude.Text
+  set newValue Alarm {..} = Alarm {comparisonOperator = newValue, ..}
+instance Property "DatapointsToAlarm" Alarm where
+  type PropertyType "DatapointsToAlarm" Alarm = Value Prelude.Integer
+  set newValue Alarm {..}
+    = Alarm {datapointsToAlarm = Prelude.pure newValue, ..}
+instance Property "Dimensions" Alarm where
+  type PropertyType "Dimensions" Alarm = [DimensionProperty]
+  set newValue Alarm {..}
+    = Alarm {dimensions = Prelude.pure newValue, ..}
+instance Property "EvaluateLowSampleCountPercentile" Alarm where
+  type PropertyType "EvaluateLowSampleCountPercentile" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm
+        {evaluateLowSampleCountPercentile = Prelude.pure newValue, ..}
+instance Property "EvaluationPeriods" Alarm where
+  type PropertyType "EvaluationPeriods" Alarm = Value Prelude.Integer
+  set newValue Alarm {..} = Alarm {evaluationPeriods = newValue, ..}
+instance Property "ExtendedStatistic" Alarm where
+  type PropertyType "ExtendedStatistic" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {extendedStatistic = Prelude.pure newValue, ..}
+instance Property "InsufficientDataActions" Alarm where
+  type PropertyType "InsufficientDataActions" Alarm = ValueList Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {insufficientDataActions = Prelude.pure newValue, ..}
+instance Property "MetricName" Alarm where
+  type PropertyType "MetricName" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {metricName = Prelude.pure newValue, ..}
+instance Property "Metrics" Alarm where
+  type PropertyType "Metrics" Alarm = [MetricDataQueryProperty]
+  set newValue Alarm {..}
+    = Alarm {metrics = Prelude.pure newValue, ..}
+instance Property "Namespace" Alarm where
+  type PropertyType "Namespace" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {namespace = Prelude.pure newValue, ..}
+instance Property "OKActions" Alarm where
+  type PropertyType "OKActions" Alarm = ValueList Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {oKActions = Prelude.pure newValue, ..}
+instance Property "Period" Alarm where
+  type PropertyType "Period" Alarm = Value Prelude.Integer
+  set newValue Alarm {..}
+    = Alarm {period = Prelude.pure newValue, ..}
+instance Property "Statistic" Alarm where
+  type PropertyType "Statistic" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {statistic = Prelude.pure newValue, ..}
+instance Property "Tags" Alarm where
+  type PropertyType "Tags" Alarm = [Tag]
+  set newValue Alarm {..} = Alarm {tags = Prelude.pure newValue, ..}
+instance Property "Threshold" Alarm where
+  type PropertyType "Threshold" Alarm = Value Prelude.Double
+  set newValue Alarm {..}
+    = Alarm {threshold = Prelude.pure newValue, ..}
+instance Property "ThresholdMetricId" Alarm where
+  type PropertyType "ThresholdMetricId" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {thresholdMetricId = Prelude.pure newValue, ..}
+instance Property "TreatMissingData" Alarm where
+  type PropertyType "TreatMissingData" Alarm = Value Prelude.Text
+  set newValue Alarm {..}
+    = Alarm {treatMissingData = Prelude.pure newValue, ..}
+instance Property "Unit" Alarm where
+  type PropertyType "Unit" Alarm = Value Prelude.Text
+  set newValue Alarm {..} = Alarm {unit = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs b/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.CloudWatch.Alarm.DimensionProperty (
+        DimensionProperty(..), mkDimensionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DimensionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-dimension.html>
+    DimensionProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-dimension.html#cfn-cloudwatch-alarm-dimension-name>
+                       name :: (Value Prelude.Text),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-dimension.html#cfn-cloudwatch-alarm-dimension-value>
+                       value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDimensionProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> DimensionProperty
+mkDimensionProperty name value
+  = DimensionProperty
+      {haddock_workaround_ = (), name = name, value = value}
+instance ToResourceProperties DimensionProperty where
+  toResourceProperties DimensionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Alarm.Dimension",
+         supportsTags = Prelude.False,
+         properties = ["Name" JSON..= name, "Value" JSON..= value]}
+instance JSON.ToJSON DimensionProperty where
+  toJSON DimensionProperty {..}
+    = JSON.object ["Name" JSON..= name, "Value" JSON..= value]
+instance Property "Name" DimensionProperty where
+  type PropertyType "Name" DimensionProperty = Value Prelude.Text
+  set newValue DimensionProperty {..}
+    = DimensionProperty {name = newValue, ..}
+instance Property "Value" DimensionProperty where
+  type PropertyType "Value" DimensionProperty = Value Prelude.Text
+  set newValue DimensionProperty {..}
+    = DimensionProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs-boot b/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/DimensionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.Alarm.DimensionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DimensionProperty :: Prelude.Type
+instance ToResourceProperties DimensionProperty
+instance Prelude.Eq DimensionProperty
+instance Prelude.Show DimensionProperty
+instance JSON.ToJSON DimensionProperty
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs b/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs
@@ -0,0 +1,92 @@
+module Stratosphere.CloudWatch.Alarm.MetricDataQueryProperty (
+        module Exports, MetricDataQueryProperty(..),
+        mkMetricDataQueryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.Alarm.MetricStatProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricDataQueryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html>
+    MetricDataQueryProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-accountid>
+                             accountId :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-expression>
+                             expression :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-id>
+                             id :: (Value Prelude.Text),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-label>
+                             label :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-metricstat>
+                             metricStat :: (Prelude.Maybe MetricStatProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-period>
+                             period :: (Prelude.Maybe (Value Prelude.Integer)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-returndata>
+                             returnData :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricDataQueryProperty ::
+  Value Prelude.Text -> MetricDataQueryProperty
+mkMetricDataQueryProperty id
+  = MetricDataQueryProperty
+      {haddock_workaround_ = (), id = id, accountId = Prelude.Nothing,
+       expression = Prelude.Nothing, label = Prelude.Nothing,
+       metricStat = Prelude.Nothing, period = Prelude.Nothing,
+       returnData = Prelude.Nothing}
+instance ToResourceProperties MetricDataQueryProperty where
+  toResourceProperties MetricDataQueryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Alarm.MetricDataQuery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Id" JSON..= id]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AccountId" Prelude.<$> accountId,
+                               (JSON..=) "Expression" Prelude.<$> expression,
+                               (JSON..=) "Label" Prelude.<$> label,
+                               (JSON..=) "MetricStat" Prelude.<$> metricStat,
+                               (JSON..=) "Period" Prelude.<$> period,
+                               (JSON..=) "ReturnData" Prelude.<$> returnData]))}
+instance JSON.ToJSON MetricDataQueryProperty where
+  toJSON MetricDataQueryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Id" JSON..= id]
+              (Prelude.catMaybes
+                 [(JSON..=) "AccountId" Prelude.<$> accountId,
+                  (JSON..=) "Expression" Prelude.<$> expression,
+                  (JSON..=) "Label" Prelude.<$> label,
+                  (JSON..=) "MetricStat" Prelude.<$> metricStat,
+                  (JSON..=) "Period" Prelude.<$> period,
+                  (JSON..=) "ReturnData" Prelude.<$> returnData])))
+instance Property "AccountId" MetricDataQueryProperty where
+  type PropertyType "AccountId" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {accountId = Prelude.pure newValue, ..}
+instance Property "Expression" MetricDataQueryProperty where
+  type PropertyType "Expression" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {expression = Prelude.pure newValue, ..}
+instance Property "Id" MetricDataQueryProperty where
+  type PropertyType "Id" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {id = newValue, ..}
+instance Property "Label" MetricDataQueryProperty where
+  type PropertyType "Label" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {label = Prelude.pure newValue, ..}
+instance Property "MetricStat" MetricDataQueryProperty where
+  type PropertyType "MetricStat" MetricDataQueryProperty = MetricStatProperty
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {metricStat = Prelude.pure newValue, ..}
+instance Property "Period" MetricDataQueryProperty where
+  type PropertyType "Period" MetricDataQueryProperty = Value Prelude.Integer
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {period = Prelude.pure newValue, ..}
+instance Property "ReturnData" MetricDataQueryProperty where
+  type PropertyType "ReturnData" MetricDataQueryProperty = Value Prelude.Bool
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {returnData = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs-boot b/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricDataQueryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.Alarm.MetricDataQueryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricDataQueryProperty :: Prelude.Type
+instance ToResourceProperties MetricDataQueryProperty
+instance Prelude.Eq MetricDataQueryProperty
+instance Prelude.Show MetricDataQueryProperty
+instance JSON.ToJSON MetricDataQueryProperty
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs b/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs
@@ -0,0 +1,54 @@
+module Stratosphere.CloudWatch.Alarm.MetricProperty (
+        module Exports, MetricProperty(..), mkMetricProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.Alarm.DimensionProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html>
+    MetricProperty {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-dimensions>
+                    dimensions :: (Prelude.Maybe [DimensionProperty]),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-metricname>
+                    metricName :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-namespace>
+                    namespace :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricProperty :: MetricProperty
+mkMetricProperty
+  = MetricProperty
+      {haddock_workaround_ = (), dimensions = Prelude.Nothing,
+       metricName = Prelude.Nothing, namespace = Prelude.Nothing}
+instance ToResourceProperties MetricProperty where
+  toResourceProperties MetricProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Alarm.Metric",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Dimensions" Prelude.<$> dimensions,
+                            (JSON..=) "MetricName" Prelude.<$> metricName,
+                            (JSON..=) "Namespace" Prelude.<$> namespace])}
+instance JSON.ToJSON MetricProperty where
+  toJSON MetricProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Dimensions" Prelude.<$> dimensions,
+               (JSON..=) "MetricName" Prelude.<$> metricName,
+               (JSON..=) "Namespace" Prelude.<$> namespace]))
+instance Property "Dimensions" MetricProperty where
+  type PropertyType "Dimensions" MetricProperty = [DimensionProperty]
+  set newValue MetricProperty {..}
+    = MetricProperty {dimensions = Prelude.pure newValue, ..}
+instance Property "MetricName" MetricProperty where
+  type PropertyType "MetricName" MetricProperty = Value Prelude.Text
+  set newValue MetricProperty {..}
+    = MetricProperty {metricName = Prelude.pure newValue, ..}
+instance Property "Namespace" MetricProperty where
+  type PropertyType "Namespace" MetricProperty = Value Prelude.Text
+  set newValue MetricProperty {..}
+    = MetricProperty {namespace = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs-boot b/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.Alarm.MetricProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricProperty :: Prelude.Type
+instance ToResourceProperties MetricProperty
+instance Prelude.Eq MetricProperty
+instance Prelude.Show MetricProperty
+instance JSON.ToJSON MetricProperty
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs b/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs
@@ -0,0 +1,63 @@
+module Stratosphere.CloudWatch.Alarm.MetricStatProperty (
+        module Exports, MetricStatProperty(..), mkMetricStatProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.Alarm.MetricProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricStatProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html>
+    MetricStatProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-metric>
+                        metric :: MetricProperty,
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-period>
+                        period :: (Value Prelude.Integer),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-stat>
+                        stat :: (Value Prelude.Text),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-unit>
+                        unit :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStatProperty ::
+  MetricProperty
+  -> Value Prelude.Integer
+     -> Value Prelude.Text -> MetricStatProperty
+mkMetricStatProperty metric period stat
+  = MetricStatProperty
+      {haddock_workaround_ = (), metric = metric, period = period,
+       stat = stat, unit = Prelude.Nothing}
+instance ToResourceProperties MetricStatProperty where
+  toResourceProperties MetricStatProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Alarm.MetricStat",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Metric" JSON..= metric, "Period" JSON..= period,
+                            "Stat" JSON..= stat]
+                           (Prelude.catMaybes [(JSON..=) "Unit" Prelude.<$> unit]))}
+instance JSON.ToJSON MetricStatProperty where
+  toJSON MetricStatProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Metric" JSON..= metric, "Period" JSON..= period,
+               "Stat" JSON..= stat]
+              (Prelude.catMaybes [(JSON..=) "Unit" Prelude.<$> unit])))
+instance Property "Metric" MetricStatProperty where
+  type PropertyType "Metric" MetricStatProperty = MetricProperty
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {metric = newValue, ..}
+instance Property "Period" MetricStatProperty where
+  type PropertyType "Period" MetricStatProperty = Value Prelude.Integer
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {period = newValue, ..}
+instance Property "Stat" MetricStatProperty where
+  type PropertyType "Stat" MetricStatProperty = Value Prelude.Text
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {stat = newValue, ..}
+instance Property "Unit" MetricStatProperty where
+  type PropertyType "Unit" MetricStatProperty = Value Prelude.Text
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {unit = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs-boot b/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Alarm/MetricStatProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.Alarm.MetricStatProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricStatProperty :: Prelude.Type
+instance ToResourceProperties MetricStatProperty
+instance Prelude.Eq MetricStatProperty
+instance Prelude.Show MetricStatProperty
+instance JSON.ToJSON MetricStatProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector.hs
@@ -0,0 +1,112 @@
+module Stratosphere.CloudWatch.AnomalyDetector (
+        module Exports, AnomalyDetector(..), mkAnomalyDetector
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.ConfigurationProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricCharacteristicsProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricMathAnomalyDetectorProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.SingleMetricAnomalyDetectorProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AnomalyDetector
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html>
+    AnomalyDetector {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-configuration>
+                     configuration :: (Prelude.Maybe ConfigurationProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-dimensions>
+                     dimensions :: (Prelude.Maybe [DimensionProperty]),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metriccharacteristics>
+                     metricCharacteristics :: (Prelude.Maybe MetricCharacteristicsProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector>
+                     metricMathAnomalyDetector :: (Prelude.Maybe MetricMathAnomalyDetectorProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricname>
+                     metricName :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-namespace>
+                     namespace :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector>
+                     singleMetricAnomalyDetector :: (Prelude.Maybe SingleMetricAnomalyDetectorProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-stat>
+                     stat :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAnomalyDetector :: AnomalyDetector
+mkAnomalyDetector
+  = AnomalyDetector
+      {haddock_workaround_ = (), configuration = Prelude.Nothing,
+       dimensions = Prelude.Nothing,
+       metricCharacteristics = Prelude.Nothing,
+       metricMathAnomalyDetector = Prelude.Nothing,
+       metricName = Prelude.Nothing, namespace = Prelude.Nothing,
+       singleMetricAnomalyDetector = Prelude.Nothing,
+       stat = Prelude.Nothing}
+instance ToResourceProperties AnomalyDetector where
+  toResourceProperties AnomalyDetector {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Configuration" Prelude.<$> configuration,
+                            (JSON..=) "Dimensions" Prelude.<$> dimensions,
+                            (JSON..=) "MetricCharacteristics"
+                              Prelude.<$> metricCharacteristics,
+                            (JSON..=) "MetricMathAnomalyDetector"
+                              Prelude.<$> metricMathAnomalyDetector,
+                            (JSON..=) "MetricName" Prelude.<$> metricName,
+                            (JSON..=) "Namespace" Prelude.<$> namespace,
+                            (JSON..=) "SingleMetricAnomalyDetector"
+                              Prelude.<$> singleMetricAnomalyDetector,
+                            (JSON..=) "Stat" Prelude.<$> stat])}
+instance JSON.ToJSON AnomalyDetector where
+  toJSON AnomalyDetector {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Configuration" Prelude.<$> configuration,
+               (JSON..=) "Dimensions" Prelude.<$> dimensions,
+               (JSON..=) "MetricCharacteristics"
+                 Prelude.<$> metricCharacteristics,
+               (JSON..=) "MetricMathAnomalyDetector"
+                 Prelude.<$> metricMathAnomalyDetector,
+               (JSON..=) "MetricName" Prelude.<$> metricName,
+               (JSON..=) "Namespace" Prelude.<$> namespace,
+               (JSON..=) "SingleMetricAnomalyDetector"
+                 Prelude.<$> singleMetricAnomalyDetector,
+               (JSON..=) "Stat" Prelude.<$> stat]))
+instance Property "Configuration" AnomalyDetector where
+  type PropertyType "Configuration" AnomalyDetector = ConfigurationProperty
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector {configuration = Prelude.pure newValue, ..}
+instance Property "Dimensions" AnomalyDetector where
+  type PropertyType "Dimensions" AnomalyDetector = [DimensionProperty]
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector {dimensions = Prelude.pure newValue, ..}
+instance Property "MetricCharacteristics" AnomalyDetector where
+  type PropertyType "MetricCharacteristics" AnomalyDetector = MetricCharacteristicsProperty
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector
+        {metricCharacteristics = Prelude.pure newValue, ..}
+instance Property "MetricMathAnomalyDetector" AnomalyDetector where
+  type PropertyType "MetricMathAnomalyDetector" AnomalyDetector = MetricMathAnomalyDetectorProperty
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector
+        {metricMathAnomalyDetector = Prelude.pure newValue, ..}
+instance Property "MetricName" AnomalyDetector where
+  type PropertyType "MetricName" AnomalyDetector = Value Prelude.Text
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector {metricName = Prelude.pure newValue, ..}
+instance Property "Namespace" AnomalyDetector where
+  type PropertyType "Namespace" AnomalyDetector = Value Prelude.Text
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector {namespace = Prelude.pure newValue, ..}
+instance Property "SingleMetricAnomalyDetector" AnomalyDetector where
+  type PropertyType "SingleMetricAnomalyDetector" AnomalyDetector = SingleMetricAnomalyDetectorProperty
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector
+        {singleMetricAnomalyDetector = Prelude.pure newValue, ..}
+instance Property "Stat" AnomalyDetector where
+  type PropertyType "Stat" AnomalyDetector = Value Prelude.Text
+  set newValue AnomalyDetector {..}
+    = AnomalyDetector {stat = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs
@@ -0,0 +1,48 @@
+module Stratosphere.CloudWatch.AnomalyDetector.ConfigurationProperty (
+        module Exports, ConfigurationProperty(..), mkConfigurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.RangeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ConfigurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html>
+    ConfigurationProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html#cfn-cloudwatch-anomalydetector-configuration-excludedtimeranges>
+                           excludedTimeRanges :: (Prelude.Maybe [RangeProperty]),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html#cfn-cloudwatch-anomalydetector-configuration-metrictimezone>
+                           metricTimeZone :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkConfigurationProperty :: ConfigurationProperty
+mkConfigurationProperty
+  = ConfigurationProperty
+      {haddock_workaround_ = (), excludedTimeRanges = Prelude.Nothing,
+       metricTimeZone = Prelude.Nothing}
+instance ToResourceProperties ConfigurationProperty where
+  toResourceProperties ConfigurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.Configuration",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ExcludedTimeRanges" Prelude.<$> excludedTimeRanges,
+                            (JSON..=) "MetricTimeZone" Prelude.<$> metricTimeZone])}
+instance JSON.ToJSON ConfigurationProperty where
+  toJSON ConfigurationProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ExcludedTimeRanges" Prelude.<$> excludedTimeRanges,
+               (JSON..=) "MetricTimeZone" Prelude.<$> metricTimeZone]))
+instance Property "ExcludedTimeRanges" ConfigurationProperty where
+  type PropertyType "ExcludedTimeRanges" ConfigurationProperty = [RangeProperty]
+  set newValue ConfigurationProperty {..}
+    = ConfigurationProperty
+        {excludedTimeRanges = Prelude.pure newValue, ..}
+instance Property "MetricTimeZone" ConfigurationProperty where
+  type PropertyType "MetricTimeZone" ConfigurationProperty = Value Prelude.Text
+  set newValue ConfigurationProperty {..}
+    = ConfigurationProperty
+        {metricTimeZone = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/ConfigurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.ConfigurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ConfigurationProperty :: Prelude.Type
+instance ToResourceProperties ConfigurationProperty
+instance Prelude.Eq ConfigurationProperty
+instance Prelude.Show ConfigurationProperty
+instance JSON.ToJSON ConfigurationProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty (
+        DimensionProperty(..), mkDimensionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DimensionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html>
+    DimensionProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html#cfn-cloudwatch-anomalydetector-dimension-name>
+                       name :: (Value Prelude.Text),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html#cfn-cloudwatch-anomalydetector-dimension-value>
+                       value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDimensionProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> DimensionProperty
+mkDimensionProperty name value
+  = DimensionProperty
+      {haddock_workaround_ = (), name = name, value = value}
+instance ToResourceProperties DimensionProperty where
+  toResourceProperties DimensionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.Dimension",
+         supportsTags = Prelude.False,
+         properties = ["Name" JSON..= name, "Value" JSON..= value]}
+instance JSON.ToJSON DimensionProperty where
+  toJSON DimensionProperty {..}
+    = JSON.object ["Name" JSON..= name, "Value" JSON..= value]
+instance Property "Name" DimensionProperty where
+  type PropertyType "Name" DimensionProperty = Value Prelude.Text
+  set newValue DimensionProperty {..}
+    = DimensionProperty {name = newValue, ..}
+instance Property "Value" DimensionProperty where
+  type PropertyType "Value" DimensionProperty = Value Prelude.Text
+  set newValue DimensionProperty {..}
+    = DimensionProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/DimensionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DimensionProperty :: Prelude.Type
+instance ToResourceProperties DimensionProperty
+instance Prelude.Eq DimensionProperty
+instance Prelude.Show DimensionProperty
+instance JSON.ToJSON DimensionProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricCharacteristicsProperty (
+        MetricCharacteristicsProperty(..), mkMetricCharacteristicsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricCharacteristicsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metriccharacteristics.html>
+    MetricCharacteristicsProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metriccharacteristics.html#cfn-cloudwatch-anomalydetector-metriccharacteristics-periodicspikes>
+                                   periodicSpikes :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricCharacteristicsProperty :: MetricCharacteristicsProperty
+mkMetricCharacteristicsProperty
+  = MetricCharacteristicsProperty
+      {haddock_workaround_ = (), periodicSpikes = Prelude.Nothing}
+instance ToResourceProperties MetricCharacteristicsProperty where
+  toResourceProperties MetricCharacteristicsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.MetricCharacteristics",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "PeriodicSpikes" Prelude.<$> periodicSpikes])}
+instance JSON.ToJSON MetricCharacteristicsProperty where
+  toJSON MetricCharacteristicsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "PeriodicSpikes" Prelude.<$> periodicSpikes]))
+instance Property "PeriodicSpikes" MetricCharacteristicsProperty where
+  type PropertyType "PeriodicSpikes" MetricCharacteristicsProperty = Value Prelude.Bool
+  set newValue MetricCharacteristicsProperty {..}
+    = MetricCharacteristicsProperty
+        {periodicSpikes = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricCharacteristicsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricCharacteristicsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricCharacteristicsProperty :: Prelude.Type
+instance ToResourceProperties MetricCharacteristicsProperty
+instance Prelude.Eq MetricCharacteristicsProperty
+instance Prelude.Show MetricCharacteristicsProperty
+instance JSON.ToJSON MetricCharacteristicsProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs
@@ -0,0 +1,5 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueriesProperty (
+        module Exports, MetricDataQueriesProperty
+    ) where
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty as Exports
+type MetricDataQueriesProperty = [MetricDataQueryProperty]
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueriesProperty.hs-boot
@@ -0,0 +1,5 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueriesProperty (
+        module Exports, MetricDataQueriesProperty
+    ) where
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty as Exports
+type MetricDataQueriesProperty = [MetricDataQueryProperty]
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs
@@ -0,0 +1,92 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty (
+        module Exports, MetricDataQueryProperty(..),
+        mkMetricDataQueryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricStatProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricDataQueryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html>
+    MetricDataQueryProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-accountid>
+                             accountId :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-expression>
+                             expression :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-id>
+                             id :: (Value Prelude.Text),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-label>
+                             label :: (Prelude.Maybe (Value Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-metricstat>
+                             metricStat :: (Prelude.Maybe MetricStatProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-period>
+                             period :: (Prelude.Maybe (Value Prelude.Integer)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-returndata>
+                             returnData :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricDataQueryProperty ::
+  Value Prelude.Text -> MetricDataQueryProperty
+mkMetricDataQueryProperty id
+  = MetricDataQueryProperty
+      {haddock_workaround_ = (), id = id, accountId = Prelude.Nothing,
+       expression = Prelude.Nothing, label = Prelude.Nothing,
+       metricStat = Prelude.Nothing, period = Prelude.Nothing,
+       returnData = Prelude.Nothing}
+instance ToResourceProperties MetricDataQueryProperty where
+  toResourceProperties MetricDataQueryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.MetricDataQuery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Id" JSON..= id]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AccountId" Prelude.<$> accountId,
+                               (JSON..=) "Expression" Prelude.<$> expression,
+                               (JSON..=) "Label" Prelude.<$> label,
+                               (JSON..=) "MetricStat" Prelude.<$> metricStat,
+                               (JSON..=) "Period" Prelude.<$> period,
+                               (JSON..=) "ReturnData" Prelude.<$> returnData]))}
+instance JSON.ToJSON MetricDataQueryProperty where
+  toJSON MetricDataQueryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Id" JSON..= id]
+              (Prelude.catMaybes
+                 [(JSON..=) "AccountId" Prelude.<$> accountId,
+                  (JSON..=) "Expression" Prelude.<$> expression,
+                  (JSON..=) "Label" Prelude.<$> label,
+                  (JSON..=) "MetricStat" Prelude.<$> metricStat,
+                  (JSON..=) "Period" Prelude.<$> period,
+                  (JSON..=) "ReturnData" Prelude.<$> returnData])))
+instance Property "AccountId" MetricDataQueryProperty where
+  type PropertyType "AccountId" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {accountId = Prelude.pure newValue, ..}
+instance Property "Expression" MetricDataQueryProperty where
+  type PropertyType "Expression" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {expression = Prelude.pure newValue, ..}
+instance Property "Id" MetricDataQueryProperty where
+  type PropertyType "Id" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {id = newValue, ..}
+instance Property "Label" MetricDataQueryProperty where
+  type PropertyType "Label" MetricDataQueryProperty = Value Prelude.Text
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {label = Prelude.pure newValue, ..}
+instance Property "MetricStat" MetricDataQueryProperty where
+  type PropertyType "MetricStat" MetricDataQueryProperty = MetricStatProperty
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {metricStat = Prelude.pure newValue, ..}
+instance Property "Period" MetricDataQueryProperty where
+  type PropertyType "Period" MetricDataQueryProperty = Value Prelude.Integer
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {period = Prelude.pure newValue, ..}
+instance Property "ReturnData" MetricDataQueryProperty where
+  type PropertyType "ReturnData" MetricDataQueryProperty = Value Prelude.Bool
+  set newValue MetricDataQueryProperty {..}
+    = MetricDataQueryProperty {returnData = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricDataQueryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricDataQueryProperty :: Prelude.Type
+instance ToResourceProperties MetricDataQueryProperty
+instance Prelude.Eq MetricDataQueryProperty
+instance Prelude.Show MetricDataQueryProperty
+instance JSON.ToJSON MetricDataQueryProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricMathAnomalyDetectorProperty (
+        module Exports, MetricMathAnomalyDetectorProperty(..),
+        mkMetricMathAnomalyDetectorProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty as Exports
+import Stratosphere.ResourceProperties
+data MetricMathAnomalyDetectorProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html>
+    MetricMathAnomalyDetectorProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector-metricdataqueries>
+                                       metricDataQueries :: (Prelude.Maybe [MetricDataQueryProperty])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricMathAnomalyDetectorProperty ::
+  MetricMathAnomalyDetectorProperty
+mkMetricMathAnomalyDetectorProperty
+  = MetricMathAnomalyDetectorProperty
+      {haddock_workaround_ = (), metricDataQueries = Prelude.Nothing}
+instance ToResourceProperties MetricMathAnomalyDetectorProperty where
+  toResourceProperties MetricMathAnomalyDetectorProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.MetricMathAnomalyDetector",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "MetricDataQueries" Prelude.<$> metricDataQueries])}
+instance JSON.ToJSON MetricMathAnomalyDetectorProperty where
+  toJSON MetricMathAnomalyDetectorProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "MetricDataQueries" Prelude.<$> metricDataQueries]))
+instance Property "MetricDataQueries" MetricMathAnomalyDetectorProperty where
+  type PropertyType "MetricDataQueries" MetricMathAnomalyDetectorProperty = [MetricDataQueryProperty]
+  set newValue MetricMathAnomalyDetectorProperty {..}
+    = MetricMathAnomalyDetectorProperty
+        {metricDataQueries = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricMathAnomalyDetectorProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricMathAnomalyDetectorProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricMathAnomalyDetectorProperty :: Prelude.Type
+instance ToResourceProperties MetricMathAnomalyDetectorProperty
+instance Prelude.Eq MetricMathAnomalyDetectorProperty
+instance Prelude.Show MetricMathAnomalyDetectorProperty
+instance JSON.ToJSON MetricMathAnomalyDetectorProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs
@@ -0,0 +1,55 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricProperty (
+        module Exports, MetricProperty(..), mkMetricProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html>
+    MetricProperty {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-dimensions>
+                    dimensions :: (Prelude.Maybe [DimensionProperty]),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-metricname>
+                    metricName :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-namespace>
+                    namespace :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> MetricProperty
+mkMetricProperty metricName namespace
+  = MetricProperty
+      {haddock_workaround_ = (), metricName = metricName,
+       namespace = namespace, dimensions = Prelude.Nothing}
+instance ToResourceProperties MetricProperty where
+  toResourceProperties MetricProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.Metric",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MetricName" JSON..= metricName, "Namespace" JSON..= namespace]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Dimensions" Prelude.<$> dimensions]))}
+instance JSON.ToJSON MetricProperty where
+  toJSON MetricProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MetricName" JSON..= metricName, "Namespace" JSON..= namespace]
+              (Prelude.catMaybes
+                 [(JSON..=) "Dimensions" Prelude.<$> dimensions])))
+instance Property "Dimensions" MetricProperty where
+  type PropertyType "Dimensions" MetricProperty = [DimensionProperty]
+  set newValue MetricProperty {..}
+    = MetricProperty {dimensions = Prelude.pure newValue, ..}
+instance Property "MetricName" MetricProperty where
+  type PropertyType "MetricName" MetricProperty = Value Prelude.Text
+  set newValue MetricProperty {..}
+    = MetricProperty {metricName = newValue, ..}
+instance Property "Namespace" MetricProperty where
+  type PropertyType "Namespace" MetricProperty = Value Prelude.Text
+  set newValue MetricProperty {..}
+    = MetricProperty {namespace = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricProperty :: Prelude.Type
+instance ToResourceProperties MetricProperty
+instance Prelude.Eq MetricProperty
+instance Prelude.Show MetricProperty
+instance JSON.ToJSON MetricProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs
@@ -0,0 +1,63 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricStatProperty (
+        module Exports, MetricStatProperty(..), mkMetricStatProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.MetricProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricStatProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html>
+    MetricStatProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-metric>
+                        metric :: MetricProperty,
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-period>
+                        period :: (Value Prelude.Integer),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-stat>
+                        stat :: (Value Prelude.Text),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-unit>
+                        unit :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStatProperty ::
+  MetricProperty
+  -> Value Prelude.Integer
+     -> Value Prelude.Text -> MetricStatProperty
+mkMetricStatProperty metric period stat
+  = MetricStatProperty
+      {haddock_workaround_ = (), metric = metric, period = period,
+       stat = stat, unit = Prelude.Nothing}
+instance ToResourceProperties MetricStatProperty where
+  toResourceProperties MetricStatProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.MetricStat",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Metric" JSON..= metric, "Period" JSON..= period,
+                            "Stat" JSON..= stat]
+                           (Prelude.catMaybes [(JSON..=) "Unit" Prelude.<$> unit]))}
+instance JSON.ToJSON MetricStatProperty where
+  toJSON MetricStatProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Metric" JSON..= metric, "Period" JSON..= period,
+               "Stat" JSON..= stat]
+              (Prelude.catMaybes [(JSON..=) "Unit" Prelude.<$> unit])))
+instance Property "Metric" MetricStatProperty where
+  type PropertyType "Metric" MetricStatProperty = MetricProperty
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {metric = newValue, ..}
+instance Property "Period" MetricStatProperty where
+  type PropertyType "Period" MetricStatProperty = Value Prelude.Integer
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {period = newValue, ..}
+instance Property "Stat" MetricStatProperty where
+  type PropertyType "Stat" MetricStatProperty = Value Prelude.Text
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {stat = newValue, ..}
+instance Property "Unit" MetricStatProperty where
+  type PropertyType "Unit" MetricStatProperty = Value Prelude.Text
+  set newValue MetricStatProperty {..}
+    = MetricStatProperty {unit = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/MetricStatProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.MetricStatProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricStatProperty :: Prelude.Type
+instance ToResourceProperties MetricStatProperty
+instance Prelude.Eq MetricStatProperty
+instance Prelude.Show MetricStatProperty
+instance JSON.ToJSON MetricStatProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.CloudWatch.AnomalyDetector.RangeProperty (
+        RangeProperty(..), mkRangeProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data RangeProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html>
+    RangeProperty {haddock_workaround_ :: (),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html#cfn-cloudwatch-anomalydetector-range-endtime>
+                   endTime :: (Value Prelude.Text),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html#cfn-cloudwatch-anomalydetector-range-starttime>
+                   startTime :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkRangeProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> RangeProperty
+mkRangeProperty endTime startTime
+  = RangeProperty
+      {haddock_workaround_ = (), endTime = endTime,
+       startTime = startTime}
+instance ToResourceProperties RangeProperty where
+  toResourceProperties RangeProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.Range",
+         supportsTags = Prelude.False,
+         properties = ["EndTime" JSON..= endTime,
+                       "StartTime" JSON..= startTime]}
+instance JSON.ToJSON RangeProperty where
+  toJSON RangeProperty {..}
+    = JSON.object
+        ["EndTime" JSON..= endTime, "StartTime" JSON..= startTime]
+instance Property "EndTime" RangeProperty where
+  type PropertyType "EndTime" RangeProperty = Value Prelude.Text
+  set newValue RangeProperty {..}
+    = RangeProperty {endTime = newValue, ..}
+instance Property "StartTime" RangeProperty where
+  type PropertyType "StartTime" RangeProperty = Value Prelude.Text
+  set newValue RangeProperty {..}
+    = RangeProperty {startTime = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/RangeProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.RangeProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data RangeProperty :: Prelude.Type
+instance ToResourceProperties RangeProperty
+instance Prelude.Eq RangeProperty
+instance Prelude.Show RangeProperty
+instance JSON.ToJSON RangeProperty
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs b/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs
@@ -0,0 +1,78 @@
+module Stratosphere.CloudWatch.AnomalyDetector.SingleMetricAnomalyDetectorProperty (
+        module Exports, SingleMetricAnomalyDetectorProperty(..),
+        mkSingleMetricAnomalyDetectorProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data SingleMetricAnomalyDetectorProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html>
+    SingleMetricAnomalyDetectorProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-accountid>
+                                         accountId :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-dimensions>
+                                         dimensions :: (Prelude.Maybe [DimensionProperty]),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-metricname>
+                                         metricName :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-namespace>
+                                         namespace :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-stat>
+                                         stat :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSingleMetricAnomalyDetectorProperty ::
+  SingleMetricAnomalyDetectorProperty
+mkSingleMetricAnomalyDetectorProperty
+  = SingleMetricAnomalyDetectorProperty
+      {haddock_workaround_ = (), accountId = Prelude.Nothing,
+       dimensions = Prelude.Nothing, metricName = Prelude.Nothing,
+       namespace = Prelude.Nothing, stat = Prelude.Nothing}
+instance ToResourceProperties SingleMetricAnomalyDetectorProperty where
+  toResourceProperties SingleMetricAnomalyDetectorProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::AnomalyDetector.SingleMetricAnomalyDetector",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AccountId" Prelude.<$> accountId,
+                            (JSON..=) "Dimensions" Prelude.<$> dimensions,
+                            (JSON..=) "MetricName" Prelude.<$> metricName,
+                            (JSON..=) "Namespace" Prelude.<$> namespace,
+                            (JSON..=) "Stat" Prelude.<$> stat])}
+instance JSON.ToJSON SingleMetricAnomalyDetectorProperty where
+  toJSON SingleMetricAnomalyDetectorProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AccountId" Prelude.<$> accountId,
+               (JSON..=) "Dimensions" Prelude.<$> dimensions,
+               (JSON..=) "MetricName" Prelude.<$> metricName,
+               (JSON..=) "Namespace" Prelude.<$> namespace,
+               (JSON..=) "Stat" Prelude.<$> stat]))
+instance Property "AccountId" SingleMetricAnomalyDetectorProperty where
+  type PropertyType "AccountId" SingleMetricAnomalyDetectorProperty = Value Prelude.Text
+  set newValue SingleMetricAnomalyDetectorProperty {..}
+    = SingleMetricAnomalyDetectorProperty
+        {accountId = Prelude.pure newValue, ..}
+instance Property "Dimensions" SingleMetricAnomalyDetectorProperty where
+  type PropertyType "Dimensions" SingleMetricAnomalyDetectorProperty = [DimensionProperty]
+  set newValue SingleMetricAnomalyDetectorProperty {..}
+    = SingleMetricAnomalyDetectorProperty
+        {dimensions = Prelude.pure newValue, ..}
+instance Property "MetricName" SingleMetricAnomalyDetectorProperty where
+  type PropertyType "MetricName" SingleMetricAnomalyDetectorProperty = Value Prelude.Text
+  set newValue SingleMetricAnomalyDetectorProperty {..}
+    = SingleMetricAnomalyDetectorProperty
+        {metricName = Prelude.pure newValue, ..}
+instance Property "Namespace" SingleMetricAnomalyDetectorProperty where
+  type PropertyType "Namespace" SingleMetricAnomalyDetectorProperty = Value Prelude.Text
+  set newValue SingleMetricAnomalyDetectorProperty {..}
+    = SingleMetricAnomalyDetectorProperty
+        {namespace = Prelude.pure newValue, ..}
+instance Property "Stat" SingleMetricAnomalyDetectorProperty where
+  type PropertyType "Stat" SingleMetricAnomalyDetectorProperty = Value Prelude.Text
+  set newValue SingleMetricAnomalyDetectorProperty {..}
+    = SingleMetricAnomalyDetectorProperty
+        {stat = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs-boot b/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/AnomalyDetector/SingleMetricAnomalyDetectorProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.AnomalyDetector.SingleMetricAnomalyDetectorProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SingleMetricAnomalyDetectorProperty :: Prelude.Type
+instance ToResourceProperties SingleMetricAnomalyDetectorProperty
+instance Prelude.Eq SingleMetricAnomalyDetectorProperty
+instance Prelude.Show SingleMetricAnomalyDetectorProperty
+instance JSON.ToJSON SingleMetricAnomalyDetectorProperty
diff --git a/gen/Stratosphere/CloudWatch/CompositeAlarm.hs b/gen/Stratosphere/CloudWatch/CompositeAlarm.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/CompositeAlarm.hs
@@ -0,0 +1,136 @@
+module Stratosphere.CloudWatch.CompositeAlarm (
+        CompositeAlarm(..), mkCompositeAlarm
+    ) 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 CompositeAlarm
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html>
+    CompositeAlarm {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionsenabled>
+                    actionsEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressor>
+                    actionsSuppressor :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressorextensionperiod>
+                    actionsSuppressorExtensionPeriod :: (Prelude.Maybe (Value Prelude.Integer)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressorwaitperiod>
+                    actionsSuppressorWaitPeriod :: (Prelude.Maybe (Value Prelude.Integer)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmactions>
+                    alarmActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmdescription>
+                    alarmDescription :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmname>
+                    alarmName :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmrule>
+                    alarmRule :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-insufficientdataactions>
+                    insufficientDataActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-okactions>
+                    oKActions :: (Prelude.Maybe (ValueList Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-tags>
+                    tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCompositeAlarm :: Value Prelude.Text -> CompositeAlarm
+mkCompositeAlarm alarmRule
+  = CompositeAlarm
+      {haddock_workaround_ = (), alarmRule = alarmRule,
+       actionsEnabled = Prelude.Nothing,
+       actionsSuppressor = Prelude.Nothing,
+       actionsSuppressorExtensionPeriod = Prelude.Nothing,
+       actionsSuppressorWaitPeriod = Prelude.Nothing,
+       alarmActions = Prelude.Nothing, alarmDescription = Prelude.Nothing,
+       alarmName = Prelude.Nothing,
+       insufficientDataActions = Prelude.Nothing,
+       oKActions = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties CompositeAlarm where
+  toResourceProperties CompositeAlarm {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::CompositeAlarm",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["AlarmRule" JSON..= alarmRule]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ActionsEnabled" Prelude.<$> actionsEnabled,
+                               (JSON..=) "ActionsSuppressor" Prelude.<$> actionsSuppressor,
+                               (JSON..=) "ActionsSuppressorExtensionPeriod"
+                                 Prelude.<$> actionsSuppressorExtensionPeriod,
+                               (JSON..=) "ActionsSuppressorWaitPeriod"
+                                 Prelude.<$> actionsSuppressorWaitPeriod,
+                               (JSON..=) "AlarmActions" Prelude.<$> alarmActions,
+                               (JSON..=) "AlarmDescription" Prelude.<$> alarmDescription,
+                               (JSON..=) "AlarmName" Prelude.<$> alarmName,
+                               (JSON..=) "InsufficientDataActions"
+                                 Prelude.<$> insufficientDataActions,
+                               (JSON..=) "OKActions" Prelude.<$> oKActions,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON CompositeAlarm where
+  toJSON CompositeAlarm {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["AlarmRule" JSON..= alarmRule]
+              (Prelude.catMaybes
+                 [(JSON..=) "ActionsEnabled" Prelude.<$> actionsEnabled,
+                  (JSON..=) "ActionsSuppressor" Prelude.<$> actionsSuppressor,
+                  (JSON..=) "ActionsSuppressorExtensionPeriod"
+                    Prelude.<$> actionsSuppressorExtensionPeriod,
+                  (JSON..=) "ActionsSuppressorWaitPeriod"
+                    Prelude.<$> actionsSuppressorWaitPeriod,
+                  (JSON..=) "AlarmActions" Prelude.<$> alarmActions,
+                  (JSON..=) "AlarmDescription" Prelude.<$> alarmDescription,
+                  (JSON..=) "AlarmName" Prelude.<$> alarmName,
+                  (JSON..=) "InsufficientDataActions"
+                    Prelude.<$> insufficientDataActions,
+                  (JSON..=) "OKActions" Prelude.<$> oKActions,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "ActionsEnabled" CompositeAlarm where
+  type PropertyType "ActionsEnabled" CompositeAlarm = Value Prelude.Bool
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {actionsEnabled = Prelude.pure newValue, ..}
+instance Property "ActionsSuppressor" CompositeAlarm where
+  type PropertyType "ActionsSuppressor" CompositeAlarm = Value Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {actionsSuppressor = Prelude.pure newValue, ..}
+instance Property "ActionsSuppressorExtensionPeriod" CompositeAlarm where
+  type PropertyType "ActionsSuppressorExtensionPeriod" CompositeAlarm = Value Prelude.Integer
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm
+        {actionsSuppressorExtensionPeriod = Prelude.pure newValue, ..}
+instance Property "ActionsSuppressorWaitPeriod" CompositeAlarm where
+  type PropertyType "ActionsSuppressorWaitPeriod" CompositeAlarm = Value Prelude.Integer
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm
+        {actionsSuppressorWaitPeriod = Prelude.pure newValue, ..}
+instance Property "AlarmActions" CompositeAlarm where
+  type PropertyType "AlarmActions" CompositeAlarm = ValueList Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {alarmActions = Prelude.pure newValue, ..}
+instance Property "AlarmDescription" CompositeAlarm where
+  type PropertyType "AlarmDescription" CompositeAlarm = Value Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {alarmDescription = Prelude.pure newValue, ..}
+instance Property "AlarmName" CompositeAlarm where
+  type PropertyType "AlarmName" CompositeAlarm = Value Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {alarmName = Prelude.pure newValue, ..}
+instance Property "AlarmRule" CompositeAlarm where
+  type PropertyType "AlarmRule" CompositeAlarm = Value Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {alarmRule = newValue, ..}
+instance Property "InsufficientDataActions" CompositeAlarm where
+  type PropertyType "InsufficientDataActions" CompositeAlarm = ValueList Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm
+        {insufficientDataActions = Prelude.pure newValue, ..}
+instance Property "OKActions" CompositeAlarm where
+  type PropertyType "OKActions" CompositeAlarm = ValueList Prelude.Text
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {oKActions = Prelude.pure newValue, ..}
+instance Property "Tags" CompositeAlarm where
+  type PropertyType "Tags" CompositeAlarm = [Tag]
+  set newValue CompositeAlarm {..}
+    = CompositeAlarm {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/Dashboard.hs b/gen/Stratosphere/CloudWatch/Dashboard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/Dashboard.hs
@@ -0,0 +1,47 @@
+module Stratosphere.CloudWatch.Dashboard (
+        Dashboard(..), mkDashboard
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data Dashboard
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html>
+    Dashboard {haddock_workaround_ :: (),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html#cfn-cloudwatch-dashboard-dashboardbody>
+               dashboardBody :: (Value Prelude.Text),
+               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html#cfn-cloudwatch-dashboard-dashboardname>
+               dashboardName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDashboard :: Value Prelude.Text -> Dashboard
+mkDashboard dashboardBody
+  = Dashboard
+      {haddock_workaround_ = (), dashboardBody = dashboardBody,
+       dashboardName = Prelude.Nothing}
+instance ToResourceProperties Dashboard where
+  toResourceProperties Dashboard {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::Dashboard",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["DashboardBody" JSON..= dashboardBody]
+                           (Prelude.catMaybes
+                              [(JSON..=) "DashboardName" Prelude.<$> dashboardName]))}
+instance JSON.ToJSON Dashboard where
+  toJSON Dashboard {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["DashboardBody" JSON..= dashboardBody]
+              (Prelude.catMaybes
+                 [(JSON..=) "DashboardName" Prelude.<$> dashboardName])))
+instance Property "DashboardBody" Dashboard where
+  type PropertyType "DashboardBody" Dashboard = Value Prelude.Text
+  set newValue Dashboard {..}
+    = Dashboard {dashboardBody = newValue, ..}
+instance Property "DashboardName" Dashboard where
+  type PropertyType "DashboardName" Dashboard = Value Prelude.Text
+  set newValue Dashboard {..}
+    = Dashboard {dashboardName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/InsightRule.hs b/gen/Stratosphere/CloudWatch/InsightRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/InsightRule.hs
@@ -0,0 +1,75 @@
+module Stratosphere.CloudWatch.InsightRule (
+        module Exports, InsightRule(..), mkInsightRule
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.InsightRule.TagsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data InsightRule
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html>
+    InsightRule {haddock_workaround_ :: (),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-applyontransformedlogs>
+                 applyOnTransformedLogs :: (Prelude.Maybe (Value Prelude.Bool)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulebody>
+                 ruleBody :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulename>
+                 ruleName :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulestate>
+                 ruleState :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-tags>
+                 tags :: (Prelude.Maybe TagsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkInsightRule ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> Value Prelude.Text -> InsightRule
+mkInsightRule ruleBody ruleName ruleState
+  = InsightRule
+      {haddock_workaround_ = (), ruleBody = ruleBody,
+       ruleName = ruleName, ruleState = ruleState,
+       applyOnTransformedLogs = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties InsightRule where
+  toResourceProperties InsightRule {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::InsightRule",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["RuleBody" JSON..= ruleBody, "RuleName" JSON..= ruleName,
+                            "RuleState" JSON..= ruleState]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ApplyOnTransformedLogs"
+                                 Prelude.<$> applyOnTransformedLogs,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON InsightRule where
+  toJSON InsightRule {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["RuleBody" JSON..= ruleBody, "RuleName" JSON..= ruleName,
+               "RuleState" JSON..= ruleState]
+              (Prelude.catMaybes
+                 [(JSON..=) "ApplyOnTransformedLogs"
+                    Prelude.<$> applyOnTransformedLogs,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "ApplyOnTransformedLogs" InsightRule where
+  type PropertyType "ApplyOnTransformedLogs" InsightRule = Value Prelude.Bool
+  set newValue InsightRule {..}
+    = InsightRule {applyOnTransformedLogs = Prelude.pure newValue, ..}
+instance Property "RuleBody" InsightRule where
+  type PropertyType "RuleBody" InsightRule = Value Prelude.Text
+  set newValue InsightRule {..}
+    = InsightRule {ruleBody = newValue, ..}
+instance Property "RuleName" InsightRule where
+  type PropertyType "RuleName" InsightRule = Value Prelude.Text
+  set newValue InsightRule {..}
+    = InsightRule {ruleName = newValue, ..}
+instance Property "RuleState" InsightRule where
+  type PropertyType "RuleState" InsightRule = Value Prelude.Text
+  set newValue InsightRule {..}
+    = InsightRule {ruleState = newValue, ..}
+instance Property "Tags" InsightRule where
+  type PropertyType "Tags" InsightRule = TagsProperty
+  set newValue InsightRule {..}
+    = InsightRule {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs b/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs
@@ -0,0 +1,5 @@
+module Stratosphere.CloudWatch.InsightRule.TagsProperty (
+        TagsProperty
+    ) where
+import Stratosphere.Tag
+type TagsProperty = [Tag]
diff --git a/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs-boot b/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/InsightRule/TagsProperty.hs-boot
@@ -0,0 +1,5 @@
+module Stratosphere.CloudWatch.InsightRule.TagsProperty (
+        TagsProperty
+    ) where
+import Stratosphere.Tag
+type TagsProperty = [Tag]
diff --git a/gen/Stratosphere/CloudWatch/MetricStream.hs b/gen/Stratosphere/CloudWatch/MetricStream.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream.hs
@@ -0,0 +1,116 @@
+module Stratosphere.CloudWatch.MetricStream (
+        module Exports, MetricStream(..), mkMetricStream
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.MetricStream.MetricStreamFilterProperty as Exports
+import {-# SOURCE #-} Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsConfigurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data MetricStream
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html>
+    MetricStream {haddock_workaround_ :: (),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-excludefilters>
+                  excludeFilters :: (Prelude.Maybe [MetricStreamFilterProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-firehosearn>
+                  firehoseArn :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-includefilters>
+                  includeFilters :: (Prelude.Maybe [MetricStreamFilterProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-includelinkedaccountsmetrics>
+                  includeLinkedAccountsMetrics :: (Prelude.Maybe (Value Prelude.Bool)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-name>
+                  name :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-outputformat>
+                  outputFormat :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-rolearn>
+                  roleArn :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-statisticsconfigurations>
+                  statisticsConfigurations :: (Prelude.Maybe [MetricStreamStatisticsConfigurationProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-tags>
+                  tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStream ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> Value Prelude.Text -> MetricStream
+mkMetricStream firehoseArn outputFormat roleArn
+  = MetricStream
+      {haddock_workaround_ = (), firehoseArn = firehoseArn,
+       outputFormat = outputFormat, roleArn = roleArn,
+       excludeFilters = Prelude.Nothing, includeFilters = Prelude.Nothing,
+       includeLinkedAccountsMetrics = Prelude.Nothing,
+       name = Prelude.Nothing, statisticsConfigurations = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties MetricStream where
+  toResourceProperties MetricStream {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::MetricStream",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["FirehoseArn" JSON..= firehoseArn,
+                            "OutputFormat" JSON..= outputFormat, "RoleArn" JSON..= roleArn]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ExcludeFilters" Prelude.<$> excludeFilters,
+                               (JSON..=) "IncludeFilters" Prelude.<$> includeFilters,
+                               (JSON..=) "IncludeLinkedAccountsMetrics"
+                                 Prelude.<$> includeLinkedAccountsMetrics,
+                               (JSON..=) "Name" Prelude.<$> name,
+                               (JSON..=) "StatisticsConfigurations"
+                                 Prelude.<$> statisticsConfigurations,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON MetricStream where
+  toJSON MetricStream {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["FirehoseArn" JSON..= firehoseArn,
+               "OutputFormat" JSON..= outputFormat, "RoleArn" JSON..= roleArn]
+              (Prelude.catMaybes
+                 [(JSON..=) "ExcludeFilters" Prelude.<$> excludeFilters,
+                  (JSON..=) "IncludeFilters" Prelude.<$> includeFilters,
+                  (JSON..=) "IncludeLinkedAccountsMetrics"
+                    Prelude.<$> includeLinkedAccountsMetrics,
+                  (JSON..=) "Name" Prelude.<$> name,
+                  (JSON..=) "StatisticsConfigurations"
+                    Prelude.<$> statisticsConfigurations,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "ExcludeFilters" MetricStream where
+  type PropertyType "ExcludeFilters" MetricStream = [MetricStreamFilterProperty]
+  set newValue MetricStream {..}
+    = MetricStream {excludeFilters = Prelude.pure newValue, ..}
+instance Property "FirehoseArn" MetricStream where
+  type PropertyType "FirehoseArn" MetricStream = Value Prelude.Text
+  set newValue MetricStream {..}
+    = MetricStream {firehoseArn = newValue, ..}
+instance Property "IncludeFilters" MetricStream where
+  type PropertyType "IncludeFilters" MetricStream = [MetricStreamFilterProperty]
+  set newValue MetricStream {..}
+    = MetricStream {includeFilters = Prelude.pure newValue, ..}
+instance Property "IncludeLinkedAccountsMetrics" MetricStream where
+  type PropertyType "IncludeLinkedAccountsMetrics" MetricStream = Value Prelude.Bool
+  set newValue MetricStream {..}
+    = MetricStream
+        {includeLinkedAccountsMetrics = Prelude.pure newValue, ..}
+instance Property "Name" MetricStream where
+  type PropertyType "Name" MetricStream = Value Prelude.Text
+  set newValue MetricStream {..}
+    = MetricStream {name = Prelude.pure newValue, ..}
+instance Property "OutputFormat" MetricStream where
+  type PropertyType "OutputFormat" MetricStream = Value Prelude.Text
+  set newValue MetricStream {..}
+    = MetricStream {outputFormat = newValue, ..}
+instance Property "RoleArn" MetricStream where
+  type PropertyType "RoleArn" MetricStream = Value Prelude.Text
+  set newValue MetricStream {..}
+    = MetricStream {roleArn = newValue, ..}
+instance Property "StatisticsConfigurations" MetricStream where
+  type PropertyType "StatisticsConfigurations" MetricStream = [MetricStreamStatisticsConfigurationProperty]
+  set newValue MetricStream {..}
+    = MetricStream
+        {statisticsConfigurations = Prelude.pure newValue, ..}
+instance Property "Tags" MetricStream where
+  type PropertyType "Tags" MetricStream = [Tag]
+  set newValue MetricStream {..}
+    = MetricStream {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamFilterProperty (
+        MetricStreamFilterProperty(..), mkMetricStreamFilterProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricStreamFilterProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html>
+    MetricStreamFilterProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html#cfn-cloudwatch-metricstream-metricstreamfilter-metricnames>
+                                metricNames :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html#cfn-cloudwatch-metricstream-metricstreamfilter-namespace>
+                                namespace :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStreamFilterProperty ::
+  Value Prelude.Text -> MetricStreamFilterProperty
+mkMetricStreamFilterProperty namespace
+  = MetricStreamFilterProperty
+      {haddock_workaround_ = (), namespace = namespace,
+       metricNames = Prelude.Nothing}
+instance ToResourceProperties MetricStreamFilterProperty where
+  toResourceProperties MetricStreamFilterProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::MetricStream.MetricStreamFilter",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Namespace" JSON..= namespace]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MetricNames" Prelude.<$> metricNames]))}
+instance JSON.ToJSON MetricStreamFilterProperty where
+  toJSON MetricStreamFilterProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Namespace" JSON..= namespace]
+              (Prelude.catMaybes
+                 [(JSON..=) "MetricNames" Prelude.<$> metricNames])))
+instance Property "MetricNames" MetricStreamFilterProperty where
+  type PropertyType "MetricNames" MetricStreamFilterProperty = ValueList Prelude.Text
+  set newValue MetricStreamFilterProperty {..}
+    = MetricStreamFilterProperty
+        {metricNames = Prelude.pure newValue, ..}
+instance Property "Namespace" MetricStreamFilterProperty where
+  type PropertyType "Namespace" MetricStreamFilterProperty = Value Prelude.Text
+  set newValue MetricStreamFilterProperty {..}
+    = MetricStreamFilterProperty {namespace = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs-boot b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamFilterProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamFilterProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricStreamFilterProperty :: Prelude.Type
+instance ToResourceProperties MetricStreamFilterProperty
+instance Prelude.Eq MetricStreamFilterProperty
+instance Prelude.Show MetricStreamFilterProperty
+instance JSON.ToJSON MetricStreamFilterProperty
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs
@@ -0,0 +1,52 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsConfigurationProperty (
+        module Exports, MetricStreamStatisticsConfigurationProperty(..),
+        mkMetricStreamStatisticsConfigurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsMetricProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricStreamStatisticsConfigurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html>
+    MetricStreamStatisticsConfigurationProperty {haddock_workaround_ :: (),
+                                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html#cfn-cloudwatch-metricstream-metricstreamstatisticsconfiguration-additionalstatistics>
+                                                 additionalStatistics :: (ValueList Prelude.Text),
+                                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html#cfn-cloudwatch-metricstream-metricstreamstatisticsconfiguration-includemetrics>
+                                                 includeMetrics :: [MetricStreamStatisticsMetricProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStreamStatisticsConfigurationProperty ::
+  ValueList Prelude.Text
+  -> [MetricStreamStatisticsMetricProperty]
+     -> MetricStreamStatisticsConfigurationProperty
+mkMetricStreamStatisticsConfigurationProperty
+  additionalStatistics
+  includeMetrics
+  = MetricStreamStatisticsConfigurationProperty
+      {haddock_workaround_ = (),
+       additionalStatistics = additionalStatistics,
+       includeMetrics = includeMetrics}
+instance ToResourceProperties MetricStreamStatisticsConfigurationProperty where
+  toResourceProperties
+    MetricStreamStatisticsConfigurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::MetricStream.MetricStreamStatisticsConfiguration",
+         supportsTags = Prelude.False,
+         properties = ["AdditionalStatistics" JSON..= additionalStatistics,
+                       "IncludeMetrics" JSON..= includeMetrics]}
+instance JSON.ToJSON MetricStreamStatisticsConfigurationProperty where
+  toJSON MetricStreamStatisticsConfigurationProperty {..}
+    = JSON.object
+        ["AdditionalStatistics" JSON..= additionalStatistics,
+         "IncludeMetrics" JSON..= includeMetrics]
+instance Property "AdditionalStatistics" MetricStreamStatisticsConfigurationProperty where
+  type PropertyType "AdditionalStatistics" MetricStreamStatisticsConfigurationProperty = ValueList Prelude.Text
+  set newValue MetricStreamStatisticsConfigurationProperty {..}
+    = MetricStreamStatisticsConfigurationProperty
+        {additionalStatistics = newValue, ..}
+instance Property "IncludeMetrics" MetricStreamStatisticsConfigurationProperty where
+  type PropertyType "IncludeMetrics" MetricStreamStatisticsConfigurationProperty = [MetricStreamStatisticsMetricProperty]
+  set newValue MetricStreamStatisticsConfigurationProperty {..}
+    = MetricStreamStatisticsConfigurationProperty
+        {includeMetrics = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs-boot b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsConfigurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsConfigurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricStreamStatisticsConfigurationProperty :: Prelude.Type
+instance ToResourceProperties MetricStreamStatisticsConfigurationProperty
+instance Prelude.Eq MetricStreamStatisticsConfigurationProperty
+instance Prelude.Show MetricStreamStatisticsConfigurationProperty
+instance JSON.ToJSON MetricStreamStatisticsConfigurationProperty
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs
@@ -0,0 +1,43 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsMetricProperty (
+        MetricStreamStatisticsMetricProperty(..),
+        mkMetricStreamStatisticsMetricProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MetricStreamStatisticsMetricProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html>
+    MetricStreamStatisticsMetricProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html#cfn-cloudwatch-metricstream-metricstreamstatisticsmetric-metricname>
+                                          metricName :: (Value Prelude.Text),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html#cfn-cloudwatch-metricstream-metricstreamstatisticsmetric-namespace>
+                                          namespace :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMetricStreamStatisticsMetricProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> MetricStreamStatisticsMetricProperty
+mkMetricStreamStatisticsMetricProperty metricName namespace
+  = MetricStreamStatisticsMetricProperty
+      {haddock_workaround_ = (), metricName = metricName,
+       namespace = namespace}
+instance ToResourceProperties MetricStreamStatisticsMetricProperty where
+  toResourceProperties MetricStreamStatisticsMetricProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CloudWatch::MetricStream.MetricStreamStatisticsMetric",
+         supportsTags = Prelude.False,
+         properties = ["MetricName" JSON..= metricName,
+                       "Namespace" JSON..= namespace]}
+instance JSON.ToJSON MetricStreamStatisticsMetricProperty where
+  toJSON MetricStreamStatisticsMetricProperty {..}
+    = JSON.object
+        ["MetricName" JSON..= metricName, "Namespace" JSON..= namespace]
+instance Property "MetricName" MetricStreamStatisticsMetricProperty where
+  type PropertyType "MetricName" MetricStreamStatisticsMetricProperty = Value Prelude.Text
+  set newValue MetricStreamStatisticsMetricProperty {..}
+    = MetricStreamStatisticsMetricProperty {metricName = newValue, ..}
+instance Property "Namespace" MetricStreamStatisticsMetricProperty where
+  type PropertyType "Namespace" MetricStreamStatisticsMetricProperty = Value Prelude.Text
+  set newValue MetricStreamStatisticsMetricProperty {..}
+    = MetricStreamStatisticsMetricProperty {namespace = newValue, ..}
diff --git a/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs-boot b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CloudWatch/MetricStream/MetricStreamStatisticsMetricProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsMetricProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MetricStreamStatisticsMetricProperty :: Prelude.Type
+instance ToResourceProperties MetricStreamStatisticsMetricProperty
+instance Prelude.Eq MetricStreamStatisticsMetricProperty
+instance Prelude.Show MetricStreamStatisticsMetricProperty
+instance JSON.ToJSON MetricStreamStatisticsMetricProperty
diff --git a/stratosphere-cloudwatch.cabal b/stratosphere-cloudwatch.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-cloudwatch.cabal
@@ -0,0 +1,96 @@
+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-cloudwatch
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS CloudWatch.
+description:    Integration into stratosphere to generate resources and properties for AWS CloudWatch
+category:       AWS, Cloud, CloudWatch
+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.CloudWatch.Alarm
+      Stratosphere.CloudWatch.Alarm.DimensionProperty
+      Stratosphere.CloudWatch.Alarm.MetricDataQueryProperty
+      Stratosphere.CloudWatch.Alarm.MetricProperty
+      Stratosphere.CloudWatch.Alarm.MetricStatProperty
+      Stratosphere.CloudWatch.AnomalyDetector
+      Stratosphere.CloudWatch.AnomalyDetector.ConfigurationProperty
+      Stratosphere.CloudWatch.AnomalyDetector.DimensionProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricCharacteristicsProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueriesProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricDataQueryProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricMathAnomalyDetectorProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricProperty
+      Stratosphere.CloudWatch.AnomalyDetector.MetricStatProperty
+      Stratosphere.CloudWatch.AnomalyDetector.RangeProperty
+      Stratosphere.CloudWatch.AnomalyDetector.SingleMetricAnomalyDetectorProperty
+      Stratosphere.CloudWatch.CompositeAlarm
+      Stratosphere.CloudWatch.Dashboard
+      Stratosphere.CloudWatch.InsightRule
+      Stratosphere.CloudWatch.InsightRule.TagsProperty
+      Stratosphere.CloudWatch.MetricStream
+      Stratosphere.CloudWatch.MetricStream.MetricStreamFilterProperty
+      Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsConfigurationProperty
+      Stratosphere.CloudWatch.MetricStream.MetricStreamStatisticsMetricProperty
+  other-modules:
+      Paths_stratosphere_cloudwatch
+  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
