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/AppMesh/GatewayRoute.hs b/gen/Stratosphere/AppMesh/GatewayRoute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute.hs
@@ -0,0 +1,82 @@
+module Stratosphere.AppMesh.GatewayRoute (
+        module Exports, GatewayRoute(..), mkGatewayRoute
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data GatewayRoute
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html>
+    GatewayRoute {haddock_workaround_ :: (),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-gatewayroutename>
+                  gatewayRouteName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-meshname>
+                  meshName :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-meshowner>
+                  meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-spec>
+                  spec :: GatewayRouteSpecProperty,
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-tags>
+                  tags :: (Prelude.Maybe [Tag]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-virtualgatewayname>
+                  virtualGatewayName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRoute ::
+  Value Prelude.Text
+  -> GatewayRouteSpecProperty -> Value Prelude.Text -> GatewayRoute
+mkGatewayRoute meshName spec virtualGatewayName
+  = GatewayRoute
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       virtualGatewayName = virtualGatewayName,
+       gatewayRouteName = Prelude.Nothing, meshOwner = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties GatewayRoute where
+  toResourceProperties GatewayRoute {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+                            "VirtualGatewayName" JSON..= virtualGatewayName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "GatewayRouteName" Prelude.<$> gatewayRouteName,
+                               (JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON GatewayRoute where
+  toJSON GatewayRoute {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+               "VirtualGatewayName" JSON..= virtualGatewayName]
+              (Prelude.catMaybes
+                 [(JSON..=) "GatewayRouteName" Prelude.<$> gatewayRouteName,
+                  (JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "GatewayRouteName" GatewayRoute where
+  type PropertyType "GatewayRouteName" GatewayRoute = Value Prelude.Text
+  set newValue GatewayRoute {..}
+    = GatewayRoute {gatewayRouteName = Prelude.pure newValue, ..}
+instance Property "MeshName" GatewayRoute where
+  type PropertyType "MeshName" GatewayRoute = Value Prelude.Text
+  set newValue GatewayRoute {..}
+    = GatewayRoute {meshName = newValue, ..}
+instance Property "MeshOwner" GatewayRoute where
+  type PropertyType "MeshOwner" GatewayRoute = Value Prelude.Text
+  set newValue GatewayRoute {..}
+    = GatewayRoute {meshOwner = Prelude.pure newValue, ..}
+instance Property "Spec" GatewayRoute where
+  type PropertyType "Spec" GatewayRoute = GatewayRouteSpecProperty
+  set newValue GatewayRoute {..} = GatewayRoute {spec = newValue, ..}
+instance Property "Tags" GatewayRoute where
+  type PropertyType "Tags" GatewayRoute = [Tag]
+  set newValue GatewayRoute {..}
+    = GatewayRoute {tags = Prelude.pure newValue, ..}
+instance Property "VirtualGatewayName" GatewayRoute where
+  type PropertyType "VirtualGatewayName" GatewayRoute = Value Prelude.Text
+  set newValue GatewayRoute {..}
+    = GatewayRoute {virtualGatewayName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameMatchProperty (
+        GatewayRouteHostnameMatchProperty(..),
+        mkGatewayRouteHostnameMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteHostnameMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html>
+    GatewayRouteHostnameMatchProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html#cfn-appmesh-gatewayroute-gatewayroutehostnamematch-exact>
+                                       exact :: (Prelude.Maybe (Value Prelude.Text)),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html#cfn-appmesh-gatewayroute-gatewayroutehostnamematch-suffix>
+                                       suffix :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteHostnameMatchProperty ::
+  GatewayRouteHostnameMatchProperty
+mkGatewayRouteHostnameMatchProperty
+  = GatewayRouteHostnameMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       suffix = Prelude.Nothing}
+instance ToResourceProperties GatewayRouteHostnameMatchProperty where
+  toResourceProperties GatewayRouteHostnameMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteHostnameMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Suffix" Prelude.<$> suffix])}
+instance JSON.ToJSON GatewayRouteHostnameMatchProperty where
+  toJSON GatewayRouteHostnameMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Suffix" Prelude.<$> suffix]))
+instance Property "Exact" GatewayRouteHostnameMatchProperty where
+  type PropertyType "Exact" GatewayRouteHostnameMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteHostnameMatchProperty {..}
+    = GatewayRouteHostnameMatchProperty
+        {exact = Prelude.pure newValue, ..}
+instance Property "Suffix" GatewayRouteHostnameMatchProperty where
+  type PropertyType "Suffix" GatewayRouteHostnameMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteHostnameMatchProperty {..}
+    = GatewayRouteHostnameMatchProperty
+        {suffix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteHostnameMatchProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteHostnameMatchProperty
+instance Prelude.Eq GatewayRouteHostnameMatchProperty
+instance Prelude.Show GatewayRouteHostnameMatchProperty
+instance JSON.ToJSON GatewayRouteHostnameMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameRewriteProperty (
+        GatewayRouteHostnameRewriteProperty(..),
+        mkGatewayRouteHostnameRewriteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteHostnameRewriteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamerewrite.html>
+    GatewayRouteHostnameRewriteProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamerewrite.html#cfn-appmesh-gatewayroute-gatewayroutehostnamerewrite-defaulttargethostname>
+                                         defaultTargetHostname :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteHostnameRewriteProperty ::
+  GatewayRouteHostnameRewriteProperty
+mkGatewayRouteHostnameRewriteProperty
+  = GatewayRouteHostnameRewriteProperty
+      {haddock_workaround_ = (), defaultTargetHostname = Prelude.Nothing}
+instance ToResourceProperties GatewayRouteHostnameRewriteProperty where
+  toResourceProperties GatewayRouteHostnameRewriteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteHostnameRewrite",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DefaultTargetHostname"
+                              Prelude.<$> defaultTargetHostname])}
+instance JSON.ToJSON GatewayRouteHostnameRewriteProperty where
+  toJSON GatewayRouteHostnameRewriteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DefaultTargetHostname"
+                 Prelude.<$> defaultTargetHostname]))
+instance Property "DefaultTargetHostname" GatewayRouteHostnameRewriteProperty where
+  type PropertyType "DefaultTargetHostname" GatewayRouteHostnameRewriteProperty = Value Prelude.Text
+  set newValue GatewayRouteHostnameRewriteProperty {..}
+    = GatewayRouteHostnameRewriteProperty
+        {defaultTargetHostname = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteHostnameRewriteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameRewriteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteHostnameRewriteProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteHostnameRewriteProperty
+instance Prelude.Eq GatewayRouteHostnameRewriteProperty
+instance Prelude.Show GatewayRouteHostnameRewriteProperty
+instance JSON.ToJSON GatewayRouteHostnameRewriteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs
@@ -0,0 +1,78 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteMetadataMatchProperty (
+        module Exports, GatewayRouteMetadataMatchProperty(..),
+        mkGatewayRouteMetadataMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteRangeMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteMetadataMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html>
+    GatewayRouteMetadataMatchProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-exact>
+                                       exact :: (Prelude.Maybe (Value Prelude.Text)),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-prefix>
+                                       prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-range>
+                                       range :: (Prelude.Maybe GatewayRouteRangeMatchProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-regex>
+                                       regex :: (Prelude.Maybe (Value Prelude.Text)),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-suffix>
+                                       suffix :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteMetadataMatchProperty ::
+  GatewayRouteMetadataMatchProperty
+mkGatewayRouteMetadataMatchProperty
+  = GatewayRouteMetadataMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       prefix = Prelude.Nothing, range = Prelude.Nothing,
+       regex = Prelude.Nothing, suffix = Prelude.Nothing}
+instance ToResourceProperties GatewayRouteMetadataMatchProperty where
+  toResourceProperties GatewayRouteMetadataMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteMetadataMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "Range" Prelude.<$> range,
+                            (JSON..=) "Regex" Prelude.<$> regex,
+                            (JSON..=) "Suffix" Prelude.<$> suffix])}
+instance JSON.ToJSON GatewayRouteMetadataMatchProperty where
+  toJSON GatewayRouteMetadataMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "Range" Prelude.<$> range,
+               (JSON..=) "Regex" Prelude.<$> regex,
+               (JSON..=) "Suffix" Prelude.<$> suffix]))
+instance Property "Exact" GatewayRouteMetadataMatchProperty where
+  type PropertyType "Exact" GatewayRouteMetadataMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteMetadataMatchProperty {..}
+    = GatewayRouteMetadataMatchProperty
+        {exact = Prelude.pure newValue, ..}
+instance Property "Prefix" GatewayRouteMetadataMatchProperty where
+  type PropertyType "Prefix" GatewayRouteMetadataMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteMetadataMatchProperty {..}
+    = GatewayRouteMetadataMatchProperty
+        {prefix = Prelude.pure newValue, ..}
+instance Property "Range" GatewayRouteMetadataMatchProperty where
+  type PropertyType "Range" GatewayRouteMetadataMatchProperty = GatewayRouteRangeMatchProperty
+  set newValue GatewayRouteMetadataMatchProperty {..}
+    = GatewayRouteMetadataMatchProperty
+        {range = Prelude.pure newValue, ..}
+instance Property "Regex" GatewayRouteMetadataMatchProperty where
+  type PropertyType "Regex" GatewayRouteMetadataMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteMetadataMatchProperty {..}
+    = GatewayRouteMetadataMatchProperty
+        {regex = Prelude.pure newValue, ..}
+instance Property "Suffix" GatewayRouteMetadataMatchProperty where
+  type PropertyType "Suffix" GatewayRouteMetadataMatchProperty = Value Prelude.Text
+  set newValue GatewayRouteMetadataMatchProperty {..}
+    = GatewayRouteMetadataMatchProperty
+        {suffix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteMetadataMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteMetadataMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteMetadataMatchProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteMetadataMatchProperty
+instance Prelude.Eq GatewayRouteMetadataMatchProperty
+instance Prelude.Show GatewayRouteMetadataMatchProperty
+instance JSON.ToJSON GatewayRouteMetadataMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs
@@ -0,0 +1,40 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteRangeMatchProperty (
+        GatewayRouteRangeMatchProperty(..),
+        mkGatewayRouteRangeMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteRangeMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html>
+    GatewayRouteRangeMatchProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html#cfn-appmesh-gatewayroute-gatewayrouterangematch-end>
+                                    end :: (Value Prelude.Integer),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html#cfn-appmesh-gatewayroute-gatewayrouterangematch-start>
+                                    start :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteRangeMatchProperty ::
+  Value Prelude.Integer
+  -> Value Prelude.Integer -> GatewayRouteRangeMatchProperty
+mkGatewayRouteRangeMatchProperty end start
+  = GatewayRouteRangeMatchProperty
+      {haddock_workaround_ = (), end = end, start = start}
+instance ToResourceProperties GatewayRouteRangeMatchProperty where
+  toResourceProperties GatewayRouteRangeMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteRangeMatch",
+         supportsTags = Prelude.False,
+         properties = ["End" JSON..= end, "Start" JSON..= start]}
+instance JSON.ToJSON GatewayRouteRangeMatchProperty where
+  toJSON GatewayRouteRangeMatchProperty {..}
+    = JSON.object ["End" JSON..= end, "Start" JSON..= start]
+instance Property "End" GatewayRouteRangeMatchProperty where
+  type PropertyType "End" GatewayRouteRangeMatchProperty = Value Prelude.Integer
+  set newValue GatewayRouteRangeMatchProperty {..}
+    = GatewayRouteRangeMatchProperty {end = newValue, ..}
+instance Property "Start" GatewayRouteRangeMatchProperty where
+  type PropertyType "Start" GatewayRouteRangeMatchProperty = Value Prelude.Integer
+  set newValue GatewayRouteRangeMatchProperty {..}
+    = GatewayRouteRangeMatchProperty {start = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteRangeMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteRangeMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteRangeMatchProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteRangeMatchProperty
+instance Prelude.Eq GatewayRouteRangeMatchProperty
+instance Prelude.Show GatewayRouteRangeMatchProperty
+instance JSON.ToJSON GatewayRouteRangeMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs
@@ -0,0 +1,65 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteSpecProperty (
+        module Exports, GatewayRouteSpecProperty(..),
+        mkGatewayRouteSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html>
+    GatewayRouteSpecProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-grpcroute>
+                              grpcRoute :: (Prelude.Maybe GrpcGatewayRouteProperty),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-http2route>
+                              http2Route :: (Prelude.Maybe HttpGatewayRouteProperty),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-httproute>
+                              httpRoute :: (Prelude.Maybe HttpGatewayRouteProperty),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-priority>
+                              priority :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteSpecProperty :: GatewayRouteSpecProperty
+mkGatewayRouteSpecProperty
+  = GatewayRouteSpecProperty
+      {haddock_workaround_ = (), grpcRoute = Prelude.Nothing,
+       http2Route = Prelude.Nothing, httpRoute = Prelude.Nothing,
+       priority = Prelude.Nothing}
+instance ToResourceProperties GatewayRouteSpecProperty where
+  toResourceProperties GatewayRouteSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteSpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "GrpcRoute" Prelude.<$> grpcRoute,
+                            (JSON..=) "Http2Route" Prelude.<$> http2Route,
+                            (JSON..=) "HttpRoute" Prelude.<$> httpRoute,
+                            (JSON..=) "Priority" Prelude.<$> priority])}
+instance JSON.ToJSON GatewayRouteSpecProperty where
+  toJSON GatewayRouteSpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "GrpcRoute" Prelude.<$> grpcRoute,
+               (JSON..=) "Http2Route" Prelude.<$> http2Route,
+               (JSON..=) "HttpRoute" Prelude.<$> httpRoute,
+               (JSON..=) "Priority" Prelude.<$> priority]))
+instance Property "GrpcRoute" GatewayRouteSpecProperty where
+  type PropertyType "GrpcRoute" GatewayRouteSpecProperty = GrpcGatewayRouteProperty
+  set newValue GatewayRouteSpecProperty {..}
+    = GatewayRouteSpecProperty {grpcRoute = Prelude.pure newValue, ..}
+instance Property "Http2Route" GatewayRouteSpecProperty where
+  type PropertyType "Http2Route" GatewayRouteSpecProperty = HttpGatewayRouteProperty
+  set newValue GatewayRouteSpecProperty {..}
+    = GatewayRouteSpecProperty {http2Route = Prelude.pure newValue, ..}
+instance Property "HttpRoute" GatewayRouteSpecProperty where
+  type PropertyType "HttpRoute" GatewayRouteSpecProperty = HttpGatewayRouteProperty
+  set newValue GatewayRouteSpecProperty {..}
+    = GatewayRouteSpecProperty {httpRoute = Prelude.pure newValue, ..}
+instance Property "Priority" GatewayRouteSpecProperty where
+  type PropertyType "Priority" GatewayRouteSpecProperty = Value Prelude.Integer
+  set newValue GatewayRouteSpecProperty {..}
+    = GatewayRouteSpecProperty {priority = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteSpecProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteSpecProperty
+instance Prelude.Eq GatewayRouteSpecProperty
+instance Prelude.Show GatewayRouteSpecProperty
+instance JSON.ToJSON GatewayRouteSpecProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs
@@ -0,0 +1,48 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteTargetProperty (
+        module Exports, GatewayRouteTargetProperty(..),
+        mkGatewayRouteTargetProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteVirtualServiceProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteTargetProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html>
+    GatewayRouteTargetProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html#cfn-appmesh-gatewayroute-gatewayroutetarget-port>
+                                port :: (Prelude.Maybe (Value Prelude.Integer)),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html#cfn-appmesh-gatewayroute-gatewayroutetarget-virtualservice>
+                                virtualService :: GatewayRouteVirtualServiceProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteTargetProperty ::
+  GatewayRouteVirtualServiceProperty -> GatewayRouteTargetProperty
+mkGatewayRouteTargetProperty virtualService
+  = GatewayRouteTargetProperty
+      {haddock_workaround_ = (), virtualService = virtualService,
+       port = Prelude.Nothing}
+instance ToResourceProperties GatewayRouteTargetProperty where
+  toResourceProperties GatewayRouteTargetProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteTarget",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["VirtualService" JSON..= virtualService]
+                           (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port]))}
+instance JSON.ToJSON GatewayRouteTargetProperty where
+  toJSON GatewayRouteTargetProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["VirtualService" JSON..= virtualService]
+              (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port])))
+instance Property "Port" GatewayRouteTargetProperty where
+  type PropertyType "Port" GatewayRouteTargetProperty = Value Prelude.Integer
+  set newValue GatewayRouteTargetProperty {..}
+    = GatewayRouteTargetProperty {port = Prelude.pure newValue, ..}
+instance Property "VirtualService" GatewayRouteTargetProperty where
+  type PropertyType "VirtualService" GatewayRouteTargetProperty = GatewayRouteVirtualServiceProperty
+  set newValue GatewayRouteTargetProperty {..}
+    = GatewayRouteTargetProperty {virtualService = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteTargetProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteTargetProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteTargetProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteTargetProperty
+instance Prelude.Eq GatewayRouteTargetProperty
+instance Prelude.Show GatewayRouteTargetProperty
+instance JSON.ToJSON GatewayRouteTargetProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteVirtualServiceProperty (
+        GatewayRouteVirtualServiceProperty(..),
+        mkGatewayRouteVirtualServiceProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GatewayRouteVirtualServiceProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutevirtualservice.html>
+    GatewayRouteVirtualServiceProperty {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutevirtualservice.html#cfn-appmesh-gatewayroute-gatewayroutevirtualservice-virtualservicename>
+                                        virtualServiceName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGatewayRouteVirtualServiceProperty ::
+  Value Prelude.Text -> GatewayRouteVirtualServiceProperty
+mkGatewayRouteVirtualServiceProperty virtualServiceName
+  = GatewayRouteVirtualServiceProperty
+      {haddock_workaround_ = (), virtualServiceName = virtualServiceName}
+instance ToResourceProperties GatewayRouteVirtualServiceProperty where
+  toResourceProperties GatewayRouteVirtualServiceProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GatewayRouteVirtualService",
+         supportsTags = Prelude.False,
+         properties = ["VirtualServiceName" JSON..= virtualServiceName]}
+instance JSON.ToJSON GatewayRouteVirtualServiceProperty where
+  toJSON GatewayRouteVirtualServiceProperty {..}
+    = JSON.object ["VirtualServiceName" JSON..= virtualServiceName]
+instance Property "VirtualServiceName" GatewayRouteVirtualServiceProperty where
+  type PropertyType "VirtualServiceName" GatewayRouteVirtualServiceProperty = Value Prelude.Text
+  set newValue GatewayRouteVirtualServiceProperty {..}
+    = GatewayRouteVirtualServiceProperty
+        {virtualServiceName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GatewayRouteVirtualServiceProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GatewayRouteVirtualServiceProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GatewayRouteVirtualServiceProperty :: Prelude.Type
+instance ToResourceProperties GatewayRouteVirtualServiceProperty
+instance Prelude.Eq GatewayRouteVirtualServiceProperty
+instance Prelude.Show GatewayRouteVirtualServiceProperty
+instance JSON.ToJSON GatewayRouteVirtualServiceProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteActionProperty (
+        module Exports, GrpcGatewayRouteActionProperty(..),
+        mkGrpcGatewayRouteActionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteTargetProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteRewriteProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteActionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html>
+    GrpcGatewayRouteActionProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html#cfn-appmesh-gatewayroute-grpcgatewayrouteaction-rewrite>
+                                    rewrite :: (Prelude.Maybe GrpcGatewayRouteRewriteProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html#cfn-appmesh-gatewayroute-grpcgatewayrouteaction-target>
+                                    target :: GatewayRouteTargetProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcGatewayRouteActionProperty ::
+  GatewayRouteTargetProperty -> GrpcGatewayRouteActionProperty
+mkGrpcGatewayRouteActionProperty target
+  = GrpcGatewayRouteActionProperty
+      {haddock_workaround_ = (), target = target,
+       rewrite = Prelude.Nothing}
+instance ToResourceProperties GrpcGatewayRouteActionProperty where
+  toResourceProperties GrpcGatewayRouteActionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GrpcGatewayRouteAction",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Target" JSON..= target]
+                           (Prelude.catMaybes [(JSON..=) "Rewrite" Prelude.<$> rewrite]))}
+instance JSON.ToJSON GrpcGatewayRouteActionProperty where
+  toJSON GrpcGatewayRouteActionProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Target" JSON..= target]
+              (Prelude.catMaybes [(JSON..=) "Rewrite" Prelude.<$> rewrite])))
+instance Property "Rewrite" GrpcGatewayRouteActionProperty where
+  type PropertyType "Rewrite" GrpcGatewayRouteActionProperty = GrpcGatewayRouteRewriteProperty
+  set newValue GrpcGatewayRouteActionProperty {..}
+    = GrpcGatewayRouteActionProperty
+        {rewrite = Prelude.pure newValue, ..}
+instance Property "Target" GrpcGatewayRouteActionProperty where
+  type PropertyType "Target" GrpcGatewayRouteActionProperty = GatewayRouteTargetProperty
+  set newValue GrpcGatewayRouteActionProperty {..}
+    = GrpcGatewayRouteActionProperty {target = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteActionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteActionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteActionProperty :: Prelude.Type
+instance ToResourceProperties GrpcGatewayRouteActionProperty
+instance Prelude.Eq GrpcGatewayRouteActionProperty
+instance Prelude.Show GrpcGatewayRouteActionProperty
+instance JSON.ToJSON GrpcGatewayRouteActionProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs
@@ -0,0 +1,68 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMatchProperty (
+        module Exports, GrpcGatewayRouteMatchProperty(..),
+        mkGrpcGatewayRouteMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMetadataProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcGatewayRouteMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html>
+    GrpcGatewayRouteMatchProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-hostname>
+                                   hostname :: (Prelude.Maybe GatewayRouteHostnameMatchProperty),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-metadata>
+                                   metadata :: (Prelude.Maybe [GrpcGatewayRouteMetadataProperty]),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-port>
+                                   port :: (Prelude.Maybe (Value Prelude.Integer)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-servicename>
+                                   serviceName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcGatewayRouteMatchProperty :: GrpcGatewayRouteMatchProperty
+mkGrpcGatewayRouteMatchProperty
+  = GrpcGatewayRouteMatchProperty
+      {haddock_workaround_ = (), hostname = Prelude.Nothing,
+       metadata = Prelude.Nothing, port = Prelude.Nothing,
+       serviceName = Prelude.Nothing}
+instance ToResourceProperties GrpcGatewayRouteMatchProperty where
+  toResourceProperties GrpcGatewayRouteMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Hostname" Prelude.<$> hostname,
+                            (JSON..=) "Metadata" Prelude.<$> metadata,
+                            (JSON..=) "Port" Prelude.<$> port,
+                            (JSON..=) "ServiceName" Prelude.<$> serviceName])}
+instance JSON.ToJSON GrpcGatewayRouteMatchProperty where
+  toJSON GrpcGatewayRouteMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Hostname" Prelude.<$> hostname,
+               (JSON..=) "Metadata" Prelude.<$> metadata,
+               (JSON..=) "Port" Prelude.<$> port,
+               (JSON..=) "ServiceName" Prelude.<$> serviceName]))
+instance Property "Hostname" GrpcGatewayRouteMatchProperty where
+  type PropertyType "Hostname" GrpcGatewayRouteMatchProperty = GatewayRouteHostnameMatchProperty
+  set newValue GrpcGatewayRouteMatchProperty {..}
+    = GrpcGatewayRouteMatchProperty
+        {hostname = Prelude.pure newValue, ..}
+instance Property "Metadata" GrpcGatewayRouteMatchProperty where
+  type PropertyType "Metadata" GrpcGatewayRouteMatchProperty = [GrpcGatewayRouteMetadataProperty]
+  set newValue GrpcGatewayRouteMatchProperty {..}
+    = GrpcGatewayRouteMatchProperty
+        {metadata = Prelude.pure newValue, ..}
+instance Property "Port" GrpcGatewayRouteMatchProperty where
+  type PropertyType "Port" GrpcGatewayRouteMatchProperty = Value Prelude.Integer
+  set newValue GrpcGatewayRouteMatchProperty {..}
+    = GrpcGatewayRouteMatchProperty {port = Prelude.pure newValue, ..}
+instance Property "ServiceName" GrpcGatewayRouteMatchProperty where
+  type PropertyType "ServiceName" GrpcGatewayRouteMatchProperty = Value Prelude.Text
+  set newValue GrpcGatewayRouteMatchProperty {..}
+    = GrpcGatewayRouteMatchProperty
+        {serviceName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteMatchProperty :: Prelude.Type
+instance ToResourceProperties GrpcGatewayRouteMatchProperty
+instance Prelude.Eq GrpcGatewayRouteMatchProperty
+instance Prelude.Show GrpcGatewayRouteMatchProperty
+instance JSON.ToJSON GrpcGatewayRouteMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMetadataProperty (
+        module Exports, GrpcGatewayRouteMetadataProperty(..),
+        mkGrpcGatewayRouteMetadataProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteMetadataMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcGatewayRouteMetadataProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html>
+    GrpcGatewayRouteMetadataProperty {haddock_workaround_ :: (),
+                                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-invert>
+                                      invert :: (Prelude.Maybe (Value Prelude.Bool)),
+                                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-match>
+                                      match :: (Prelude.Maybe GatewayRouteMetadataMatchProperty),
+                                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-name>
+                                      name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcGatewayRouteMetadataProperty ::
+  Value Prelude.Text -> GrpcGatewayRouteMetadataProperty
+mkGrpcGatewayRouteMetadataProperty name
+  = GrpcGatewayRouteMetadataProperty
+      {haddock_workaround_ = (), name = name, invert = Prelude.Nothing,
+       match = Prelude.Nothing}
+instance ToResourceProperties GrpcGatewayRouteMetadataProperty where
+  toResourceProperties GrpcGatewayRouteMetadataProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMetadata",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Invert" Prelude.<$> invert,
+                               (JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON GrpcGatewayRouteMetadataProperty where
+  toJSON GrpcGatewayRouteMetadataProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "Invert" Prelude.<$> invert,
+                  (JSON..=) "Match" Prelude.<$> match])))
+instance Property "Invert" GrpcGatewayRouteMetadataProperty where
+  type PropertyType "Invert" GrpcGatewayRouteMetadataProperty = Value Prelude.Bool
+  set newValue GrpcGatewayRouteMetadataProperty {..}
+    = GrpcGatewayRouteMetadataProperty
+        {invert = Prelude.pure newValue, ..}
+instance Property "Match" GrpcGatewayRouteMetadataProperty where
+  type PropertyType "Match" GrpcGatewayRouteMetadataProperty = GatewayRouteMetadataMatchProperty
+  set newValue GrpcGatewayRouteMetadataProperty {..}
+    = GrpcGatewayRouteMetadataProperty
+        {match = Prelude.pure newValue, ..}
+instance Property "Name" GrpcGatewayRouteMetadataProperty where
+  type PropertyType "Name" GrpcGatewayRouteMetadataProperty = Value Prelude.Text
+  set newValue GrpcGatewayRouteMetadataProperty {..}
+    = GrpcGatewayRouteMetadataProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteMetadataProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMetadataProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteMetadataProperty :: Prelude.Type
+instance ToResourceProperties GrpcGatewayRouteMetadataProperty
+instance Prelude.Eq GrpcGatewayRouteMetadataProperty
+instance Prelude.Show GrpcGatewayRouteMetadataProperty
+instance JSON.ToJSON GrpcGatewayRouteMetadataProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteProperty (
+        module Exports, GrpcGatewayRouteProperty(..),
+        mkGrpcGatewayRouteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteActionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMatchProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html>
+    GrpcGatewayRouteProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html#cfn-appmesh-gatewayroute-grpcgatewayroute-action>
+                              action :: GrpcGatewayRouteActionProperty,
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html#cfn-appmesh-gatewayroute-grpcgatewayroute-match>
+                              match :: GrpcGatewayRouteMatchProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcGatewayRouteProperty ::
+  GrpcGatewayRouteActionProperty
+  -> GrpcGatewayRouteMatchProperty -> GrpcGatewayRouteProperty
+mkGrpcGatewayRouteProperty action match
+  = GrpcGatewayRouteProperty
+      {haddock_workaround_ = (), action = action, match = match}
+instance ToResourceProperties GrpcGatewayRouteProperty where
+  toResourceProperties GrpcGatewayRouteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GrpcGatewayRoute",
+         supportsTags = Prelude.False,
+         properties = ["Action" JSON..= action, "Match" JSON..= match]}
+instance JSON.ToJSON GrpcGatewayRouteProperty where
+  toJSON GrpcGatewayRouteProperty {..}
+    = JSON.object ["Action" JSON..= action, "Match" JSON..= match]
+instance Property "Action" GrpcGatewayRouteProperty where
+  type PropertyType "Action" GrpcGatewayRouteProperty = GrpcGatewayRouteActionProperty
+  set newValue GrpcGatewayRouteProperty {..}
+    = GrpcGatewayRouteProperty {action = newValue, ..}
+instance Property "Match" GrpcGatewayRouteProperty where
+  type PropertyType "Match" GrpcGatewayRouteProperty = GrpcGatewayRouteMatchProperty
+  set newValue GrpcGatewayRouteProperty {..}
+    = GrpcGatewayRouteProperty {match = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteProperty :: Prelude.Type
+instance ToResourceProperties GrpcGatewayRouteProperty
+instance Prelude.Eq GrpcGatewayRouteProperty
+instance Prelude.Show GrpcGatewayRouteProperty
+instance JSON.ToJSON GrpcGatewayRouteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteRewriteProperty (
+        module Exports, GrpcGatewayRouteRewriteProperty(..),
+        mkGrpcGatewayRouteRewriteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameRewriteProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteRewriteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouterewrite.html>
+    GrpcGatewayRouteRewriteProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouterewrite.html#cfn-appmesh-gatewayroute-grpcgatewayrouterewrite-hostname>
+                                     hostname :: (Prelude.Maybe GatewayRouteHostnameRewriteProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcGatewayRouteRewriteProperty ::
+  GrpcGatewayRouteRewriteProperty
+mkGrpcGatewayRouteRewriteProperty
+  = GrpcGatewayRouteRewriteProperty
+      {haddock_workaround_ = (), hostname = Prelude.Nothing}
+instance ToResourceProperties GrpcGatewayRouteRewriteProperty where
+  toResourceProperties GrpcGatewayRouteRewriteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.GrpcGatewayRouteRewrite",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Hostname" Prelude.<$> hostname])}
+instance JSON.ToJSON GrpcGatewayRouteRewriteProperty where
+  toJSON GrpcGatewayRouteRewriteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Hostname" Prelude.<$> hostname]))
+instance Property "Hostname" GrpcGatewayRouteRewriteProperty where
+  type PropertyType "Hostname" GrpcGatewayRouteRewriteProperty = GatewayRouteHostnameRewriteProperty
+  set newValue GrpcGatewayRouteRewriteProperty {..}
+    = GrpcGatewayRouteRewriteProperty
+        {hostname = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/GrpcGatewayRouteRewriteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteRewriteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcGatewayRouteRewriteProperty :: Prelude.Type
+instance ToResourceProperties GrpcGatewayRouteRewriteProperty
+instance Prelude.Eq GrpcGatewayRouteRewriteProperty
+instance Prelude.Show GrpcGatewayRouteRewriteProperty
+instance JSON.ToJSON GrpcGatewayRouteRewriteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteActionProperty (
+        module Exports, HttpGatewayRouteActionProperty(..),
+        mkHttpGatewayRouteActionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteTargetProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteRewriteProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteActionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html>
+    HttpGatewayRouteActionProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html#cfn-appmesh-gatewayroute-httpgatewayrouteaction-rewrite>
+                                    rewrite :: (Prelude.Maybe HttpGatewayRouteRewriteProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html#cfn-appmesh-gatewayroute-httpgatewayrouteaction-target>
+                                    target :: GatewayRouteTargetProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteActionProperty ::
+  GatewayRouteTargetProperty -> HttpGatewayRouteActionProperty
+mkHttpGatewayRouteActionProperty target
+  = HttpGatewayRouteActionProperty
+      {haddock_workaround_ = (), target = target,
+       rewrite = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRouteActionProperty where
+  toResourceProperties HttpGatewayRouteActionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRouteAction",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Target" JSON..= target]
+                           (Prelude.catMaybes [(JSON..=) "Rewrite" Prelude.<$> rewrite]))}
+instance JSON.ToJSON HttpGatewayRouteActionProperty where
+  toJSON HttpGatewayRouteActionProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Target" JSON..= target]
+              (Prelude.catMaybes [(JSON..=) "Rewrite" Prelude.<$> rewrite])))
+instance Property "Rewrite" HttpGatewayRouteActionProperty where
+  type PropertyType "Rewrite" HttpGatewayRouteActionProperty = HttpGatewayRouteRewriteProperty
+  set newValue HttpGatewayRouteActionProperty {..}
+    = HttpGatewayRouteActionProperty
+        {rewrite = Prelude.pure newValue, ..}
+instance Property "Target" HttpGatewayRouteActionProperty where
+  type PropertyType "Target" HttpGatewayRouteActionProperty = GatewayRouteTargetProperty
+  set newValue HttpGatewayRouteActionProperty {..}
+    = HttpGatewayRouteActionProperty {target = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteActionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteActionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteActionProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteActionProperty
+instance Prelude.Eq HttpGatewayRouteActionProperty
+instance Prelude.Show HttpGatewayRouteActionProperty
+instance JSON.ToJSON HttpGatewayRouteActionProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs
@@ -0,0 +1,78 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderMatchProperty (
+        module Exports, HttpGatewayRouteHeaderMatchProperty(..),
+        mkHttpGatewayRouteHeaderMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteRangeMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpGatewayRouteHeaderMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html>
+    HttpGatewayRouteHeaderMatchProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-exact>
+                                         exact :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-prefix>
+                                         prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-range>
+                                         range :: (Prelude.Maybe GatewayRouteRangeMatchProperty),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-regex>
+                                         regex :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-suffix>
+                                         suffix :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteHeaderMatchProperty ::
+  HttpGatewayRouteHeaderMatchProperty
+mkHttpGatewayRouteHeaderMatchProperty
+  = HttpGatewayRouteHeaderMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       prefix = Prelude.Nothing, range = Prelude.Nothing,
+       regex = Prelude.Nothing, suffix = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRouteHeaderMatchProperty where
+  toResourceProperties HttpGatewayRouteHeaderMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeaderMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "Range" Prelude.<$> range,
+                            (JSON..=) "Regex" Prelude.<$> regex,
+                            (JSON..=) "Suffix" Prelude.<$> suffix])}
+instance JSON.ToJSON HttpGatewayRouteHeaderMatchProperty where
+  toJSON HttpGatewayRouteHeaderMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "Range" Prelude.<$> range,
+               (JSON..=) "Regex" Prelude.<$> regex,
+               (JSON..=) "Suffix" Prelude.<$> suffix]))
+instance Property "Exact" HttpGatewayRouteHeaderMatchProperty where
+  type PropertyType "Exact" HttpGatewayRouteHeaderMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteHeaderMatchProperty {..}
+    = HttpGatewayRouteHeaderMatchProperty
+        {exact = Prelude.pure newValue, ..}
+instance Property "Prefix" HttpGatewayRouteHeaderMatchProperty where
+  type PropertyType "Prefix" HttpGatewayRouteHeaderMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteHeaderMatchProperty {..}
+    = HttpGatewayRouteHeaderMatchProperty
+        {prefix = Prelude.pure newValue, ..}
+instance Property "Range" HttpGatewayRouteHeaderMatchProperty where
+  type PropertyType "Range" HttpGatewayRouteHeaderMatchProperty = GatewayRouteRangeMatchProperty
+  set newValue HttpGatewayRouteHeaderMatchProperty {..}
+    = HttpGatewayRouteHeaderMatchProperty
+        {range = Prelude.pure newValue, ..}
+instance Property "Regex" HttpGatewayRouteHeaderMatchProperty where
+  type PropertyType "Regex" HttpGatewayRouteHeaderMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteHeaderMatchProperty {..}
+    = HttpGatewayRouteHeaderMatchProperty
+        {regex = Prelude.pure newValue, ..}
+instance Property "Suffix" HttpGatewayRouteHeaderMatchProperty where
+  type PropertyType "Suffix" HttpGatewayRouteHeaderMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteHeaderMatchProperty {..}
+    = HttpGatewayRouteHeaderMatchProperty
+        {suffix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteHeaderMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteHeaderMatchProperty
+instance Prelude.Eq HttpGatewayRouteHeaderMatchProperty
+instance Prelude.Show HttpGatewayRouteHeaderMatchProperty
+instance JSON.ToJSON HttpGatewayRouteHeaderMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderProperty (
+        module Exports, HttpGatewayRouteHeaderProperty(..),
+        mkHttpGatewayRouteHeaderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpGatewayRouteHeaderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html>
+    HttpGatewayRouteHeaderProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-invert>
+                                    invert :: (Prelude.Maybe (Value Prelude.Bool)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-match>
+                                    match :: (Prelude.Maybe HttpGatewayRouteHeaderMatchProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-name>
+                                    name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteHeaderProperty ::
+  Value Prelude.Text -> HttpGatewayRouteHeaderProperty
+mkHttpGatewayRouteHeaderProperty name
+  = HttpGatewayRouteHeaderProperty
+      {haddock_workaround_ = (), name = name, invert = Prelude.Nothing,
+       match = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRouteHeaderProperty where
+  toResourceProperties HttpGatewayRouteHeaderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeader",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Invert" Prelude.<$> invert,
+                               (JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON HttpGatewayRouteHeaderProperty where
+  toJSON HttpGatewayRouteHeaderProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "Invert" Prelude.<$> invert,
+                  (JSON..=) "Match" Prelude.<$> match])))
+instance Property "Invert" HttpGatewayRouteHeaderProperty where
+  type PropertyType "Invert" HttpGatewayRouteHeaderProperty = Value Prelude.Bool
+  set newValue HttpGatewayRouteHeaderProperty {..}
+    = HttpGatewayRouteHeaderProperty
+        {invert = Prelude.pure newValue, ..}
+instance Property "Match" HttpGatewayRouteHeaderProperty where
+  type PropertyType "Match" HttpGatewayRouteHeaderProperty = HttpGatewayRouteHeaderMatchProperty
+  set newValue HttpGatewayRouteHeaderProperty {..}
+    = HttpGatewayRouteHeaderProperty
+        {match = Prelude.pure newValue, ..}
+instance Property "Name" HttpGatewayRouteHeaderProperty where
+  type PropertyType "Name" HttpGatewayRouteHeaderProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteHeaderProperty {..}
+    = HttpGatewayRouteHeaderProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteHeaderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteHeaderProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteHeaderProperty
+instance Prelude.Eq HttpGatewayRouteHeaderProperty
+instance Prelude.Show HttpGatewayRouteHeaderProperty
+instance JSON.ToJSON HttpGatewayRouteHeaderProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs
@@ -0,0 +1,97 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteMatchProperty (
+        module Exports, HttpGatewayRouteMatchProperty(..),
+        mkHttpGatewayRouteMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpPathMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.QueryParameterProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpGatewayRouteMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html>
+    HttpGatewayRouteMatchProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-headers>
+                                   headers :: (Prelude.Maybe [HttpGatewayRouteHeaderProperty]),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-hostname>
+                                   hostname :: (Prelude.Maybe GatewayRouteHostnameMatchProperty),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-method>
+                                   method :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-path>
+                                   path :: (Prelude.Maybe HttpPathMatchProperty),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-port>
+                                   port :: (Prelude.Maybe (Value Prelude.Integer)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-prefix>
+                                   prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-queryparameters>
+                                   queryParameters :: (Prelude.Maybe [QueryParameterProperty])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteMatchProperty :: HttpGatewayRouteMatchProperty
+mkHttpGatewayRouteMatchProperty
+  = HttpGatewayRouteMatchProperty
+      {haddock_workaround_ = (), headers = Prelude.Nothing,
+       hostname = Prelude.Nothing, method = Prelude.Nothing,
+       path = Prelude.Nothing, port = Prelude.Nothing,
+       prefix = Prelude.Nothing, queryParameters = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRouteMatchProperty where
+  toResourceProperties HttpGatewayRouteMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRouteMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Headers" Prelude.<$> headers,
+                            (JSON..=) "Hostname" Prelude.<$> hostname,
+                            (JSON..=) "Method" Prelude.<$> method,
+                            (JSON..=) "Path" Prelude.<$> path,
+                            (JSON..=) "Port" Prelude.<$> port,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "QueryParameters" Prelude.<$> queryParameters])}
+instance JSON.ToJSON HttpGatewayRouteMatchProperty where
+  toJSON HttpGatewayRouteMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Headers" Prelude.<$> headers,
+               (JSON..=) "Hostname" Prelude.<$> hostname,
+               (JSON..=) "Method" Prelude.<$> method,
+               (JSON..=) "Path" Prelude.<$> path,
+               (JSON..=) "Port" Prelude.<$> port,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "QueryParameters" Prelude.<$> queryParameters]))
+instance Property "Headers" HttpGatewayRouteMatchProperty where
+  type PropertyType "Headers" HttpGatewayRouteMatchProperty = [HttpGatewayRouteHeaderProperty]
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty
+        {headers = Prelude.pure newValue, ..}
+instance Property "Hostname" HttpGatewayRouteMatchProperty where
+  type PropertyType "Hostname" HttpGatewayRouteMatchProperty = GatewayRouteHostnameMatchProperty
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty
+        {hostname = Prelude.pure newValue, ..}
+instance Property "Method" HttpGatewayRouteMatchProperty where
+  type PropertyType "Method" HttpGatewayRouteMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty
+        {method = Prelude.pure newValue, ..}
+instance Property "Path" HttpGatewayRouteMatchProperty where
+  type PropertyType "Path" HttpGatewayRouteMatchProperty = HttpPathMatchProperty
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty {path = Prelude.pure newValue, ..}
+instance Property "Port" HttpGatewayRouteMatchProperty where
+  type PropertyType "Port" HttpGatewayRouteMatchProperty = Value Prelude.Integer
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty {port = Prelude.pure newValue, ..}
+instance Property "Prefix" HttpGatewayRouteMatchProperty where
+  type PropertyType "Prefix" HttpGatewayRouteMatchProperty = Value Prelude.Text
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty
+        {prefix = Prelude.pure newValue, ..}
+instance Property "QueryParameters" HttpGatewayRouteMatchProperty where
+  type PropertyType "QueryParameters" HttpGatewayRouteMatchProperty = [QueryParameterProperty]
+  set newValue HttpGatewayRouteMatchProperty {..}
+    = HttpGatewayRouteMatchProperty
+        {queryParameters = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteMatchProperty
+instance Prelude.Eq HttpGatewayRouteMatchProperty
+instance Prelude.Show HttpGatewayRouteMatchProperty
+instance JSON.ToJSON HttpGatewayRouteMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePathRewriteProperty (
+        HttpGatewayRoutePathRewriteProperty(..),
+        mkHttpGatewayRoutePathRewriteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpGatewayRoutePathRewriteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutepathrewrite.html>
+    HttpGatewayRoutePathRewriteProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutepathrewrite.html#cfn-appmesh-gatewayroute-httpgatewayroutepathrewrite-exact>
+                                         exact :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRoutePathRewriteProperty ::
+  HttpGatewayRoutePathRewriteProperty
+mkHttpGatewayRoutePathRewriteProperty
+  = HttpGatewayRoutePathRewriteProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRoutePathRewriteProperty where
+  toResourceProperties HttpGatewayRoutePathRewriteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRoutePathRewrite",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact])}
+instance JSON.ToJSON HttpGatewayRoutePathRewriteProperty where
+  toJSON HttpGatewayRoutePathRewriteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact]))
+instance Property "Exact" HttpGatewayRoutePathRewriteProperty where
+  type PropertyType "Exact" HttpGatewayRoutePathRewriteProperty = Value Prelude.Text
+  set newValue HttpGatewayRoutePathRewriteProperty {..}
+    = HttpGatewayRoutePathRewriteProperty
+        {exact = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePathRewriteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePathRewriteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRoutePathRewriteProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRoutePathRewriteProperty
+instance Prelude.Eq HttpGatewayRoutePathRewriteProperty
+instance Prelude.Show HttpGatewayRoutePathRewriteProperty
+instance JSON.ToJSON HttpGatewayRoutePathRewriteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePrefixRewriteProperty (
+        HttpGatewayRoutePrefixRewriteProperty(..),
+        mkHttpGatewayRoutePrefixRewriteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpGatewayRoutePrefixRewriteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html>
+    HttpGatewayRoutePrefixRewriteProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouteprefixrewrite-defaultprefix>
+                                           defaultPrefix :: (Prelude.Maybe (Value Prelude.Text)),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouteprefixrewrite-value>
+                                           value :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRoutePrefixRewriteProperty ::
+  HttpGatewayRoutePrefixRewriteProperty
+mkHttpGatewayRoutePrefixRewriteProperty
+  = HttpGatewayRoutePrefixRewriteProperty
+      {haddock_workaround_ = (), defaultPrefix = Prelude.Nothing,
+       value = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRoutePrefixRewriteProperty where
+  toResourceProperties HttpGatewayRoutePrefixRewriteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRoutePrefixRewrite",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DefaultPrefix" Prelude.<$> defaultPrefix,
+                            (JSON..=) "Value" Prelude.<$> value])}
+instance JSON.ToJSON HttpGatewayRoutePrefixRewriteProperty where
+  toJSON HttpGatewayRoutePrefixRewriteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DefaultPrefix" Prelude.<$> defaultPrefix,
+               (JSON..=) "Value" Prelude.<$> value]))
+instance Property "DefaultPrefix" HttpGatewayRoutePrefixRewriteProperty where
+  type PropertyType "DefaultPrefix" HttpGatewayRoutePrefixRewriteProperty = Value Prelude.Text
+  set newValue HttpGatewayRoutePrefixRewriteProperty {..}
+    = HttpGatewayRoutePrefixRewriteProperty
+        {defaultPrefix = Prelude.pure newValue, ..}
+instance Property "Value" HttpGatewayRoutePrefixRewriteProperty where
+  type PropertyType "Value" HttpGatewayRoutePrefixRewriteProperty = Value Prelude.Text
+  set newValue HttpGatewayRoutePrefixRewriteProperty {..}
+    = HttpGatewayRoutePrefixRewriteProperty
+        {value = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRoutePrefixRewriteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePrefixRewriteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRoutePrefixRewriteProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRoutePrefixRewriteProperty
+instance Prelude.Eq HttpGatewayRoutePrefixRewriteProperty
+instance Prelude.Show HttpGatewayRoutePrefixRewriteProperty
+instance JSON.ToJSON HttpGatewayRoutePrefixRewriteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteProperty (
+        module Exports, HttpGatewayRouteProperty(..),
+        mkHttpGatewayRouteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteActionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteMatchProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html>
+    HttpGatewayRouteProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html#cfn-appmesh-gatewayroute-httpgatewayroute-action>
+                              action :: HttpGatewayRouteActionProperty,
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html#cfn-appmesh-gatewayroute-httpgatewayroute-match>
+                              match :: HttpGatewayRouteMatchProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteProperty ::
+  HttpGatewayRouteActionProperty
+  -> HttpGatewayRouteMatchProperty -> HttpGatewayRouteProperty
+mkHttpGatewayRouteProperty action match
+  = HttpGatewayRouteProperty
+      {haddock_workaround_ = (), action = action, match = match}
+instance ToResourceProperties HttpGatewayRouteProperty where
+  toResourceProperties HttpGatewayRouteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRoute",
+         supportsTags = Prelude.False,
+         properties = ["Action" JSON..= action, "Match" JSON..= match]}
+instance JSON.ToJSON HttpGatewayRouteProperty where
+  toJSON HttpGatewayRouteProperty {..}
+    = JSON.object ["Action" JSON..= action, "Match" JSON..= match]
+instance Property "Action" HttpGatewayRouteProperty where
+  type PropertyType "Action" HttpGatewayRouteProperty = HttpGatewayRouteActionProperty
+  set newValue HttpGatewayRouteProperty {..}
+    = HttpGatewayRouteProperty {action = newValue, ..}
+instance Property "Match" HttpGatewayRouteProperty where
+  type PropertyType "Match" HttpGatewayRouteProperty = HttpGatewayRouteMatchProperty
+  set newValue HttpGatewayRouteProperty {..}
+    = HttpGatewayRouteProperty {match = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteProperty
+instance Prelude.Eq HttpGatewayRouteProperty
+instance Prelude.Show HttpGatewayRouteProperty
+instance JSON.ToJSON HttpGatewayRouteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteRewriteProperty (
+        module Exports, HttpGatewayRouteRewriteProperty(..),
+        mkHttpGatewayRouteRewriteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameRewriteProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePathRewriteProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePrefixRewriteProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteRewriteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html>
+    HttpGatewayRouteRewriteProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-hostname>
+                                     hostname :: (Prelude.Maybe GatewayRouteHostnameRewriteProperty),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-path>
+                                     path :: (Prelude.Maybe HttpGatewayRoutePathRewriteProperty),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-prefix>
+                                     prefix :: (Prelude.Maybe HttpGatewayRoutePrefixRewriteProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpGatewayRouteRewriteProperty ::
+  HttpGatewayRouteRewriteProperty
+mkHttpGatewayRouteRewriteProperty
+  = HttpGatewayRouteRewriteProperty
+      {haddock_workaround_ = (), hostname = Prelude.Nothing,
+       path = Prelude.Nothing, prefix = Prelude.Nothing}
+instance ToResourceProperties HttpGatewayRouteRewriteProperty where
+  toResourceProperties HttpGatewayRouteRewriteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpGatewayRouteRewrite",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Hostname" Prelude.<$> hostname,
+                            (JSON..=) "Path" Prelude.<$> path,
+                            (JSON..=) "Prefix" Prelude.<$> prefix])}
+instance JSON.ToJSON HttpGatewayRouteRewriteProperty where
+  toJSON HttpGatewayRouteRewriteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Hostname" Prelude.<$> hostname,
+               (JSON..=) "Path" Prelude.<$> path,
+               (JSON..=) "Prefix" Prelude.<$> prefix]))
+instance Property "Hostname" HttpGatewayRouteRewriteProperty where
+  type PropertyType "Hostname" HttpGatewayRouteRewriteProperty = GatewayRouteHostnameRewriteProperty
+  set newValue HttpGatewayRouteRewriteProperty {..}
+    = HttpGatewayRouteRewriteProperty
+        {hostname = Prelude.pure newValue, ..}
+instance Property "Path" HttpGatewayRouteRewriteProperty where
+  type PropertyType "Path" HttpGatewayRouteRewriteProperty = HttpGatewayRoutePathRewriteProperty
+  set newValue HttpGatewayRouteRewriteProperty {..}
+    = HttpGatewayRouteRewriteProperty
+        {path = Prelude.pure newValue, ..}
+instance Property "Prefix" HttpGatewayRouteRewriteProperty where
+  type PropertyType "Prefix" HttpGatewayRouteRewriteProperty = HttpGatewayRoutePrefixRewriteProperty
+  set newValue HttpGatewayRouteRewriteProperty {..}
+    = HttpGatewayRouteRewriteProperty
+        {prefix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpGatewayRouteRewriteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteRewriteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpGatewayRouteRewriteProperty :: Prelude.Type
+instance ToResourceProperties HttpGatewayRouteRewriteProperty
+instance Prelude.Eq HttpGatewayRouteRewriteProperty
+instance Prelude.Show HttpGatewayRouteRewriteProperty
+instance JSON.ToJSON HttpGatewayRouteRewriteProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpPathMatchProperty (
+        HttpPathMatchProperty(..), mkHttpPathMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpPathMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html>
+    HttpPathMatchProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html#cfn-appmesh-gatewayroute-httppathmatch-exact>
+                           exact :: (Prelude.Maybe (Value Prelude.Text)),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html#cfn-appmesh-gatewayroute-httppathmatch-regex>
+                           regex :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpPathMatchProperty :: HttpPathMatchProperty
+mkHttpPathMatchProperty
+  = HttpPathMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       regex = Prelude.Nothing}
+instance ToResourceProperties HttpPathMatchProperty where
+  toResourceProperties HttpPathMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpPathMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Regex" Prelude.<$> regex])}
+instance JSON.ToJSON HttpPathMatchProperty where
+  toJSON HttpPathMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Regex" Prelude.<$> regex]))
+instance Property "Exact" HttpPathMatchProperty where
+  type PropertyType "Exact" HttpPathMatchProperty = Value Prelude.Text
+  set newValue HttpPathMatchProperty {..}
+    = HttpPathMatchProperty {exact = Prelude.pure newValue, ..}
+instance Property "Regex" HttpPathMatchProperty where
+  type PropertyType "Regex" HttpPathMatchProperty = Value Prelude.Text
+  set newValue HttpPathMatchProperty {..}
+    = HttpPathMatchProperty {regex = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpPathMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpPathMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpPathMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpPathMatchProperty
+instance Prelude.Eq HttpPathMatchProperty
+instance Prelude.Show HttpPathMatchProperty
+instance JSON.ToJSON HttpPathMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpQueryParameterMatchProperty (
+        HttpQueryParameterMatchProperty(..),
+        mkHttpQueryParameterMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpQueryParameterMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpqueryparametermatch.html>
+    HttpQueryParameterMatchProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpqueryparametermatch.html#cfn-appmesh-gatewayroute-httpqueryparametermatch-exact>
+                                     exact :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpQueryParameterMatchProperty ::
+  HttpQueryParameterMatchProperty
+mkHttpQueryParameterMatchProperty
+  = HttpQueryParameterMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing}
+instance ToResourceProperties HttpQueryParameterMatchProperty where
+  toResourceProperties HttpQueryParameterMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.HttpQueryParameterMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact])}
+instance JSON.ToJSON HttpQueryParameterMatchProperty where
+  toJSON HttpQueryParameterMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact]))
+instance Property "Exact" HttpQueryParameterMatchProperty where
+  type PropertyType "Exact" HttpQueryParameterMatchProperty = Value Prelude.Text
+  set newValue HttpQueryParameterMatchProperty {..}
+    = HttpQueryParameterMatchProperty
+        {exact = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/HttpQueryParameterMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.HttpQueryParameterMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpQueryParameterMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpQueryParameterMatchProperty
+instance Prelude.Eq HttpQueryParameterMatchProperty
+instance Prelude.Show HttpQueryParameterMatchProperty
+instance JSON.ToJSON HttpQueryParameterMatchProperty
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs b/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs
@@ -0,0 +1,47 @@
+module Stratosphere.AppMesh.GatewayRoute.QueryParameterProperty (
+        module Exports, QueryParameterProperty(..),
+        mkQueryParameterProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.GatewayRoute.HttpQueryParameterMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data QueryParameterProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html>
+    QueryParameterProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html#cfn-appmesh-gatewayroute-queryparameter-match>
+                            match :: (Prelude.Maybe HttpQueryParameterMatchProperty),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html#cfn-appmesh-gatewayroute-queryparameter-name>
+                            name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkQueryParameterProperty ::
+  Value Prelude.Text -> QueryParameterProperty
+mkQueryParameterProperty name
+  = QueryParameterProperty
+      {haddock_workaround_ = (), name = name, match = Prelude.Nothing}
+instance ToResourceProperties QueryParameterProperty where
+  toResourceProperties QueryParameterProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::GatewayRoute.QueryParameter",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes [(JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON QueryParameterProperty where
+  toJSON QueryParameterProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes [(JSON..=) "Match" Prelude.<$> match])))
+instance Property "Match" QueryParameterProperty where
+  type PropertyType "Match" QueryParameterProperty = HttpQueryParameterMatchProperty
+  set newValue QueryParameterProperty {..}
+    = QueryParameterProperty {match = Prelude.pure newValue, ..}
+instance Property "Name" QueryParameterProperty where
+  type PropertyType "Name" QueryParameterProperty = Value Prelude.Text
+  set newValue QueryParameterProperty {..}
+    = QueryParameterProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs-boot b/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/GatewayRoute/QueryParameterProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.GatewayRoute.QueryParameterProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data QueryParameterProperty :: Prelude.Type
+instance ToResourceProperties QueryParameterProperty
+instance Prelude.Eq QueryParameterProperty
+instance Prelude.Show QueryParameterProperty
+instance JSON.ToJSON QueryParameterProperty
diff --git a/gen/Stratosphere/AppMesh/Mesh.hs b/gen/Stratosphere/AppMesh/Mesh.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh.hs
@@ -0,0 +1,52 @@
+module Stratosphere.AppMesh.Mesh (
+        module Exports, Mesh(..), mkMesh
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Mesh.MeshSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Mesh
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html>
+    Mesh {haddock_workaround_ :: (),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-meshname>
+          meshName :: (Prelude.Maybe (Value Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-spec>
+          spec :: (Prelude.Maybe MeshSpecProperty),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-tags>
+          tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMesh :: Mesh
+mkMesh
+  = Mesh
+      {haddock_workaround_ = (), meshName = Prelude.Nothing,
+       spec = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties Mesh where
+  toResourceProperties Mesh {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Mesh", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "MeshName" Prelude.<$> meshName,
+                            (JSON..=) "Spec" Prelude.<$> spec,
+                            (JSON..=) "Tags" Prelude.<$> tags])}
+instance JSON.ToJSON Mesh where
+  toJSON Mesh {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "MeshName" Prelude.<$> meshName,
+               (JSON..=) "Spec" Prelude.<$> spec,
+               (JSON..=) "Tags" Prelude.<$> tags]))
+instance Property "MeshName" Mesh where
+  type PropertyType "MeshName" Mesh = Value Prelude.Text
+  set newValue Mesh {..}
+    = Mesh {meshName = Prelude.pure newValue, ..}
+instance Property "Spec" Mesh where
+  type PropertyType "Spec" Mesh = MeshSpecProperty
+  set newValue Mesh {..} = Mesh {spec = Prelude.pure newValue, ..}
+instance Property "Tags" Mesh where
+  type PropertyType "Tags" Mesh = [Tag]
+  set newValue Mesh {..} = Mesh {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs b/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs
@@ -0,0 +1,30 @@
+module Stratosphere.AppMesh.Mesh.EgressFilterProperty (
+        EgressFilterProperty(..), mkEgressFilterProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data EgressFilterProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-egressfilter.html>
+    EgressFilterProperty {haddock_workaround_ :: (),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-egressfilter.html#cfn-appmesh-mesh-egressfilter-type>
+                          type' :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEgressFilterProperty ::
+  Value Prelude.Text -> EgressFilterProperty
+mkEgressFilterProperty type'
+  = EgressFilterProperty {haddock_workaround_ = (), type' = type'}
+instance ToResourceProperties EgressFilterProperty where
+  toResourceProperties EgressFilterProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Mesh.EgressFilter",
+         supportsTags = Prelude.False, properties = ["Type" JSON..= type']}
+instance JSON.ToJSON EgressFilterProperty where
+  toJSON EgressFilterProperty {..}
+    = JSON.object ["Type" JSON..= type']
+instance Property "Type" EgressFilterProperty where
+  type PropertyType "Type" EgressFilterProperty = Value Prelude.Text
+  set newValue EgressFilterProperty {..}
+    = EgressFilterProperty {type' = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs-boot b/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/EgressFilterProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Mesh.EgressFilterProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data EgressFilterProperty :: Prelude.Type
+instance ToResourceProperties EgressFilterProperty
+instance Prelude.Eq EgressFilterProperty
+instance Prelude.Show EgressFilterProperty
+instance JSON.ToJSON EgressFilterProperty
diff --git a/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs b/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.Mesh.MeshServiceDiscoveryProperty (
+        MeshServiceDiscoveryProperty(..), mkMeshServiceDiscoveryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MeshServiceDiscoveryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshservicediscovery.html>
+    MeshServiceDiscoveryProperty {haddock_workaround_ :: (),
+                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshservicediscovery.html#cfn-appmesh-mesh-meshservicediscovery-ippreference>
+                                  ipPreference :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMeshServiceDiscoveryProperty :: MeshServiceDiscoveryProperty
+mkMeshServiceDiscoveryProperty
+  = MeshServiceDiscoveryProperty
+      {haddock_workaround_ = (), ipPreference = Prelude.Nothing}
+instance ToResourceProperties MeshServiceDiscoveryProperty where
+  toResourceProperties MeshServiceDiscoveryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Mesh.MeshServiceDiscovery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "IpPreference" Prelude.<$> ipPreference])}
+instance JSON.ToJSON MeshServiceDiscoveryProperty where
+  toJSON MeshServiceDiscoveryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "IpPreference" Prelude.<$> ipPreference]))
+instance Property "IpPreference" MeshServiceDiscoveryProperty where
+  type PropertyType "IpPreference" MeshServiceDiscoveryProperty = Value Prelude.Text
+  set newValue MeshServiceDiscoveryProperty {..}
+    = MeshServiceDiscoveryProperty
+        {ipPreference = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs-boot b/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/MeshServiceDiscoveryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Mesh.MeshServiceDiscoveryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MeshServiceDiscoveryProperty :: Prelude.Type
+instance ToResourceProperties MeshServiceDiscoveryProperty
+instance Prelude.Eq MeshServiceDiscoveryProperty
+instance Prelude.Show MeshServiceDiscoveryProperty
+instance JSON.ToJSON MeshServiceDiscoveryProperty
diff --git a/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs b/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs
@@ -0,0 +1,46 @@
+module Stratosphere.AppMesh.Mesh.MeshSpecProperty (
+        module Exports, MeshSpecProperty(..), mkMeshSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Mesh.EgressFilterProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Mesh.MeshServiceDiscoveryProperty as Exports
+import Stratosphere.ResourceProperties
+data MeshSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html>
+    MeshSpecProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html#cfn-appmesh-mesh-meshspec-egressfilter>
+                      egressFilter :: (Prelude.Maybe EgressFilterProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html#cfn-appmesh-mesh-meshspec-servicediscovery>
+                      serviceDiscovery :: (Prelude.Maybe MeshServiceDiscoveryProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMeshSpecProperty :: MeshSpecProperty
+mkMeshSpecProperty
+  = MeshSpecProperty
+      {haddock_workaround_ = (), egressFilter = Prelude.Nothing,
+       serviceDiscovery = Prelude.Nothing}
+instance ToResourceProperties MeshSpecProperty where
+  toResourceProperties MeshSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Mesh.MeshSpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "EgressFilter" Prelude.<$> egressFilter,
+                            (JSON..=) "ServiceDiscovery" Prelude.<$> serviceDiscovery])}
+instance JSON.ToJSON MeshSpecProperty where
+  toJSON MeshSpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "EgressFilter" Prelude.<$> egressFilter,
+               (JSON..=) "ServiceDiscovery" Prelude.<$> serviceDiscovery]))
+instance Property "EgressFilter" MeshSpecProperty where
+  type PropertyType "EgressFilter" MeshSpecProperty = EgressFilterProperty
+  set newValue MeshSpecProperty {..}
+    = MeshSpecProperty {egressFilter = Prelude.pure newValue, ..}
+instance Property "ServiceDiscovery" MeshSpecProperty where
+  type PropertyType "ServiceDiscovery" MeshSpecProperty = MeshServiceDiscoveryProperty
+  set newValue MeshSpecProperty {..}
+    = MeshSpecProperty {serviceDiscovery = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Mesh/MeshSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Mesh.MeshSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MeshSpecProperty :: Prelude.Type
+instance ToResourceProperties MeshSpecProperty
+instance Prelude.Eq MeshSpecProperty
+instance Prelude.Show MeshSpecProperty
+instance JSON.ToJSON MeshSpecProperty
diff --git a/gen/Stratosphere/AppMesh/Route.hs b/gen/Stratosphere/AppMesh/Route.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route.hs
@@ -0,0 +1,77 @@
+module Stratosphere.AppMesh.Route (
+        module Exports, Route(..), mkRoute
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.RouteSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Route
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html>
+    Route {haddock_workaround_ :: (),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-meshname>
+           meshName :: (Value Prelude.Text),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-meshowner>
+           meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-routename>
+           routeName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-spec>
+           spec :: RouteSpecProperty,
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-tags>
+           tags :: (Prelude.Maybe [Tag]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-virtualroutername>
+           virtualRouterName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkRoute ::
+  Value Prelude.Text
+  -> RouteSpecProperty -> Value Prelude.Text -> Route
+mkRoute meshName spec virtualRouterName
+  = Route
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       virtualRouterName = virtualRouterName, meshOwner = Prelude.Nothing,
+       routeName = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties Route where
+  toResourceProperties Route {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+                            "VirtualRouterName" JSON..= virtualRouterName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "RouteName" Prelude.<$> routeName,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON Route where
+  toJSON Route {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+               "VirtualRouterName" JSON..= virtualRouterName]
+              (Prelude.catMaybes
+                 [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "RouteName" Prelude.<$> routeName,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "MeshName" Route where
+  type PropertyType "MeshName" Route = Value Prelude.Text
+  set newValue Route {..} = Route {meshName = newValue, ..}
+instance Property "MeshOwner" Route where
+  type PropertyType "MeshOwner" Route = Value Prelude.Text
+  set newValue Route {..}
+    = Route {meshOwner = Prelude.pure newValue, ..}
+instance Property "RouteName" Route where
+  type PropertyType "RouteName" Route = Value Prelude.Text
+  set newValue Route {..}
+    = Route {routeName = Prelude.pure newValue, ..}
+instance Property "Spec" Route where
+  type PropertyType "Spec" Route = RouteSpecProperty
+  set newValue Route {..} = Route {spec = newValue, ..}
+instance Property "Tags" Route where
+  type PropertyType "Tags" Route = [Tag]
+  set newValue Route {..} = Route {tags = Prelude.pure newValue, ..}
+instance Property "VirtualRouterName" Route where
+  type PropertyType "VirtualRouterName" Route = Value Prelude.Text
+  set newValue Route {..} = Route {virtualRouterName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/DurationProperty.hs b/gen/Stratosphere/AppMesh/Route/DurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/DurationProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.Route.DurationProperty (
+        DurationProperty(..), mkDurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html>
+    DurationProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html#cfn-appmesh-route-duration-unit>
+                      unit :: (Value Prelude.Text),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html#cfn-appmesh-route-duration-value>
+                      value :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDurationProperty ::
+  Value Prelude.Text -> Value Prelude.Integer -> DurationProperty
+mkDurationProperty unit value
+  = DurationProperty
+      {haddock_workaround_ = (), unit = unit, value = value}
+instance ToResourceProperties DurationProperty where
+  toResourceProperties DurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.Duration",
+         supportsTags = Prelude.False,
+         properties = ["Unit" JSON..= unit, "Value" JSON..= value]}
+instance JSON.ToJSON DurationProperty where
+  toJSON DurationProperty {..}
+    = JSON.object ["Unit" JSON..= unit, "Value" JSON..= value]
+instance Property "Unit" DurationProperty where
+  type PropertyType "Unit" DurationProperty = Value Prelude.Text
+  set newValue DurationProperty {..}
+    = DurationProperty {unit = newValue, ..}
+instance Property "Value" DurationProperty where
+  type PropertyType "Value" DurationProperty = Value Prelude.Integer
+  set newValue DurationProperty {..}
+    = DurationProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/DurationProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/DurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/DurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.DurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DurationProperty :: Prelude.Type
+instance ToResourceProperties DurationProperty
+instance Prelude.Eq DurationProperty
+instance Prelude.Show DurationProperty
+instance JSON.ToJSON DurationProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs
@@ -0,0 +1,81 @@
+module Stratosphere.AppMesh.Route.GrpcRetryPolicyProperty (
+        module Exports, GrpcRetryPolicyProperty(..),
+        mkGrpcRetryPolicyProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcRetryPolicyProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html>
+    GrpcRetryPolicyProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-grpcretryevents>
+                             grpcRetryEvents :: (Prelude.Maybe (ValueList Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-httpretryevents>
+                             httpRetryEvents :: (Prelude.Maybe (ValueList Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-maxretries>
+                             maxRetries :: (Value Prelude.Integer),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-perretrytimeout>
+                             perRetryTimeout :: DurationProperty,
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-tcpretryevents>
+                             tcpRetryEvents :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRetryPolicyProperty ::
+  Value Prelude.Integer
+  -> DurationProperty -> GrpcRetryPolicyProperty
+mkGrpcRetryPolicyProperty maxRetries perRetryTimeout
+  = GrpcRetryPolicyProperty
+      {haddock_workaround_ = (), maxRetries = maxRetries,
+       perRetryTimeout = perRetryTimeout,
+       grpcRetryEvents = Prelude.Nothing,
+       httpRetryEvents = Prelude.Nothing,
+       tcpRetryEvents = Prelude.Nothing}
+instance ToResourceProperties GrpcRetryPolicyProperty where
+  toResourceProperties GrpcRetryPolicyProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRetryPolicy",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MaxRetries" JSON..= maxRetries,
+                            "PerRetryTimeout" JSON..= perRetryTimeout]
+                           (Prelude.catMaybes
+                              [(JSON..=) "GrpcRetryEvents" Prelude.<$> grpcRetryEvents,
+                               (JSON..=) "HttpRetryEvents" Prelude.<$> httpRetryEvents,
+                               (JSON..=) "TcpRetryEvents" Prelude.<$> tcpRetryEvents]))}
+instance JSON.ToJSON GrpcRetryPolicyProperty where
+  toJSON GrpcRetryPolicyProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MaxRetries" JSON..= maxRetries,
+               "PerRetryTimeout" JSON..= perRetryTimeout]
+              (Prelude.catMaybes
+                 [(JSON..=) "GrpcRetryEvents" Prelude.<$> grpcRetryEvents,
+                  (JSON..=) "HttpRetryEvents" Prelude.<$> httpRetryEvents,
+                  (JSON..=) "TcpRetryEvents" Prelude.<$> tcpRetryEvents])))
+instance Property "GrpcRetryEvents" GrpcRetryPolicyProperty where
+  type PropertyType "GrpcRetryEvents" GrpcRetryPolicyProperty = ValueList Prelude.Text
+  set newValue GrpcRetryPolicyProperty {..}
+    = GrpcRetryPolicyProperty
+        {grpcRetryEvents = Prelude.pure newValue, ..}
+instance Property "HttpRetryEvents" GrpcRetryPolicyProperty where
+  type PropertyType "HttpRetryEvents" GrpcRetryPolicyProperty = ValueList Prelude.Text
+  set newValue GrpcRetryPolicyProperty {..}
+    = GrpcRetryPolicyProperty
+        {httpRetryEvents = Prelude.pure newValue, ..}
+instance Property "MaxRetries" GrpcRetryPolicyProperty where
+  type PropertyType "MaxRetries" GrpcRetryPolicyProperty = Value Prelude.Integer
+  set newValue GrpcRetryPolicyProperty {..}
+    = GrpcRetryPolicyProperty {maxRetries = newValue, ..}
+instance Property "PerRetryTimeout" GrpcRetryPolicyProperty where
+  type PropertyType "PerRetryTimeout" GrpcRetryPolicyProperty = DurationProperty
+  set newValue GrpcRetryPolicyProperty {..}
+    = GrpcRetryPolicyProperty {perRetryTimeout = newValue, ..}
+instance Property "TcpRetryEvents" GrpcRetryPolicyProperty where
+  type PropertyType "TcpRetryEvents" GrpcRetryPolicyProperty = ValueList Prelude.Text
+  set newValue GrpcRetryPolicyProperty {..}
+    = GrpcRetryPolicyProperty
+        {tcpRetryEvents = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRetryPolicyProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRetryPolicyProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRetryPolicyProperty :: Prelude.Type
+instance ToResourceProperties GrpcRetryPolicyProperty
+instance Prelude.Eq GrpcRetryPolicyProperty
+instance Prelude.Show GrpcRetryPolicyProperty
+instance JSON.ToJSON GrpcRetryPolicyProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.Route.GrpcRouteActionProperty (
+        module Exports, GrpcRouteActionProperty(..),
+        mkGrpcRouteActionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.WeightedTargetProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcRouteActionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcrouteaction.html>
+    GrpcRouteActionProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcrouteaction.html#cfn-appmesh-route-grpcrouteaction-weightedtargets>
+                             weightedTargets :: [WeightedTargetProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRouteActionProperty ::
+  [WeightedTargetProperty] -> GrpcRouteActionProperty
+mkGrpcRouteActionProperty weightedTargets
+  = GrpcRouteActionProperty
+      {haddock_workaround_ = (), weightedTargets = weightedTargets}
+instance ToResourceProperties GrpcRouteActionProperty where
+  toResourceProperties GrpcRouteActionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRouteAction",
+         supportsTags = Prelude.False,
+         properties = ["WeightedTargets" JSON..= weightedTargets]}
+instance JSON.ToJSON GrpcRouteActionProperty where
+  toJSON GrpcRouteActionProperty {..}
+    = JSON.object ["WeightedTargets" JSON..= weightedTargets]
+instance Property "WeightedTargets" GrpcRouteActionProperty where
+  type PropertyType "WeightedTargets" GrpcRouteActionProperty = [WeightedTargetProperty]
+  set newValue GrpcRouteActionProperty {..}
+    = GrpcRouteActionProperty {weightedTargets = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteActionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRouteActionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRouteActionProperty :: Prelude.Type
+instance ToResourceProperties GrpcRouteActionProperty
+instance Prelude.Eq GrpcRouteActionProperty
+instance Prelude.Show GrpcRouteActionProperty
+instance JSON.ToJSON GrpcRouteActionProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs
@@ -0,0 +1,64 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMatchProperty (
+        module Exports, GrpcRouteMatchProperty(..),
+        mkGrpcRouteMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRouteMetadataProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcRouteMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html>
+    GrpcRouteMatchProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-metadata>
+                            metadata :: (Prelude.Maybe [GrpcRouteMetadataProperty]),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-methodname>
+                            methodName :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-port>
+                            port :: (Prelude.Maybe (Value Prelude.Integer)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-servicename>
+                            serviceName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRouteMatchProperty :: GrpcRouteMatchProperty
+mkGrpcRouteMatchProperty
+  = GrpcRouteMatchProperty
+      {haddock_workaround_ = (), metadata = Prelude.Nothing,
+       methodName = Prelude.Nothing, port = Prelude.Nothing,
+       serviceName = Prelude.Nothing}
+instance ToResourceProperties GrpcRouteMatchProperty where
+  toResourceProperties GrpcRouteMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRouteMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Metadata" Prelude.<$> metadata,
+                            (JSON..=) "MethodName" Prelude.<$> methodName,
+                            (JSON..=) "Port" Prelude.<$> port,
+                            (JSON..=) "ServiceName" Prelude.<$> serviceName])}
+instance JSON.ToJSON GrpcRouteMatchProperty where
+  toJSON GrpcRouteMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Metadata" Prelude.<$> metadata,
+               (JSON..=) "MethodName" Prelude.<$> methodName,
+               (JSON..=) "Port" Prelude.<$> port,
+               (JSON..=) "ServiceName" Prelude.<$> serviceName]))
+instance Property "Metadata" GrpcRouteMatchProperty where
+  type PropertyType "Metadata" GrpcRouteMatchProperty = [GrpcRouteMetadataProperty]
+  set newValue GrpcRouteMatchProperty {..}
+    = GrpcRouteMatchProperty {metadata = Prelude.pure newValue, ..}
+instance Property "MethodName" GrpcRouteMatchProperty where
+  type PropertyType "MethodName" GrpcRouteMatchProperty = Value Prelude.Text
+  set newValue GrpcRouteMatchProperty {..}
+    = GrpcRouteMatchProperty {methodName = Prelude.pure newValue, ..}
+instance Property "Port" GrpcRouteMatchProperty where
+  type PropertyType "Port" GrpcRouteMatchProperty = Value Prelude.Integer
+  set newValue GrpcRouteMatchProperty {..}
+    = GrpcRouteMatchProperty {port = Prelude.pure newValue, ..}
+instance Property "ServiceName" GrpcRouteMatchProperty where
+  type PropertyType "ServiceName" GrpcRouteMatchProperty = Value Prelude.Text
+  set newValue GrpcRouteMatchProperty {..}
+    = GrpcRouteMatchProperty {serviceName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRouteMatchProperty :: Prelude.Type
+instance ToResourceProperties GrpcRouteMatchProperty
+instance Prelude.Eq GrpcRouteMatchProperty
+instance Prelude.Show GrpcRouteMatchProperty
+instance JSON.ToJSON GrpcRouteMatchProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs
@@ -0,0 +1,78 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMetadataMatchMethodProperty (
+        module Exports, GrpcRouteMetadataMatchMethodProperty(..),
+        mkGrpcRouteMetadataMatchMethodProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.MatchRangeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcRouteMetadataMatchMethodProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html>
+    GrpcRouteMetadataMatchMethodProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-exact>
+                                          exact :: (Prelude.Maybe (Value Prelude.Text)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-prefix>
+                                          prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-range>
+                                          range :: (Prelude.Maybe MatchRangeProperty),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-regex>
+                                          regex :: (Prelude.Maybe (Value Prelude.Text)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-suffix>
+                                          suffix :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRouteMetadataMatchMethodProperty ::
+  GrpcRouteMetadataMatchMethodProperty
+mkGrpcRouteMetadataMatchMethodProperty
+  = GrpcRouteMetadataMatchMethodProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       prefix = Prelude.Nothing, range = Prelude.Nothing,
+       regex = Prelude.Nothing, suffix = Prelude.Nothing}
+instance ToResourceProperties GrpcRouteMetadataMatchMethodProperty where
+  toResourceProperties GrpcRouteMetadataMatchMethodProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRouteMetadataMatchMethod",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "Range" Prelude.<$> range,
+                            (JSON..=) "Regex" Prelude.<$> regex,
+                            (JSON..=) "Suffix" Prelude.<$> suffix])}
+instance JSON.ToJSON GrpcRouteMetadataMatchMethodProperty where
+  toJSON GrpcRouteMetadataMatchMethodProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "Range" Prelude.<$> range,
+               (JSON..=) "Regex" Prelude.<$> regex,
+               (JSON..=) "Suffix" Prelude.<$> suffix]))
+instance Property "Exact" GrpcRouteMetadataMatchMethodProperty where
+  type PropertyType "Exact" GrpcRouteMetadataMatchMethodProperty = Value Prelude.Text
+  set newValue GrpcRouteMetadataMatchMethodProperty {..}
+    = GrpcRouteMetadataMatchMethodProperty
+        {exact = Prelude.pure newValue, ..}
+instance Property "Prefix" GrpcRouteMetadataMatchMethodProperty where
+  type PropertyType "Prefix" GrpcRouteMetadataMatchMethodProperty = Value Prelude.Text
+  set newValue GrpcRouteMetadataMatchMethodProperty {..}
+    = GrpcRouteMetadataMatchMethodProperty
+        {prefix = Prelude.pure newValue, ..}
+instance Property "Range" GrpcRouteMetadataMatchMethodProperty where
+  type PropertyType "Range" GrpcRouteMetadataMatchMethodProperty = MatchRangeProperty
+  set newValue GrpcRouteMetadataMatchMethodProperty {..}
+    = GrpcRouteMetadataMatchMethodProperty
+        {range = Prelude.pure newValue, ..}
+instance Property "Regex" GrpcRouteMetadataMatchMethodProperty where
+  type PropertyType "Regex" GrpcRouteMetadataMatchMethodProperty = Value Prelude.Text
+  set newValue GrpcRouteMetadataMatchMethodProperty {..}
+    = GrpcRouteMetadataMatchMethodProperty
+        {regex = Prelude.pure newValue, ..}
+instance Property "Suffix" GrpcRouteMetadataMatchMethodProperty where
+  type PropertyType "Suffix" GrpcRouteMetadataMatchMethodProperty = Value Prelude.Text
+  set newValue GrpcRouteMetadataMatchMethodProperty {..}
+    = GrpcRouteMetadataMatchMethodProperty
+        {suffix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataMatchMethodProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMetadataMatchMethodProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRouteMetadataMatchMethodProperty :: Prelude.Type
+instance ToResourceProperties GrpcRouteMetadataMatchMethodProperty
+instance Prelude.Eq GrpcRouteMetadataMatchMethodProperty
+instance Prelude.Show GrpcRouteMetadataMatchMethodProperty
+instance JSON.ToJSON GrpcRouteMetadataMatchMethodProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs
@@ -0,0 +1,58 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMetadataProperty (
+        module Exports, GrpcRouteMetadataProperty(..),
+        mkGrpcRouteMetadataProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRouteMetadataMatchMethodProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GrpcRouteMetadataProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html>
+    GrpcRouteMetadataProperty {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-invert>
+                               invert :: (Prelude.Maybe (Value Prelude.Bool)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-match>
+                               match :: (Prelude.Maybe GrpcRouteMetadataMatchMethodProperty),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-name>
+                               name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRouteMetadataProperty ::
+  Value Prelude.Text -> GrpcRouteMetadataProperty
+mkGrpcRouteMetadataProperty name
+  = GrpcRouteMetadataProperty
+      {haddock_workaround_ = (), name = name, invert = Prelude.Nothing,
+       match = Prelude.Nothing}
+instance ToResourceProperties GrpcRouteMetadataProperty where
+  toResourceProperties GrpcRouteMetadataProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRouteMetadata",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Invert" Prelude.<$> invert,
+                               (JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON GrpcRouteMetadataProperty where
+  toJSON GrpcRouteMetadataProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "Invert" Prelude.<$> invert,
+                  (JSON..=) "Match" Prelude.<$> match])))
+instance Property "Invert" GrpcRouteMetadataProperty where
+  type PropertyType "Invert" GrpcRouteMetadataProperty = Value Prelude.Bool
+  set newValue GrpcRouteMetadataProperty {..}
+    = GrpcRouteMetadataProperty {invert = Prelude.pure newValue, ..}
+instance Property "Match" GrpcRouteMetadataProperty where
+  type PropertyType "Match" GrpcRouteMetadataProperty = GrpcRouteMetadataMatchMethodProperty
+  set newValue GrpcRouteMetadataProperty {..}
+    = GrpcRouteMetadataProperty {match = Prelude.pure newValue, ..}
+instance Property "Name" GrpcRouteMetadataProperty where
+  type PropertyType "Name" GrpcRouteMetadataProperty = Value Prelude.Text
+  set newValue GrpcRouteMetadataProperty {..}
+    = GrpcRouteMetadataProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteMetadataProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRouteMetadataProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRouteMetadataProperty :: Prelude.Type
+instance ToResourceProperties GrpcRouteMetadataProperty
+instance Prelude.Eq GrpcRouteMetadataProperty
+instance Prelude.Show GrpcRouteMetadataProperty
+instance JSON.ToJSON GrpcRouteMetadataProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs
@@ -0,0 +1,66 @@
+module Stratosphere.AppMesh.Route.GrpcRouteProperty (
+        module Exports, GrpcRouteProperty(..), mkGrpcRouteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRetryPolicyProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRouteActionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRouteMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcTimeoutProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcRouteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html>
+    GrpcRouteProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-action>
+                       action :: GrpcRouteActionProperty,
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-match>
+                       match :: GrpcRouteMatchProperty,
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-retrypolicy>
+                       retryPolicy :: (Prelude.Maybe GrpcRetryPolicyProperty),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-timeout>
+                       timeout :: (Prelude.Maybe GrpcTimeoutProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcRouteProperty ::
+  GrpcRouteActionProperty
+  -> GrpcRouteMatchProperty -> GrpcRouteProperty
+mkGrpcRouteProperty action match
+  = GrpcRouteProperty
+      {haddock_workaround_ = (), action = action, match = match,
+       retryPolicy = Prelude.Nothing, timeout = Prelude.Nothing}
+instance ToResourceProperties GrpcRouteProperty where
+  toResourceProperties GrpcRouteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcRoute",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Action" JSON..= action, "Match" JSON..= match]
+                           (Prelude.catMaybes
+                              [(JSON..=) "RetryPolicy" Prelude.<$> retryPolicy,
+                               (JSON..=) "Timeout" Prelude.<$> timeout]))}
+instance JSON.ToJSON GrpcRouteProperty where
+  toJSON GrpcRouteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Action" JSON..= action, "Match" JSON..= match]
+              (Prelude.catMaybes
+                 [(JSON..=) "RetryPolicy" Prelude.<$> retryPolicy,
+                  (JSON..=) "Timeout" Prelude.<$> timeout])))
+instance Property "Action" GrpcRouteProperty where
+  type PropertyType "Action" GrpcRouteProperty = GrpcRouteActionProperty
+  set newValue GrpcRouteProperty {..}
+    = GrpcRouteProperty {action = newValue, ..}
+instance Property "Match" GrpcRouteProperty where
+  type PropertyType "Match" GrpcRouteProperty = GrpcRouteMatchProperty
+  set newValue GrpcRouteProperty {..}
+    = GrpcRouteProperty {match = newValue, ..}
+instance Property "RetryPolicy" GrpcRouteProperty where
+  type PropertyType "RetryPolicy" GrpcRouteProperty = GrpcRetryPolicyProperty
+  set newValue GrpcRouteProperty {..}
+    = GrpcRouteProperty {retryPolicy = Prelude.pure newValue, ..}
+instance Property "Timeout" GrpcRouteProperty where
+  type PropertyType "Timeout" GrpcRouteProperty = GrpcTimeoutProperty
+  set newValue GrpcRouteProperty {..}
+    = GrpcRouteProperty {timeout = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcRouteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcRouteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcRouteProperty :: Prelude.Type
+instance ToResourceProperties GrpcRouteProperty
+instance Prelude.Eq GrpcRouteProperty
+instance Prelude.Show GrpcRouteProperty
+instance JSON.ToJSON GrpcRouteProperty
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs b/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.Route.GrpcTimeoutProperty (
+        module Exports, GrpcTimeoutProperty(..), mkGrpcTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html>
+    GrpcTimeoutProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html#cfn-appmesh-route-grpctimeout-idle>
+                         idle :: (Prelude.Maybe DurationProperty),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html#cfn-appmesh-route-grpctimeout-perrequest>
+                         perRequest :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcTimeoutProperty :: GrpcTimeoutProperty
+mkGrpcTimeoutProperty
+  = GrpcTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing,
+       perRequest = Prelude.Nothing}
+instance ToResourceProperties GrpcTimeoutProperty where
+  toResourceProperties GrpcTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.GrpcTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Idle" Prelude.<$> idle,
+                            (JSON..=) "PerRequest" Prelude.<$> perRequest])}
+instance JSON.ToJSON GrpcTimeoutProperty where
+  toJSON GrpcTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Idle" Prelude.<$> idle,
+               (JSON..=) "PerRequest" Prelude.<$> perRequest]))
+instance Property "Idle" GrpcTimeoutProperty where
+  type PropertyType "Idle" GrpcTimeoutProperty = DurationProperty
+  set newValue GrpcTimeoutProperty {..}
+    = GrpcTimeoutProperty {idle = Prelude.pure newValue, ..}
+instance Property "PerRequest" GrpcTimeoutProperty where
+  type PropertyType "PerRequest" GrpcTimeoutProperty = DurationProperty
+  set newValue GrpcTimeoutProperty {..}
+    = GrpcTimeoutProperty {perRequest = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/GrpcTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.GrpcTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcTimeoutProperty :: Prelude.Type
+instance ToResourceProperties GrpcTimeoutProperty
+instance Prelude.Eq GrpcTimeoutProperty
+instance Prelude.Show GrpcTimeoutProperty
+instance JSON.ToJSON GrpcTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs b/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs
@@ -0,0 +1,72 @@
+module Stratosphere.AppMesh.Route.HeaderMatchMethodProperty (
+        module Exports, HeaderMatchMethodProperty(..),
+        mkHeaderMatchMethodProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.MatchRangeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HeaderMatchMethodProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html>
+    HeaderMatchMethodProperty {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-exact>
+                               exact :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-prefix>
+                               prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-range>
+                               range :: (Prelude.Maybe MatchRangeProperty),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-regex>
+                               regex :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-suffix>
+                               suffix :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHeaderMatchMethodProperty :: HeaderMatchMethodProperty
+mkHeaderMatchMethodProperty
+  = HeaderMatchMethodProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       prefix = Prelude.Nothing, range = Prelude.Nothing,
+       regex = Prelude.Nothing, suffix = Prelude.Nothing}
+instance ToResourceProperties HeaderMatchMethodProperty where
+  toResourceProperties HeaderMatchMethodProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HeaderMatchMethod",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "Range" Prelude.<$> range,
+                            (JSON..=) "Regex" Prelude.<$> regex,
+                            (JSON..=) "Suffix" Prelude.<$> suffix])}
+instance JSON.ToJSON HeaderMatchMethodProperty where
+  toJSON HeaderMatchMethodProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "Range" Prelude.<$> range,
+               (JSON..=) "Regex" Prelude.<$> regex,
+               (JSON..=) "Suffix" Prelude.<$> suffix]))
+instance Property "Exact" HeaderMatchMethodProperty where
+  type PropertyType "Exact" HeaderMatchMethodProperty = Value Prelude.Text
+  set newValue HeaderMatchMethodProperty {..}
+    = HeaderMatchMethodProperty {exact = Prelude.pure newValue, ..}
+instance Property "Prefix" HeaderMatchMethodProperty where
+  type PropertyType "Prefix" HeaderMatchMethodProperty = Value Prelude.Text
+  set newValue HeaderMatchMethodProperty {..}
+    = HeaderMatchMethodProperty {prefix = Prelude.pure newValue, ..}
+instance Property "Range" HeaderMatchMethodProperty where
+  type PropertyType "Range" HeaderMatchMethodProperty = MatchRangeProperty
+  set newValue HeaderMatchMethodProperty {..}
+    = HeaderMatchMethodProperty {range = Prelude.pure newValue, ..}
+instance Property "Regex" HeaderMatchMethodProperty where
+  type PropertyType "Regex" HeaderMatchMethodProperty = Value Prelude.Text
+  set newValue HeaderMatchMethodProperty {..}
+    = HeaderMatchMethodProperty {regex = Prelude.pure newValue, ..}
+instance Property "Suffix" HeaderMatchMethodProperty where
+  type PropertyType "Suffix" HeaderMatchMethodProperty = Value Prelude.Text
+  set newValue HeaderMatchMethodProperty {..}
+    = HeaderMatchMethodProperty {suffix = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HeaderMatchMethodProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HeaderMatchMethodProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HeaderMatchMethodProperty :: Prelude.Type
+instance ToResourceProperties HeaderMatchMethodProperty
+instance Prelude.Eq HeaderMatchMethodProperty
+instance Prelude.Show HeaderMatchMethodProperty
+instance JSON.ToJSON HeaderMatchMethodProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.Route.HttpPathMatchProperty (
+        HttpPathMatchProperty(..), mkHttpPathMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpPathMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html>
+    HttpPathMatchProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html#cfn-appmesh-route-httppathmatch-exact>
+                           exact :: (Prelude.Maybe (Value Prelude.Text)),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html#cfn-appmesh-route-httppathmatch-regex>
+                           regex :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpPathMatchProperty :: HttpPathMatchProperty
+mkHttpPathMatchProperty
+  = HttpPathMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing,
+       regex = Prelude.Nothing}
+instance ToResourceProperties HttpPathMatchProperty where
+  toResourceProperties HttpPathMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpPathMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Exact" Prelude.<$> exact,
+                            (JSON..=) "Regex" Prelude.<$> regex])}
+instance JSON.ToJSON HttpPathMatchProperty where
+  toJSON HttpPathMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Exact" Prelude.<$> exact,
+               (JSON..=) "Regex" Prelude.<$> regex]))
+instance Property "Exact" HttpPathMatchProperty where
+  type PropertyType "Exact" HttpPathMatchProperty = Value Prelude.Text
+  set newValue HttpPathMatchProperty {..}
+    = HttpPathMatchProperty {exact = Prelude.pure newValue, ..}
+instance Property "Regex" HttpPathMatchProperty where
+  type PropertyType "Regex" HttpPathMatchProperty = Value Prelude.Text
+  set newValue HttpPathMatchProperty {..}
+    = HttpPathMatchProperty {regex = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpPathMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpPathMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpPathMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpPathMatchProperty
+instance Prelude.Eq HttpPathMatchProperty
+instance Prelude.Show HttpPathMatchProperty
+instance JSON.ToJSON HttpPathMatchProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.Route.HttpQueryParameterMatchProperty (
+        HttpQueryParameterMatchProperty(..),
+        mkHttpQueryParameterMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpQueryParameterMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpqueryparametermatch.html>
+    HttpQueryParameterMatchProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpqueryparametermatch.html#cfn-appmesh-route-httpqueryparametermatch-exact>
+                                     exact :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpQueryParameterMatchProperty ::
+  HttpQueryParameterMatchProperty
+mkHttpQueryParameterMatchProperty
+  = HttpQueryParameterMatchProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing}
+instance ToResourceProperties HttpQueryParameterMatchProperty where
+  toResourceProperties HttpQueryParameterMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpQueryParameterMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact])}
+instance JSON.ToJSON HttpQueryParameterMatchProperty where
+  toJSON HttpQueryParameterMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact]))
+instance Property "Exact" HttpQueryParameterMatchProperty where
+  type PropertyType "Exact" HttpQueryParameterMatchProperty = Value Prelude.Text
+  set newValue HttpQueryParameterMatchProperty {..}
+    = HttpQueryParameterMatchProperty
+        {exact = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpQueryParameterMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpQueryParameterMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpQueryParameterMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpQueryParameterMatchProperty
+instance Prelude.Eq HttpQueryParameterMatchProperty
+instance Prelude.Show HttpQueryParameterMatchProperty
+instance JSON.ToJSON HttpQueryParameterMatchProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs
@@ -0,0 +1,71 @@
+module Stratosphere.AppMesh.Route.HttpRetryPolicyProperty (
+        module Exports, HttpRetryPolicyProperty(..),
+        mkHttpRetryPolicyProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpRetryPolicyProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html>
+    HttpRetryPolicyProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-httpretryevents>
+                             httpRetryEvents :: (Prelude.Maybe (ValueList Prelude.Text)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-maxretries>
+                             maxRetries :: (Value Prelude.Integer),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-perretrytimeout>
+                             perRetryTimeout :: DurationProperty,
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-tcpretryevents>
+                             tcpRetryEvents :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpRetryPolicyProperty ::
+  Value Prelude.Integer
+  -> DurationProperty -> HttpRetryPolicyProperty
+mkHttpRetryPolicyProperty maxRetries perRetryTimeout
+  = HttpRetryPolicyProperty
+      {haddock_workaround_ = (), maxRetries = maxRetries,
+       perRetryTimeout = perRetryTimeout,
+       httpRetryEvents = Prelude.Nothing,
+       tcpRetryEvents = Prelude.Nothing}
+instance ToResourceProperties HttpRetryPolicyProperty where
+  toResourceProperties HttpRetryPolicyProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpRetryPolicy",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MaxRetries" JSON..= maxRetries,
+                            "PerRetryTimeout" JSON..= perRetryTimeout]
+                           (Prelude.catMaybes
+                              [(JSON..=) "HttpRetryEvents" Prelude.<$> httpRetryEvents,
+                               (JSON..=) "TcpRetryEvents" Prelude.<$> tcpRetryEvents]))}
+instance JSON.ToJSON HttpRetryPolicyProperty where
+  toJSON HttpRetryPolicyProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MaxRetries" JSON..= maxRetries,
+               "PerRetryTimeout" JSON..= perRetryTimeout]
+              (Prelude.catMaybes
+                 [(JSON..=) "HttpRetryEvents" Prelude.<$> httpRetryEvents,
+                  (JSON..=) "TcpRetryEvents" Prelude.<$> tcpRetryEvents])))
+instance Property "HttpRetryEvents" HttpRetryPolicyProperty where
+  type PropertyType "HttpRetryEvents" HttpRetryPolicyProperty = ValueList Prelude.Text
+  set newValue HttpRetryPolicyProperty {..}
+    = HttpRetryPolicyProperty
+        {httpRetryEvents = Prelude.pure newValue, ..}
+instance Property "MaxRetries" HttpRetryPolicyProperty where
+  type PropertyType "MaxRetries" HttpRetryPolicyProperty = Value Prelude.Integer
+  set newValue HttpRetryPolicyProperty {..}
+    = HttpRetryPolicyProperty {maxRetries = newValue, ..}
+instance Property "PerRetryTimeout" HttpRetryPolicyProperty where
+  type PropertyType "PerRetryTimeout" HttpRetryPolicyProperty = DurationProperty
+  set newValue HttpRetryPolicyProperty {..}
+    = HttpRetryPolicyProperty {perRetryTimeout = newValue, ..}
+instance Property "TcpRetryEvents" HttpRetryPolicyProperty where
+  type PropertyType "TcpRetryEvents" HttpRetryPolicyProperty = ValueList Prelude.Text
+  set newValue HttpRetryPolicyProperty {..}
+    = HttpRetryPolicyProperty
+        {tcpRetryEvents = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRetryPolicyProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpRetryPolicyProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpRetryPolicyProperty :: Prelude.Type
+instance ToResourceProperties HttpRetryPolicyProperty
+instance Prelude.Eq HttpRetryPolicyProperty
+instance Prelude.Show HttpRetryPolicyProperty
+instance JSON.ToJSON HttpRetryPolicyProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.Route.HttpRouteActionProperty (
+        module Exports, HttpRouteActionProperty(..),
+        mkHttpRouteActionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.WeightedTargetProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpRouteActionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteaction.html>
+    HttpRouteActionProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteaction.html#cfn-appmesh-route-httprouteaction-weightedtargets>
+                             weightedTargets :: [WeightedTargetProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpRouteActionProperty ::
+  [WeightedTargetProperty] -> HttpRouteActionProperty
+mkHttpRouteActionProperty weightedTargets
+  = HttpRouteActionProperty
+      {haddock_workaround_ = (), weightedTargets = weightedTargets}
+instance ToResourceProperties HttpRouteActionProperty where
+  toResourceProperties HttpRouteActionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpRouteAction",
+         supportsTags = Prelude.False,
+         properties = ["WeightedTargets" JSON..= weightedTargets]}
+instance JSON.ToJSON HttpRouteActionProperty where
+  toJSON HttpRouteActionProperty {..}
+    = JSON.object ["WeightedTargets" JSON..= weightedTargets]
+instance Property "WeightedTargets" HttpRouteActionProperty where
+  type PropertyType "WeightedTargets" HttpRouteActionProperty = [WeightedTargetProperty]
+  set newValue HttpRouteActionProperty {..}
+    = HttpRouteActionProperty {weightedTargets = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteActionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpRouteActionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpRouteActionProperty :: Prelude.Type
+instance ToResourceProperties HttpRouteActionProperty
+instance Prelude.Eq HttpRouteActionProperty
+instance Prelude.Show HttpRouteActionProperty
+instance JSON.ToJSON HttpRouteActionProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs
@@ -0,0 +1,58 @@
+module Stratosphere.AppMesh.Route.HttpRouteHeaderProperty (
+        module Exports, HttpRouteHeaderProperty(..),
+        mkHttpRouteHeaderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HeaderMatchMethodProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpRouteHeaderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html>
+    HttpRouteHeaderProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-invert>
+                             invert :: (Prelude.Maybe (Value Prelude.Bool)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-match>
+                             match :: (Prelude.Maybe HeaderMatchMethodProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-name>
+                             name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpRouteHeaderProperty ::
+  Value Prelude.Text -> HttpRouteHeaderProperty
+mkHttpRouteHeaderProperty name
+  = HttpRouteHeaderProperty
+      {haddock_workaround_ = (), name = name, invert = Prelude.Nothing,
+       match = Prelude.Nothing}
+instance ToResourceProperties HttpRouteHeaderProperty where
+  toResourceProperties HttpRouteHeaderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpRouteHeader",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Invert" Prelude.<$> invert,
+                               (JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON HttpRouteHeaderProperty where
+  toJSON HttpRouteHeaderProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "Invert" Prelude.<$> invert,
+                  (JSON..=) "Match" Prelude.<$> match])))
+instance Property "Invert" HttpRouteHeaderProperty where
+  type PropertyType "Invert" HttpRouteHeaderProperty = Value Prelude.Bool
+  set newValue HttpRouteHeaderProperty {..}
+    = HttpRouteHeaderProperty {invert = Prelude.pure newValue, ..}
+instance Property "Match" HttpRouteHeaderProperty where
+  type PropertyType "Match" HttpRouteHeaderProperty = HeaderMatchMethodProperty
+  set newValue HttpRouteHeaderProperty {..}
+    = HttpRouteHeaderProperty {match = Prelude.pure newValue, ..}
+instance Property "Name" HttpRouteHeaderProperty where
+  type PropertyType "Name" HttpRouteHeaderProperty = Value Prelude.Text
+  set newValue HttpRouteHeaderProperty {..}
+    = HttpRouteHeaderProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteHeaderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpRouteHeaderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpRouteHeaderProperty :: Prelude.Type
+instance ToResourceProperties HttpRouteHeaderProperty
+instance Prelude.Eq HttpRouteHeaderProperty
+instance Prelude.Show HttpRouteHeaderProperty
+instance JSON.ToJSON HttpRouteHeaderProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs
@@ -0,0 +1,92 @@
+module Stratosphere.AppMesh.Route.HttpRouteMatchProperty (
+        module Exports, HttpRouteMatchProperty(..),
+        mkHttpRouteMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpPathMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpRouteHeaderProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.QueryParameterProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HttpRouteMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html>
+    HttpRouteMatchProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-headers>
+                            headers :: (Prelude.Maybe [HttpRouteHeaderProperty]),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-method>
+                            method :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-path>
+                            path :: (Prelude.Maybe HttpPathMatchProperty),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-port>
+                            port :: (Prelude.Maybe (Value Prelude.Integer)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-prefix>
+                            prefix :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-queryparameters>
+                            queryParameters :: (Prelude.Maybe [QueryParameterProperty]),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-scheme>
+                            scheme :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpRouteMatchProperty :: HttpRouteMatchProperty
+mkHttpRouteMatchProperty
+  = HttpRouteMatchProperty
+      {haddock_workaround_ = (), headers = Prelude.Nothing,
+       method = Prelude.Nothing, path = Prelude.Nothing,
+       port = Prelude.Nothing, prefix = Prelude.Nothing,
+       queryParameters = Prelude.Nothing, scheme = Prelude.Nothing}
+instance ToResourceProperties HttpRouteMatchProperty where
+  toResourceProperties HttpRouteMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpRouteMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Headers" Prelude.<$> headers,
+                            (JSON..=) "Method" Prelude.<$> method,
+                            (JSON..=) "Path" Prelude.<$> path,
+                            (JSON..=) "Port" Prelude.<$> port,
+                            (JSON..=) "Prefix" Prelude.<$> prefix,
+                            (JSON..=) "QueryParameters" Prelude.<$> queryParameters,
+                            (JSON..=) "Scheme" Prelude.<$> scheme])}
+instance JSON.ToJSON HttpRouteMatchProperty where
+  toJSON HttpRouteMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Headers" Prelude.<$> headers,
+               (JSON..=) "Method" Prelude.<$> method,
+               (JSON..=) "Path" Prelude.<$> path,
+               (JSON..=) "Port" Prelude.<$> port,
+               (JSON..=) "Prefix" Prelude.<$> prefix,
+               (JSON..=) "QueryParameters" Prelude.<$> queryParameters,
+               (JSON..=) "Scheme" Prelude.<$> scheme]))
+instance Property "Headers" HttpRouteMatchProperty where
+  type PropertyType "Headers" HttpRouteMatchProperty = [HttpRouteHeaderProperty]
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {headers = Prelude.pure newValue, ..}
+instance Property "Method" HttpRouteMatchProperty where
+  type PropertyType "Method" HttpRouteMatchProperty = Value Prelude.Text
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {method = Prelude.pure newValue, ..}
+instance Property "Path" HttpRouteMatchProperty where
+  type PropertyType "Path" HttpRouteMatchProperty = HttpPathMatchProperty
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {path = Prelude.pure newValue, ..}
+instance Property "Port" HttpRouteMatchProperty where
+  type PropertyType "Port" HttpRouteMatchProperty = Value Prelude.Integer
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {port = Prelude.pure newValue, ..}
+instance Property "Prefix" HttpRouteMatchProperty where
+  type PropertyType "Prefix" HttpRouteMatchProperty = Value Prelude.Text
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {prefix = Prelude.pure newValue, ..}
+instance Property "QueryParameters" HttpRouteMatchProperty where
+  type PropertyType "QueryParameters" HttpRouteMatchProperty = [QueryParameterProperty]
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty
+        {queryParameters = Prelude.pure newValue, ..}
+instance Property "Scheme" HttpRouteMatchProperty where
+  type PropertyType "Scheme" HttpRouteMatchProperty = Value Prelude.Text
+  set newValue HttpRouteMatchProperty {..}
+    = HttpRouteMatchProperty {scheme = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpRouteMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpRouteMatchProperty :: Prelude.Type
+instance ToResourceProperties HttpRouteMatchProperty
+instance Prelude.Eq HttpRouteMatchProperty
+instance Prelude.Show HttpRouteMatchProperty
+instance JSON.ToJSON HttpRouteMatchProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs
@@ -0,0 +1,66 @@
+module Stratosphere.AppMesh.Route.HttpRouteProperty (
+        module Exports, HttpRouteProperty(..), mkHttpRouteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpRetryPolicyProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpRouteActionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpRouteMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpTimeoutProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpRouteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html>
+    HttpRouteProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-action>
+                       action :: HttpRouteActionProperty,
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-match>
+                       match :: HttpRouteMatchProperty,
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-retrypolicy>
+                       retryPolicy :: (Prelude.Maybe HttpRetryPolicyProperty),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-timeout>
+                       timeout :: (Prelude.Maybe HttpTimeoutProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpRouteProperty ::
+  HttpRouteActionProperty
+  -> HttpRouteMatchProperty -> HttpRouteProperty
+mkHttpRouteProperty action match
+  = HttpRouteProperty
+      {haddock_workaround_ = (), action = action, match = match,
+       retryPolicy = Prelude.Nothing, timeout = Prelude.Nothing}
+instance ToResourceProperties HttpRouteProperty where
+  toResourceProperties HttpRouteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpRoute",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Action" JSON..= action, "Match" JSON..= match]
+                           (Prelude.catMaybes
+                              [(JSON..=) "RetryPolicy" Prelude.<$> retryPolicy,
+                               (JSON..=) "Timeout" Prelude.<$> timeout]))}
+instance JSON.ToJSON HttpRouteProperty where
+  toJSON HttpRouteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Action" JSON..= action, "Match" JSON..= match]
+              (Prelude.catMaybes
+                 [(JSON..=) "RetryPolicy" Prelude.<$> retryPolicy,
+                  (JSON..=) "Timeout" Prelude.<$> timeout])))
+instance Property "Action" HttpRouteProperty where
+  type PropertyType "Action" HttpRouteProperty = HttpRouteActionProperty
+  set newValue HttpRouteProperty {..}
+    = HttpRouteProperty {action = newValue, ..}
+instance Property "Match" HttpRouteProperty where
+  type PropertyType "Match" HttpRouteProperty = HttpRouteMatchProperty
+  set newValue HttpRouteProperty {..}
+    = HttpRouteProperty {match = newValue, ..}
+instance Property "RetryPolicy" HttpRouteProperty where
+  type PropertyType "RetryPolicy" HttpRouteProperty = HttpRetryPolicyProperty
+  set newValue HttpRouteProperty {..}
+    = HttpRouteProperty {retryPolicy = Prelude.pure newValue, ..}
+instance Property "Timeout" HttpRouteProperty where
+  type PropertyType "Timeout" HttpRouteProperty = HttpTimeoutProperty
+  set newValue HttpRouteProperty {..}
+    = HttpRouteProperty {timeout = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpRouteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpRouteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpRouteProperty :: Prelude.Type
+instance ToResourceProperties HttpRouteProperty
+instance Prelude.Eq HttpRouteProperty
+instance Prelude.Show HttpRouteProperty
+instance JSON.ToJSON HttpRouteProperty
diff --git a/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs b/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.Route.HttpTimeoutProperty (
+        module Exports, HttpTimeoutProperty(..), mkHttpTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html>
+    HttpTimeoutProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html#cfn-appmesh-route-httptimeout-idle>
+                         idle :: (Prelude.Maybe DurationProperty),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html#cfn-appmesh-route-httptimeout-perrequest>
+                         perRequest :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpTimeoutProperty :: HttpTimeoutProperty
+mkHttpTimeoutProperty
+  = HttpTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing,
+       perRequest = Prelude.Nothing}
+instance ToResourceProperties HttpTimeoutProperty where
+  toResourceProperties HttpTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.HttpTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Idle" Prelude.<$> idle,
+                            (JSON..=) "PerRequest" Prelude.<$> perRequest])}
+instance JSON.ToJSON HttpTimeoutProperty where
+  toJSON HttpTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Idle" Prelude.<$> idle,
+               (JSON..=) "PerRequest" Prelude.<$> perRequest]))
+instance Property "Idle" HttpTimeoutProperty where
+  type PropertyType "Idle" HttpTimeoutProperty = DurationProperty
+  set newValue HttpTimeoutProperty {..}
+    = HttpTimeoutProperty {idle = Prelude.pure newValue, ..}
+instance Property "PerRequest" HttpTimeoutProperty where
+  type PropertyType "PerRequest" HttpTimeoutProperty = DurationProperty
+  set newValue HttpTimeoutProperty {..}
+    = HttpTimeoutProperty {perRequest = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/HttpTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.HttpTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpTimeoutProperty :: Prelude.Type
+instance ToResourceProperties HttpTimeoutProperty
+instance Prelude.Eq HttpTimeoutProperty
+instance Prelude.Show HttpTimeoutProperty
+instance JSON.ToJSON HttpTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs b/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.AppMesh.Route.MatchRangeProperty (
+        MatchRangeProperty(..), mkMatchRangeProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MatchRangeProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html>
+    MatchRangeProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html#cfn-appmesh-route-matchrange-end>
+                        end :: (Value Prelude.Integer),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html#cfn-appmesh-route-matchrange-start>
+                        start :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMatchRangeProperty ::
+  Value Prelude.Integer
+  -> Value Prelude.Integer -> MatchRangeProperty
+mkMatchRangeProperty end start
+  = MatchRangeProperty
+      {haddock_workaround_ = (), end = end, start = start}
+instance ToResourceProperties MatchRangeProperty where
+  toResourceProperties MatchRangeProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.MatchRange",
+         supportsTags = Prelude.False,
+         properties = ["End" JSON..= end, "Start" JSON..= start]}
+instance JSON.ToJSON MatchRangeProperty where
+  toJSON MatchRangeProperty {..}
+    = JSON.object ["End" JSON..= end, "Start" JSON..= start]
+instance Property "End" MatchRangeProperty where
+  type PropertyType "End" MatchRangeProperty = Value Prelude.Integer
+  set newValue MatchRangeProperty {..}
+    = MatchRangeProperty {end = newValue, ..}
+instance Property "Start" MatchRangeProperty where
+  type PropertyType "Start" MatchRangeProperty = Value Prelude.Integer
+  set newValue MatchRangeProperty {..}
+    = MatchRangeProperty {start = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/MatchRangeProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.MatchRangeProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MatchRangeProperty :: Prelude.Type
+instance ToResourceProperties MatchRangeProperty
+instance Prelude.Eq MatchRangeProperty
+instance Prelude.Show MatchRangeProperty
+instance JSON.ToJSON MatchRangeProperty
diff --git a/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs b/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs
@@ -0,0 +1,47 @@
+module Stratosphere.AppMesh.Route.QueryParameterProperty (
+        module Exports, QueryParameterProperty(..),
+        mkQueryParameterProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpQueryParameterMatchProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data QueryParameterProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html>
+    QueryParameterProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html#cfn-appmesh-route-queryparameter-match>
+                            match :: (Prelude.Maybe HttpQueryParameterMatchProperty),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html#cfn-appmesh-route-queryparameter-name>
+                            name :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkQueryParameterProperty ::
+  Value Prelude.Text -> QueryParameterProperty
+mkQueryParameterProperty name
+  = QueryParameterProperty
+      {haddock_workaround_ = (), name = name, match = Prelude.Nothing}
+instance ToResourceProperties QueryParameterProperty where
+  toResourceProperties QueryParameterProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.QueryParameter",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name]
+                           (Prelude.catMaybes [(JSON..=) "Match" Prelude.<$> match]))}
+instance JSON.ToJSON QueryParameterProperty where
+  toJSON QueryParameterProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name]
+              (Prelude.catMaybes [(JSON..=) "Match" Prelude.<$> match])))
+instance Property "Match" QueryParameterProperty where
+  type PropertyType "Match" QueryParameterProperty = HttpQueryParameterMatchProperty
+  set newValue QueryParameterProperty {..}
+    = QueryParameterProperty {match = Prelude.pure newValue, ..}
+instance Property "Name" QueryParameterProperty where
+  type PropertyType "Name" QueryParameterProperty = Value Prelude.Text
+  set newValue QueryParameterProperty {..}
+    = QueryParameterProperty {name = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/QueryParameterProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.QueryParameterProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data QueryParameterProperty :: Prelude.Type
+instance ToResourceProperties QueryParameterProperty
+instance Prelude.Eq QueryParameterProperty
+instance Prelude.Show QueryParameterProperty
+instance JSON.ToJSON QueryParameterProperty
diff --git a/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs b/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs
@@ -0,0 +1,73 @@
+module Stratosphere.AppMesh.Route.RouteSpecProperty (
+        module Exports, RouteSpecProperty(..), mkRouteSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.GrpcRouteProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.HttpRouteProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.TcpRouteProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data RouteSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html>
+    RouteSpecProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-grpcroute>
+                       grpcRoute :: (Prelude.Maybe GrpcRouteProperty),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-http2route>
+                       http2Route :: (Prelude.Maybe HttpRouteProperty),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-httproute>
+                       httpRoute :: (Prelude.Maybe HttpRouteProperty),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-priority>
+                       priority :: (Prelude.Maybe (Value Prelude.Integer)),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-tcproute>
+                       tcpRoute :: (Prelude.Maybe TcpRouteProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkRouteSpecProperty :: RouteSpecProperty
+mkRouteSpecProperty
+  = RouteSpecProperty
+      {haddock_workaround_ = (), grpcRoute = Prelude.Nothing,
+       http2Route = Prelude.Nothing, httpRoute = Prelude.Nothing,
+       priority = Prelude.Nothing, tcpRoute = Prelude.Nothing}
+instance ToResourceProperties RouteSpecProperty where
+  toResourceProperties RouteSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.RouteSpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "GrpcRoute" Prelude.<$> grpcRoute,
+                            (JSON..=) "Http2Route" Prelude.<$> http2Route,
+                            (JSON..=) "HttpRoute" Prelude.<$> httpRoute,
+                            (JSON..=) "Priority" Prelude.<$> priority,
+                            (JSON..=) "TcpRoute" Prelude.<$> tcpRoute])}
+instance JSON.ToJSON RouteSpecProperty where
+  toJSON RouteSpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "GrpcRoute" Prelude.<$> grpcRoute,
+               (JSON..=) "Http2Route" Prelude.<$> http2Route,
+               (JSON..=) "HttpRoute" Prelude.<$> httpRoute,
+               (JSON..=) "Priority" Prelude.<$> priority,
+               (JSON..=) "TcpRoute" Prelude.<$> tcpRoute]))
+instance Property "GrpcRoute" RouteSpecProperty where
+  type PropertyType "GrpcRoute" RouteSpecProperty = GrpcRouteProperty
+  set newValue RouteSpecProperty {..}
+    = RouteSpecProperty {grpcRoute = Prelude.pure newValue, ..}
+instance Property "Http2Route" RouteSpecProperty where
+  type PropertyType "Http2Route" RouteSpecProperty = HttpRouteProperty
+  set newValue RouteSpecProperty {..}
+    = RouteSpecProperty {http2Route = Prelude.pure newValue, ..}
+instance Property "HttpRoute" RouteSpecProperty where
+  type PropertyType "HttpRoute" RouteSpecProperty = HttpRouteProperty
+  set newValue RouteSpecProperty {..}
+    = RouteSpecProperty {httpRoute = Prelude.pure newValue, ..}
+instance Property "Priority" RouteSpecProperty where
+  type PropertyType "Priority" RouteSpecProperty = Value Prelude.Integer
+  set newValue RouteSpecProperty {..}
+    = RouteSpecProperty {priority = Prelude.pure newValue, ..}
+instance Property "TcpRoute" RouteSpecProperty where
+  type PropertyType "TcpRoute" RouteSpecProperty = TcpRouteProperty
+  set newValue RouteSpecProperty {..}
+    = RouteSpecProperty {tcpRoute = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/RouteSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.RouteSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data RouteSpecProperty :: Prelude.Type
+instance ToResourceProperties RouteSpecProperty
+instance Prelude.Eq RouteSpecProperty
+instance Prelude.Show RouteSpecProperty
+instance JSON.ToJSON RouteSpecProperty
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs b/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.Route.TcpRouteActionProperty (
+        module Exports, TcpRouteActionProperty(..),
+        mkTcpRouteActionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.WeightedTargetProperty as Exports
+import Stratosphere.ResourceProperties
+data TcpRouteActionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcprouteaction.html>
+    TcpRouteActionProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcprouteaction.html#cfn-appmesh-route-tcprouteaction-weightedtargets>
+                            weightedTargets :: [WeightedTargetProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTcpRouteActionProperty ::
+  [WeightedTargetProperty] -> TcpRouteActionProperty
+mkTcpRouteActionProperty weightedTargets
+  = TcpRouteActionProperty
+      {haddock_workaround_ = (), weightedTargets = weightedTargets}
+instance ToResourceProperties TcpRouteActionProperty where
+  toResourceProperties TcpRouteActionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.TcpRouteAction",
+         supportsTags = Prelude.False,
+         properties = ["WeightedTargets" JSON..= weightedTargets]}
+instance JSON.ToJSON TcpRouteActionProperty where
+  toJSON TcpRouteActionProperty {..}
+    = JSON.object ["WeightedTargets" JSON..= weightedTargets]
+instance Property "WeightedTargets" TcpRouteActionProperty where
+  type PropertyType "WeightedTargets" TcpRouteActionProperty = [WeightedTargetProperty]
+  set newValue TcpRouteActionProperty {..}
+    = TcpRouteActionProperty {weightedTargets = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteActionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.TcpRouteActionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TcpRouteActionProperty :: Prelude.Type
+instance ToResourceProperties TcpRouteActionProperty
+instance Prelude.Eq TcpRouteActionProperty
+instance Prelude.Show TcpRouteActionProperty
+instance JSON.ToJSON TcpRouteActionProperty
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs b/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.Route.TcpRouteMatchProperty (
+        TcpRouteMatchProperty(..), mkTcpRouteMatchProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data TcpRouteMatchProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproutematch.html>
+    TcpRouteMatchProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproutematch.html#cfn-appmesh-route-tcproutematch-port>
+                           port :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTcpRouteMatchProperty :: TcpRouteMatchProperty
+mkTcpRouteMatchProperty
+  = TcpRouteMatchProperty
+      {haddock_workaround_ = (), port = Prelude.Nothing}
+instance ToResourceProperties TcpRouteMatchProperty where
+  toResourceProperties TcpRouteMatchProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.TcpRouteMatch",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port])}
+instance JSON.ToJSON TcpRouteMatchProperty where
+  toJSON TcpRouteMatchProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port]))
+instance Property "Port" TcpRouteMatchProperty where
+  type PropertyType "Port" TcpRouteMatchProperty = Value Prelude.Integer
+  set newValue TcpRouteMatchProperty {..}
+    = TcpRouteMatchProperty {port = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteMatchProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.TcpRouteMatchProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TcpRouteMatchProperty :: Prelude.Type
+instance ToResourceProperties TcpRouteMatchProperty
+instance Prelude.Eq TcpRouteMatchProperty
+instance Prelude.Show TcpRouteMatchProperty
+instance JSON.ToJSON TcpRouteMatchProperty
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs b/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs
@@ -0,0 +1,57 @@
+module Stratosphere.AppMesh.Route.TcpRouteProperty (
+        module Exports, TcpRouteProperty(..), mkTcpRouteProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.TcpRouteActionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.TcpRouteMatchProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.TcpTimeoutProperty as Exports
+import Stratosphere.ResourceProperties
+data TcpRouteProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html>
+    TcpRouteProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-action>
+                      action :: TcpRouteActionProperty,
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-match>
+                      match :: (Prelude.Maybe TcpRouteMatchProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-timeout>
+                      timeout :: (Prelude.Maybe TcpTimeoutProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTcpRouteProperty :: TcpRouteActionProperty -> TcpRouteProperty
+mkTcpRouteProperty action
+  = TcpRouteProperty
+      {haddock_workaround_ = (), action = action,
+       match = Prelude.Nothing, timeout = Prelude.Nothing}
+instance ToResourceProperties TcpRouteProperty where
+  toResourceProperties TcpRouteProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.TcpRoute",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Action" JSON..= action]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Match" Prelude.<$> match,
+                               (JSON..=) "Timeout" Prelude.<$> timeout]))}
+instance JSON.ToJSON TcpRouteProperty where
+  toJSON TcpRouteProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Action" JSON..= action]
+              (Prelude.catMaybes
+                 [(JSON..=) "Match" Prelude.<$> match,
+                  (JSON..=) "Timeout" Prelude.<$> timeout])))
+instance Property "Action" TcpRouteProperty where
+  type PropertyType "Action" TcpRouteProperty = TcpRouteActionProperty
+  set newValue TcpRouteProperty {..}
+    = TcpRouteProperty {action = newValue, ..}
+instance Property "Match" TcpRouteProperty where
+  type PropertyType "Match" TcpRouteProperty = TcpRouteMatchProperty
+  set newValue TcpRouteProperty {..}
+    = TcpRouteProperty {match = Prelude.pure newValue, ..}
+instance Property "Timeout" TcpRouteProperty where
+  type PropertyType "Timeout" TcpRouteProperty = TcpTimeoutProperty
+  set newValue TcpRouteProperty {..}
+    = TcpRouteProperty {timeout = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpRouteProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.TcpRouteProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TcpRouteProperty :: Prelude.Type
+instance ToResourceProperties TcpRouteProperty
+instance Prelude.Eq TcpRouteProperty
+instance Prelude.Show TcpRouteProperty
+instance JSON.ToJSON TcpRouteProperty
diff --git a/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs b/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.Route.TcpTimeoutProperty (
+        module Exports, TcpTimeoutProperty(..), mkTcpTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.Route.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data TcpTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcptimeout.html>
+    TcpTimeoutProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcptimeout.html#cfn-appmesh-route-tcptimeout-idle>
+                        idle :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTcpTimeoutProperty :: TcpTimeoutProperty
+mkTcpTimeoutProperty
+  = TcpTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing}
+instance ToResourceProperties TcpTimeoutProperty where
+  toResourceProperties TcpTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.TcpTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Idle" Prelude.<$> idle])}
+instance JSON.ToJSON TcpTimeoutProperty where
+  toJSON TcpTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Idle" Prelude.<$> idle]))
+instance Property "Idle" TcpTimeoutProperty where
+  type PropertyType "Idle" TcpTimeoutProperty = DurationProperty
+  set newValue TcpTimeoutProperty {..}
+    = TcpTimeoutProperty {idle = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/TcpTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.TcpTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TcpTimeoutProperty :: Prelude.Type
+instance ToResourceProperties TcpTimeoutProperty
+instance Prelude.Eq TcpTimeoutProperty
+instance Prelude.Show TcpTimeoutProperty
+instance JSON.ToJSON TcpTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs b/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs
@@ -0,0 +1,53 @@
+module Stratosphere.AppMesh.Route.WeightedTargetProperty (
+        WeightedTargetProperty(..), mkWeightedTargetProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data WeightedTargetProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html>
+    WeightedTargetProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-port>
+                            port :: (Prelude.Maybe (Value Prelude.Integer)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-virtualnode>
+                            virtualNode :: (Value Prelude.Text),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-weight>
+                            weight :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkWeightedTargetProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Integer -> WeightedTargetProperty
+mkWeightedTargetProperty virtualNode weight
+  = WeightedTargetProperty
+      {haddock_workaround_ = (), virtualNode = virtualNode,
+       weight = weight, port = Prelude.Nothing}
+instance ToResourceProperties WeightedTargetProperty where
+  toResourceProperties WeightedTargetProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::Route.WeightedTarget",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["VirtualNode" JSON..= virtualNode, "Weight" JSON..= weight]
+                           (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port]))}
+instance JSON.ToJSON WeightedTargetProperty where
+  toJSON WeightedTargetProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["VirtualNode" JSON..= virtualNode, "Weight" JSON..= weight]
+              (Prelude.catMaybes [(JSON..=) "Port" Prelude.<$> port])))
+instance Property "Port" WeightedTargetProperty where
+  type PropertyType "Port" WeightedTargetProperty = Value Prelude.Integer
+  set newValue WeightedTargetProperty {..}
+    = WeightedTargetProperty {port = Prelude.pure newValue, ..}
+instance Property "VirtualNode" WeightedTargetProperty where
+  type PropertyType "VirtualNode" WeightedTargetProperty = Value Prelude.Text
+  set newValue WeightedTargetProperty {..}
+    = WeightedTargetProperty {virtualNode = newValue, ..}
+instance Property "Weight" WeightedTargetProperty where
+  type PropertyType "Weight" WeightedTargetProperty = Value Prelude.Integer
+  set newValue WeightedTargetProperty {..}
+    = WeightedTargetProperty {weight = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs-boot b/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/Route/WeightedTargetProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.Route.WeightedTargetProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data WeightedTargetProperty :: Prelude.Type
+instance ToResourceProperties WeightedTargetProperty
+instance Prelude.Eq WeightedTargetProperty
+instance Prelude.Show WeightedTargetProperty
+instance JSON.ToJSON WeightedTargetProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway.hs b/gen/Stratosphere/AppMesh/VirtualGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway.hs
@@ -0,0 +1,73 @@
+module Stratosphere.AppMesh.VirtualGateway (
+        module Exports, VirtualGateway(..), mkVirtualGateway
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewaySpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data VirtualGateway
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html>
+    VirtualGateway {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-meshname>
+                    meshName :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-meshowner>
+                    meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-spec>
+                    spec :: VirtualGatewaySpecProperty,
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-tags>
+                    tags :: (Prelude.Maybe [Tag]),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-virtualgatewayname>
+                    virtualGatewayName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGateway ::
+  Value Prelude.Text -> VirtualGatewaySpecProperty -> VirtualGateway
+mkVirtualGateway meshName spec
+  = VirtualGateway
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       meshOwner = Prelude.Nothing, tags = Prelude.Nothing,
+       virtualGatewayName = Prelude.Nothing}
+instance ToResourceProperties VirtualGateway where
+  toResourceProperties VirtualGateway {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "VirtualGatewayName" Prelude.<$> virtualGatewayName]))}
+instance JSON.ToJSON VirtualGateway where
+  toJSON VirtualGateway {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+              (Prelude.catMaybes
+                 [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "VirtualGatewayName" Prelude.<$> virtualGatewayName])))
+instance Property "MeshName" VirtualGateway where
+  type PropertyType "MeshName" VirtualGateway = Value Prelude.Text
+  set newValue VirtualGateway {..}
+    = VirtualGateway {meshName = newValue, ..}
+instance Property "MeshOwner" VirtualGateway where
+  type PropertyType "MeshOwner" VirtualGateway = Value Prelude.Text
+  set newValue VirtualGateway {..}
+    = VirtualGateway {meshOwner = Prelude.pure newValue, ..}
+instance Property "Spec" VirtualGateway where
+  type PropertyType "Spec" VirtualGateway = VirtualGatewaySpecProperty
+  set newValue VirtualGateway {..}
+    = VirtualGateway {spec = newValue, ..}
+instance Property "Tags" VirtualGateway where
+  type PropertyType "Tags" VirtualGateway = [Tag]
+  set newValue VirtualGateway {..}
+    = VirtualGateway {tags = Prelude.pure newValue, ..}
+instance Property "VirtualGatewayName" VirtualGateway where
+  type PropertyType "VirtualGatewayName" VirtualGateway = Value Prelude.Text
+  set newValue VirtualGateway {..}
+    = VirtualGateway {virtualGatewayName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualGateway.JsonFormatRefProperty (
+        JsonFormatRefProperty(..), mkJsonFormatRefProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data JsonFormatRefProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html>
+    JsonFormatRefProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html#cfn-appmesh-virtualgateway-jsonformatref-key>
+                           key :: (Value Prelude.Text),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html#cfn-appmesh-virtualgateway-jsonformatref-value>
+                           value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkJsonFormatRefProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> JsonFormatRefProperty
+mkJsonFormatRefProperty key value
+  = JsonFormatRefProperty
+      {haddock_workaround_ = (), key = key, value = value}
+instance ToResourceProperties JsonFormatRefProperty where
+  toResourceProperties JsonFormatRefProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.JsonFormatRef",
+         supportsTags = Prelude.False,
+         properties = ["Key" JSON..= key, "Value" JSON..= value]}
+instance JSON.ToJSON JsonFormatRefProperty where
+  toJSON JsonFormatRefProperty {..}
+    = JSON.object ["Key" JSON..= key, "Value" JSON..= value]
+instance Property "Key" JsonFormatRefProperty where
+  type PropertyType "Key" JsonFormatRefProperty = Value Prelude.Text
+  set newValue JsonFormatRefProperty {..}
+    = JsonFormatRefProperty {key = newValue, ..}
+instance Property "Value" JsonFormatRefProperty where
+  type PropertyType "Value" JsonFormatRefProperty = Value Prelude.Text
+  set newValue JsonFormatRefProperty {..}
+    = JsonFormatRefProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/JsonFormatRefProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.JsonFormatRefProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data JsonFormatRefProperty :: Prelude.Type
+instance ToResourceProperties JsonFormatRefProperty
+instance Prelude.Eq JsonFormatRefProperty
+instance Prelude.Show JsonFormatRefProperty
+instance JSON.ToJSON JsonFormatRefProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs
@@ -0,0 +1,46 @@
+module Stratosphere.AppMesh.VirtualGateway.LoggingFormatProperty (
+        module Exports, LoggingFormatProperty(..), mkLoggingFormatProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.JsonFormatRefProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data LoggingFormatProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html>
+    LoggingFormatProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html#cfn-appmesh-virtualgateway-loggingformat-json>
+                           json :: (Prelude.Maybe [JsonFormatRefProperty]),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html#cfn-appmesh-virtualgateway-loggingformat-text>
+                           text :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLoggingFormatProperty :: LoggingFormatProperty
+mkLoggingFormatProperty
+  = LoggingFormatProperty
+      {haddock_workaround_ = (), json = Prelude.Nothing,
+       text = Prelude.Nothing}
+instance ToResourceProperties LoggingFormatProperty where
+  toResourceProperties LoggingFormatProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.LoggingFormat",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Json" Prelude.<$> json,
+                            (JSON..=) "Text" Prelude.<$> text])}
+instance JSON.ToJSON LoggingFormatProperty where
+  toJSON LoggingFormatProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Json" Prelude.<$> json,
+               (JSON..=) "Text" Prelude.<$> text]))
+instance Property "Json" LoggingFormatProperty where
+  type PropertyType "Json" LoggingFormatProperty = [JsonFormatRefProperty]
+  set newValue LoggingFormatProperty {..}
+    = LoggingFormatProperty {json = Prelude.pure newValue, ..}
+instance Property "Text" LoggingFormatProperty where
+  type PropertyType "Text" LoggingFormatProperty = Value Prelude.Text
+  set newValue LoggingFormatProperty {..}
+    = LoggingFormatProperty {text = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/LoggingFormatProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.LoggingFormatProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LoggingFormatProperty :: Prelude.Type
+instance ToResourceProperties LoggingFormatProperty
+instance Prelude.Eq LoggingFormatProperty
+instance Prelude.Show LoggingFormatProperty
+instance JSON.ToJSON LoggingFormatProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNameMatchersProperty (
+        SubjectAlternativeNameMatchersProperty(..),
+        mkSubjectAlternativeNameMatchersProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data SubjectAlternativeNameMatchersProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenamematchers.html>
+    SubjectAlternativeNameMatchersProperty {haddock_workaround_ :: (),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenamematchers.html#cfn-appmesh-virtualgateway-subjectalternativenamematchers-exact>
+                                            exact :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSubjectAlternativeNameMatchersProperty ::
+  SubjectAlternativeNameMatchersProperty
+mkSubjectAlternativeNameMatchersProperty
+  = SubjectAlternativeNameMatchersProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing}
+instance ToResourceProperties SubjectAlternativeNameMatchersProperty where
+  toResourceProperties SubjectAlternativeNameMatchersProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.SubjectAlternativeNameMatchers",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact])}
+instance JSON.ToJSON SubjectAlternativeNameMatchersProperty where
+  toJSON SubjectAlternativeNameMatchersProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact]))
+instance Property "Exact" SubjectAlternativeNameMatchersProperty where
+  type PropertyType "Exact" SubjectAlternativeNameMatchersProperty = ValueList Prelude.Text
+  set newValue SubjectAlternativeNameMatchersProperty {..}
+    = SubjectAlternativeNameMatchersProperty
+        {exact = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNameMatchersProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNameMatchersProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNameMatchersProperty :: Prelude.Type
+instance ToResourceProperties SubjectAlternativeNameMatchersProperty
+instance Prelude.Eq SubjectAlternativeNameMatchersProperty
+instance Prelude.Show SubjectAlternativeNameMatchersProperty
+instance JSON.ToJSON SubjectAlternativeNameMatchersProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNamesProperty (
+        module Exports, SubjectAlternativeNamesProperty(..),
+        mkSubjectAlternativeNamesProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNameMatchersProperty as Exports
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNamesProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenames.html>
+    SubjectAlternativeNamesProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenames.html#cfn-appmesh-virtualgateway-subjectalternativenames-match>
+                                     match :: SubjectAlternativeNameMatchersProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSubjectAlternativeNamesProperty ::
+  SubjectAlternativeNameMatchersProperty
+  -> SubjectAlternativeNamesProperty
+mkSubjectAlternativeNamesProperty match
+  = SubjectAlternativeNamesProperty
+      {haddock_workaround_ = (), match = match}
+instance ToResourceProperties SubjectAlternativeNamesProperty where
+  toResourceProperties SubjectAlternativeNamesProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.SubjectAlternativeNames",
+         supportsTags = Prelude.False, properties = ["Match" JSON..= match]}
+instance JSON.ToJSON SubjectAlternativeNamesProperty where
+  toJSON SubjectAlternativeNamesProperty {..}
+    = JSON.object ["Match" JSON..= match]
+instance Property "Match" SubjectAlternativeNamesProperty where
+  type PropertyType "Match" SubjectAlternativeNamesProperty = SubjectAlternativeNameMatchersProperty
+  set newValue SubjectAlternativeNamesProperty {..}
+    = SubjectAlternativeNamesProperty {match = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/SubjectAlternativeNamesProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNamesProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNamesProperty :: Prelude.Type
+instance ToResourceProperties SubjectAlternativeNamesProperty
+instance Prelude.Eq SubjectAlternativeNamesProperty
+instance Prelude.Show SubjectAlternativeNamesProperty
+instance JSON.ToJSON SubjectAlternativeNamesProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayAccessLogProperty (
+        module Exports, VirtualGatewayAccessLogProperty(..),
+        mkVirtualGatewayAccessLogProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayFileAccessLogProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayAccessLogProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayaccesslog.html>
+    VirtualGatewayAccessLogProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayaccesslog-file>
+                                     file :: (Prelude.Maybe VirtualGatewayFileAccessLogProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayAccessLogProperty ::
+  VirtualGatewayAccessLogProperty
+mkVirtualGatewayAccessLogProperty
+  = VirtualGatewayAccessLogProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayAccessLogProperty where
+  toResourceProperties VirtualGatewayAccessLogProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayAccessLog",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "File" Prelude.<$> file])}
+instance JSON.ToJSON VirtualGatewayAccessLogProperty where
+  toJSON VirtualGatewayAccessLogProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "File" Prelude.<$> file]))
+instance Property "File" VirtualGatewayAccessLogProperty where
+  type PropertyType "File" VirtualGatewayAccessLogProperty = VirtualGatewayFileAccessLogProperty
+  set newValue VirtualGatewayAccessLogProperty {..}
+    = VirtualGatewayAccessLogProperty
+        {file = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayAccessLogProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayAccessLogProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayAccessLogProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayAccessLogProperty
+instance Prelude.Eq VirtualGatewayAccessLogProperty
+instance Prelude.Show VirtualGatewayAccessLogProperty
+instance JSON.ToJSON VirtualGatewayAccessLogProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayBackendDefaultsProperty (
+        module Exports, VirtualGatewayBackendDefaultsProperty(..),
+        mkVirtualGatewayBackendDefaultsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayBackendDefaultsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaybackenddefaults.html>
+    VirtualGatewayBackendDefaultsProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaybackenddefaults.html#cfn-appmesh-virtualgateway-virtualgatewaybackenddefaults-clientpolicy>
+                                           clientPolicy :: (Prelude.Maybe VirtualGatewayClientPolicyProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayBackendDefaultsProperty ::
+  VirtualGatewayBackendDefaultsProperty
+mkVirtualGatewayBackendDefaultsProperty
+  = VirtualGatewayBackendDefaultsProperty
+      {haddock_workaround_ = (), clientPolicy = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayBackendDefaultsProperty where
+  toResourceProperties VirtualGatewayBackendDefaultsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayBackendDefaults",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy])}
+instance JSON.ToJSON VirtualGatewayBackendDefaultsProperty where
+  toJSON VirtualGatewayBackendDefaultsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy]))
+instance Property "ClientPolicy" VirtualGatewayBackendDefaultsProperty where
+  type PropertyType "ClientPolicy" VirtualGatewayBackendDefaultsProperty = VirtualGatewayClientPolicyProperty
+  set newValue VirtualGatewayBackendDefaultsProperty {..}
+    = VirtualGatewayBackendDefaultsProperty
+        {clientPolicy = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayBackendDefaultsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayBackendDefaultsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayBackendDefaultsProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayBackendDefaultsProperty
+instance Prelude.Eq VirtualGatewayBackendDefaultsProperty
+instance Prelude.Show VirtualGatewayBackendDefaultsProperty
+instance JSON.ToJSON VirtualGatewayBackendDefaultsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyProperty (
+        module Exports, VirtualGatewayClientPolicyProperty(..),
+        mkVirtualGatewayClientPolicyProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyTlsProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayClientPolicyProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicy.html>
+    VirtualGatewayClientPolicyProperty {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicy-tls>
+                                        tLS :: (Prelude.Maybe VirtualGatewayClientPolicyTlsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayClientPolicyProperty ::
+  VirtualGatewayClientPolicyProperty
+mkVirtualGatewayClientPolicyProperty
+  = VirtualGatewayClientPolicyProperty
+      {haddock_workaround_ = (), tLS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayClientPolicyProperty where
+  toResourceProperties VirtualGatewayClientPolicyProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicy",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "TLS" Prelude.<$> tLS])}
+instance JSON.ToJSON VirtualGatewayClientPolicyProperty where
+  toJSON VirtualGatewayClientPolicyProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "TLS" Prelude.<$> tLS]))
+instance Property "TLS" VirtualGatewayClientPolicyProperty where
+  type PropertyType "TLS" VirtualGatewayClientPolicyProperty = VirtualGatewayClientPolicyTlsProperty
+  set newValue VirtualGatewayClientPolicyProperty {..}
+    = VirtualGatewayClientPolicyProperty
+        {tLS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayClientPolicyProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayClientPolicyProperty
+instance Prelude.Eq VirtualGatewayClientPolicyProperty
+instance Prelude.Show VirtualGatewayClientPolicyProperty
+instance JSON.ToJSON VirtualGatewayClientPolicyProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs
@@ -0,0 +1,72 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyTlsProperty (
+        module Exports, VirtualGatewayClientPolicyTlsProperty(..),
+        mkVirtualGatewayClientPolicyTlsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientTlsCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayClientPolicyTlsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html>
+    VirtualGatewayClientPolicyTlsProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-certificate>
+                                           certificate :: (Prelude.Maybe VirtualGatewayClientTlsCertificateProperty),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-enforce>
+                                           enforce :: (Prelude.Maybe (Value Prelude.Bool)),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-ports>
+                                           ports :: (Prelude.Maybe (ValueList Prelude.Integer)),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-validation>
+                                           validation :: VirtualGatewayTlsValidationContextProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayClientPolicyTlsProperty ::
+  VirtualGatewayTlsValidationContextProperty
+  -> VirtualGatewayClientPolicyTlsProperty
+mkVirtualGatewayClientPolicyTlsProperty validation
+  = VirtualGatewayClientPolicyTlsProperty
+      {haddock_workaround_ = (), validation = validation,
+       certificate = Prelude.Nothing, enforce = Prelude.Nothing,
+       ports = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayClientPolicyTlsProperty where
+  toResourceProperties VirtualGatewayClientPolicyTlsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicyTls",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Validation" JSON..= validation]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Certificate" Prelude.<$> certificate,
+                               (JSON..=) "Enforce" Prelude.<$> enforce,
+                               (JSON..=) "Ports" Prelude.<$> ports]))}
+instance JSON.ToJSON VirtualGatewayClientPolicyTlsProperty where
+  toJSON VirtualGatewayClientPolicyTlsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Validation" JSON..= validation]
+              (Prelude.catMaybes
+                 [(JSON..=) "Certificate" Prelude.<$> certificate,
+                  (JSON..=) "Enforce" Prelude.<$> enforce,
+                  (JSON..=) "Ports" Prelude.<$> ports])))
+instance Property "Certificate" VirtualGatewayClientPolicyTlsProperty where
+  type PropertyType "Certificate" VirtualGatewayClientPolicyTlsProperty = VirtualGatewayClientTlsCertificateProperty
+  set newValue VirtualGatewayClientPolicyTlsProperty {..}
+    = VirtualGatewayClientPolicyTlsProperty
+        {certificate = Prelude.pure newValue, ..}
+instance Property "Enforce" VirtualGatewayClientPolicyTlsProperty where
+  type PropertyType "Enforce" VirtualGatewayClientPolicyTlsProperty = Value Prelude.Bool
+  set newValue VirtualGatewayClientPolicyTlsProperty {..}
+    = VirtualGatewayClientPolicyTlsProperty
+        {enforce = Prelude.pure newValue, ..}
+instance Property "Ports" VirtualGatewayClientPolicyTlsProperty where
+  type PropertyType "Ports" VirtualGatewayClientPolicyTlsProperty = ValueList Prelude.Integer
+  set newValue VirtualGatewayClientPolicyTlsProperty {..}
+    = VirtualGatewayClientPolicyTlsProperty
+        {ports = Prelude.pure newValue, ..}
+instance Property "Validation" VirtualGatewayClientPolicyTlsProperty where
+  type PropertyType "Validation" VirtualGatewayClientPolicyTlsProperty = VirtualGatewayTlsValidationContextProperty
+  set newValue VirtualGatewayClientPolicyTlsProperty {..}
+    = VirtualGatewayClientPolicyTlsProperty {validation = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientPolicyTlsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyTlsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayClientPolicyTlsProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayClientPolicyTlsProperty
+instance Prelude.Eq VirtualGatewayClientPolicyTlsProperty
+instance Prelude.Show VirtualGatewayClientPolicyTlsProperty
+instance JSON.ToJSON VirtualGatewayClientPolicyTlsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs
@@ -0,0 +1,51 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientTlsCertificateProperty (
+        module Exports, VirtualGatewayClientTlsCertificateProperty(..),
+        mkVirtualGatewayClientTlsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsFileCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsSdsCertificateProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayClientTlsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html>
+    VirtualGatewayClientTlsCertificateProperty {haddock_workaround_ :: (),
+                                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewayclienttlscertificate-file>
+                                                file :: (Prelude.Maybe VirtualGatewayListenerTlsFileCertificateProperty),
+                                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewayclienttlscertificate-sds>
+                                                sDS :: (Prelude.Maybe VirtualGatewayListenerTlsSdsCertificateProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayClientTlsCertificateProperty ::
+  VirtualGatewayClientTlsCertificateProperty
+mkVirtualGatewayClientTlsCertificateProperty
+  = VirtualGatewayClientTlsCertificateProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing,
+       sDS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayClientTlsCertificateProperty where
+  toResourceProperties
+    VirtualGatewayClientTlsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayClientTlsCertificate",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON VirtualGatewayClientTlsCertificateProperty where
+  toJSON VirtualGatewayClientTlsCertificateProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "File" VirtualGatewayClientTlsCertificateProperty where
+  type PropertyType "File" VirtualGatewayClientTlsCertificateProperty = VirtualGatewayListenerTlsFileCertificateProperty
+  set newValue VirtualGatewayClientTlsCertificateProperty {..}
+    = VirtualGatewayClientTlsCertificateProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" VirtualGatewayClientTlsCertificateProperty where
+  type PropertyType "SDS" VirtualGatewayClientTlsCertificateProperty = VirtualGatewayListenerTlsSdsCertificateProperty
+  set newValue VirtualGatewayClientTlsCertificateProperty {..}
+    = VirtualGatewayClientTlsCertificateProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayClientTlsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientTlsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayClientTlsCertificateProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayClientTlsCertificateProperty
+instance Prelude.Eq VirtualGatewayClientTlsCertificateProperty
+instance Prelude.Show VirtualGatewayClientTlsCertificateProperty
+instance JSON.ToJSON VirtualGatewayClientTlsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayConnectionPoolProperty (
+        module Exports, VirtualGatewayConnectionPoolProperty(..),
+        mkVirtualGatewayConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayGrpcConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttp2ConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttpConnectionPoolProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html>
+    VirtualGatewayConnectionPoolProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-grpc>
+                                          gRPC :: (Prelude.Maybe VirtualGatewayGrpcConnectionPoolProperty),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-http>
+                                          hTTP :: (Prelude.Maybe VirtualGatewayHttpConnectionPoolProperty),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-http2>
+                                          hTTP2 :: (Prelude.Maybe VirtualGatewayHttp2ConnectionPoolProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayConnectionPoolProperty ::
+  VirtualGatewayConnectionPoolProperty
+mkVirtualGatewayConnectionPoolProperty
+  = VirtualGatewayConnectionPoolProperty
+      {haddock_workaround_ = (), gRPC = Prelude.Nothing,
+       hTTP = Prelude.Nothing, hTTP2 = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayConnectionPoolProperty where
+  toResourceProperties VirtualGatewayConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayConnectionPool",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "GRPC" Prelude.<$> gRPC,
+                            (JSON..=) "HTTP" Prelude.<$> hTTP,
+                            (JSON..=) "HTTP2" Prelude.<$> hTTP2])}
+instance JSON.ToJSON VirtualGatewayConnectionPoolProperty where
+  toJSON VirtualGatewayConnectionPoolProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "GRPC" Prelude.<$> gRPC,
+               (JSON..=) "HTTP" Prelude.<$> hTTP,
+               (JSON..=) "HTTP2" Prelude.<$> hTTP2]))
+instance Property "GRPC" VirtualGatewayConnectionPoolProperty where
+  type PropertyType "GRPC" VirtualGatewayConnectionPoolProperty = VirtualGatewayGrpcConnectionPoolProperty
+  set newValue VirtualGatewayConnectionPoolProperty {..}
+    = VirtualGatewayConnectionPoolProperty
+        {gRPC = Prelude.pure newValue, ..}
+instance Property "HTTP" VirtualGatewayConnectionPoolProperty where
+  type PropertyType "HTTP" VirtualGatewayConnectionPoolProperty = VirtualGatewayHttpConnectionPoolProperty
+  set newValue VirtualGatewayConnectionPoolProperty {..}
+    = VirtualGatewayConnectionPoolProperty
+        {hTTP = Prelude.pure newValue, ..}
+instance Property "HTTP2" VirtualGatewayConnectionPoolProperty where
+  type PropertyType "HTTP2" VirtualGatewayConnectionPoolProperty = VirtualGatewayHttp2ConnectionPoolProperty
+  set newValue VirtualGatewayConnectionPoolProperty {..}
+    = VirtualGatewayConnectionPoolProperty
+        {hTTP2 = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayConnectionPoolProperty
+instance Prelude.Eq VirtualGatewayConnectionPoolProperty
+instance Prelude.Show VirtualGatewayConnectionPoolProperty
+instance JSON.ToJSON VirtualGatewayConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs
@@ -0,0 +1,48 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayFileAccessLogProperty (
+        module Exports, VirtualGatewayFileAccessLogProperty(..),
+        mkVirtualGatewayFileAccessLogProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.LoggingFormatProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayFileAccessLogProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html>
+    VirtualGatewayFileAccessLogProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayfileaccesslog-format>
+                                         format :: (Prelude.Maybe LoggingFormatProperty),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayfileaccesslog-path>
+                                         path :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayFileAccessLogProperty ::
+  Value Prelude.Text -> VirtualGatewayFileAccessLogProperty
+mkVirtualGatewayFileAccessLogProperty path
+  = VirtualGatewayFileAccessLogProperty
+      {haddock_workaround_ = (), path = path, format = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayFileAccessLogProperty where
+  toResourceProperties VirtualGatewayFileAccessLogProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayFileAccessLog",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Path" JSON..= path]
+                           (Prelude.catMaybes [(JSON..=) "Format" Prelude.<$> format]))}
+instance JSON.ToJSON VirtualGatewayFileAccessLogProperty where
+  toJSON VirtualGatewayFileAccessLogProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Path" JSON..= path]
+              (Prelude.catMaybes [(JSON..=) "Format" Prelude.<$> format])))
+instance Property "Format" VirtualGatewayFileAccessLogProperty where
+  type PropertyType "Format" VirtualGatewayFileAccessLogProperty = LoggingFormatProperty
+  set newValue VirtualGatewayFileAccessLogProperty {..}
+    = VirtualGatewayFileAccessLogProperty
+        {format = Prelude.pure newValue, ..}
+instance Property "Path" VirtualGatewayFileAccessLogProperty where
+  type PropertyType "Path" VirtualGatewayFileAccessLogProperty = Value Prelude.Text
+  set newValue VirtualGatewayFileAccessLogProperty {..}
+    = VirtualGatewayFileAccessLogProperty {path = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayFileAccessLogProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayFileAccessLogProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayFileAccessLogProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayFileAccessLogProperty
+instance Prelude.Eq VirtualGatewayFileAccessLogProperty
+instance Prelude.Show VirtualGatewayFileAccessLogProperty
+instance JSON.ToJSON VirtualGatewayFileAccessLogProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayGrpcConnectionPoolProperty (
+        VirtualGatewayGrpcConnectionPoolProperty(..),
+        mkVirtualGatewayGrpcConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayGrpcConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool.html>
+    VirtualGatewayGrpcConnectionPoolProperty {haddock_workaround_ :: (),
+                                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool-maxrequests>
+                                              maxRequests :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayGrpcConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualGatewayGrpcConnectionPoolProperty
+mkVirtualGatewayGrpcConnectionPoolProperty maxRequests
+  = VirtualGatewayGrpcConnectionPoolProperty
+      {haddock_workaround_ = (), maxRequests = maxRequests}
+instance ToResourceProperties VirtualGatewayGrpcConnectionPoolProperty where
+  toResourceProperties VirtualGatewayGrpcConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayGrpcConnectionPool",
+         supportsTags = Prelude.False,
+         properties = ["MaxRequests" JSON..= maxRequests]}
+instance JSON.ToJSON VirtualGatewayGrpcConnectionPoolProperty where
+  toJSON VirtualGatewayGrpcConnectionPoolProperty {..}
+    = JSON.object ["MaxRequests" JSON..= maxRequests]
+instance Property "MaxRequests" VirtualGatewayGrpcConnectionPoolProperty where
+  type PropertyType "MaxRequests" VirtualGatewayGrpcConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualGatewayGrpcConnectionPoolProperty {..}
+    = VirtualGatewayGrpcConnectionPoolProperty
+        {maxRequests = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayGrpcConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayGrpcConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayGrpcConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayGrpcConnectionPoolProperty
+instance Prelude.Eq VirtualGatewayGrpcConnectionPoolProperty
+instance Prelude.Show VirtualGatewayGrpcConnectionPoolProperty
+instance JSON.ToJSON VirtualGatewayGrpcConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs
@@ -0,0 +1,105 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHealthCheckPolicyProperty (
+        VirtualGatewayHealthCheckPolicyProperty(..),
+        mkVirtualGatewayHealthCheckPolicyProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayHealthCheckPolicyProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html>
+    VirtualGatewayHealthCheckPolicyProperty {haddock_workaround_ :: (),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-healthythreshold>
+                                             healthyThreshold :: (Value Prelude.Integer),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-intervalmillis>
+                                             intervalMillis :: (Value Prelude.Integer),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-path>
+                                             path :: (Prelude.Maybe (Value Prelude.Text)),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-port>
+                                             port :: (Prelude.Maybe (Value Prelude.Integer)),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-protocol>
+                                             protocol :: (Value Prelude.Text),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-timeoutmillis>
+                                             timeoutMillis :: (Value Prelude.Integer),
+                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-unhealthythreshold>
+                                             unhealthyThreshold :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayHealthCheckPolicyProperty ::
+  Value Prelude.Integer
+  -> Value Prelude.Integer
+     -> Value Prelude.Text
+        -> Value Prelude.Integer
+           -> Value Prelude.Integer -> VirtualGatewayHealthCheckPolicyProperty
+mkVirtualGatewayHealthCheckPolicyProperty
+  healthyThreshold
+  intervalMillis
+  protocol
+  timeoutMillis
+  unhealthyThreshold
+  = VirtualGatewayHealthCheckPolicyProperty
+      {haddock_workaround_ = (), healthyThreshold = healthyThreshold,
+       intervalMillis = intervalMillis, protocol = protocol,
+       timeoutMillis = timeoutMillis,
+       unhealthyThreshold = unhealthyThreshold, path = Prelude.Nothing,
+       port = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayHealthCheckPolicyProperty where
+  toResourceProperties VirtualGatewayHealthCheckPolicyProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayHealthCheckPolicy",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["HealthyThreshold" JSON..= healthyThreshold,
+                            "IntervalMillis" JSON..= intervalMillis,
+                            "Protocol" JSON..= protocol, "TimeoutMillis" JSON..= timeoutMillis,
+                            "UnhealthyThreshold" JSON..= unhealthyThreshold]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Path" Prelude.<$> path,
+                               (JSON..=) "Port" Prelude.<$> port]))}
+instance JSON.ToJSON VirtualGatewayHealthCheckPolicyProperty where
+  toJSON VirtualGatewayHealthCheckPolicyProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["HealthyThreshold" JSON..= healthyThreshold,
+               "IntervalMillis" JSON..= intervalMillis,
+               "Protocol" JSON..= protocol, "TimeoutMillis" JSON..= timeoutMillis,
+               "UnhealthyThreshold" JSON..= unhealthyThreshold]
+              (Prelude.catMaybes
+                 [(JSON..=) "Path" Prelude.<$> path,
+                  (JSON..=) "Port" Prelude.<$> port])))
+instance Property "HealthyThreshold" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "HealthyThreshold" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {healthyThreshold = newValue, ..}
+instance Property "IntervalMillis" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "IntervalMillis" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {intervalMillis = newValue, ..}
+instance Property "Path" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "Path" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Text
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {path = Prelude.pure newValue, ..}
+instance Property "Port" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "Port" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {port = Prelude.pure newValue, ..}
+instance Property "Protocol" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "Protocol" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Text
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty {protocol = newValue, ..}
+instance Property "TimeoutMillis" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "TimeoutMillis" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {timeoutMillis = newValue, ..}
+instance Property "UnhealthyThreshold" VirtualGatewayHealthCheckPolicyProperty where
+  type PropertyType "UnhealthyThreshold" VirtualGatewayHealthCheckPolicyProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHealthCheckPolicyProperty {..}
+    = VirtualGatewayHealthCheckPolicyProperty
+        {unhealthyThreshold = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHealthCheckPolicyProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHealthCheckPolicyProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayHealthCheckPolicyProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayHealthCheckPolicyProperty
+instance Prelude.Eq VirtualGatewayHealthCheckPolicyProperty
+instance Prelude.Show VirtualGatewayHealthCheckPolicyProperty
+instance JSON.ToJSON VirtualGatewayHealthCheckPolicyProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttp2ConnectionPoolProperty (
+        VirtualGatewayHttp2ConnectionPoolProperty(..),
+        mkVirtualGatewayHttp2ConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayHttp2ConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttp2connectionpool.html>
+    VirtualGatewayHttp2ConnectionPoolProperty {haddock_workaround_ :: (),
+                                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttp2connectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttp2connectionpool-maxrequests>
+                                               maxRequests :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayHttp2ConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualGatewayHttp2ConnectionPoolProperty
+mkVirtualGatewayHttp2ConnectionPoolProperty maxRequests
+  = VirtualGatewayHttp2ConnectionPoolProperty
+      {haddock_workaround_ = (), maxRequests = maxRequests}
+instance ToResourceProperties VirtualGatewayHttp2ConnectionPoolProperty where
+  toResourceProperties VirtualGatewayHttp2ConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayHttp2ConnectionPool",
+         supportsTags = Prelude.False,
+         properties = ["MaxRequests" JSON..= maxRequests]}
+instance JSON.ToJSON VirtualGatewayHttp2ConnectionPoolProperty where
+  toJSON VirtualGatewayHttp2ConnectionPoolProperty {..}
+    = JSON.object ["MaxRequests" JSON..= maxRequests]
+instance Property "MaxRequests" VirtualGatewayHttp2ConnectionPoolProperty where
+  type PropertyType "MaxRequests" VirtualGatewayHttp2ConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHttp2ConnectionPoolProperty {..}
+    = VirtualGatewayHttp2ConnectionPoolProperty
+        {maxRequests = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttp2ConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttp2ConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayHttp2ConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayHttp2ConnectionPoolProperty
+instance Prelude.Eq VirtualGatewayHttp2ConnectionPoolProperty
+instance Prelude.Show VirtualGatewayHttp2ConnectionPoolProperty
+instance JSON.ToJSON VirtualGatewayHttp2ConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs
@@ -0,0 +1,51 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttpConnectionPoolProperty (
+        VirtualGatewayHttpConnectionPoolProperty(..),
+        mkVirtualGatewayHttpConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayHttpConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html>
+    VirtualGatewayHttpConnectionPoolProperty {haddock_workaround_ :: (),
+                                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttpconnectionpool-maxconnections>
+                                              maxConnections :: (Value Prelude.Integer),
+                                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttpconnectionpool-maxpendingrequests>
+                                              maxPendingRequests :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayHttpConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualGatewayHttpConnectionPoolProperty
+mkVirtualGatewayHttpConnectionPoolProperty maxConnections
+  = VirtualGatewayHttpConnectionPoolProperty
+      {haddock_workaround_ = (), maxConnections = maxConnections,
+       maxPendingRequests = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayHttpConnectionPoolProperty where
+  toResourceProperties VirtualGatewayHttpConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayHttpConnectionPool",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MaxConnections" JSON..= maxConnections]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MaxPendingRequests" Prelude.<$> maxPendingRequests]))}
+instance JSON.ToJSON VirtualGatewayHttpConnectionPoolProperty where
+  toJSON VirtualGatewayHttpConnectionPoolProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MaxConnections" JSON..= maxConnections]
+              (Prelude.catMaybes
+                 [(JSON..=) "MaxPendingRequests" Prelude.<$> maxPendingRequests])))
+instance Property "MaxConnections" VirtualGatewayHttpConnectionPoolProperty where
+  type PropertyType "MaxConnections" VirtualGatewayHttpConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHttpConnectionPoolProperty {..}
+    = VirtualGatewayHttpConnectionPoolProperty
+        {maxConnections = newValue, ..}
+instance Property "MaxPendingRequests" VirtualGatewayHttpConnectionPoolProperty where
+  type PropertyType "MaxPendingRequests" VirtualGatewayHttpConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualGatewayHttpConnectionPoolProperty {..}
+    = VirtualGatewayHttpConnectionPoolProperty
+        {maxPendingRequests = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayHttpConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttpConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayHttpConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayHttpConnectionPoolProperty
+instance Prelude.Eq VirtualGatewayHttpConnectionPoolProperty
+instance Prelude.Show VirtualGatewayHttpConnectionPoolProperty
+instance JSON.ToJSON VirtualGatewayHttpConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs
@@ -0,0 +1,71 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerProperty (
+        module Exports, VirtualGatewayListenerProperty(..),
+        mkVirtualGatewayListenerProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHealthCheckPolicyProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayPortMappingProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html>
+    VirtualGatewayListenerProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-connectionpool>
+                                    connectionPool :: (Prelude.Maybe VirtualGatewayConnectionPoolProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-healthcheck>
+                                    healthCheck :: (Prelude.Maybe VirtualGatewayHealthCheckPolicyProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-portmapping>
+                                    portMapping :: VirtualGatewayPortMappingProperty,
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-tls>
+                                    tLS :: (Prelude.Maybe VirtualGatewayListenerTlsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerProperty ::
+  VirtualGatewayPortMappingProperty -> VirtualGatewayListenerProperty
+mkVirtualGatewayListenerProperty portMapping
+  = VirtualGatewayListenerProperty
+      {haddock_workaround_ = (), portMapping = portMapping,
+       connectionPool = Prelude.Nothing, healthCheck = Prelude.Nothing,
+       tLS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayListenerProperty where
+  toResourceProperties VirtualGatewayListenerProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListener",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["PortMapping" JSON..= portMapping]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ConnectionPool" Prelude.<$> connectionPool,
+                               (JSON..=) "HealthCheck" Prelude.<$> healthCheck,
+                               (JSON..=) "TLS" Prelude.<$> tLS]))}
+instance JSON.ToJSON VirtualGatewayListenerProperty where
+  toJSON VirtualGatewayListenerProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["PortMapping" JSON..= portMapping]
+              (Prelude.catMaybes
+                 [(JSON..=) "ConnectionPool" Prelude.<$> connectionPool,
+                  (JSON..=) "HealthCheck" Prelude.<$> healthCheck,
+                  (JSON..=) "TLS" Prelude.<$> tLS])))
+instance Property "ConnectionPool" VirtualGatewayListenerProperty where
+  type PropertyType "ConnectionPool" VirtualGatewayListenerProperty = VirtualGatewayConnectionPoolProperty
+  set newValue VirtualGatewayListenerProperty {..}
+    = VirtualGatewayListenerProperty
+        {connectionPool = Prelude.pure newValue, ..}
+instance Property "HealthCheck" VirtualGatewayListenerProperty where
+  type PropertyType "HealthCheck" VirtualGatewayListenerProperty = VirtualGatewayHealthCheckPolicyProperty
+  set newValue VirtualGatewayListenerProperty {..}
+    = VirtualGatewayListenerProperty
+        {healthCheck = Prelude.pure newValue, ..}
+instance Property "PortMapping" VirtualGatewayListenerProperty where
+  type PropertyType "PortMapping" VirtualGatewayListenerProperty = VirtualGatewayPortMappingProperty
+  set newValue VirtualGatewayListenerProperty {..}
+    = VirtualGatewayListenerProperty {portMapping = newValue, ..}
+instance Property "TLS" VirtualGatewayListenerProperty where
+  type PropertyType "TLS" VirtualGatewayListenerProperty = VirtualGatewayListenerTlsProperty
+  set newValue VirtualGatewayListenerProperty {..}
+    = VirtualGatewayListenerProperty {tLS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerProperty
+instance Prelude.Eq VirtualGatewayListenerProperty
+instance Prelude.Show VirtualGatewayListenerProperty
+instance JSON.ToJSON VirtualGatewayListenerProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs
@@ -0,0 +1,36 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsAcmCertificateProperty (
+        VirtualGatewayListenerTlsAcmCertificateProperty(..),
+        mkVirtualGatewayListenerTlsAcmCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayListenerTlsAcmCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate.html>
+    VirtualGatewayListenerTlsAcmCertificateProperty {haddock_workaround_ :: (),
+                                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate-certificatearn>
+                                                     certificateArn :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsAcmCertificateProperty ::
+  Value Prelude.Text
+  -> VirtualGatewayListenerTlsAcmCertificateProperty
+mkVirtualGatewayListenerTlsAcmCertificateProperty certificateArn
+  = VirtualGatewayListenerTlsAcmCertificateProperty
+      {haddock_workaround_ = (), certificateArn = certificateArn}
+instance ToResourceProperties VirtualGatewayListenerTlsAcmCertificateProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsAcmCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsAcmCertificate",
+         supportsTags = Prelude.False,
+         properties = ["CertificateArn" JSON..= certificateArn]}
+instance JSON.ToJSON VirtualGatewayListenerTlsAcmCertificateProperty where
+  toJSON VirtualGatewayListenerTlsAcmCertificateProperty {..}
+    = JSON.object ["CertificateArn" JSON..= certificateArn]
+instance Property "CertificateArn" VirtualGatewayListenerTlsAcmCertificateProperty where
+  type PropertyType "CertificateArn" VirtualGatewayListenerTlsAcmCertificateProperty = Value Prelude.Text
+  set newValue VirtualGatewayListenerTlsAcmCertificateProperty {..}
+    = VirtualGatewayListenerTlsAcmCertificateProperty
+        {certificateArn = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsAcmCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsAcmCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsAcmCertificateProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsAcmCertificateProperty
+instance Prelude.Eq VirtualGatewayListenerTlsAcmCertificateProperty
+instance Prelude.Show VirtualGatewayListenerTlsAcmCertificateProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsAcmCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs
@@ -0,0 +1,61 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsCertificateProperty (
+        module Exports, VirtualGatewayListenerTlsCertificateProperty(..),
+        mkVirtualGatewayListenerTlsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsAcmCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsFileCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsSdsCertificateProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html>
+    VirtualGatewayListenerTlsCertificateProperty {haddock_workaround_ :: (),
+                                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-acm>
+                                                  aCM :: (Prelude.Maybe VirtualGatewayListenerTlsAcmCertificateProperty),
+                                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-file>
+                                                  file :: (Prelude.Maybe VirtualGatewayListenerTlsFileCertificateProperty),
+                                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-sds>
+                                                  sDS :: (Prelude.Maybe VirtualGatewayListenerTlsSdsCertificateProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsCertificateProperty ::
+  VirtualGatewayListenerTlsCertificateProperty
+mkVirtualGatewayListenerTlsCertificateProperty
+  = VirtualGatewayListenerTlsCertificateProperty
+      {haddock_workaround_ = (), aCM = Prelude.Nothing,
+       file = Prelude.Nothing, sDS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayListenerTlsCertificateProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsCertificate",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ACM" Prelude.<$> aCM,
+                            (JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON VirtualGatewayListenerTlsCertificateProperty where
+  toJSON VirtualGatewayListenerTlsCertificateProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ACM" Prelude.<$> aCM,
+               (JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "ACM" VirtualGatewayListenerTlsCertificateProperty where
+  type PropertyType "ACM" VirtualGatewayListenerTlsCertificateProperty = VirtualGatewayListenerTlsAcmCertificateProperty
+  set newValue VirtualGatewayListenerTlsCertificateProperty {..}
+    = VirtualGatewayListenerTlsCertificateProperty
+        {aCM = Prelude.pure newValue, ..}
+instance Property "File" VirtualGatewayListenerTlsCertificateProperty where
+  type PropertyType "File" VirtualGatewayListenerTlsCertificateProperty = VirtualGatewayListenerTlsFileCertificateProperty
+  set newValue VirtualGatewayListenerTlsCertificateProperty {..}
+    = VirtualGatewayListenerTlsCertificateProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" VirtualGatewayListenerTlsCertificateProperty where
+  type PropertyType "SDS" VirtualGatewayListenerTlsCertificateProperty = VirtualGatewayListenerTlsSdsCertificateProperty
+  set newValue VirtualGatewayListenerTlsCertificateProperty {..}
+    = VirtualGatewayListenerTlsCertificateProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsCertificateProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsCertificateProperty
+instance Prelude.Eq VirtualGatewayListenerTlsCertificateProperty
+instance Prelude.Show VirtualGatewayListenerTlsCertificateProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs
@@ -0,0 +1,50 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsFileCertificateProperty (
+        VirtualGatewayListenerTlsFileCertificateProperty(..),
+        mkVirtualGatewayListenerTlsFileCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayListenerTlsFileCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html>
+    VirtualGatewayListenerTlsFileCertificateProperty {haddock_workaround_ :: (),
+                                                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate-certificatechain>
+                                                      certificateChain :: (Value Prelude.Text),
+                                                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate-privatekey>
+                                                      privateKey :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsFileCertificateProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text
+     -> VirtualGatewayListenerTlsFileCertificateProperty
+mkVirtualGatewayListenerTlsFileCertificateProperty
+  certificateChain
+  privateKey
+  = VirtualGatewayListenerTlsFileCertificateProperty
+      {haddock_workaround_ = (), certificateChain = certificateChain,
+       privateKey = privateKey}
+instance ToResourceProperties VirtualGatewayListenerTlsFileCertificateProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsFileCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsFileCertificate",
+         supportsTags = Prelude.False,
+         properties = ["CertificateChain" JSON..= certificateChain,
+                       "PrivateKey" JSON..= privateKey]}
+instance JSON.ToJSON VirtualGatewayListenerTlsFileCertificateProperty where
+  toJSON VirtualGatewayListenerTlsFileCertificateProperty {..}
+    = JSON.object
+        ["CertificateChain" JSON..= certificateChain,
+         "PrivateKey" JSON..= privateKey]
+instance Property "CertificateChain" VirtualGatewayListenerTlsFileCertificateProperty where
+  type PropertyType "CertificateChain" VirtualGatewayListenerTlsFileCertificateProperty = Value Prelude.Text
+  set newValue VirtualGatewayListenerTlsFileCertificateProperty {..}
+    = VirtualGatewayListenerTlsFileCertificateProperty
+        {certificateChain = newValue, ..}
+instance Property "PrivateKey" VirtualGatewayListenerTlsFileCertificateProperty where
+  type PropertyType "PrivateKey" VirtualGatewayListenerTlsFileCertificateProperty = Value Prelude.Text
+  set newValue VirtualGatewayListenerTlsFileCertificateProperty {..}
+    = VirtualGatewayListenerTlsFileCertificateProperty
+        {privateKey = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsFileCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsFileCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsFileCertificateProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsFileCertificateProperty
+instance Prelude.Eq VirtualGatewayListenerTlsFileCertificateProperty
+instance Prelude.Show VirtualGatewayListenerTlsFileCertificateProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsFileCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs
@@ -0,0 +1,59 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsProperty (
+        module Exports, VirtualGatewayListenerTlsProperty(..),
+        mkVirtualGatewayListenerTlsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayListenerTlsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html>
+    VirtualGatewayListenerTlsProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-certificate>
+                                       certificate :: VirtualGatewayListenerTlsCertificateProperty,
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-mode>
+                                       mode :: (Value Prelude.Text),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-validation>
+                                       validation :: (Prelude.Maybe VirtualGatewayListenerTlsValidationContextProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsProperty ::
+  VirtualGatewayListenerTlsCertificateProperty
+  -> Value Prelude.Text -> VirtualGatewayListenerTlsProperty
+mkVirtualGatewayListenerTlsProperty certificate mode
+  = VirtualGatewayListenerTlsProperty
+      {haddock_workaround_ = (), certificate = certificate, mode = mode,
+       validation = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayListenerTlsProperty where
+  toResourceProperties VirtualGatewayListenerTlsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTls",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Certificate" JSON..= certificate, "Mode" JSON..= mode]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Validation" Prelude.<$> validation]))}
+instance JSON.ToJSON VirtualGatewayListenerTlsProperty where
+  toJSON VirtualGatewayListenerTlsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Certificate" JSON..= certificate, "Mode" JSON..= mode]
+              (Prelude.catMaybes
+                 [(JSON..=) "Validation" Prelude.<$> validation])))
+instance Property "Certificate" VirtualGatewayListenerTlsProperty where
+  type PropertyType "Certificate" VirtualGatewayListenerTlsProperty = VirtualGatewayListenerTlsCertificateProperty
+  set newValue VirtualGatewayListenerTlsProperty {..}
+    = VirtualGatewayListenerTlsProperty {certificate = newValue, ..}
+instance Property "Mode" VirtualGatewayListenerTlsProperty where
+  type PropertyType "Mode" VirtualGatewayListenerTlsProperty = Value Prelude.Text
+  set newValue VirtualGatewayListenerTlsProperty {..}
+    = VirtualGatewayListenerTlsProperty {mode = newValue, ..}
+instance Property "Validation" VirtualGatewayListenerTlsProperty where
+  type PropertyType "Validation" VirtualGatewayListenerTlsProperty = VirtualGatewayListenerTlsValidationContextProperty
+  set newValue VirtualGatewayListenerTlsProperty {..}
+    = VirtualGatewayListenerTlsProperty
+        {validation = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsProperty
+instance Prelude.Eq VirtualGatewayListenerTlsProperty
+instance Prelude.Show VirtualGatewayListenerTlsProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs
@@ -0,0 +1,36 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsSdsCertificateProperty (
+        VirtualGatewayListenerTlsSdsCertificateProperty(..),
+        mkVirtualGatewayListenerTlsSdsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayListenerTlsSdsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate.html>
+    VirtualGatewayListenerTlsSdsCertificateProperty {haddock_workaround_ :: (),
+                                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate-secretname>
+                                                     secretName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsSdsCertificateProperty ::
+  Value Prelude.Text
+  -> VirtualGatewayListenerTlsSdsCertificateProperty
+mkVirtualGatewayListenerTlsSdsCertificateProperty secretName
+  = VirtualGatewayListenerTlsSdsCertificateProperty
+      {haddock_workaround_ = (), secretName = secretName}
+instance ToResourceProperties VirtualGatewayListenerTlsSdsCertificateProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsSdsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsSdsCertificate",
+         supportsTags = Prelude.False,
+         properties = ["SecretName" JSON..= secretName]}
+instance JSON.ToJSON VirtualGatewayListenerTlsSdsCertificateProperty where
+  toJSON VirtualGatewayListenerTlsSdsCertificateProperty {..}
+    = JSON.object ["SecretName" JSON..= secretName]
+instance Property "SecretName" VirtualGatewayListenerTlsSdsCertificateProperty where
+  type PropertyType "SecretName" VirtualGatewayListenerTlsSdsCertificateProperty = Value Prelude.Text
+  set newValue VirtualGatewayListenerTlsSdsCertificateProperty {..}
+    = VirtualGatewayListenerTlsSdsCertificateProperty
+        {secretName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsSdsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsSdsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsSdsCertificateProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsSdsCertificateProperty
+instance Prelude.Eq VirtualGatewayListenerTlsSdsCertificateProperty
+instance Prelude.Show VirtualGatewayListenerTlsSdsCertificateProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsSdsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs
@@ -0,0 +1,61 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextProperty (
+        module Exports,
+        VirtualGatewayListenerTlsValidationContextProperty(..),
+        mkVirtualGatewayListenerTlsValidationContextProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNamesProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsValidationContextProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html>
+    VirtualGatewayListenerTlsValidationContextProperty {haddock_workaround_ :: (),
+                                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext-subjectalternativenames>
+                                                        subjectAlternativeNames :: (Prelude.Maybe SubjectAlternativeNamesProperty),
+                                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext-trust>
+                                                        trust :: VirtualGatewayListenerTlsValidationContextTrustProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsValidationContextProperty ::
+  VirtualGatewayListenerTlsValidationContextTrustProperty
+  -> VirtualGatewayListenerTlsValidationContextProperty
+mkVirtualGatewayListenerTlsValidationContextProperty trust
+  = VirtualGatewayListenerTlsValidationContextProperty
+      {haddock_workaround_ = (), trust = trust,
+       subjectAlternativeNames = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayListenerTlsValidationContextProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsValidationContextProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContext",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Trust" JSON..= trust]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SubjectAlternativeNames"
+                                 Prelude.<$> subjectAlternativeNames]))}
+instance JSON.ToJSON VirtualGatewayListenerTlsValidationContextProperty where
+  toJSON VirtualGatewayListenerTlsValidationContextProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Trust" JSON..= trust]
+              (Prelude.catMaybes
+                 [(JSON..=) "SubjectAlternativeNames"
+                    Prelude.<$> subjectAlternativeNames])))
+instance Property "SubjectAlternativeNames" VirtualGatewayListenerTlsValidationContextProperty where
+  type PropertyType "SubjectAlternativeNames" VirtualGatewayListenerTlsValidationContextProperty = SubjectAlternativeNamesProperty
+  set
+    newValue
+    VirtualGatewayListenerTlsValidationContextProperty {..}
+    = VirtualGatewayListenerTlsValidationContextProperty
+        {subjectAlternativeNames = Prelude.pure newValue, ..}
+instance Property "Trust" VirtualGatewayListenerTlsValidationContextProperty where
+  type PropertyType "Trust" VirtualGatewayListenerTlsValidationContextProperty = VirtualGatewayListenerTlsValidationContextTrustProperty
+  set
+    newValue
+    VirtualGatewayListenerTlsValidationContextProperty {..}
+    = VirtualGatewayListenerTlsValidationContextProperty
+        {trust = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsValidationContextProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsValidationContextProperty
+instance Prelude.Eq VirtualGatewayListenerTlsValidationContextProperty
+instance Prelude.Show VirtualGatewayListenerTlsValidationContextProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsValidationContextProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs
@@ -0,0 +1,56 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextTrustProperty (
+        module Exports,
+        VirtualGatewayListenerTlsValidationContextTrustProperty(..),
+        mkVirtualGatewayListenerTlsValidationContextTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextFileTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextSdsTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsValidationContextTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html>
+    VirtualGatewayListenerTlsValidationContextTrustProperty {haddock_workaround_ :: (),
+                                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust-file>
+                                                             file :: (Prelude.Maybe VirtualGatewayTlsValidationContextFileTrustProperty),
+                                                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust-sds>
+                                                             sDS :: (Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrustProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayListenerTlsValidationContextTrustProperty ::
+  VirtualGatewayListenerTlsValidationContextTrustProperty
+mkVirtualGatewayListenerTlsValidationContextTrustProperty
+  = VirtualGatewayListenerTlsValidationContextTrustProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing,
+       sDS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayListenerTlsValidationContextTrustProperty where
+  toResourceProperties
+    VirtualGatewayListenerTlsValidationContextTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContextTrust",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON VirtualGatewayListenerTlsValidationContextTrustProperty where
+  toJSON VirtualGatewayListenerTlsValidationContextTrustProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "File" VirtualGatewayListenerTlsValidationContextTrustProperty where
+  type PropertyType "File" VirtualGatewayListenerTlsValidationContextTrustProperty = VirtualGatewayTlsValidationContextFileTrustProperty
+  set
+    newValue
+    VirtualGatewayListenerTlsValidationContextTrustProperty {..}
+    = VirtualGatewayListenerTlsValidationContextTrustProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" VirtualGatewayListenerTlsValidationContextTrustProperty where
+  type PropertyType "SDS" VirtualGatewayListenerTlsValidationContextTrustProperty = VirtualGatewayTlsValidationContextSdsTrustProperty
+  set
+    newValue
+    VirtualGatewayListenerTlsValidationContextTrustProperty {..}
+    = VirtualGatewayListenerTlsValidationContextTrustProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayListenerTlsValidationContextTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayListenerTlsValidationContextTrustProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayListenerTlsValidationContextTrustProperty
+instance Prelude.Eq VirtualGatewayListenerTlsValidationContextTrustProperty
+instance Prelude.Show VirtualGatewayListenerTlsValidationContextTrustProperty
+instance JSON.ToJSON VirtualGatewayListenerTlsValidationContextTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs
@@ -0,0 +1,36 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayLoggingProperty (
+        module Exports, VirtualGatewayLoggingProperty(..),
+        mkVirtualGatewayLoggingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayAccessLogProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayLoggingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylogging.html>
+    VirtualGatewayLoggingProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylogging.html#cfn-appmesh-virtualgateway-virtualgatewaylogging-accesslog>
+                                   accessLog :: (Prelude.Maybe VirtualGatewayAccessLogProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayLoggingProperty :: VirtualGatewayLoggingProperty
+mkVirtualGatewayLoggingProperty
+  = VirtualGatewayLoggingProperty
+      {haddock_workaround_ = (), accessLog = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayLoggingProperty where
+  toResourceProperties VirtualGatewayLoggingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayLogging",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "AccessLog" Prelude.<$> accessLog])}
+instance JSON.ToJSON VirtualGatewayLoggingProperty where
+  toJSON VirtualGatewayLoggingProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "AccessLog" Prelude.<$> accessLog]))
+instance Property "AccessLog" VirtualGatewayLoggingProperty where
+  type PropertyType "AccessLog" VirtualGatewayLoggingProperty = VirtualGatewayAccessLogProperty
+  set newValue VirtualGatewayLoggingProperty {..}
+    = VirtualGatewayLoggingProperty
+        {accessLog = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayLoggingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayLoggingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayLoggingProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayLoggingProperty
+instance Prelude.Eq VirtualGatewayLoggingProperty
+instance Prelude.Show VirtualGatewayLoggingProperty
+instance JSON.ToJSON VirtualGatewayLoggingProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs
@@ -0,0 +1,40 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayPortMappingProperty (
+        VirtualGatewayPortMappingProperty(..),
+        mkVirtualGatewayPortMappingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayPortMappingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html>
+    VirtualGatewayPortMappingProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html#cfn-appmesh-virtualgateway-virtualgatewayportmapping-port>
+                                       port :: (Value Prelude.Integer),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html#cfn-appmesh-virtualgateway-virtualgatewayportmapping-protocol>
+                                       protocol :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayPortMappingProperty ::
+  Value Prelude.Integer
+  -> Value Prelude.Text -> VirtualGatewayPortMappingProperty
+mkVirtualGatewayPortMappingProperty port protocol
+  = VirtualGatewayPortMappingProperty
+      {haddock_workaround_ = (), port = port, protocol = protocol}
+instance ToResourceProperties VirtualGatewayPortMappingProperty where
+  toResourceProperties VirtualGatewayPortMappingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayPortMapping",
+         supportsTags = Prelude.False,
+         properties = ["Port" JSON..= port, "Protocol" JSON..= protocol]}
+instance JSON.ToJSON VirtualGatewayPortMappingProperty where
+  toJSON VirtualGatewayPortMappingProperty {..}
+    = JSON.object ["Port" JSON..= port, "Protocol" JSON..= protocol]
+instance Property "Port" VirtualGatewayPortMappingProperty where
+  type PropertyType "Port" VirtualGatewayPortMappingProperty = Value Prelude.Integer
+  set newValue VirtualGatewayPortMappingProperty {..}
+    = VirtualGatewayPortMappingProperty {port = newValue, ..}
+instance Property "Protocol" VirtualGatewayPortMappingProperty where
+  type PropertyType "Protocol" VirtualGatewayPortMappingProperty = Value Prelude.Text
+  set newValue VirtualGatewayPortMappingProperty {..}
+    = VirtualGatewayPortMappingProperty {protocol = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayPortMappingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayPortMappingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayPortMappingProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayPortMappingProperty
+instance Prelude.Eq VirtualGatewayPortMappingProperty
+instance Prelude.Show VirtualGatewayPortMappingProperty
+instance JSON.ToJSON VirtualGatewayPortMappingProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewaySpecProperty (
+        module Exports, VirtualGatewaySpecProperty(..),
+        mkVirtualGatewaySpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayBackendDefaultsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayLoggingProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewaySpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html>
+    VirtualGatewaySpecProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-backenddefaults>
+                                backendDefaults :: (Prelude.Maybe VirtualGatewayBackendDefaultsProperty),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-listeners>
+                                listeners :: [VirtualGatewayListenerProperty],
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-logging>
+                                logging :: (Prelude.Maybe VirtualGatewayLoggingProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewaySpecProperty ::
+  [VirtualGatewayListenerProperty] -> VirtualGatewaySpecProperty
+mkVirtualGatewaySpecProperty listeners
+  = VirtualGatewaySpecProperty
+      {haddock_workaround_ = (), listeners = listeners,
+       backendDefaults = Prelude.Nothing, logging = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewaySpecProperty where
+  toResourceProperties VirtualGatewaySpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewaySpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Listeners" JSON..= listeners]
+                           (Prelude.catMaybes
+                              [(JSON..=) "BackendDefaults" Prelude.<$> backendDefaults,
+                               (JSON..=) "Logging" Prelude.<$> logging]))}
+instance JSON.ToJSON VirtualGatewaySpecProperty where
+  toJSON VirtualGatewaySpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Listeners" JSON..= listeners]
+              (Prelude.catMaybes
+                 [(JSON..=) "BackendDefaults" Prelude.<$> backendDefaults,
+                  (JSON..=) "Logging" Prelude.<$> logging])))
+instance Property "BackendDefaults" VirtualGatewaySpecProperty where
+  type PropertyType "BackendDefaults" VirtualGatewaySpecProperty = VirtualGatewayBackendDefaultsProperty
+  set newValue VirtualGatewaySpecProperty {..}
+    = VirtualGatewaySpecProperty
+        {backendDefaults = Prelude.pure newValue, ..}
+instance Property "Listeners" VirtualGatewaySpecProperty where
+  type PropertyType "Listeners" VirtualGatewaySpecProperty = [VirtualGatewayListenerProperty]
+  set newValue VirtualGatewaySpecProperty {..}
+    = VirtualGatewaySpecProperty {listeners = newValue, ..}
+instance Property "Logging" VirtualGatewaySpecProperty where
+  type PropertyType "Logging" VirtualGatewaySpecProperty = VirtualGatewayLoggingProperty
+  set newValue VirtualGatewaySpecProperty {..}
+    = VirtualGatewaySpecProperty {logging = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewaySpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewaySpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewaySpecProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewaySpecProperty
+instance Prelude.Eq VirtualGatewaySpecProperty
+instance Prelude.Show VirtualGatewaySpecProperty
+instance JSON.ToJSON VirtualGatewaySpecProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs
@@ -0,0 +1,42 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextAcmTrustProperty (
+        VirtualGatewayTlsValidationContextAcmTrustProperty(..),
+        mkVirtualGatewayTlsValidationContextAcmTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayTlsValidationContextAcmTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust.html>
+    VirtualGatewayTlsValidationContextAcmTrustProperty {haddock_workaround_ :: (),
+                                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust-certificateauthorityarns>
+                                                        certificateAuthorityArns :: (ValueList Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayTlsValidationContextAcmTrustProperty ::
+  ValueList Prelude.Text
+  -> VirtualGatewayTlsValidationContextAcmTrustProperty
+mkVirtualGatewayTlsValidationContextAcmTrustProperty
+  certificateAuthorityArns
+  = VirtualGatewayTlsValidationContextAcmTrustProperty
+      {haddock_workaround_ = (),
+       certificateAuthorityArns = certificateAuthorityArns}
+instance ToResourceProperties VirtualGatewayTlsValidationContextAcmTrustProperty where
+  toResourceProperties
+    VirtualGatewayTlsValidationContextAcmTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextAcmTrust",
+         supportsTags = Prelude.False,
+         properties = ["CertificateAuthorityArns"
+                         JSON..= certificateAuthorityArns]}
+instance JSON.ToJSON VirtualGatewayTlsValidationContextAcmTrustProperty where
+  toJSON VirtualGatewayTlsValidationContextAcmTrustProperty {..}
+    = JSON.object
+        ["CertificateAuthorityArns" JSON..= certificateAuthorityArns]
+instance Property "CertificateAuthorityArns" VirtualGatewayTlsValidationContextAcmTrustProperty where
+  type PropertyType "CertificateAuthorityArns" VirtualGatewayTlsValidationContextAcmTrustProperty = ValueList Prelude.Text
+  set
+    newValue
+    VirtualGatewayTlsValidationContextAcmTrustProperty {..}
+    = VirtualGatewayTlsValidationContextAcmTrustProperty
+        {certificateAuthorityArns = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextAcmTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextAcmTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextAcmTrustProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayTlsValidationContextAcmTrustProperty
+instance Prelude.Eq VirtualGatewayTlsValidationContextAcmTrustProperty
+instance Prelude.Show VirtualGatewayTlsValidationContextAcmTrustProperty
+instance JSON.ToJSON VirtualGatewayTlsValidationContextAcmTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextFileTrustProperty (
+        VirtualGatewayTlsValidationContextFileTrustProperty(..),
+        mkVirtualGatewayTlsValidationContextFileTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayTlsValidationContextFileTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust.html>
+    VirtualGatewayTlsValidationContextFileTrustProperty {haddock_workaround_ :: (),
+                                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust-certificatechain>
+                                                         certificateChain :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayTlsValidationContextFileTrustProperty ::
+  Value Prelude.Text
+  -> VirtualGatewayTlsValidationContextFileTrustProperty
+mkVirtualGatewayTlsValidationContextFileTrustProperty
+  certificateChain
+  = VirtualGatewayTlsValidationContextFileTrustProperty
+      {haddock_workaround_ = (), certificateChain = certificateChain}
+instance ToResourceProperties VirtualGatewayTlsValidationContextFileTrustProperty where
+  toResourceProperties
+    VirtualGatewayTlsValidationContextFileTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextFileTrust",
+         supportsTags = Prelude.False,
+         properties = ["CertificateChain" JSON..= certificateChain]}
+instance JSON.ToJSON VirtualGatewayTlsValidationContextFileTrustProperty where
+  toJSON VirtualGatewayTlsValidationContextFileTrustProperty {..}
+    = JSON.object ["CertificateChain" JSON..= certificateChain]
+instance Property "CertificateChain" VirtualGatewayTlsValidationContextFileTrustProperty where
+  type PropertyType "CertificateChain" VirtualGatewayTlsValidationContextFileTrustProperty = Value Prelude.Text
+  set
+    newValue
+    VirtualGatewayTlsValidationContextFileTrustProperty {..}
+    = VirtualGatewayTlsValidationContextFileTrustProperty
+        {certificateChain = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextFileTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextFileTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextFileTrustProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayTlsValidationContextFileTrustProperty
+instance Prelude.Eq VirtualGatewayTlsValidationContextFileTrustProperty
+instance Prelude.Show VirtualGatewayTlsValidationContextFileTrustProperty
+instance JSON.ToJSON VirtualGatewayTlsValidationContextFileTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs
@@ -0,0 +1,55 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextProperty (
+        module Exports, VirtualGatewayTlsValidationContextProperty(..),
+        mkVirtualGatewayTlsValidationContextProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNamesProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html>
+    VirtualGatewayTlsValidationContextProperty {haddock_workaround_ :: (),
+                                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext-subjectalternativenames>
+                                                subjectAlternativeNames :: (Prelude.Maybe SubjectAlternativeNamesProperty),
+                                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext-trust>
+                                                trust :: VirtualGatewayTlsValidationContextTrustProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayTlsValidationContextProperty ::
+  VirtualGatewayTlsValidationContextTrustProperty
+  -> VirtualGatewayTlsValidationContextProperty
+mkVirtualGatewayTlsValidationContextProperty trust
+  = VirtualGatewayTlsValidationContextProperty
+      {haddock_workaround_ = (), trust = trust,
+       subjectAlternativeNames = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayTlsValidationContextProperty where
+  toResourceProperties
+    VirtualGatewayTlsValidationContextProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContext",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Trust" JSON..= trust]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SubjectAlternativeNames"
+                                 Prelude.<$> subjectAlternativeNames]))}
+instance JSON.ToJSON VirtualGatewayTlsValidationContextProperty where
+  toJSON VirtualGatewayTlsValidationContextProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Trust" JSON..= trust]
+              (Prelude.catMaybes
+                 [(JSON..=) "SubjectAlternativeNames"
+                    Prelude.<$> subjectAlternativeNames])))
+instance Property "SubjectAlternativeNames" VirtualGatewayTlsValidationContextProperty where
+  type PropertyType "SubjectAlternativeNames" VirtualGatewayTlsValidationContextProperty = SubjectAlternativeNamesProperty
+  set newValue VirtualGatewayTlsValidationContextProperty {..}
+    = VirtualGatewayTlsValidationContextProperty
+        {subjectAlternativeNames = Prelude.pure newValue, ..}
+instance Property "Trust" VirtualGatewayTlsValidationContextProperty where
+  type PropertyType "Trust" VirtualGatewayTlsValidationContextProperty = VirtualGatewayTlsValidationContextTrustProperty
+  set newValue VirtualGatewayTlsValidationContextProperty {..}
+    = VirtualGatewayTlsValidationContextProperty {trust = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayTlsValidationContextProperty
+instance Prelude.Eq VirtualGatewayTlsValidationContextProperty
+instance Prelude.Show VirtualGatewayTlsValidationContextProperty
+instance JSON.ToJSON VirtualGatewayTlsValidationContextProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextSdsTrustProperty (
+        VirtualGatewayTlsValidationContextSdsTrustProperty(..),
+        mkVirtualGatewayTlsValidationContextSdsTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualGatewayTlsValidationContextSdsTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust.html>
+    VirtualGatewayTlsValidationContextSdsTrustProperty {haddock_workaround_ :: (),
+                                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust-secretname>
+                                                        secretName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayTlsValidationContextSdsTrustProperty ::
+  Value Prelude.Text
+  -> VirtualGatewayTlsValidationContextSdsTrustProperty
+mkVirtualGatewayTlsValidationContextSdsTrustProperty secretName
+  = VirtualGatewayTlsValidationContextSdsTrustProperty
+      {haddock_workaround_ = (), secretName = secretName}
+instance ToResourceProperties VirtualGatewayTlsValidationContextSdsTrustProperty where
+  toResourceProperties
+    VirtualGatewayTlsValidationContextSdsTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextSdsTrust",
+         supportsTags = Prelude.False,
+         properties = ["SecretName" JSON..= secretName]}
+instance JSON.ToJSON VirtualGatewayTlsValidationContextSdsTrustProperty where
+  toJSON VirtualGatewayTlsValidationContextSdsTrustProperty {..}
+    = JSON.object ["SecretName" JSON..= secretName]
+instance Property "SecretName" VirtualGatewayTlsValidationContextSdsTrustProperty where
+  type PropertyType "SecretName" VirtualGatewayTlsValidationContextSdsTrustProperty = Value Prelude.Text
+  set
+    newValue
+    VirtualGatewayTlsValidationContextSdsTrustProperty {..}
+    = VirtualGatewayTlsValidationContextSdsTrustProperty
+        {secretName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextSdsTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextSdsTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextSdsTrustProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayTlsValidationContextSdsTrustProperty
+instance Prelude.Eq VirtualGatewayTlsValidationContextSdsTrustProperty
+instance Prelude.Show VirtualGatewayTlsValidationContextSdsTrustProperty
+instance JSON.ToJSON VirtualGatewayTlsValidationContextSdsTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs
@@ -0,0 +1,62 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextTrustProperty (
+        module Exports,
+        VirtualGatewayTlsValidationContextTrustProperty(..),
+        mkVirtualGatewayTlsValidationContextTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextAcmTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextFileTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextSdsTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html>
+    VirtualGatewayTlsValidationContextTrustProperty {haddock_workaround_ :: (),
+                                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-acm>
+                                                     aCM :: (Prelude.Maybe VirtualGatewayTlsValidationContextAcmTrustProperty),
+                                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-file>
+                                                     file :: (Prelude.Maybe VirtualGatewayTlsValidationContextFileTrustProperty),
+                                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-sds>
+                                                     sDS :: (Prelude.Maybe VirtualGatewayTlsValidationContextSdsTrustProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualGatewayTlsValidationContextTrustProperty ::
+  VirtualGatewayTlsValidationContextTrustProperty
+mkVirtualGatewayTlsValidationContextTrustProperty
+  = VirtualGatewayTlsValidationContextTrustProperty
+      {haddock_workaround_ = (), aCM = Prelude.Nothing,
+       file = Prelude.Nothing, sDS = Prelude.Nothing}
+instance ToResourceProperties VirtualGatewayTlsValidationContextTrustProperty where
+  toResourceProperties
+    VirtualGatewayTlsValidationContextTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextTrust",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ACM" Prelude.<$> aCM,
+                            (JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON VirtualGatewayTlsValidationContextTrustProperty where
+  toJSON VirtualGatewayTlsValidationContextTrustProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ACM" Prelude.<$> aCM,
+               (JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "ACM" VirtualGatewayTlsValidationContextTrustProperty where
+  type PropertyType "ACM" VirtualGatewayTlsValidationContextTrustProperty = VirtualGatewayTlsValidationContextAcmTrustProperty
+  set newValue VirtualGatewayTlsValidationContextTrustProperty {..}
+    = VirtualGatewayTlsValidationContextTrustProperty
+        {aCM = Prelude.pure newValue, ..}
+instance Property "File" VirtualGatewayTlsValidationContextTrustProperty where
+  type PropertyType "File" VirtualGatewayTlsValidationContextTrustProperty = VirtualGatewayTlsValidationContextFileTrustProperty
+  set newValue VirtualGatewayTlsValidationContextTrustProperty {..}
+    = VirtualGatewayTlsValidationContextTrustProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" VirtualGatewayTlsValidationContextTrustProperty where
+  type PropertyType "SDS" VirtualGatewayTlsValidationContextTrustProperty = VirtualGatewayTlsValidationContextSdsTrustProperty
+  set newValue VirtualGatewayTlsValidationContextTrustProperty {..}
+    = VirtualGatewayTlsValidationContextTrustProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualGateway/VirtualGatewayTlsValidationContextTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualGatewayTlsValidationContextTrustProperty :: Prelude.Type
+instance ToResourceProperties VirtualGatewayTlsValidationContextTrustProperty
+instance Prelude.Eq VirtualGatewayTlsValidationContextTrustProperty
+instance Prelude.Show VirtualGatewayTlsValidationContextTrustProperty
+instance JSON.ToJSON VirtualGatewayTlsValidationContextTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode.hs b/gen/Stratosphere/AppMesh/VirtualNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode.hs
@@ -0,0 +1,72 @@
+module Stratosphere.AppMesh.VirtualNode (
+        module Exports, VirtualNode(..), mkVirtualNode
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data VirtualNode
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html>
+    VirtualNode {haddock_workaround_ :: (),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-meshname>
+                 meshName :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-meshowner>
+                 meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-spec>
+                 spec :: VirtualNodeSpecProperty,
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-tags>
+                 tags :: (Prelude.Maybe [Tag]),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-virtualnodename>
+                 virtualNodeName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNode ::
+  Value Prelude.Text -> VirtualNodeSpecProperty -> VirtualNode
+mkVirtualNode meshName spec
+  = VirtualNode
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       meshOwner = Prelude.Nothing, tags = Prelude.Nothing,
+       virtualNodeName = Prelude.Nothing}
+instance ToResourceProperties VirtualNode where
+  toResourceProperties VirtualNode {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "VirtualNodeName" Prelude.<$> virtualNodeName]))}
+instance JSON.ToJSON VirtualNode where
+  toJSON VirtualNode {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+              (Prelude.catMaybes
+                 [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "VirtualNodeName" Prelude.<$> virtualNodeName])))
+instance Property "MeshName" VirtualNode where
+  type PropertyType "MeshName" VirtualNode = Value Prelude.Text
+  set newValue VirtualNode {..}
+    = VirtualNode {meshName = newValue, ..}
+instance Property "MeshOwner" VirtualNode where
+  type PropertyType "MeshOwner" VirtualNode = Value Prelude.Text
+  set newValue VirtualNode {..}
+    = VirtualNode {meshOwner = Prelude.pure newValue, ..}
+instance Property "Spec" VirtualNode where
+  type PropertyType "Spec" VirtualNode = VirtualNodeSpecProperty
+  set newValue VirtualNode {..} = VirtualNode {spec = newValue, ..}
+instance Property "Tags" VirtualNode where
+  type PropertyType "Tags" VirtualNode = [Tag]
+  set newValue VirtualNode {..}
+    = VirtualNode {tags = Prelude.pure newValue, ..}
+instance Property "VirtualNodeName" VirtualNode where
+  type PropertyType "VirtualNodeName" VirtualNode = Value Prelude.Text
+  set newValue VirtualNode {..}
+    = VirtualNode {virtualNodeName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.AccessLogProperty (
+        module Exports, AccessLogProperty(..), mkAccessLogProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.FileAccessLogProperty as Exports
+import Stratosphere.ResourceProperties
+data AccessLogProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-accesslog.html>
+    AccessLogProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-accesslog.html#cfn-appmesh-virtualnode-accesslog-file>
+                       file :: (Prelude.Maybe FileAccessLogProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAccessLogProperty :: AccessLogProperty
+mkAccessLogProperty
+  = AccessLogProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing}
+instance ToResourceProperties AccessLogProperty where
+  toResourceProperties AccessLogProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.AccessLog",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "File" Prelude.<$> file])}
+instance JSON.ToJSON AccessLogProperty where
+  toJSON AccessLogProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "File" Prelude.<$> file]))
+instance Property "File" AccessLogProperty where
+  type PropertyType "File" AccessLogProperty = FileAccessLogProperty
+  set newValue AccessLogProperty {..}
+    = AccessLogProperty {file = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AccessLogProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.AccessLogProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AccessLogProperty :: Prelude.Type
+instance ToResourceProperties AccessLogProperty
+instance Prelude.Eq AccessLogProperty
+instance Prelude.Show AccessLogProperty
+instance JSON.ToJSON AccessLogProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs
@@ -0,0 +1,40 @@
+module Stratosphere.AppMesh.VirtualNode.AwsCloudMapInstanceAttributeProperty (
+        AwsCloudMapInstanceAttributeProperty(..),
+        mkAwsCloudMapInstanceAttributeProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AwsCloudMapInstanceAttributeProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html>
+    AwsCloudMapInstanceAttributeProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html#cfn-appmesh-virtualnode-awscloudmapinstanceattribute-key>
+                                          key :: (Value Prelude.Text),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html#cfn-appmesh-virtualnode-awscloudmapinstanceattribute-value>
+                                          value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAwsCloudMapInstanceAttributeProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> AwsCloudMapInstanceAttributeProperty
+mkAwsCloudMapInstanceAttributeProperty key value
+  = AwsCloudMapInstanceAttributeProperty
+      {haddock_workaround_ = (), key = key, value = value}
+instance ToResourceProperties AwsCloudMapInstanceAttributeProperty where
+  toResourceProperties AwsCloudMapInstanceAttributeProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.AwsCloudMapInstanceAttribute",
+         supportsTags = Prelude.False,
+         properties = ["Key" JSON..= key, "Value" JSON..= value]}
+instance JSON.ToJSON AwsCloudMapInstanceAttributeProperty where
+  toJSON AwsCloudMapInstanceAttributeProperty {..}
+    = JSON.object ["Key" JSON..= key, "Value" JSON..= value]
+instance Property "Key" AwsCloudMapInstanceAttributeProperty where
+  type PropertyType "Key" AwsCloudMapInstanceAttributeProperty = Value Prelude.Text
+  set newValue AwsCloudMapInstanceAttributeProperty {..}
+    = AwsCloudMapInstanceAttributeProperty {key = newValue, ..}
+instance Property "Value" AwsCloudMapInstanceAttributeProperty where
+  type PropertyType "Value" AwsCloudMapInstanceAttributeProperty = Value Prelude.Text
+  set newValue AwsCloudMapInstanceAttributeProperty {..}
+    = AwsCloudMapInstanceAttributeProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapInstanceAttributeProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.AwsCloudMapInstanceAttributeProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AwsCloudMapInstanceAttributeProperty :: Prelude.Type
+instance ToResourceProperties AwsCloudMapInstanceAttributeProperty
+instance Prelude.Eq AwsCloudMapInstanceAttributeProperty
+instance Prelude.Show AwsCloudMapInstanceAttributeProperty
+instance JSON.ToJSON AwsCloudMapInstanceAttributeProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs
@@ -0,0 +1,71 @@
+module Stratosphere.AppMesh.VirtualNode.AwsCloudMapServiceDiscoveryProperty (
+        module Exports, AwsCloudMapServiceDiscoveryProperty(..),
+        mkAwsCloudMapServiceDiscoveryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.AwsCloudMapInstanceAttributeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AwsCloudMapServiceDiscoveryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html>
+    AwsCloudMapServiceDiscoveryProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-attributes>
+                                         attributes :: (Prelude.Maybe [AwsCloudMapInstanceAttributeProperty]),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-ippreference>
+                                         ipPreference :: (Prelude.Maybe (Value Prelude.Text)),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-namespacename>
+                                         namespaceName :: (Value Prelude.Text),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-servicename>
+                                         serviceName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAwsCloudMapServiceDiscoveryProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> AwsCloudMapServiceDiscoveryProperty
+mkAwsCloudMapServiceDiscoveryProperty namespaceName serviceName
+  = AwsCloudMapServiceDiscoveryProperty
+      {haddock_workaround_ = (), namespaceName = namespaceName,
+       serviceName = serviceName, attributes = Prelude.Nothing,
+       ipPreference = Prelude.Nothing}
+instance ToResourceProperties AwsCloudMapServiceDiscoveryProperty where
+  toResourceProperties AwsCloudMapServiceDiscoveryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.AwsCloudMapServiceDiscovery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["NamespaceName" JSON..= namespaceName,
+                            "ServiceName" JSON..= serviceName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Attributes" Prelude.<$> attributes,
+                               (JSON..=) "IpPreference" Prelude.<$> ipPreference]))}
+instance JSON.ToJSON AwsCloudMapServiceDiscoveryProperty where
+  toJSON AwsCloudMapServiceDiscoveryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["NamespaceName" JSON..= namespaceName,
+               "ServiceName" JSON..= serviceName]
+              (Prelude.catMaybes
+                 [(JSON..=) "Attributes" Prelude.<$> attributes,
+                  (JSON..=) "IpPreference" Prelude.<$> ipPreference])))
+instance Property "Attributes" AwsCloudMapServiceDiscoveryProperty where
+  type PropertyType "Attributes" AwsCloudMapServiceDiscoveryProperty = [AwsCloudMapInstanceAttributeProperty]
+  set newValue AwsCloudMapServiceDiscoveryProperty {..}
+    = AwsCloudMapServiceDiscoveryProperty
+        {attributes = Prelude.pure newValue, ..}
+instance Property "IpPreference" AwsCloudMapServiceDiscoveryProperty where
+  type PropertyType "IpPreference" AwsCloudMapServiceDiscoveryProperty = Value Prelude.Text
+  set newValue AwsCloudMapServiceDiscoveryProperty {..}
+    = AwsCloudMapServiceDiscoveryProperty
+        {ipPreference = Prelude.pure newValue, ..}
+instance Property "NamespaceName" AwsCloudMapServiceDiscoveryProperty where
+  type PropertyType "NamespaceName" AwsCloudMapServiceDiscoveryProperty = Value Prelude.Text
+  set newValue AwsCloudMapServiceDiscoveryProperty {..}
+    = AwsCloudMapServiceDiscoveryProperty
+        {namespaceName = newValue, ..}
+instance Property "ServiceName" AwsCloudMapServiceDiscoveryProperty where
+  type PropertyType "ServiceName" AwsCloudMapServiceDiscoveryProperty = Value Prelude.Text
+  set newValue AwsCloudMapServiceDiscoveryProperty {..}
+    = AwsCloudMapServiceDiscoveryProperty {serviceName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/AwsCloudMapServiceDiscoveryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.AwsCloudMapServiceDiscoveryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AwsCloudMapServiceDiscoveryProperty :: Prelude.Type
+instance ToResourceProperties AwsCloudMapServiceDiscoveryProperty
+instance Prelude.Eq AwsCloudMapServiceDiscoveryProperty
+instance Prelude.Show AwsCloudMapServiceDiscoveryProperty
+instance JSON.ToJSON AwsCloudMapServiceDiscoveryProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualNode.BackendDefaultsProperty (
+        module Exports, BackendDefaultsProperty(..),
+        mkBackendDefaultsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ClientPolicyProperty as Exports
+import Stratosphere.ResourceProperties
+data BackendDefaultsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backenddefaults.html>
+    BackendDefaultsProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backenddefaults.html#cfn-appmesh-virtualnode-backenddefaults-clientpolicy>
+                             clientPolicy :: (Prelude.Maybe ClientPolicyProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkBackendDefaultsProperty :: BackendDefaultsProperty
+mkBackendDefaultsProperty
+  = BackendDefaultsProperty
+      {haddock_workaround_ = (), clientPolicy = Prelude.Nothing}
+instance ToResourceProperties BackendDefaultsProperty where
+  toResourceProperties BackendDefaultsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.BackendDefaults",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy])}
+instance JSON.ToJSON BackendDefaultsProperty where
+  toJSON BackendDefaultsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy]))
+instance Property "ClientPolicy" BackendDefaultsProperty where
+  type PropertyType "ClientPolicy" BackendDefaultsProperty = ClientPolicyProperty
+  set newValue BackendDefaultsProperty {..}
+    = BackendDefaultsProperty
+        {clientPolicy = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/BackendDefaultsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.BackendDefaultsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data BackendDefaultsProperty :: Prelude.Type
+instance ToResourceProperties BackendDefaultsProperty
+instance Prelude.Eq BackendDefaultsProperty
+instance Prelude.Show BackendDefaultsProperty
+instance JSON.ToJSON BackendDefaultsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs
@@ -0,0 +1,36 @@
+module Stratosphere.AppMesh.VirtualNode.BackendProperty (
+        module Exports, BackendProperty(..), mkBackendProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualServiceBackendProperty as Exports
+import Stratosphere.ResourceProperties
+data BackendProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backend.html>
+    BackendProperty {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backend.html#cfn-appmesh-virtualnode-backend-virtualservice>
+                     virtualService :: (Prelude.Maybe VirtualServiceBackendProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkBackendProperty :: BackendProperty
+mkBackendProperty
+  = BackendProperty
+      {haddock_workaround_ = (), virtualService = Prelude.Nothing}
+instance ToResourceProperties BackendProperty where
+  toResourceProperties BackendProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.Backend",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "VirtualService" Prelude.<$> virtualService])}
+instance JSON.ToJSON BackendProperty where
+  toJSON BackendProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "VirtualService" Prelude.<$> virtualService]))
+instance Property "VirtualService" BackendProperty where
+  type PropertyType "VirtualService" BackendProperty = VirtualServiceBackendProperty
+  set newValue BackendProperty {..}
+    = BackendProperty {virtualService = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/BackendProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.BackendProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data BackendProperty :: Prelude.Type
+instance ToResourceProperties BackendProperty
+instance Prelude.Eq BackendProperty
+instance Prelude.Show BackendProperty
+instance JSON.ToJSON BackendProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.ClientPolicyProperty (
+        module Exports, ClientPolicyProperty(..), mkClientPolicyProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ClientPolicyTlsProperty as Exports
+import Stratosphere.ResourceProperties
+data ClientPolicyProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicy.html>
+    ClientPolicyProperty {haddock_workaround_ :: (),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicy.html#cfn-appmesh-virtualnode-clientpolicy-tls>
+                          tLS :: (Prelude.Maybe ClientPolicyTlsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkClientPolicyProperty :: ClientPolicyProperty
+mkClientPolicyProperty
+  = ClientPolicyProperty
+      {haddock_workaround_ = (), tLS = Prelude.Nothing}
+instance ToResourceProperties ClientPolicyProperty where
+  toResourceProperties ClientPolicyProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ClientPolicy",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "TLS" Prelude.<$> tLS])}
+instance JSON.ToJSON ClientPolicyProperty where
+  toJSON ClientPolicyProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "TLS" Prelude.<$> tLS]))
+instance Property "TLS" ClientPolicyProperty where
+  type PropertyType "TLS" ClientPolicyProperty = ClientPolicyTlsProperty
+  set newValue ClientPolicyProperty {..}
+    = ClientPolicyProperty {tLS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ClientPolicyProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ClientPolicyProperty :: Prelude.Type
+instance ToResourceProperties ClientPolicyProperty
+instance Prelude.Eq ClientPolicyProperty
+instance Prelude.Show ClientPolicyProperty
+instance JSON.ToJSON ClientPolicyProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs
@@ -0,0 +1,68 @@
+module Stratosphere.AppMesh.VirtualNode.ClientPolicyTlsProperty (
+        module Exports, ClientPolicyTlsProperty(..),
+        mkClientPolicyTlsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ClientTlsCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ClientPolicyTlsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html>
+    ClientPolicyTlsProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-certificate>
+                             certificate :: (Prelude.Maybe ClientTlsCertificateProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-enforce>
+                             enforce :: (Prelude.Maybe (Value Prelude.Bool)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-ports>
+                             ports :: (Prelude.Maybe (ValueList Prelude.Integer)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-validation>
+                             validation :: TlsValidationContextProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkClientPolicyTlsProperty ::
+  TlsValidationContextProperty -> ClientPolicyTlsProperty
+mkClientPolicyTlsProperty validation
+  = ClientPolicyTlsProperty
+      {haddock_workaround_ = (), validation = validation,
+       certificate = Prelude.Nothing, enforce = Prelude.Nothing,
+       ports = Prelude.Nothing}
+instance ToResourceProperties ClientPolicyTlsProperty where
+  toResourceProperties ClientPolicyTlsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ClientPolicyTls",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Validation" JSON..= validation]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Certificate" Prelude.<$> certificate,
+                               (JSON..=) "Enforce" Prelude.<$> enforce,
+                               (JSON..=) "Ports" Prelude.<$> ports]))}
+instance JSON.ToJSON ClientPolicyTlsProperty where
+  toJSON ClientPolicyTlsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Validation" JSON..= validation]
+              (Prelude.catMaybes
+                 [(JSON..=) "Certificate" Prelude.<$> certificate,
+                  (JSON..=) "Enforce" Prelude.<$> enforce,
+                  (JSON..=) "Ports" Prelude.<$> ports])))
+instance Property "Certificate" ClientPolicyTlsProperty where
+  type PropertyType "Certificate" ClientPolicyTlsProperty = ClientTlsCertificateProperty
+  set newValue ClientPolicyTlsProperty {..}
+    = ClientPolicyTlsProperty {certificate = Prelude.pure newValue, ..}
+instance Property "Enforce" ClientPolicyTlsProperty where
+  type PropertyType "Enforce" ClientPolicyTlsProperty = Value Prelude.Bool
+  set newValue ClientPolicyTlsProperty {..}
+    = ClientPolicyTlsProperty {enforce = Prelude.pure newValue, ..}
+instance Property "Ports" ClientPolicyTlsProperty where
+  type PropertyType "Ports" ClientPolicyTlsProperty = ValueList Prelude.Integer
+  set newValue ClientPolicyTlsProperty {..}
+    = ClientPolicyTlsProperty {ports = Prelude.pure newValue, ..}
+instance Property "Validation" ClientPolicyTlsProperty where
+  type PropertyType "Validation" ClientPolicyTlsProperty = TlsValidationContextProperty
+  set newValue ClientPolicyTlsProperty {..}
+    = ClientPolicyTlsProperty {validation = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientPolicyTlsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ClientPolicyTlsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ClientPolicyTlsProperty :: Prelude.Type
+instance ToResourceProperties ClientPolicyTlsProperty
+instance Prelude.Eq ClientPolicyTlsProperty
+instance Prelude.Show ClientPolicyTlsProperty
+instance JSON.ToJSON ClientPolicyTlsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs
@@ -0,0 +1,47 @@
+module Stratosphere.AppMesh.VirtualNode.ClientTlsCertificateProperty (
+        module Exports, ClientTlsCertificateProperty(..),
+        mkClientTlsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsFileCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsSdsCertificateProperty as Exports
+import Stratosphere.ResourceProperties
+data ClientTlsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html>
+    ClientTlsCertificateProperty {haddock_workaround_ :: (),
+                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html#cfn-appmesh-virtualnode-clienttlscertificate-file>
+                                  file :: (Prelude.Maybe ListenerTlsFileCertificateProperty),
+                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html#cfn-appmesh-virtualnode-clienttlscertificate-sds>
+                                  sDS :: (Prelude.Maybe ListenerTlsSdsCertificateProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkClientTlsCertificateProperty :: ClientTlsCertificateProperty
+mkClientTlsCertificateProperty
+  = ClientTlsCertificateProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing,
+       sDS = Prelude.Nothing}
+instance ToResourceProperties ClientTlsCertificateProperty where
+  toResourceProperties ClientTlsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ClientTlsCertificate",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON ClientTlsCertificateProperty where
+  toJSON ClientTlsCertificateProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "File" ClientTlsCertificateProperty where
+  type PropertyType "File" ClientTlsCertificateProperty = ListenerTlsFileCertificateProperty
+  set newValue ClientTlsCertificateProperty {..}
+    = ClientTlsCertificateProperty {file = Prelude.pure newValue, ..}
+instance Property "SDS" ClientTlsCertificateProperty where
+  type PropertyType "SDS" ClientTlsCertificateProperty = ListenerTlsSdsCertificateProperty
+  set newValue ClientTlsCertificateProperty {..}
+    = ClientTlsCertificateProperty {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ClientTlsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ClientTlsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ClientTlsCertificateProperty :: Prelude.Type
+instance ToResourceProperties ClientTlsCertificateProperty
+instance Prelude.Eq ClientTlsCertificateProperty
+instance Prelude.Show ClientTlsCertificateProperty
+instance JSON.ToJSON ClientTlsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs
@@ -0,0 +1,58 @@
+module Stratosphere.AppMesh.VirtualNode.DnsServiceDiscoveryProperty (
+        DnsServiceDiscoveryProperty(..), mkDnsServiceDiscoveryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DnsServiceDiscoveryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html>
+    DnsServiceDiscoveryProperty {haddock_workaround_ :: (),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-hostname>
+                                 hostname :: (Value Prelude.Text),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-ippreference>
+                                 ipPreference :: (Prelude.Maybe (Value Prelude.Text)),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-responsetype>
+                                 responseType :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDnsServiceDiscoveryProperty ::
+  Value Prelude.Text -> DnsServiceDiscoveryProperty
+mkDnsServiceDiscoveryProperty hostname
+  = DnsServiceDiscoveryProperty
+      {haddock_workaround_ = (), hostname = hostname,
+       ipPreference = Prelude.Nothing, responseType = Prelude.Nothing}
+instance ToResourceProperties DnsServiceDiscoveryProperty where
+  toResourceProperties DnsServiceDiscoveryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.DnsServiceDiscovery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Hostname" JSON..= hostname]
+                           (Prelude.catMaybes
+                              [(JSON..=) "IpPreference" Prelude.<$> ipPreference,
+                               (JSON..=) "ResponseType" Prelude.<$> responseType]))}
+instance JSON.ToJSON DnsServiceDiscoveryProperty where
+  toJSON DnsServiceDiscoveryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Hostname" JSON..= hostname]
+              (Prelude.catMaybes
+                 [(JSON..=) "IpPreference" Prelude.<$> ipPreference,
+                  (JSON..=) "ResponseType" Prelude.<$> responseType])))
+instance Property "Hostname" DnsServiceDiscoveryProperty where
+  type PropertyType "Hostname" DnsServiceDiscoveryProperty = Value Prelude.Text
+  set newValue DnsServiceDiscoveryProperty {..}
+    = DnsServiceDiscoveryProperty {hostname = newValue, ..}
+instance Property "IpPreference" DnsServiceDiscoveryProperty where
+  type PropertyType "IpPreference" DnsServiceDiscoveryProperty = Value Prelude.Text
+  set newValue DnsServiceDiscoveryProperty {..}
+    = DnsServiceDiscoveryProperty
+        {ipPreference = Prelude.pure newValue, ..}
+instance Property "ResponseType" DnsServiceDiscoveryProperty where
+  type PropertyType "ResponseType" DnsServiceDiscoveryProperty = Value Prelude.Text
+  set newValue DnsServiceDiscoveryProperty {..}
+    = DnsServiceDiscoveryProperty
+        {responseType = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/DnsServiceDiscoveryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.DnsServiceDiscoveryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DnsServiceDiscoveryProperty :: Prelude.Type
+instance ToResourceProperties DnsServiceDiscoveryProperty
+instance Prelude.Eq DnsServiceDiscoveryProperty
+instance Prelude.Show DnsServiceDiscoveryProperty
+instance JSON.ToJSON DnsServiceDiscoveryProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualNode.DurationProperty (
+        DurationProperty(..), mkDurationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DurationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html>
+    DurationProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html#cfn-appmesh-virtualnode-duration-unit>
+                      unit :: (Value Prelude.Text),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html#cfn-appmesh-virtualnode-duration-value>
+                      value :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDurationProperty ::
+  Value Prelude.Text -> Value Prelude.Integer -> DurationProperty
+mkDurationProperty unit value
+  = DurationProperty
+      {haddock_workaround_ = (), unit = unit, value = value}
+instance ToResourceProperties DurationProperty where
+  toResourceProperties DurationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.Duration",
+         supportsTags = Prelude.False,
+         properties = ["Unit" JSON..= unit, "Value" JSON..= value]}
+instance JSON.ToJSON DurationProperty where
+  toJSON DurationProperty {..}
+    = JSON.object ["Unit" JSON..= unit, "Value" JSON..= value]
+instance Property "Unit" DurationProperty where
+  type PropertyType "Unit" DurationProperty = Value Prelude.Text
+  set newValue DurationProperty {..}
+    = DurationProperty {unit = newValue, ..}
+instance Property "Value" DurationProperty where
+  type PropertyType "Value" DurationProperty = Value Prelude.Integer
+  set newValue DurationProperty {..}
+    = DurationProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/DurationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.DurationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DurationProperty :: Prelude.Type
+instance ToResourceProperties DurationProperty
+instance Prelude.Eq DurationProperty
+instance Prelude.Show DurationProperty
+instance JSON.ToJSON DurationProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs
@@ -0,0 +1,46 @@
+module Stratosphere.AppMesh.VirtualNode.FileAccessLogProperty (
+        module Exports, FileAccessLogProperty(..), mkFileAccessLogProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.LoggingFormatProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data FileAccessLogProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html>
+    FileAccessLogProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html#cfn-appmesh-virtualnode-fileaccesslog-format>
+                           format :: (Prelude.Maybe LoggingFormatProperty),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html#cfn-appmesh-virtualnode-fileaccesslog-path>
+                           path :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkFileAccessLogProperty ::
+  Value Prelude.Text -> FileAccessLogProperty
+mkFileAccessLogProperty path
+  = FileAccessLogProperty
+      {haddock_workaround_ = (), path = path, format = Prelude.Nothing}
+instance ToResourceProperties FileAccessLogProperty where
+  toResourceProperties FileAccessLogProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.FileAccessLog",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Path" JSON..= path]
+                           (Prelude.catMaybes [(JSON..=) "Format" Prelude.<$> format]))}
+instance JSON.ToJSON FileAccessLogProperty where
+  toJSON FileAccessLogProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Path" JSON..= path]
+              (Prelude.catMaybes [(JSON..=) "Format" Prelude.<$> format])))
+instance Property "Format" FileAccessLogProperty where
+  type PropertyType "Format" FileAccessLogProperty = LoggingFormatProperty
+  set newValue FileAccessLogProperty {..}
+    = FileAccessLogProperty {format = Prelude.pure newValue, ..}
+instance Property "Path" FileAccessLogProperty where
+  type PropertyType "Path" FileAccessLogProperty = Value Prelude.Text
+  set newValue FileAccessLogProperty {..}
+    = FileAccessLogProperty {path = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/FileAccessLogProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.FileAccessLogProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data FileAccessLogProperty :: Prelude.Type
+instance ToResourceProperties FileAccessLogProperty
+instance Prelude.Eq FileAccessLogProperty
+instance Prelude.Show FileAccessLogProperty
+instance JSON.ToJSON FileAccessLogProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.VirtualNode.GrpcTimeoutProperty (
+        module Exports, GrpcTimeoutProperty(..), mkGrpcTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data GrpcTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html>
+    GrpcTimeoutProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html#cfn-appmesh-virtualnode-grpctimeout-idle>
+                         idle :: (Prelude.Maybe DurationProperty),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html#cfn-appmesh-virtualnode-grpctimeout-perrequest>
+                         perRequest :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGrpcTimeoutProperty :: GrpcTimeoutProperty
+mkGrpcTimeoutProperty
+  = GrpcTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing,
+       perRequest = Prelude.Nothing}
+instance ToResourceProperties GrpcTimeoutProperty where
+  toResourceProperties GrpcTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.GrpcTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Idle" Prelude.<$> idle,
+                            (JSON..=) "PerRequest" Prelude.<$> perRequest])}
+instance JSON.ToJSON GrpcTimeoutProperty where
+  toJSON GrpcTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Idle" Prelude.<$> idle,
+               (JSON..=) "PerRequest" Prelude.<$> perRequest]))
+instance Property "Idle" GrpcTimeoutProperty where
+  type PropertyType "Idle" GrpcTimeoutProperty = DurationProperty
+  set newValue GrpcTimeoutProperty {..}
+    = GrpcTimeoutProperty {idle = Prelude.pure newValue, ..}
+instance Property "PerRequest" GrpcTimeoutProperty where
+  type PropertyType "PerRequest" GrpcTimeoutProperty = DurationProperty
+  set newValue GrpcTimeoutProperty {..}
+    = GrpcTimeoutProperty {perRequest = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/GrpcTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.GrpcTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GrpcTimeoutProperty :: Prelude.Type
+instance ToResourceProperties GrpcTimeoutProperty
+instance Prelude.Eq GrpcTimeoutProperty
+instance Prelude.Show GrpcTimeoutProperty
+instance JSON.ToJSON GrpcTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs
@@ -0,0 +1,98 @@
+module Stratosphere.AppMesh.VirtualNode.HealthCheckProperty (
+        HealthCheckProperty(..), mkHealthCheckProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data HealthCheckProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html>
+    HealthCheckProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-healthythreshold>
+                         healthyThreshold :: (Value Prelude.Integer),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-intervalmillis>
+                         intervalMillis :: (Value Prelude.Integer),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-path>
+                         path :: (Prelude.Maybe (Value Prelude.Text)),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-port>
+                         port :: (Prelude.Maybe (Value Prelude.Integer)),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-protocol>
+                         protocol :: (Value Prelude.Text),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-timeoutmillis>
+                         timeoutMillis :: (Value Prelude.Integer),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-unhealthythreshold>
+                         unhealthyThreshold :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHealthCheckProperty ::
+  Value Prelude.Integer
+  -> Value Prelude.Integer
+     -> Value Prelude.Text
+        -> Value Prelude.Integer
+           -> Value Prelude.Integer -> HealthCheckProperty
+mkHealthCheckProperty
+  healthyThreshold
+  intervalMillis
+  protocol
+  timeoutMillis
+  unhealthyThreshold
+  = HealthCheckProperty
+      {haddock_workaround_ = (), healthyThreshold = healthyThreshold,
+       intervalMillis = intervalMillis, protocol = protocol,
+       timeoutMillis = timeoutMillis,
+       unhealthyThreshold = unhealthyThreshold, path = Prelude.Nothing,
+       port = Prelude.Nothing}
+instance ToResourceProperties HealthCheckProperty where
+  toResourceProperties HealthCheckProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.HealthCheck",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["HealthyThreshold" JSON..= healthyThreshold,
+                            "IntervalMillis" JSON..= intervalMillis,
+                            "Protocol" JSON..= protocol, "TimeoutMillis" JSON..= timeoutMillis,
+                            "UnhealthyThreshold" JSON..= unhealthyThreshold]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Path" Prelude.<$> path,
+                               (JSON..=) "Port" Prelude.<$> port]))}
+instance JSON.ToJSON HealthCheckProperty where
+  toJSON HealthCheckProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["HealthyThreshold" JSON..= healthyThreshold,
+               "IntervalMillis" JSON..= intervalMillis,
+               "Protocol" JSON..= protocol, "TimeoutMillis" JSON..= timeoutMillis,
+               "UnhealthyThreshold" JSON..= unhealthyThreshold]
+              (Prelude.catMaybes
+                 [(JSON..=) "Path" Prelude.<$> path,
+                  (JSON..=) "Port" Prelude.<$> port])))
+instance Property "HealthyThreshold" HealthCheckProperty where
+  type PropertyType "HealthyThreshold" HealthCheckProperty = Value Prelude.Integer
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {healthyThreshold = newValue, ..}
+instance Property "IntervalMillis" HealthCheckProperty where
+  type PropertyType "IntervalMillis" HealthCheckProperty = Value Prelude.Integer
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {intervalMillis = newValue, ..}
+instance Property "Path" HealthCheckProperty where
+  type PropertyType "Path" HealthCheckProperty = Value Prelude.Text
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {path = Prelude.pure newValue, ..}
+instance Property "Port" HealthCheckProperty where
+  type PropertyType "Port" HealthCheckProperty = Value Prelude.Integer
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {port = Prelude.pure newValue, ..}
+instance Property "Protocol" HealthCheckProperty where
+  type PropertyType "Protocol" HealthCheckProperty = Value Prelude.Text
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {protocol = newValue, ..}
+instance Property "TimeoutMillis" HealthCheckProperty where
+  type PropertyType "TimeoutMillis" HealthCheckProperty = Value Prelude.Integer
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {timeoutMillis = newValue, ..}
+instance Property "UnhealthyThreshold" HealthCheckProperty where
+  type PropertyType "UnhealthyThreshold" HealthCheckProperty = Value Prelude.Integer
+  set newValue HealthCheckProperty {..}
+    = HealthCheckProperty {unhealthyThreshold = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/HealthCheckProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.HealthCheckProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HealthCheckProperty :: Prelude.Type
+instance ToResourceProperties HealthCheckProperty
+instance Prelude.Eq HealthCheckProperty
+instance Prelude.Show HealthCheckProperty
+instance JSON.ToJSON HealthCheckProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.VirtualNode.HttpTimeoutProperty (
+        module Exports, HttpTimeoutProperty(..), mkHttpTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data HttpTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html>
+    HttpTimeoutProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html#cfn-appmesh-virtualnode-httptimeout-idle>
+                         idle :: (Prelude.Maybe DurationProperty),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html#cfn-appmesh-virtualnode-httptimeout-perrequest>
+                         perRequest :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkHttpTimeoutProperty :: HttpTimeoutProperty
+mkHttpTimeoutProperty
+  = HttpTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing,
+       perRequest = Prelude.Nothing}
+instance ToResourceProperties HttpTimeoutProperty where
+  toResourceProperties HttpTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.HttpTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Idle" Prelude.<$> idle,
+                            (JSON..=) "PerRequest" Prelude.<$> perRequest])}
+instance JSON.ToJSON HttpTimeoutProperty where
+  toJSON HttpTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Idle" Prelude.<$> idle,
+               (JSON..=) "PerRequest" Prelude.<$> perRequest]))
+instance Property "Idle" HttpTimeoutProperty where
+  type PropertyType "Idle" HttpTimeoutProperty = DurationProperty
+  set newValue HttpTimeoutProperty {..}
+    = HttpTimeoutProperty {idle = Prelude.pure newValue, ..}
+instance Property "PerRequest" HttpTimeoutProperty where
+  type PropertyType "PerRequest" HttpTimeoutProperty = DurationProperty
+  set newValue HttpTimeoutProperty {..}
+    = HttpTimeoutProperty {perRequest = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/HttpTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.HttpTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data HttpTimeoutProperty :: Prelude.Type
+instance ToResourceProperties HttpTimeoutProperty
+instance Prelude.Eq HttpTimeoutProperty
+instance Prelude.Show HttpTimeoutProperty
+instance JSON.ToJSON HttpTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualNode.JsonFormatRefProperty (
+        JsonFormatRefProperty(..), mkJsonFormatRefProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data JsonFormatRefProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html>
+    JsonFormatRefProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html#cfn-appmesh-virtualnode-jsonformatref-key>
+                           key :: (Value Prelude.Text),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html#cfn-appmesh-virtualnode-jsonformatref-value>
+                           value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkJsonFormatRefProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> JsonFormatRefProperty
+mkJsonFormatRefProperty key value
+  = JsonFormatRefProperty
+      {haddock_workaround_ = (), key = key, value = value}
+instance ToResourceProperties JsonFormatRefProperty where
+  toResourceProperties JsonFormatRefProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.JsonFormatRef",
+         supportsTags = Prelude.False,
+         properties = ["Key" JSON..= key, "Value" JSON..= value]}
+instance JSON.ToJSON JsonFormatRefProperty where
+  toJSON JsonFormatRefProperty {..}
+    = JSON.object ["Key" JSON..= key, "Value" JSON..= value]
+instance Property "Key" JsonFormatRefProperty where
+  type PropertyType "Key" JsonFormatRefProperty = Value Prelude.Text
+  set newValue JsonFormatRefProperty {..}
+    = JsonFormatRefProperty {key = newValue, ..}
+instance Property "Value" JsonFormatRefProperty where
+  type PropertyType "Value" JsonFormatRefProperty = Value Prelude.Text
+  set newValue JsonFormatRefProperty {..}
+    = JsonFormatRefProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/JsonFormatRefProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.JsonFormatRefProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data JsonFormatRefProperty :: Prelude.Type
+instance ToResourceProperties JsonFormatRefProperty
+instance Prelude.Eq JsonFormatRefProperty
+instance Prelude.Show JsonFormatRefProperty
+instance JSON.ToJSON JsonFormatRefProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs
@@ -0,0 +1,86 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerProperty (
+        module Exports, ListenerProperty(..), mkListenerProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.HealthCheckProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTimeoutProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.OutlierDetectionProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.PortMappingProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeConnectionPoolProperty as Exports
+import Stratosphere.ResourceProperties
+data ListenerProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html>
+    ListenerProperty {haddock_workaround_ :: (),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-connectionpool>
+                      connectionPool :: (Prelude.Maybe VirtualNodeConnectionPoolProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-healthcheck>
+                      healthCheck :: (Prelude.Maybe HealthCheckProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-outlierdetection>
+                      outlierDetection :: (Prelude.Maybe OutlierDetectionProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-portmapping>
+                      portMapping :: PortMappingProperty,
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-tls>
+                      tLS :: (Prelude.Maybe ListenerTlsProperty),
+                      -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-timeout>
+                      timeout :: (Prelude.Maybe ListenerTimeoutProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerProperty :: PortMappingProperty -> ListenerProperty
+mkListenerProperty portMapping
+  = ListenerProperty
+      {haddock_workaround_ = (), portMapping = portMapping,
+       connectionPool = Prelude.Nothing, healthCheck = Prelude.Nothing,
+       outlierDetection = Prelude.Nothing, tLS = Prelude.Nothing,
+       timeout = Prelude.Nothing}
+instance ToResourceProperties ListenerProperty where
+  toResourceProperties ListenerProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.Listener",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["PortMapping" JSON..= portMapping]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ConnectionPool" Prelude.<$> connectionPool,
+                               (JSON..=) "HealthCheck" Prelude.<$> healthCheck,
+                               (JSON..=) "OutlierDetection" Prelude.<$> outlierDetection,
+                               (JSON..=) "TLS" Prelude.<$> tLS,
+                               (JSON..=) "Timeout" Prelude.<$> timeout]))}
+instance JSON.ToJSON ListenerProperty where
+  toJSON ListenerProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["PortMapping" JSON..= portMapping]
+              (Prelude.catMaybes
+                 [(JSON..=) "ConnectionPool" Prelude.<$> connectionPool,
+                  (JSON..=) "HealthCheck" Prelude.<$> healthCheck,
+                  (JSON..=) "OutlierDetection" Prelude.<$> outlierDetection,
+                  (JSON..=) "TLS" Prelude.<$> tLS,
+                  (JSON..=) "Timeout" Prelude.<$> timeout])))
+instance Property "ConnectionPool" ListenerProperty where
+  type PropertyType "ConnectionPool" ListenerProperty = VirtualNodeConnectionPoolProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {connectionPool = Prelude.pure newValue, ..}
+instance Property "HealthCheck" ListenerProperty where
+  type PropertyType "HealthCheck" ListenerProperty = HealthCheckProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {healthCheck = Prelude.pure newValue, ..}
+instance Property "OutlierDetection" ListenerProperty where
+  type PropertyType "OutlierDetection" ListenerProperty = OutlierDetectionProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {outlierDetection = Prelude.pure newValue, ..}
+instance Property "PortMapping" ListenerProperty where
+  type PropertyType "PortMapping" ListenerProperty = PortMappingProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {portMapping = newValue, ..}
+instance Property "TLS" ListenerProperty where
+  type PropertyType "TLS" ListenerProperty = ListenerTlsProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {tLS = Prelude.pure newValue, ..}
+instance Property "Timeout" ListenerProperty where
+  type PropertyType "Timeout" ListenerProperty = ListenerTimeoutProperty
+  set newValue ListenerProperty {..}
+    = ListenerProperty {timeout = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerProperty :: Prelude.Type
+instance ToResourceProperties ListenerProperty
+instance Prelude.Eq ListenerProperty
+instance Prelude.Show ListenerProperty
+instance JSON.ToJSON ListenerProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs
@@ -0,0 +1,65 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTimeoutProperty (
+        module Exports, ListenerTimeoutProperty(..),
+        mkListenerTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.GrpcTimeoutProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.HttpTimeoutProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TcpTimeoutProperty as Exports
+import Stratosphere.ResourceProperties
+data ListenerTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html>
+    ListenerTimeoutProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-grpc>
+                             gRPC :: (Prelude.Maybe GrpcTimeoutProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-http>
+                             hTTP :: (Prelude.Maybe HttpTimeoutProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-http2>
+                             hTTP2 :: (Prelude.Maybe HttpTimeoutProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-tcp>
+                             tCP :: (Prelude.Maybe TcpTimeoutProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTimeoutProperty :: ListenerTimeoutProperty
+mkListenerTimeoutProperty
+  = ListenerTimeoutProperty
+      {haddock_workaround_ = (), gRPC = Prelude.Nothing,
+       hTTP = Prelude.Nothing, hTTP2 = Prelude.Nothing,
+       tCP = Prelude.Nothing}
+instance ToResourceProperties ListenerTimeoutProperty where
+  toResourceProperties ListenerTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "GRPC" Prelude.<$> gRPC,
+                            (JSON..=) "HTTP" Prelude.<$> hTTP,
+                            (JSON..=) "HTTP2" Prelude.<$> hTTP2,
+                            (JSON..=) "TCP" Prelude.<$> tCP])}
+instance JSON.ToJSON ListenerTimeoutProperty where
+  toJSON ListenerTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "GRPC" Prelude.<$> gRPC,
+               (JSON..=) "HTTP" Prelude.<$> hTTP,
+               (JSON..=) "HTTP2" Prelude.<$> hTTP2,
+               (JSON..=) "TCP" Prelude.<$> tCP]))
+instance Property "GRPC" ListenerTimeoutProperty where
+  type PropertyType "GRPC" ListenerTimeoutProperty = GrpcTimeoutProperty
+  set newValue ListenerTimeoutProperty {..}
+    = ListenerTimeoutProperty {gRPC = Prelude.pure newValue, ..}
+instance Property "HTTP" ListenerTimeoutProperty where
+  type PropertyType "HTTP" ListenerTimeoutProperty = HttpTimeoutProperty
+  set newValue ListenerTimeoutProperty {..}
+    = ListenerTimeoutProperty {hTTP = Prelude.pure newValue, ..}
+instance Property "HTTP2" ListenerTimeoutProperty where
+  type PropertyType "HTTP2" ListenerTimeoutProperty = HttpTimeoutProperty
+  set newValue ListenerTimeoutProperty {..}
+    = ListenerTimeoutProperty {hTTP2 = Prelude.pure newValue, ..}
+instance Property "TCP" ListenerTimeoutProperty where
+  type PropertyType "TCP" ListenerTimeoutProperty = TcpTimeoutProperty
+  set newValue ListenerTimeoutProperty {..}
+    = ListenerTimeoutProperty {tCP = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTimeoutProperty :: Prelude.Type
+instance ToResourceProperties ListenerTimeoutProperty
+instance Prelude.Eq ListenerTimeoutProperty
+instance Prelude.Show ListenerTimeoutProperty
+instance JSON.ToJSON ListenerTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsAcmCertificateProperty (
+        ListenerTlsAcmCertificateProperty(..),
+        mkListenerTlsAcmCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ListenerTlsAcmCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsacmcertificate.html>
+    ListenerTlsAcmCertificateProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsacmcertificate.html#cfn-appmesh-virtualnode-listenertlsacmcertificate-certificatearn>
+                                       certificateArn :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsAcmCertificateProperty ::
+  Value Prelude.Text -> ListenerTlsAcmCertificateProperty
+mkListenerTlsAcmCertificateProperty certificateArn
+  = ListenerTlsAcmCertificateProperty
+      {haddock_workaround_ = (), certificateArn = certificateArn}
+instance ToResourceProperties ListenerTlsAcmCertificateProperty where
+  toResourceProperties ListenerTlsAcmCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsAcmCertificate",
+         supportsTags = Prelude.False,
+         properties = ["CertificateArn" JSON..= certificateArn]}
+instance JSON.ToJSON ListenerTlsAcmCertificateProperty where
+  toJSON ListenerTlsAcmCertificateProperty {..}
+    = JSON.object ["CertificateArn" JSON..= certificateArn]
+instance Property "CertificateArn" ListenerTlsAcmCertificateProperty where
+  type PropertyType "CertificateArn" ListenerTlsAcmCertificateProperty = Value Prelude.Text
+  set newValue ListenerTlsAcmCertificateProperty {..}
+    = ListenerTlsAcmCertificateProperty {certificateArn = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsAcmCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsAcmCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsAcmCertificateProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsAcmCertificateProperty
+instance Prelude.Eq ListenerTlsAcmCertificateProperty
+instance Prelude.Show ListenerTlsAcmCertificateProperty
+instance JSON.ToJSON ListenerTlsAcmCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs
@@ -0,0 +1,56 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsCertificateProperty (
+        module Exports, ListenerTlsCertificateProperty(..),
+        mkListenerTlsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsAcmCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsFileCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsSdsCertificateProperty as Exports
+import Stratosphere.ResourceProperties
+data ListenerTlsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html>
+    ListenerTlsCertificateProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-acm>
+                                    aCM :: (Prelude.Maybe ListenerTlsAcmCertificateProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-file>
+                                    file :: (Prelude.Maybe ListenerTlsFileCertificateProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-sds>
+                                    sDS :: (Prelude.Maybe ListenerTlsSdsCertificateProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsCertificateProperty :: ListenerTlsCertificateProperty
+mkListenerTlsCertificateProperty
+  = ListenerTlsCertificateProperty
+      {haddock_workaround_ = (), aCM = Prelude.Nothing,
+       file = Prelude.Nothing, sDS = Prelude.Nothing}
+instance ToResourceProperties ListenerTlsCertificateProperty where
+  toResourceProperties ListenerTlsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsCertificate",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ACM" Prelude.<$> aCM,
+                            (JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON ListenerTlsCertificateProperty where
+  toJSON ListenerTlsCertificateProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ACM" Prelude.<$> aCM,
+               (JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "ACM" ListenerTlsCertificateProperty where
+  type PropertyType "ACM" ListenerTlsCertificateProperty = ListenerTlsAcmCertificateProperty
+  set newValue ListenerTlsCertificateProperty {..}
+    = ListenerTlsCertificateProperty {aCM = Prelude.pure newValue, ..}
+instance Property "File" ListenerTlsCertificateProperty where
+  type PropertyType "File" ListenerTlsCertificateProperty = ListenerTlsFileCertificateProperty
+  set newValue ListenerTlsCertificateProperty {..}
+    = ListenerTlsCertificateProperty {file = Prelude.pure newValue, ..}
+instance Property "SDS" ListenerTlsCertificateProperty where
+  type PropertyType "SDS" ListenerTlsCertificateProperty = ListenerTlsSdsCertificateProperty
+  set newValue ListenerTlsCertificateProperty {..}
+    = ListenerTlsCertificateProperty {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsCertificateProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsCertificateProperty
+instance Prelude.Eq ListenerTlsCertificateProperty
+instance Prelude.Show ListenerTlsCertificateProperty
+instance JSON.ToJSON ListenerTlsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsFileCertificateProperty (
+        ListenerTlsFileCertificateProperty(..),
+        mkListenerTlsFileCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ListenerTlsFileCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html>
+    ListenerTlsFileCertificateProperty {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html#cfn-appmesh-virtualnode-listenertlsfilecertificate-certificatechain>
+                                        certificateChain :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html#cfn-appmesh-virtualnode-listenertlsfilecertificate-privatekey>
+                                        privateKey :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsFileCertificateProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> ListenerTlsFileCertificateProperty
+mkListenerTlsFileCertificateProperty certificateChain privateKey
+  = ListenerTlsFileCertificateProperty
+      {haddock_workaround_ = (), certificateChain = certificateChain,
+       privateKey = privateKey}
+instance ToResourceProperties ListenerTlsFileCertificateProperty where
+  toResourceProperties ListenerTlsFileCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsFileCertificate",
+         supportsTags = Prelude.False,
+         properties = ["CertificateChain" JSON..= certificateChain,
+                       "PrivateKey" JSON..= privateKey]}
+instance JSON.ToJSON ListenerTlsFileCertificateProperty where
+  toJSON ListenerTlsFileCertificateProperty {..}
+    = JSON.object
+        ["CertificateChain" JSON..= certificateChain,
+         "PrivateKey" JSON..= privateKey]
+instance Property "CertificateChain" ListenerTlsFileCertificateProperty where
+  type PropertyType "CertificateChain" ListenerTlsFileCertificateProperty = Value Prelude.Text
+  set newValue ListenerTlsFileCertificateProperty {..}
+    = ListenerTlsFileCertificateProperty
+        {certificateChain = newValue, ..}
+instance Property "PrivateKey" ListenerTlsFileCertificateProperty where
+  type PropertyType "PrivateKey" ListenerTlsFileCertificateProperty = Value Prelude.Text
+  set newValue ListenerTlsFileCertificateProperty {..}
+    = ListenerTlsFileCertificateProperty {privateKey = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsFileCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsFileCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsFileCertificateProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsFileCertificateProperty
+instance Prelude.Eq ListenerTlsFileCertificateProperty
+instance Prelude.Show ListenerTlsFileCertificateProperty
+instance JSON.ToJSON ListenerTlsFileCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs
@@ -0,0 +1,57 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsProperty (
+        module Exports, ListenerTlsProperty(..), mkListenerTlsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsCertificateProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ListenerTlsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html>
+    ListenerTlsProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-certificate>
+                         certificate :: ListenerTlsCertificateProperty,
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-mode>
+                         mode :: (Value Prelude.Text),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-validation>
+                         validation :: (Prelude.Maybe ListenerTlsValidationContextProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsProperty ::
+  ListenerTlsCertificateProperty
+  -> Value Prelude.Text -> ListenerTlsProperty
+mkListenerTlsProperty certificate mode
+  = ListenerTlsProperty
+      {haddock_workaround_ = (), certificate = certificate, mode = mode,
+       validation = Prelude.Nothing}
+instance ToResourceProperties ListenerTlsProperty where
+  toResourceProperties ListenerTlsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTls",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Certificate" JSON..= certificate, "Mode" JSON..= mode]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Validation" Prelude.<$> validation]))}
+instance JSON.ToJSON ListenerTlsProperty where
+  toJSON ListenerTlsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Certificate" JSON..= certificate, "Mode" JSON..= mode]
+              (Prelude.catMaybes
+                 [(JSON..=) "Validation" Prelude.<$> validation])))
+instance Property "Certificate" ListenerTlsProperty where
+  type PropertyType "Certificate" ListenerTlsProperty = ListenerTlsCertificateProperty
+  set newValue ListenerTlsProperty {..}
+    = ListenerTlsProperty {certificate = newValue, ..}
+instance Property "Mode" ListenerTlsProperty where
+  type PropertyType "Mode" ListenerTlsProperty = Value Prelude.Text
+  set newValue ListenerTlsProperty {..}
+    = ListenerTlsProperty {mode = newValue, ..}
+instance Property "Validation" ListenerTlsProperty where
+  type PropertyType "Validation" ListenerTlsProperty = ListenerTlsValidationContextProperty
+  set newValue ListenerTlsProperty {..}
+    = ListenerTlsProperty {validation = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsProperty
+instance Prelude.Eq ListenerTlsProperty
+instance Prelude.Show ListenerTlsProperty
+instance JSON.ToJSON ListenerTlsProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsSdsCertificateProperty (
+        ListenerTlsSdsCertificateProperty(..),
+        mkListenerTlsSdsCertificateProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ListenerTlsSdsCertificateProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlssdscertificate.html>
+    ListenerTlsSdsCertificateProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlssdscertificate.html#cfn-appmesh-virtualnode-listenertlssdscertificate-secretname>
+                                       secretName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsSdsCertificateProperty ::
+  Value Prelude.Text -> ListenerTlsSdsCertificateProperty
+mkListenerTlsSdsCertificateProperty secretName
+  = ListenerTlsSdsCertificateProperty
+      {haddock_workaround_ = (), secretName = secretName}
+instance ToResourceProperties ListenerTlsSdsCertificateProperty where
+  toResourceProperties ListenerTlsSdsCertificateProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsSdsCertificate",
+         supportsTags = Prelude.False,
+         properties = ["SecretName" JSON..= secretName]}
+instance JSON.ToJSON ListenerTlsSdsCertificateProperty where
+  toJSON ListenerTlsSdsCertificateProperty {..}
+    = JSON.object ["SecretName" JSON..= secretName]
+instance Property "SecretName" ListenerTlsSdsCertificateProperty where
+  type PropertyType "SecretName" ListenerTlsSdsCertificateProperty = Value Prelude.Text
+  set newValue ListenerTlsSdsCertificateProperty {..}
+    = ListenerTlsSdsCertificateProperty {secretName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsSdsCertificateProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsSdsCertificateProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsSdsCertificateProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsSdsCertificateProperty
+instance Prelude.Eq ListenerTlsSdsCertificateProperty
+instance Prelude.Show ListenerTlsSdsCertificateProperty
+instance JSON.ToJSON ListenerTlsSdsCertificateProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs
@@ -0,0 +1,54 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextProperty (
+        module Exports, ListenerTlsValidationContextProperty(..),
+        mkListenerTlsValidationContextProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNamesProperty as Exports
+import Stratosphere.ResourceProperties
+data ListenerTlsValidationContextProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html>
+    ListenerTlsValidationContextProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html#cfn-appmesh-virtualnode-listenertlsvalidationcontext-subjectalternativenames>
+                                          subjectAlternativeNames :: (Prelude.Maybe SubjectAlternativeNamesProperty),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html#cfn-appmesh-virtualnode-listenertlsvalidationcontext-trust>
+                                          trust :: ListenerTlsValidationContextTrustProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsValidationContextProperty ::
+  ListenerTlsValidationContextTrustProperty
+  -> ListenerTlsValidationContextProperty
+mkListenerTlsValidationContextProperty trust
+  = ListenerTlsValidationContextProperty
+      {haddock_workaround_ = (), trust = trust,
+       subjectAlternativeNames = Prelude.Nothing}
+instance ToResourceProperties ListenerTlsValidationContextProperty where
+  toResourceProperties ListenerTlsValidationContextProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsValidationContext",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Trust" JSON..= trust]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SubjectAlternativeNames"
+                                 Prelude.<$> subjectAlternativeNames]))}
+instance JSON.ToJSON ListenerTlsValidationContextProperty where
+  toJSON ListenerTlsValidationContextProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Trust" JSON..= trust]
+              (Prelude.catMaybes
+                 [(JSON..=) "SubjectAlternativeNames"
+                    Prelude.<$> subjectAlternativeNames])))
+instance Property "SubjectAlternativeNames" ListenerTlsValidationContextProperty where
+  type PropertyType "SubjectAlternativeNames" ListenerTlsValidationContextProperty = SubjectAlternativeNamesProperty
+  set newValue ListenerTlsValidationContextProperty {..}
+    = ListenerTlsValidationContextProperty
+        {subjectAlternativeNames = Prelude.pure newValue, ..}
+instance Property "Trust" ListenerTlsValidationContextProperty where
+  type PropertyType "Trust" ListenerTlsValidationContextProperty = ListenerTlsValidationContextTrustProperty
+  set newValue ListenerTlsValidationContextProperty {..}
+    = ListenerTlsValidationContextProperty {trust = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsValidationContextProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsValidationContextProperty
+instance Prelude.Eq ListenerTlsValidationContextProperty
+instance Prelude.Show ListenerTlsValidationContextProperty
+instance JSON.ToJSON ListenerTlsValidationContextProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs
@@ -0,0 +1,50 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextTrustProperty (
+        module Exports, ListenerTlsValidationContextTrustProperty(..),
+        mkListenerTlsValidationContextTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextFileTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextSdsTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data ListenerTlsValidationContextTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html>
+    ListenerTlsValidationContextTrustProperty {haddock_workaround_ :: (),
+                                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-listenertlsvalidationcontexttrust-file>
+                                               file :: (Prelude.Maybe TlsValidationContextFileTrustProperty),
+                                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-listenertlsvalidationcontexttrust-sds>
+                                               sDS :: (Prelude.Maybe TlsValidationContextSdsTrustProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkListenerTlsValidationContextTrustProperty ::
+  ListenerTlsValidationContextTrustProperty
+mkListenerTlsValidationContextTrustProperty
+  = ListenerTlsValidationContextTrustProperty
+      {haddock_workaround_ = (), file = Prelude.Nothing,
+       sDS = Prelude.Nothing}
+instance ToResourceProperties ListenerTlsValidationContextTrustProperty where
+  toResourceProperties ListenerTlsValidationContextTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ListenerTlsValidationContextTrust",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON ListenerTlsValidationContextTrustProperty where
+  toJSON ListenerTlsValidationContextTrustProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "File" ListenerTlsValidationContextTrustProperty where
+  type PropertyType "File" ListenerTlsValidationContextTrustProperty = TlsValidationContextFileTrustProperty
+  set newValue ListenerTlsValidationContextTrustProperty {..}
+    = ListenerTlsValidationContextTrustProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" ListenerTlsValidationContextTrustProperty where
+  type PropertyType "SDS" ListenerTlsValidationContextTrustProperty = TlsValidationContextSdsTrustProperty
+  set newValue ListenerTlsValidationContextTrustProperty {..}
+    = ListenerTlsValidationContextTrustProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ListenerTlsValidationContextTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ListenerTlsValidationContextTrustProperty :: Prelude.Type
+instance ToResourceProperties ListenerTlsValidationContextTrustProperty
+instance Prelude.Eq ListenerTlsValidationContextTrustProperty
+instance Prelude.Show ListenerTlsValidationContextTrustProperty
+instance JSON.ToJSON ListenerTlsValidationContextTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs
@@ -0,0 +1,46 @@
+module Stratosphere.AppMesh.VirtualNode.LoggingFormatProperty (
+        module Exports, LoggingFormatProperty(..), mkLoggingFormatProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.JsonFormatRefProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data LoggingFormatProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html>
+    LoggingFormatProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html#cfn-appmesh-virtualnode-loggingformat-json>
+                           json :: (Prelude.Maybe [JsonFormatRefProperty]),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html#cfn-appmesh-virtualnode-loggingformat-text>
+                           text :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLoggingFormatProperty :: LoggingFormatProperty
+mkLoggingFormatProperty
+  = LoggingFormatProperty
+      {haddock_workaround_ = (), json = Prelude.Nothing,
+       text = Prelude.Nothing}
+instance ToResourceProperties LoggingFormatProperty where
+  toResourceProperties LoggingFormatProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.LoggingFormat",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Json" Prelude.<$> json,
+                            (JSON..=) "Text" Prelude.<$> text])}
+instance JSON.ToJSON LoggingFormatProperty where
+  toJSON LoggingFormatProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Json" Prelude.<$> json,
+               (JSON..=) "Text" Prelude.<$> text]))
+instance Property "Json" LoggingFormatProperty where
+  type PropertyType "Json" LoggingFormatProperty = [JsonFormatRefProperty]
+  set newValue LoggingFormatProperty {..}
+    = LoggingFormatProperty {json = Prelude.pure newValue, ..}
+instance Property "Text" LoggingFormatProperty where
+  type PropertyType "Text" LoggingFormatProperty = Value Prelude.Text
+  set newValue LoggingFormatProperty {..}
+    = LoggingFormatProperty {text = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/LoggingFormatProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.LoggingFormatProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LoggingFormatProperty :: Prelude.Type
+instance ToResourceProperties LoggingFormatProperty
+instance Prelude.Eq LoggingFormatProperty
+instance Prelude.Show LoggingFormatProperty
+instance JSON.ToJSON LoggingFormatProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.LoggingProperty (
+        module Exports, LoggingProperty(..), mkLoggingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.AccessLogProperty as Exports
+import Stratosphere.ResourceProperties
+data LoggingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-logging.html>
+    LoggingProperty {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-logging.html#cfn-appmesh-virtualnode-logging-accesslog>
+                     accessLog :: (Prelude.Maybe AccessLogProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLoggingProperty :: LoggingProperty
+mkLoggingProperty
+  = LoggingProperty
+      {haddock_workaround_ = (), accessLog = Prelude.Nothing}
+instance ToResourceProperties LoggingProperty where
+  toResourceProperties LoggingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.Logging",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "AccessLog" Prelude.<$> accessLog])}
+instance JSON.ToJSON LoggingProperty where
+  toJSON LoggingProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "AccessLog" Prelude.<$> accessLog]))
+instance Property "AccessLog" LoggingProperty where
+  type PropertyType "AccessLog" LoggingProperty = AccessLogProperty
+  set newValue LoggingProperty {..}
+    = LoggingProperty {accessLog = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/LoggingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.LoggingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LoggingProperty :: Prelude.Type
+instance ToResourceProperties LoggingProperty
+instance Prelude.Eq LoggingProperty
+instance Prelude.Show LoggingProperty
+instance JSON.ToJSON LoggingProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs
@@ -0,0 +1,69 @@
+module Stratosphere.AppMesh.VirtualNode.OutlierDetectionProperty (
+        module Exports, OutlierDetectionProperty(..),
+        mkOutlierDetectionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data OutlierDetectionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html>
+    OutlierDetectionProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-baseejectionduration>
+                              baseEjectionDuration :: DurationProperty,
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-interval>
+                              interval :: DurationProperty,
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-maxejectionpercent>
+                              maxEjectionPercent :: (Value Prelude.Integer),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-maxservererrors>
+                              maxServerErrors :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkOutlierDetectionProperty ::
+  DurationProperty
+  -> DurationProperty
+     -> Value Prelude.Integer
+        -> Value Prelude.Integer -> OutlierDetectionProperty
+mkOutlierDetectionProperty
+  baseEjectionDuration
+  interval
+  maxEjectionPercent
+  maxServerErrors
+  = OutlierDetectionProperty
+      {haddock_workaround_ = (),
+       baseEjectionDuration = baseEjectionDuration, interval = interval,
+       maxEjectionPercent = maxEjectionPercent,
+       maxServerErrors = maxServerErrors}
+instance ToResourceProperties OutlierDetectionProperty where
+  toResourceProperties OutlierDetectionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.OutlierDetection",
+         supportsTags = Prelude.False,
+         properties = ["BaseEjectionDuration" JSON..= baseEjectionDuration,
+                       "Interval" JSON..= interval,
+                       "MaxEjectionPercent" JSON..= maxEjectionPercent,
+                       "MaxServerErrors" JSON..= maxServerErrors]}
+instance JSON.ToJSON OutlierDetectionProperty where
+  toJSON OutlierDetectionProperty {..}
+    = JSON.object
+        ["BaseEjectionDuration" JSON..= baseEjectionDuration,
+         "Interval" JSON..= interval,
+         "MaxEjectionPercent" JSON..= maxEjectionPercent,
+         "MaxServerErrors" JSON..= maxServerErrors]
+instance Property "BaseEjectionDuration" OutlierDetectionProperty where
+  type PropertyType "BaseEjectionDuration" OutlierDetectionProperty = DurationProperty
+  set newValue OutlierDetectionProperty {..}
+    = OutlierDetectionProperty {baseEjectionDuration = newValue, ..}
+instance Property "Interval" OutlierDetectionProperty where
+  type PropertyType "Interval" OutlierDetectionProperty = DurationProperty
+  set newValue OutlierDetectionProperty {..}
+    = OutlierDetectionProperty {interval = newValue, ..}
+instance Property "MaxEjectionPercent" OutlierDetectionProperty where
+  type PropertyType "MaxEjectionPercent" OutlierDetectionProperty = Value Prelude.Integer
+  set newValue OutlierDetectionProperty {..}
+    = OutlierDetectionProperty {maxEjectionPercent = newValue, ..}
+instance Property "MaxServerErrors" OutlierDetectionProperty where
+  type PropertyType "MaxServerErrors" OutlierDetectionProperty = Value Prelude.Integer
+  set newValue OutlierDetectionProperty {..}
+    = OutlierDetectionProperty {maxServerErrors = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/OutlierDetectionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.OutlierDetectionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data OutlierDetectionProperty :: Prelude.Type
+instance ToResourceProperties OutlierDetectionProperty
+instance Prelude.Eq OutlierDetectionProperty
+instance Prelude.Show OutlierDetectionProperty
+instance JSON.ToJSON OutlierDetectionProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualNode.PortMappingProperty (
+        PortMappingProperty(..), mkPortMappingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data PortMappingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html>
+    PortMappingProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html#cfn-appmesh-virtualnode-portmapping-port>
+                         port :: (Value Prelude.Integer),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html#cfn-appmesh-virtualnode-portmapping-protocol>
+                         protocol :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkPortMappingProperty ::
+  Value Prelude.Integer -> Value Prelude.Text -> PortMappingProperty
+mkPortMappingProperty port protocol
+  = PortMappingProperty
+      {haddock_workaround_ = (), port = port, protocol = protocol}
+instance ToResourceProperties PortMappingProperty where
+  toResourceProperties PortMappingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.PortMapping",
+         supportsTags = Prelude.False,
+         properties = ["Port" JSON..= port, "Protocol" JSON..= protocol]}
+instance JSON.ToJSON PortMappingProperty where
+  toJSON PortMappingProperty {..}
+    = JSON.object ["Port" JSON..= port, "Protocol" JSON..= protocol]
+instance Property "Port" PortMappingProperty where
+  type PropertyType "Port" PortMappingProperty = Value Prelude.Integer
+  set newValue PortMappingProperty {..}
+    = PortMappingProperty {port = newValue, ..}
+instance Property "Protocol" PortMappingProperty where
+  type PropertyType "Protocol" PortMappingProperty = Value Prelude.Text
+  set newValue PortMappingProperty {..}
+    = PortMappingProperty {protocol = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/PortMappingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.PortMappingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data PortMappingProperty :: Prelude.Type
+instance ToResourceProperties PortMappingProperty
+instance Prelude.Eq PortMappingProperty
+instance Prelude.Show PortMappingProperty
+instance JSON.ToJSON PortMappingProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs
@@ -0,0 +1,48 @@
+module Stratosphere.AppMesh.VirtualNode.ServiceDiscoveryProperty (
+        module Exports, ServiceDiscoveryProperty(..),
+        mkServiceDiscoveryProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.AwsCloudMapServiceDiscoveryProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.DnsServiceDiscoveryProperty as Exports
+import Stratosphere.ResourceProperties
+data ServiceDiscoveryProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html>
+    ServiceDiscoveryProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html#cfn-appmesh-virtualnode-servicediscovery-awscloudmap>
+                              aWSCloudMap :: (Prelude.Maybe AwsCloudMapServiceDiscoveryProperty),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html#cfn-appmesh-virtualnode-servicediscovery-dns>
+                              dNS :: (Prelude.Maybe DnsServiceDiscoveryProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkServiceDiscoveryProperty :: ServiceDiscoveryProperty
+mkServiceDiscoveryProperty
+  = ServiceDiscoveryProperty
+      {haddock_workaround_ = (), aWSCloudMap = Prelude.Nothing,
+       dNS = Prelude.Nothing}
+instance ToResourceProperties ServiceDiscoveryProperty where
+  toResourceProperties ServiceDiscoveryProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.ServiceDiscovery",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AWSCloudMap" Prelude.<$> aWSCloudMap,
+                            (JSON..=) "DNS" Prelude.<$> dNS])}
+instance JSON.ToJSON ServiceDiscoveryProperty where
+  toJSON ServiceDiscoveryProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AWSCloudMap" Prelude.<$> aWSCloudMap,
+               (JSON..=) "DNS" Prelude.<$> dNS]))
+instance Property "AWSCloudMap" ServiceDiscoveryProperty where
+  type PropertyType "AWSCloudMap" ServiceDiscoveryProperty = AwsCloudMapServiceDiscoveryProperty
+  set newValue ServiceDiscoveryProperty {..}
+    = ServiceDiscoveryProperty
+        {aWSCloudMap = Prelude.pure newValue, ..}
+instance Property "DNS" ServiceDiscoveryProperty where
+  type PropertyType "DNS" ServiceDiscoveryProperty = DnsServiceDiscoveryProperty
+  set newValue ServiceDiscoveryProperty {..}
+    = ServiceDiscoveryProperty {dNS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/ServiceDiscoveryProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.ServiceDiscoveryProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ServiceDiscoveryProperty :: Prelude.Type
+instance ToResourceProperties ServiceDiscoveryProperty
+instance Prelude.Eq ServiceDiscoveryProperty
+instance Prelude.Show ServiceDiscoveryProperty
+instance JSON.ToJSON ServiceDiscoveryProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNameMatchersProperty (
+        SubjectAlternativeNameMatchersProperty(..),
+        mkSubjectAlternativeNameMatchersProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data SubjectAlternativeNameMatchersProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenamematchers.html>
+    SubjectAlternativeNameMatchersProperty {haddock_workaround_ :: (),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenamematchers.html#cfn-appmesh-virtualnode-subjectalternativenamematchers-exact>
+                                            exact :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSubjectAlternativeNameMatchersProperty ::
+  SubjectAlternativeNameMatchersProperty
+mkSubjectAlternativeNameMatchersProperty
+  = SubjectAlternativeNameMatchersProperty
+      {haddock_workaround_ = (), exact = Prelude.Nothing}
+instance ToResourceProperties SubjectAlternativeNameMatchersProperty where
+  toResourceProperties SubjectAlternativeNameMatchersProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.SubjectAlternativeNameMatchers",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact])}
+instance JSON.ToJSON SubjectAlternativeNameMatchersProperty where
+  toJSON SubjectAlternativeNameMatchersProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Exact" Prelude.<$> exact]))
+instance Property "Exact" SubjectAlternativeNameMatchersProperty where
+  type PropertyType "Exact" SubjectAlternativeNameMatchersProperty = ValueList Prelude.Text
+  set newValue SubjectAlternativeNameMatchersProperty {..}
+    = SubjectAlternativeNameMatchersProperty
+        {exact = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNameMatchersProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNameMatchersProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNameMatchersProperty :: Prelude.Type
+instance ToResourceProperties SubjectAlternativeNameMatchersProperty
+instance Prelude.Eq SubjectAlternativeNameMatchersProperty
+instance Prelude.Show SubjectAlternativeNameMatchersProperty
+instance JSON.ToJSON SubjectAlternativeNameMatchersProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNamesProperty (
+        module Exports, SubjectAlternativeNamesProperty(..),
+        mkSubjectAlternativeNamesProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNameMatchersProperty as Exports
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNamesProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenames.html>
+    SubjectAlternativeNamesProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenames.html#cfn-appmesh-virtualnode-subjectalternativenames-match>
+                                     match :: SubjectAlternativeNameMatchersProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSubjectAlternativeNamesProperty ::
+  SubjectAlternativeNameMatchersProperty
+  -> SubjectAlternativeNamesProperty
+mkSubjectAlternativeNamesProperty match
+  = SubjectAlternativeNamesProperty
+      {haddock_workaround_ = (), match = match}
+instance ToResourceProperties SubjectAlternativeNamesProperty where
+  toResourceProperties SubjectAlternativeNamesProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.SubjectAlternativeNames",
+         supportsTags = Prelude.False, properties = ["Match" JSON..= match]}
+instance JSON.ToJSON SubjectAlternativeNamesProperty where
+  toJSON SubjectAlternativeNamesProperty {..}
+    = JSON.object ["Match" JSON..= match]
+instance Property "Match" SubjectAlternativeNamesProperty where
+  type PropertyType "Match" SubjectAlternativeNamesProperty = SubjectAlternativeNameMatchersProperty
+  set newValue SubjectAlternativeNamesProperty {..}
+    = SubjectAlternativeNamesProperty {match = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/SubjectAlternativeNamesProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNamesProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SubjectAlternativeNamesProperty :: Prelude.Type
+instance ToResourceProperties SubjectAlternativeNamesProperty
+instance Prelude.Eq SubjectAlternativeNamesProperty
+instance Prelude.Show SubjectAlternativeNamesProperty
+instance JSON.ToJSON SubjectAlternativeNamesProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.TcpTimeoutProperty (
+        module Exports, TcpTimeoutProperty(..), mkTcpTimeoutProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.DurationProperty as Exports
+import Stratosphere.ResourceProperties
+data TcpTimeoutProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tcptimeout.html>
+    TcpTimeoutProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tcptimeout.html#cfn-appmesh-virtualnode-tcptimeout-idle>
+                        idle :: (Prelude.Maybe DurationProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTcpTimeoutProperty :: TcpTimeoutProperty
+mkTcpTimeoutProperty
+  = TcpTimeoutProperty
+      {haddock_workaround_ = (), idle = Prelude.Nothing}
+instance ToResourceProperties TcpTimeoutProperty where
+  toResourceProperties TcpTimeoutProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TcpTimeout",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Idle" Prelude.<$> idle])}
+instance JSON.ToJSON TcpTimeoutProperty where
+  toJSON TcpTimeoutProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Idle" Prelude.<$> idle]))
+instance Property "Idle" TcpTimeoutProperty where
+  type PropertyType "Idle" TcpTimeoutProperty = DurationProperty
+  set newValue TcpTimeoutProperty {..}
+    = TcpTimeoutProperty {idle = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TcpTimeoutProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TcpTimeoutProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TcpTimeoutProperty :: Prelude.Type
+instance ToResourceProperties TcpTimeoutProperty
+instance Prelude.Eq TcpTimeoutProperty
+instance Prelude.Show TcpTimeoutProperty
+instance JSON.ToJSON TcpTimeoutProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextAcmTrustProperty (
+        TlsValidationContextAcmTrustProperty(..),
+        mkTlsValidationContextAcmTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data TlsValidationContextAcmTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextacmtrust.html>
+    TlsValidationContextAcmTrustProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextacmtrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextacmtrust-certificateauthorityarns>
+                                          certificateAuthorityArns :: (ValueList Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTlsValidationContextAcmTrustProperty ::
+  ValueList Prelude.Text -> TlsValidationContextAcmTrustProperty
+mkTlsValidationContextAcmTrustProperty certificateAuthorityArns
+  = TlsValidationContextAcmTrustProperty
+      {haddock_workaround_ = (),
+       certificateAuthorityArns = certificateAuthorityArns}
+instance ToResourceProperties TlsValidationContextAcmTrustProperty where
+  toResourceProperties TlsValidationContextAcmTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TlsValidationContextAcmTrust",
+         supportsTags = Prelude.False,
+         properties = ["CertificateAuthorityArns"
+                         JSON..= certificateAuthorityArns]}
+instance JSON.ToJSON TlsValidationContextAcmTrustProperty where
+  toJSON TlsValidationContextAcmTrustProperty {..}
+    = JSON.object
+        ["CertificateAuthorityArns" JSON..= certificateAuthorityArns]
+instance Property "CertificateAuthorityArns" TlsValidationContextAcmTrustProperty where
+  type PropertyType "CertificateAuthorityArns" TlsValidationContextAcmTrustProperty = ValueList Prelude.Text
+  set newValue TlsValidationContextAcmTrustProperty {..}
+    = TlsValidationContextAcmTrustProperty
+        {certificateAuthorityArns = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextAcmTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextAcmTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TlsValidationContextAcmTrustProperty :: Prelude.Type
+instance ToResourceProperties TlsValidationContextAcmTrustProperty
+instance Prelude.Eq TlsValidationContextAcmTrustProperty
+instance Prelude.Show TlsValidationContextAcmTrustProperty
+instance JSON.ToJSON TlsValidationContextAcmTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextFileTrustProperty (
+        TlsValidationContextFileTrustProperty(..),
+        mkTlsValidationContextFileTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data TlsValidationContextFileTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextfiletrust.html>
+    TlsValidationContextFileTrustProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextfiletrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextfiletrust-certificatechain>
+                                           certificateChain :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTlsValidationContextFileTrustProperty ::
+  Value Prelude.Text -> TlsValidationContextFileTrustProperty
+mkTlsValidationContextFileTrustProperty certificateChain
+  = TlsValidationContextFileTrustProperty
+      {haddock_workaround_ = (), certificateChain = certificateChain}
+instance ToResourceProperties TlsValidationContextFileTrustProperty where
+  toResourceProperties TlsValidationContextFileTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TlsValidationContextFileTrust",
+         supportsTags = Prelude.False,
+         properties = ["CertificateChain" JSON..= certificateChain]}
+instance JSON.ToJSON TlsValidationContextFileTrustProperty where
+  toJSON TlsValidationContextFileTrustProperty {..}
+    = JSON.object ["CertificateChain" JSON..= certificateChain]
+instance Property "CertificateChain" TlsValidationContextFileTrustProperty where
+  type PropertyType "CertificateChain" TlsValidationContextFileTrustProperty = Value Prelude.Text
+  set newValue TlsValidationContextFileTrustProperty {..}
+    = TlsValidationContextFileTrustProperty
+        {certificateChain = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextFileTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextFileTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TlsValidationContextFileTrustProperty :: Prelude.Type
+instance ToResourceProperties TlsValidationContextFileTrustProperty
+instance Prelude.Eq TlsValidationContextFileTrustProperty
+instance Prelude.Show TlsValidationContextFileTrustProperty
+instance JSON.ToJSON TlsValidationContextFileTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs
@@ -0,0 +1,53 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextProperty (
+        module Exports, TlsValidationContextProperty(..),
+        mkTlsValidationContextProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNamesProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data TlsValidationContextProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html>
+    TlsValidationContextProperty {haddock_workaround_ :: (),
+                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html#cfn-appmesh-virtualnode-tlsvalidationcontext-subjectalternativenames>
+                                  subjectAlternativeNames :: (Prelude.Maybe SubjectAlternativeNamesProperty),
+                                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html#cfn-appmesh-virtualnode-tlsvalidationcontext-trust>
+                                  trust :: TlsValidationContextTrustProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTlsValidationContextProperty ::
+  TlsValidationContextTrustProperty -> TlsValidationContextProperty
+mkTlsValidationContextProperty trust
+  = TlsValidationContextProperty
+      {haddock_workaround_ = (), trust = trust,
+       subjectAlternativeNames = Prelude.Nothing}
+instance ToResourceProperties TlsValidationContextProperty where
+  toResourceProperties TlsValidationContextProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TlsValidationContext",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Trust" JSON..= trust]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SubjectAlternativeNames"
+                                 Prelude.<$> subjectAlternativeNames]))}
+instance JSON.ToJSON TlsValidationContextProperty where
+  toJSON TlsValidationContextProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Trust" JSON..= trust]
+              (Prelude.catMaybes
+                 [(JSON..=) "SubjectAlternativeNames"
+                    Prelude.<$> subjectAlternativeNames])))
+instance Property "SubjectAlternativeNames" TlsValidationContextProperty where
+  type PropertyType "SubjectAlternativeNames" TlsValidationContextProperty = SubjectAlternativeNamesProperty
+  set newValue TlsValidationContextProperty {..}
+    = TlsValidationContextProperty
+        {subjectAlternativeNames = Prelude.pure newValue, ..}
+instance Property "Trust" TlsValidationContextProperty where
+  type PropertyType "Trust" TlsValidationContextProperty = TlsValidationContextTrustProperty
+  set newValue TlsValidationContextProperty {..}
+    = TlsValidationContextProperty {trust = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TlsValidationContextProperty :: Prelude.Type
+instance ToResourceProperties TlsValidationContextProperty
+instance Prelude.Eq TlsValidationContextProperty
+instance Prelude.Show TlsValidationContextProperty
+instance JSON.ToJSON TlsValidationContextProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextSdsTrustProperty (
+        TlsValidationContextSdsTrustProperty(..),
+        mkTlsValidationContextSdsTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data TlsValidationContextSdsTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextsdstrust.html>
+    TlsValidationContextSdsTrustProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextsdstrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextsdstrust-secretname>
+                                          secretName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTlsValidationContextSdsTrustProperty ::
+  Value Prelude.Text -> TlsValidationContextSdsTrustProperty
+mkTlsValidationContextSdsTrustProperty secretName
+  = TlsValidationContextSdsTrustProperty
+      {haddock_workaround_ = (), secretName = secretName}
+instance ToResourceProperties TlsValidationContextSdsTrustProperty where
+  toResourceProperties TlsValidationContextSdsTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TlsValidationContextSdsTrust",
+         supportsTags = Prelude.False,
+         properties = ["SecretName" JSON..= secretName]}
+instance JSON.ToJSON TlsValidationContextSdsTrustProperty where
+  toJSON TlsValidationContextSdsTrustProperty {..}
+    = JSON.object ["SecretName" JSON..= secretName]
+instance Property "SecretName" TlsValidationContextSdsTrustProperty where
+  type PropertyType "SecretName" TlsValidationContextSdsTrustProperty = Value Prelude.Text
+  set newValue TlsValidationContextSdsTrustProperty {..}
+    = TlsValidationContextSdsTrustProperty {secretName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextSdsTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextSdsTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TlsValidationContextSdsTrustProperty :: Prelude.Type
+instance ToResourceProperties TlsValidationContextSdsTrustProperty
+instance Prelude.Eq TlsValidationContextSdsTrustProperty
+instance Prelude.Show TlsValidationContextSdsTrustProperty
+instance JSON.ToJSON TlsValidationContextSdsTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextTrustProperty (
+        module Exports, TlsValidationContextTrustProperty(..),
+        mkTlsValidationContextTrustProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextAcmTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextFileTrustProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.TlsValidationContextSdsTrustProperty as Exports
+import Stratosphere.ResourceProperties
+data TlsValidationContextTrustProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html>
+    TlsValidationContextTrustProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-acm>
+                                       aCM :: (Prelude.Maybe TlsValidationContextAcmTrustProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-file>
+                                       file :: (Prelude.Maybe TlsValidationContextFileTrustProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-sds>
+                                       sDS :: (Prelude.Maybe TlsValidationContextSdsTrustProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTlsValidationContextTrustProperty ::
+  TlsValidationContextTrustProperty
+mkTlsValidationContextTrustProperty
+  = TlsValidationContextTrustProperty
+      {haddock_workaround_ = (), aCM = Prelude.Nothing,
+       file = Prelude.Nothing, sDS = Prelude.Nothing}
+instance ToResourceProperties TlsValidationContextTrustProperty where
+  toResourceProperties TlsValidationContextTrustProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.TlsValidationContextTrust",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ACM" Prelude.<$> aCM,
+                            (JSON..=) "File" Prelude.<$> file,
+                            (JSON..=) "SDS" Prelude.<$> sDS])}
+instance JSON.ToJSON TlsValidationContextTrustProperty where
+  toJSON TlsValidationContextTrustProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ACM" Prelude.<$> aCM,
+               (JSON..=) "File" Prelude.<$> file,
+               (JSON..=) "SDS" Prelude.<$> sDS]))
+instance Property "ACM" TlsValidationContextTrustProperty where
+  type PropertyType "ACM" TlsValidationContextTrustProperty = TlsValidationContextAcmTrustProperty
+  set newValue TlsValidationContextTrustProperty {..}
+    = TlsValidationContextTrustProperty
+        {aCM = Prelude.pure newValue, ..}
+instance Property "File" TlsValidationContextTrustProperty where
+  type PropertyType "File" TlsValidationContextTrustProperty = TlsValidationContextFileTrustProperty
+  set newValue TlsValidationContextTrustProperty {..}
+    = TlsValidationContextTrustProperty
+        {file = Prelude.pure newValue, ..}
+instance Property "SDS" TlsValidationContextTrustProperty where
+  type PropertyType "SDS" TlsValidationContextTrustProperty = TlsValidationContextSdsTrustProperty
+  set newValue TlsValidationContextTrustProperty {..}
+    = TlsValidationContextTrustProperty
+        {sDS = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/TlsValidationContextTrustProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.TlsValidationContextTrustProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data TlsValidationContextTrustProperty :: Prelude.Type
+instance ToResourceProperties TlsValidationContextTrustProperty
+instance Prelude.Eq TlsValidationContextTrustProperty
+instance Prelude.Show TlsValidationContextTrustProperty
+instance JSON.ToJSON TlsValidationContextTrustProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs
@@ -0,0 +1,71 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeConnectionPoolProperty (
+        module Exports, VirtualNodeConnectionPoolProperty(..),
+        mkVirtualNodeConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeGrpcConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeHttp2ConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeHttpConnectionPoolProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.VirtualNodeTcpConnectionPoolProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualNodeConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html>
+    VirtualNodeConnectionPoolProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-grpc>
+                                       gRPC :: (Prelude.Maybe VirtualNodeGrpcConnectionPoolProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-http>
+                                       hTTP :: (Prelude.Maybe VirtualNodeHttpConnectionPoolProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-http2>
+                                       hTTP2 :: (Prelude.Maybe VirtualNodeHttp2ConnectionPoolProperty),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-tcp>
+                                       tCP :: (Prelude.Maybe VirtualNodeTcpConnectionPoolProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeConnectionPoolProperty ::
+  VirtualNodeConnectionPoolProperty
+mkVirtualNodeConnectionPoolProperty
+  = VirtualNodeConnectionPoolProperty
+      {haddock_workaround_ = (), gRPC = Prelude.Nothing,
+       hTTP = Prelude.Nothing, hTTP2 = Prelude.Nothing,
+       tCP = Prelude.Nothing}
+instance ToResourceProperties VirtualNodeConnectionPoolProperty where
+  toResourceProperties VirtualNodeConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeConnectionPool",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "GRPC" Prelude.<$> gRPC,
+                            (JSON..=) "HTTP" Prelude.<$> hTTP,
+                            (JSON..=) "HTTP2" Prelude.<$> hTTP2,
+                            (JSON..=) "TCP" Prelude.<$> tCP])}
+instance JSON.ToJSON VirtualNodeConnectionPoolProperty where
+  toJSON VirtualNodeConnectionPoolProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "GRPC" Prelude.<$> gRPC,
+               (JSON..=) "HTTP" Prelude.<$> hTTP,
+               (JSON..=) "HTTP2" Prelude.<$> hTTP2,
+               (JSON..=) "TCP" Prelude.<$> tCP]))
+instance Property "GRPC" VirtualNodeConnectionPoolProperty where
+  type PropertyType "GRPC" VirtualNodeConnectionPoolProperty = VirtualNodeGrpcConnectionPoolProperty
+  set newValue VirtualNodeConnectionPoolProperty {..}
+    = VirtualNodeConnectionPoolProperty
+        {gRPC = Prelude.pure newValue, ..}
+instance Property "HTTP" VirtualNodeConnectionPoolProperty where
+  type PropertyType "HTTP" VirtualNodeConnectionPoolProperty = VirtualNodeHttpConnectionPoolProperty
+  set newValue VirtualNodeConnectionPoolProperty {..}
+    = VirtualNodeConnectionPoolProperty
+        {hTTP = Prelude.pure newValue, ..}
+instance Property "HTTP2" VirtualNodeConnectionPoolProperty where
+  type PropertyType "HTTP2" VirtualNodeConnectionPoolProperty = VirtualNodeHttp2ConnectionPoolProperty
+  set newValue VirtualNodeConnectionPoolProperty {..}
+    = VirtualNodeConnectionPoolProperty
+        {hTTP2 = Prelude.pure newValue, ..}
+instance Property "TCP" VirtualNodeConnectionPoolProperty where
+  type PropertyType "TCP" VirtualNodeConnectionPoolProperty = VirtualNodeTcpConnectionPoolProperty
+  set newValue VirtualNodeConnectionPoolProperty {..}
+    = VirtualNodeConnectionPoolProperty
+        {tCP = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeConnectionPoolProperty
+instance Prelude.Eq VirtualNodeConnectionPoolProperty
+instance Prelude.Show VirtualNodeConnectionPoolProperty
+instance JSON.ToJSON VirtualNodeConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeGrpcConnectionPoolProperty (
+        VirtualNodeGrpcConnectionPoolProperty(..),
+        mkVirtualNodeGrpcConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualNodeGrpcConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodegrpcconnectionpool.html>
+    VirtualNodeGrpcConnectionPoolProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodegrpcconnectionpool.html#cfn-appmesh-virtualnode-virtualnodegrpcconnectionpool-maxrequests>
+                                           maxRequests :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeGrpcConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualNodeGrpcConnectionPoolProperty
+mkVirtualNodeGrpcConnectionPoolProperty maxRequests
+  = VirtualNodeGrpcConnectionPoolProperty
+      {haddock_workaround_ = (), maxRequests = maxRequests}
+instance ToResourceProperties VirtualNodeGrpcConnectionPoolProperty where
+  toResourceProperties VirtualNodeGrpcConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeGrpcConnectionPool",
+         supportsTags = Prelude.False,
+         properties = ["MaxRequests" JSON..= maxRequests]}
+instance JSON.ToJSON VirtualNodeGrpcConnectionPoolProperty where
+  toJSON VirtualNodeGrpcConnectionPoolProperty {..}
+    = JSON.object ["MaxRequests" JSON..= maxRequests]
+instance Property "MaxRequests" VirtualNodeGrpcConnectionPoolProperty where
+  type PropertyType "MaxRequests" VirtualNodeGrpcConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualNodeGrpcConnectionPoolProperty {..}
+    = VirtualNodeGrpcConnectionPoolProperty
+        {maxRequests = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeGrpcConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeGrpcConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeGrpcConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeGrpcConnectionPoolProperty
+instance Prelude.Eq VirtualNodeGrpcConnectionPoolProperty
+instance Prelude.Show VirtualNodeGrpcConnectionPoolProperty
+instance JSON.ToJSON VirtualNodeGrpcConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeHttp2ConnectionPoolProperty (
+        VirtualNodeHttp2ConnectionPoolProperty(..),
+        mkVirtualNodeHttp2ConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualNodeHttp2ConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttp2connectionpool.html>
+    VirtualNodeHttp2ConnectionPoolProperty {haddock_workaround_ :: (),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttp2connectionpool.html#cfn-appmesh-virtualnode-virtualnodehttp2connectionpool-maxrequests>
+                                            maxRequests :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeHttp2ConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualNodeHttp2ConnectionPoolProperty
+mkVirtualNodeHttp2ConnectionPoolProperty maxRequests
+  = VirtualNodeHttp2ConnectionPoolProperty
+      {haddock_workaround_ = (), maxRequests = maxRequests}
+instance ToResourceProperties VirtualNodeHttp2ConnectionPoolProperty where
+  toResourceProperties VirtualNodeHttp2ConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeHttp2ConnectionPool",
+         supportsTags = Prelude.False,
+         properties = ["MaxRequests" JSON..= maxRequests]}
+instance JSON.ToJSON VirtualNodeHttp2ConnectionPoolProperty where
+  toJSON VirtualNodeHttp2ConnectionPoolProperty {..}
+    = JSON.object ["MaxRequests" JSON..= maxRequests]
+instance Property "MaxRequests" VirtualNodeHttp2ConnectionPoolProperty where
+  type PropertyType "MaxRequests" VirtualNodeHttp2ConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualNodeHttp2ConnectionPoolProperty {..}
+    = VirtualNodeHttp2ConnectionPoolProperty
+        {maxRequests = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttp2ConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeHttp2ConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeHttp2ConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeHttp2ConnectionPoolProperty
+instance Prelude.Eq VirtualNodeHttp2ConnectionPoolProperty
+instance Prelude.Show VirtualNodeHttp2ConnectionPoolProperty
+instance JSON.ToJSON VirtualNodeHttp2ConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs
@@ -0,0 +1,51 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeHttpConnectionPoolProperty (
+        VirtualNodeHttpConnectionPoolProperty(..),
+        mkVirtualNodeHttpConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualNodeHttpConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html>
+    VirtualNodeHttpConnectionPoolProperty {haddock_workaround_ :: (),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodehttpconnectionpool-maxconnections>
+                                           maxConnections :: (Value Prelude.Integer),
+                                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodehttpconnectionpool-maxpendingrequests>
+                                           maxPendingRequests :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeHttpConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualNodeHttpConnectionPoolProperty
+mkVirtualNodeHttpConnectionPoolProperty maxConnections
+  = VirtualNodeHttpConnectionPoolProperty
+      {haddock_workaround_ = (), maxConnections = maxConnections,
+       maxPendingRequests = Prelude.Nothing}
+instance ToResourceProperties VirtualNodeHttpConnectionPoolProperty where
+  toResourceProperties VirtualNodeHttpConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeHttpConnectionPool",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MaxConnections" JSON..= maxConnections]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MaxPendingRequests" Prelude.<$> maxPendingRequests]))}
+instance JSON.ToJSON VirtualNodeHttpConnectionPoolProperty where
+  toJSON VirtualNodeHttpConnectionPoolProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MaxConnections" JSON..= maxConnections]
+              (Prelude.catMaybes
+                 [(JSON..=) "MaxPendingRequests" Prelude.<$> maxPendingRequests])))
+instance Property "MaxConnections" VirtualNodeHttpConnectionPoolProperty where
+  type PropertyType "MaxConnections" VirtualNodeHttpConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualNodeHttpConnectionPoolProperty {..}
+    = VirtualNodeHttpConnectionPoolProperty
+        {maxConnections = newValue, ..}
+instance Property "MaxPendingRequests" VirtualNodeHttpConnectionPoolProperty where
+  type PropertyType "MaxPendingRequests" VirtualNodeHttpConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualNodeHttpConnectionPoolProperty {..}
+    = VirtualNodeHttpConnectionPoolProperty
+        {maxPendingRequests = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeHttpConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeHttpConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeHttpConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeHttpConnectionPoolProperty
+instance Prelude.Eq VirtualNodeHttpConnectionPoolProperty
+instance Prelude.Show VirtualNodeHttpConnectionPoolProperty
+instance JSON.ToJSON VirtualNodeHttpConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs
@@ -0,0 +1,77 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeSpecProperty (
+        module Exports, VirtualNodeSpecProperty(..),
+        mkVirtualNodeSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.BackendProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.BackendDefaultsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ListenerProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.LoggingProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ServiceDiscoveryProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualNodeSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html>
+    VirtualNodeSpecProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-backenddefaults>
+                             backendDefaults :: (Prelude.Maybe BackendDefaultsProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-backends>
+                             backends :: (Prelude.Maybe [BackendProperty]),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-listeners>
+                             listeners :: (Prelude.Maybe [ListenerProperty]),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-logging>
+                             logging :: (Prelude.Maybe LoggingProperty),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-servicediscovery>
+                             serviceDiscovery :: (Prelude.Maybe ServiceDiscoveryProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeSpecProperty :: VirtualNodeSpecProperty
+mkVirtualNodeSpecProperty
+  = VirtualNodeSpecProperty
+      {haddock_workaround_ = (), backendDefaults = Prelude.Nothing,
+       backends = Prelude.Nothing, listeners = Prelude.Nothing,
+       logging = Prelude.Nothing, serviceDiscovery = Prelude.Nothing}
+instance ToResourceProperties VirtualNodeSpecProperty where
+  toResourceProperties VirtualNodeSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeSpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "BackendDefaults" Prelude.<$> backendDefaults,
+                            (JSON..=) "Backends" Prelude.<$> backends,
+                            (JSON..=) "Listeners" Prelude.<$> listeners,
+                            (JSON..=) "Logging" Prelude.<$> logging,
+                            (JSON..=) "ServiceDiscovery" Prelude.<$> serviceDiscovery])}
+instance JSON.ToJSON VirtualNodeSpecProperty where
+  toJSON VirtualNodeSpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "BackendDefaults" Prelude.<$> backendDefaults,
+               (JSON..=) "Backends" Prelude.<$> backends,
+               (JSON..=) "Listeners" Prelude.<$> listeners,
+               (JSON..=) "Logging" Prelude.<$> logging,
+               (JSON..=) "ServiceDiscovery" Prelude.<$> serviceDiscovery]))
+instance Property "BackendDefaults" VirtualNodeSpecProperty where
+  type PropertyType "BackendDefaults" VirtualNodeSpecProperty = BackendDefaultsProperty
+  set newValue VirtualNodeSpecProperty {..}
+    = VirtualNodeSpecProperty
+        {backendDefaults = Prelude.pure newValue, ..}
+instance Property "Backends" VirtualNodeSpecProperty where
+  type PropertyType "Backends" VirtualNodeSpecProperty = [BackendProperty]
+  set newValue VirtualNodeSpecProperty {..}
+    = VirtualNodeSpecProperty {backends = Prelude.pure newValue, ..}
+instance Property "Listeners" VirtualNodeSpecProperty where
+  type PropertyType "Listeners" VirtualNodeSpecProperty = [ListenerProperty]
+  set newValue VirtualNodeSpecProperty {..}
+    = VirtualNodeSpecProperty {listeners = Prelude.pure newValue, ..}
+instance Property "Logging" VirtualNodeSpecProperty where
+  type PropertyType "Logging" VirtualNodeSpecProperty = LoggingProperty
+  set newValue VirtualNodeSpecProperty {..}
+    = VirtualNodeSpecProperty {logging = Prelude.pure newValue, ..}
+instance Property "ServiceDiscovery" VirtualNodeSpecProperty where
+  type PropertyType "ServiceDiscovery" VirtualNodeSpecProperty = ServiceDiscoveryProperty
+  set newValue VirtualNodeSpecProperty {..}
+    = VirtualNodeSpecProperty
+        {serviceDiscovery = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeSpecProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeSpecProperty
+instance Prelude.Eq VirtualNodeSpecProperty
+instance Prelude.Show VirtualNodeSpecProperty
+instance JSON.ToJSON VirtualNodeSpecProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeTcpConnectionPoolProperty (
+        VirtualNodeTcpConnectionPoolProperty(..),
+        mkVirtualNodeTcpConnectionPoolProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualNodeTcpConnectionPoolProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodetcpconnectionpool.html>
+    VirtualNodeTcpConnectionPoolProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodetcpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodetcpconnectionpool-maxconnections>
+                                          maxConnections :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeTcpConnectionPoolProperty ::
+  Value Prelude.Integer -> VirtualNodeTcpConnectionPoolProperty
+mkVirtualNodeTcpConnectionPoolProperty maxConnections
+  = VirtualNodeTcpConnectionPoolProperty
+      {haddock_workaround_ = (), maxConnections = maxConnections}
+instance ToResourceProperties VirtualNodeTcpConnectionPoolProperty where
+  toResourceProperties VirtualNodeTcpConnectionPoolProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualNodeTcpConnectionPool",
+         supportsTags = Prelude.False,
+         properties = ["MaxConnections" JSON..= maxConnections]}
+instance JSON.ToJSON VirtualNodeTcpConnectionPoolProperty where
+  toJSON VirtualNodeTcpConnectionPoolProperty {..}
+    = JSON.object ["MaxConnections" JSON..= maxConnections]
+instance Property "MaxConnections" VirtualNodeTcpConnectionPoolProperty where
+  type PropertyType "MaxConnections" VirtualNodeTcpConnectionPoolProperty = Value Prelude.Integer
+  set newValue VirtualNodeTcpConnectionPoolProperty {..}
+    = VirtualNodeTcpConnectionPoolProperty
+        {maxConnections = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualNodeTcpConnectionPoolProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualNodeTcpConnectionPoolProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeTcpConnectionPoolProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeTcpConnectionPoolProperty
+instance Prelude.Eq VirtualNodeTcpConnectionPoolProperty
+instance Prelude.Show VirtualNodeTcpConnectionPoolProperty
+instance JSON.ToJSON VirtualNodeTcpConnectionPoolProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs b/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs
@@ -0,0 +1,51 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualServiceBackendProperty (
+        module Exports, VirtualServiceBackendProperty(..),
+        mkVirtualServiceBackendProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualNode.ClientPolicyProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualServiceBackendProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html>
+    VirtualServiceBackendProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html#cfn-appmesh-virtualnode-virtualservicebackend-clientpolicy>
+                                   clientPolicy :: (Prelude.Maybe ClientPolicyProperty),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html#cfn-appmesh-virtualnode-virtualservicebackend-virtualservicename>
+                                   virtualServiceName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualServiceBackendProperty ::
+  Value Prelude.Text -> VirtualServiceBackendProperty
+mkVirtualServiceBackendProperty virtualServiceName
+  = VirtualServiceBackendProperty
+      {haddock_workaround_ = (), virtualServiceName = virtualServiceName,
+       clientPolicy = Prelude.Nothing}
+instance ToResourceProperties VirtualServiceBackendProperty where
+  toResourceProperties VirtualServiceBackendProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualNode.VirtualServiceBackend",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["VirtualServiceName" JSON..= virtualServiceName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy]))}
+instance JSON.ToJSON VirtualServiceBackendProperty where
+  toJSON VirtualServiceBackendProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["VirtualServiceName" JSON..= virtualServiceName]
+              (Prelude.catMaybes
+                 [(JSON..=) "ClientPolicy" Prelude.<$> clientPolicy])))
+instance Property "ClientPolicy" VirtualServiceBackendProperty where
+  type PropertyType "ClientPolicy" VirtualServiceBackendProperty = ClientPolicyProperty
+  set newValue VirtualServiceBackendProperty {..}
+    = VirtualServiceBackendProperty
+        {clientPolicy = Prelude.pure newValue, ..}
+instance Property "VirtualServiceName" VirtualServiceBackendProperty where
+  type PropertyType "VirtualServiceName" VirtualServiceBackendProperty = Value Prelude.Text
+  set newValue VirtualServiceBackendProperty {..}
+    = VirtualServiceBackendProperty {virtualServiceName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualNode/VirtualServiceBackendProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualNode.VirtualServiceBackendProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualServiceBackendProperty :: Prelude.Type
+instance ToResourceProperties VirtualServiceBackendProperty
+instance Prelude.Eq VirtualServiceBackendProperty
+instance Prelude.Show VirtualServiceBackendProperty
+instance JSON.ToJSON VirtualServiceBackendProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter.hs b/gen/Stratosphere/AppMesh/VirtualRouter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter.hs
@@ -0,0 +1,73 @@
+module Stratosphere.AppMesh.VirtualRouter (
+        module Exports, VirtualRouter(..), mkVirtualRouter
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualRouter.VirtualRouterSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data VirtualRouter
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html>
+    VirtualRouter {haddock_workaround_ :: (),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-meshname>
+                   meshName :: (Value Prelude.Text),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-meshowner>
+                   meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-spec>
+                   spec :: VirtualRouterSpecProperty,
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-tags>
+                   tags :: (Prelude.Maybe [Tag]),
+                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-virtualroutername>
+                   virtualRouterName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualRouter ::
+  Value Prelude.Text -> VirtualRouterSpecProperty -> VirtualRouter
+mkVirtualRouter meshName spec
+  = VirtualRouter
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       meshOwner = Prelude.Nothing, tags = Prelude.Nothing,
+       virtualRouterName = Prelude.Nothing}
+instance ToResourceProperties VirtualRouter where
+  toResourceProperties VirtualRouter {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualRouter",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "VirtualRouterName" Prelude.<$> virtualRouterName]))}
+instance JSON.ToJSON VirtualRouter where
+  toJSON VirtualRouter {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec]
+              (Prelude.catMaybes
+                 [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "VirtualRouterName" Prelude.<$> virtualRouterName])))
+instance Property "MeshName" VirtualRouter where
+  type PropertyType "MeshName" VirtualRouter = Value Prelude.Text
+  set newValue VirtualRouter {..}
+    = VirtualRouter {meshName = newValue, ..}
+instance Property "MeshOwner" VirtualRouter where
+  type PropertyType "MeshOwner" VirtualRouter = Value Prelude.Text
+  set newValue VirtualRouter {..}
+    = VirtualRouter {meshOwner = Prelude.pure newValue, ..}
+instance Property "Spec" VirtualRouter where
+  type PropertyType "Spec" VirtualRouter = VirtualRouterSpecProperty
+  set newValue VirtualRouter {..}
+    = VirtualRouter {spec = newValue, ..}
+instance Property "Tags" VirtualRouter where
+  type PropertyType "Tags" VirtualRouter = [Tag]
+  set newValue VirtualRouter {..}
+    = VirtualRouter {tags = Prelude.pure newValue, ..}
+instance Property "VirtualRouterName" VirtualRouter where
+  type PropertyType "VirtualRouterName" VirtualRouter = Value Prelude.Text
+  set newValue VirtualRouter {..}
+    = VirtualRouter {virtualRouterName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs b/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppMesh.VirtualRouter.PortMappingProperty (
+        PortMappingProperty(..), mkPortMappingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data PortMappingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html>
+    PortMappingProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html#cfn-appmesh-virtualrouter-portmapping-port>
+                         port :: (Value Prelude.Integer),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html#cfn-appmesh-virtualrouter-portmapping-protocol>
+                         protocol :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkPortMappingProperty ::
+  Value Prelude.Integer -> Value Prelude.Text -> PortMappingProperty
+mkPortMappingProperty port protocol
+  = PortMappingProperty
+      {haddock_workaround_ = (), port = port, protocol = protocol}
+instance ToResourceProperties PortMappingProperty where
+  toResourceProperties PortMappingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualRouter.PortMapping",
+         supportsTags = Prelude.False,
+         properties = ["Port" JSON..= port, "Protocol" JSON..= protocol]}
+instance JSON.ToJSON PortMappingProperty where
+  toJSON PortMappingProperty {..}
+    = JSON.object ["Port" JSON..= port, "Protocol" JSON..= protocol]
+instance Property "Port" PortMappingProperty where
+  type PropertyType "Port" PortMappingProperty = Value Prelude.Integer
+  set newValue PortMappingProperty {..}
+    = PortMappingProperty {port = newValue, ..}
+instance Property "Protocol" PortMappingProperty where
+  type PropertyType "Protocol" PortMappingProperty = Value Prelude.Text
+  set newValue PortMappingProperty {..}
+    = PortMappingProperty {protocol = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/PortMappingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualRouter.PortMappingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data PortMappingProperty :: Prelude.Type
+instance ToResourceProperties PortMappingProperty
+instance Prelude.Eq PortMappingProperty
+instance Prelude.Show PortMappingProperty
+instance JSON.ToJSON PortMappingProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualRouter.VirtualRouterListenerProperty (
+        module Exports, VirtualRouterListenerProperty(..),
+        mkVirtualRouterListenerProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualRouter.PortMappingProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualRouterListenerProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterlistener.html>
+    VirtualRouterListenerProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterlistener.html#cfn-appmesh-virtualrouter-virtualrouterlistener-portmapping>
+                                   portMapping :: PortMappingProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualRouterListenerProperty ::
+  PortMappingProperty -> VirtualRouterListenerProperty
+mkVirtualRouterListenerProperty portMapping
+  = VirtualRouterListenerProperty
+      {haddock_workaround_ = (), portMapping = portMapping}
+instance ToResourceProperties VirtualRouterListenerProperty where
+  toResourceProperties VirtualRouterListenerProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualRouter.VirtualRouterListener",
+         supportsTags = Prelude.False,
+         properties = ["PortMapping" JSON..= portMapping]}
+instance JSON.ToJSON VirtualRouterListenerProperty where
+  toJSON VirtualRouterListenerProperty {..}
+    = JSON.object ["PortMapping" JSON..= portMapping]
+instance Property "PortMapping" VirtualRouterListenerProperty where
+  type PropertyType "PortMapping" VirtualRouterListenerProperty = PortMappingProperty
+  set newValue VirtualRouterListenerProperty {..}
+    = VirtualRouterListenerProperty {portMapping = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterListenerProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualRouter.VirtualRouterListenerProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualRouterListenerProperty :: Prelude.Type
+instance ToResourceProperties VirtualRouterListenerProperty
+instance Prelude.Eq VirtualRouterListenerProperty
+instance Prelude.Show VirtualRouterListenerProperty
+instance JSON.ToJSON VirtualRouterListenerProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.AppMesh.VirtualRouter.VirtualRouterSpecProperty (
+        module Exports, VirtualRouterSpecProperty(..),
+        mkVirtualRouterSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualRouter.VirtualRouterListenerProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualRouterSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterspec.html>
+    VirtualRouterSpecProperty {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterspec.html#cfn-appmesh-virtualrouter-virtualrouterspec-listeners>
+                               listeners :: [VirtualRouterListenerProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualRouterSpecProperty ::
+  [VirtualRouterListenerProperty] -> VirtualRouterSpecProperty
+mkVirtualRouterSpecProperty listeners
+  = VirtualRouterSpecProperty
+      {haddock_workaround_ = (), listeners = listeners}
+instance ToResourceProperties VirtualRouterSpecProperty where
+  toResourceProperties VirtualRouterSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualRouter.VirtualRouterSpec",
+         supportsTags = Prelude.False,
+         properties = ["Listeners" JSON..= listeners]}
+instance JSON.ToJSON VirtualRouterSpecProperty where
+  toJSON VirtualRouterSpecProperty {..}
+    = JSON.object ["Listeners" JSON..= listeners]
+instance Property "Listeners" VirtualRouterSpecProperty where
+  type PropertyType "Listeners" VirtualRouterSpecProperty = [VirtualRouterListenerProperty]
+  set newValue VirtualRouterSpecProperty {..}
+    = VirtualRouterSpecProperty {listeners = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualRouter/VirtualRouterSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualRouter.VirtualRouterSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualRouterSpecProperty :: Prelude.Type
+instance ToResourceProperties VirtualRouterSpecProperty
+instance Prelude.Eq VirtualRouterSpecProperty
+instance Prelude.Show VirtualRouterSpecProperty
+instance JSON.ToJSON VirtualRouterSpecProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualService.hs b/gen/Stratosphere/AppMesh/VirtualService.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService.hs
@@ -0,0 +1,75 @@
+module Stratosphere.AppMesh.VirtualService (
+        module Exports, VirtualService(..), mkVirtualService
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualService.VirtualServiceSpecProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data VirtualService
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html>
+    VirtualService {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-meshname>
+                    meshName :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-meshowner>
+                    meshOwner :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-spec>
+                    spec :: VirtualServiceSpecProperty,
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-tags>
+                    tags :: (Prelude.Maybe [Tag]),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-virtualservicename>
+                    virtualServiceName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualService ::
+  Value Prelude.Text
+  -> VirtualServiceSpecProperty
+     -> Value Prelude.Text -> VirtualService
+mkVirtualService meshName spec virtualServiceName
+  = VirtualService
+      {haddock_workaround_ = (), meshName = meshName, spec = spec,
+       virtualServiceName = virtualServiceName,
+       meshOwner = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties VirtualService where
+  toResourceProperties VirtualService {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualService",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+                            "VirtualServiceName" JSON..= virtualServiceName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON VirtualService where
+  toJSON VirtualService {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["MeshName" JSON..= meshName, "Spec" JSON..= spec,
+               "VirtualServiceName" JSON..= virtualServiceName]
+              (Prelude.catMaybes
+                 [(JSON..=) "MeshOwner" Prelude.<$> meshOwner,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "MeshName" VirtualService where
+  type PropertyType "MeshName" VirtualService = Value Prelude.Text
+  set newValue VirtualService {..}
+    = VirtualService {meshName = newValue, ..}
+instance Property "MeshOwner" VirtualService where
+  type PropertyType "MeshOwner" VirtualService = Value Prelude.Text
+  set newValue VirtualService {..}
+    = VirtualService {meshOwner = Prelude.pure newValue, ..}
+instance Property "Spec" VirtualService where
+  type PropertyType "Spec" VirtualService = VirtualServiceSpecProperty
+  set newValue VirtualService {..}
+    = VirtualService {spec = newValue, ..}
+instance Property "Tags" VirtualService where
+  type PropertyType "Tags" VirtualService = [Tag]
+  set newValue VirtualService {..}
+    = VirtualService {tags = Prelude.pure newValue, ..}
+instance Property "VirtualServiceName" VirtualService where
+  type PropertyType "VirtualServiceName" VirtualService = Value Prelude.Text
+  set newValue VirtualService {..}
+    = VirtualService {virtualServiceName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs b/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualService.VirtualNodeServiceProviderProperty (
+        VirtualNodeServiceProviderProperty(..),
+        mkVirtualNodeServiceProviderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualNodeServiceProviderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualnodeserviceprovider.html>
+    VirtualNodeServiceProviderProperty {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualnodeserviceprovider.html#cfn-appmesh-virtualservice-virtualnodeserviceprovider-virtualnodename>
+                                        virtualNodeName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualNodeServiceProviderProperty ::
+  Value Prelude.Text -> VirtualNodeServiceProviderProperty
+mkVirtualNodeServiceProviderProperty virtualNodeName
+  = VirtualNodeServiceProviderProperty
+      {haddock_workaround_ = (), virtualNodeName = virtualNodeName}
+instance ToResourceProperties VirtualNodeServiceProviderProperty where
+  toResourceProperties VirtualNodeServiceProviderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualService.VirtualNodeServiceProvider",
+         supportsTags = Prelude.False,
+         properties = ["VirtualNodeName" JSON..= virtualNodeName]}
+instance JSON.ToJSON VirtualNodeServiceProviderProperty where
+  toJSON VirtualNodeServiceProviderProperty {..}
+    = JSON.object ["VirtualNodeName" JSON..= virtualNodeName]
+instance Property "VirtualNodeName" VirtualNodeServiceProviderProperty where
+  type PropertyType "VirtualNodeName" VirtualNodeServiceProviderProperty = Value Prelude.Text
+  set newValue VirtualNodeServiceProviderProperty {..}
+    = VirtualNodeServiceProviderProperty
+        {virtualNodeName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualNodeServiceProviderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualService.VirtualNodeServiceProviderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualNodeServiceProviderProperty :: Prelude.Type
+instance ToResourceProperties VirtualNodeServiceProviderProperty
+instance Prelude.Eq VirtualNodeServiceProviderProperty
+instance Prelude.Show VirtualNodeServiceProviderProperty
+instance JSON.ToJSON VirtualNodeServiceProviderProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs b/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.AppMesh.VirtualService.VirtualRouterServiceProviderProperty (
+        VirtualRouterServiceProviderProperty(..),
+        mkVirtualRouterServiceProviderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VirtualRouterServiceProviderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualrouterserviceprovider.html>
+    VirtualRouterServiceProviderProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualrouterserviceprovider.html#cfn-appmesh-virtualservice-virtualrouterserviceprovider-virtualroutername>
+                                          virtualRouterName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualRouterServiceProviderProperty ::
+  Value Prelude.Text -> VirtualRouterServiceProviderProperty
+mkVirtualRouterServiceProviderProperty virtualRouterName
+  = VirtualRouterServiceProviderProperty
+      {haddock_workaround_ = (), virtualRouterName = virtualRouterName}
+instance ToResourceProperties VirtualRouterServiceProviderProperty where
+  toResourceProperties VirtualRouterServiceProviderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualService.VirtualRouterServiceProvider",
+         supportsTags = Prelude.False,
+         properties = ["VirtualRouterName" JSON..= virtualRouterName]}
+instance JSON.ToJSON VirtualRouterServiceProviderProperty where
+  toJSON VirtualRouterServiceProviderProperty {..}
+    = JSON.object ["VirtualRouterName" JSON..= virtualRouterName]
+instance Property "VirtualRouterName" VirtualRouterServiceProviderProperty where
+  type PropertyType "VirtualRouterName" VirtualRouterServiceProviderProperty = Value Prelude.Text
+  set newValue VirtualRouterServiceProviderProperty {..}
+    = VirtualRouterServiceProviderProperty
+        {virtualRouterName = newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualRouterServiceProviderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualService.VirtualRouterServiceProviderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualRouterServiceProviderProperty :: Prelude.Type
+instance ToResourceProperties VirtualRouterServiceProviderProperty
+instance Prelude.Eq VirtualRouterServiceProviderProperty
+instance Prelude.Show VirtualRouterServiceProviderProperty
+instance JSON.ToJSON VirtualRouterServiceProviderProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppMesh.VirtualService.VirtualServiceProviderProperty (
+        module Exports, VirtualServiceProviderProperty(..),
+        mkVirtualServiceProviderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualService.VirtualNodeServiceProviderProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualService.VirtualRouterServiceProviderProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualServiceProviderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html>
+    VirtualServiceProviderProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html#cfn-appmesh-virtualservice-virtualserviceprovider-virtualnode>
+                                    virtualNode :: (Prelude.Maybe VirtualNodeServiceProviderProperty),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html#cfn-appmesh-virtualservice-virtualserviceprovider-virtualrouter>
+                                    virtualRouter :: (Prelude.Maybe VirtualRouterServiceProviderProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualServiceProviderProperty :: VirtualServiceProviderProperty
+mkVirtualServiceProviderProperty
+  = VirtualServiceProviderProperty
+      {haddock_workaround_ = (), virtualNode = Prelude.Nothing,
+       virtualRouter = Prelude.Nothing}
+instance ToResourceProperties VirtualServiceProviderProperty where
+  toResourceProperties VirtualServiceProviderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualService.VirtualServiceProvider",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "VirtualNode" Prelude.<$> virtualNode,
+                            (JSON..=) "VirtualRouter" Prelude.<$> virtualRouter])}
+instance JSON.ToJSON VirtualServiceProviderProperty where
+  toJSON VirtualServiceProviderProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "VirtualNode" Prelude.<$> virtualNode,
+               (JSON..=) "VirtualRouter" Prelude.<$> virtualRouter]))
+instance Property "VirtualNode" VirtualServiceProviderProperty where
+  type PropertyType "VirtualNode" VirtualServiceProviderProperty = VirtualNodeServiceProviderProperty
+  set newValue VirtualServiceProviderProperty {..}
+    = VirtualServiceProviderProperty
+        {virtualNode = Prelude.pure newValue, ..}
+instance Property "VirtualRouter" VirtualServiceProviderProperty where
+  type PropertyType "VirtualRouter" VirtualServiceProviderProperty = VirtualRouterServiceProviderProperty
+  set newValue VirtualServiceProviderProperty {..}
+    = VirtualServiceProviderProperty
+        {virtualRouter = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceProviderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualService.VirtualServiceProviderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualServiceProviderProperty :: Prelude.Type
+instance ToResourceProperties VirtualServiceProviderProperty
+instance Prelude.Eq VirtualServiceProviderProperty
+instance Prelude.Show VirtualServiceProviderProperty
+instance JSON.ToJSON VirtualServiceProviderProperty
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs
@@ -0,0 +1,35 @@
+module Stratosphere.AppMesh.VirtualService.VirtualServiceSpecProperty (
+        module Exports, VirtualServiceSpecProperty(..),
+        mkVirtualServiceSpecProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppMesh.VirtualService.VirtualServiceProviderProperty as Exports
+import Stratosphere.ResourceProperties
+data VirtualServiceSpecProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualservicespec.html>
+    VirtualServiceSpecProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualservicespec.html#cfn-appmesh-virtualservice-virtualservicespec-provider>
+                                provider :: (Prelude.Maybe VirtualServiceProviderProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualServiceSpecProperty :: VirtualServiceSpecProperty
+mkVirtualServiceSpecProperty
+  = VirtualServiceSpecProperty
+      {haddock_workaround_ = (), provider = Prelude.Nothing}
+instance ToResourceProperties VirtualServiceSpecProperty where
+  toResourceProperties VirtualServiceSpecProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppMesh::VirtualService.VirtualServiceSpec",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Provider" Prelude.<$> provider])}
+instance JSON.ToJSON VirtualServiceSpecProperty where
+  toJSON VirtualServiceSpecProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Provider" Prelude.<$> provider]))
+instance Property "Provider" VirtualServiceSpecProperty where
+  type PropertyType "Provider" VirtualServiceSpecProperty = VirtualServiceProviderProperty
+  set newValue VirtualServiceSpecProperty {..}
+    = VirtualServiceSpecProperty {provider = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs-boot b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppMesh/VirtualService/VirtualServiceSpecProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppMesh.VirtualService.VirtualServiceSpecProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VirtualServiceSpecProperty :: Prelude.Type
+instance ToResourceProperties VirtualServiceSpecProperty
+instance Prelude.Eq VirtualServiceSpecProperty
+instance Prelude.Show VirtualServiceSpecProperty
+instance JSON.ToJSON VirtualServiceSpecProperty
diff --git a/stratosphere-appmesh.cabal b/stratosphere-appmesh.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-appmesh.cabal
@@ -0,0 +1,212 @@
+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-appmesh
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS AppMesh.
+description:    Integration into stratosphere to generate resources and properties for AWS AppMesh
+category:       AWS, Cloud, AppMesh
+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.AppMesh.GatewayRoute
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteHostnameRewriteProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteMetadataMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteRangeMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteSpecProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteTargetProperty
+      Stratosphere.AppMesh.GatewayRoute.GatewayRouteVirtualServiceProperty
+      Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteActionProperty
+      Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteMetadataProperty
+      Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteProperty
+      Stratosphere.AppMesh.GatewayRoute.GrpcGatewayRouteRewriteProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteActionProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteHeaderProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePathRewriteProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRoutePrefixRewriteProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpGatewayRouteRewriteProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpPathMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.HttpQueryParameterMatchProperty
+      Stratosphere.AppMesh.GatewayRoute.QueryParameterProperty
+      Stratosphere.AppMesh.Mesh
+      Stratosphere.AppMesh.Mesh.EgressFilterProperty
+      Stratosphere.AppMesh.Mesh.MeshServiceDiscoveryProperty
+      Stratosphere.AppMesh.Mesh.MeshSpecProperty
+      Stratosphere.AppMesh.Route
+      Stratosphere.AppMesh.Route.DurationProperty
+      Stratosphere.AppMesh.Route.GrpcRetryPolicyProperty
+      Stratosphere.AppMesh.Route.GrpcRouteActionProperty
+      Stratosphere.AppMesh.Route.GrpcRouteMatchProperty
+      Stratosphere.AppMesh.Route.GrpcRouteMetadataMatchMethodProperty
+      Stratosphere.AppMesh.Route.GrpcRouteMetadataProperty
+      Stratosphere.AppMesh.Route.GrpcRouteProperty
+      Stratosphere.AppMesh.Route.GrpcTimeoutProperty
+      Stratosphere.AppMesh.Route.HeaderMatchMethodProperty
+      Stratosphere.AppMesh.Route.HttpPathMatchProperty
+      Stratosphere.AppMesh.Route.HttpQueryParameterMatchProperty
+      Stratosphere.AppMesh.Route.HttpRetryPolicyProperty
+      Stratosphere.AppMesh.Route.HttpRouteActionProperty
+      Stratosphere.AppMesh.Route.HttpRouteHeaderProperty
+      Stratosphere.AppMesh.Route.HttpRouteMatchProperty
+      Stratosphere.AppMesh.Route.HttpRouteProperty
+      Stratosphere.AppMesh.Route.HttpTimeoutProperty
+      Stratosphere.AppMesh.Route.MatchRangeProperty
+      Stratosphere.AppMesh.Route.QueryParameterProperty
+      Stratosphere.AppMesh.Route.RouteSpecProperty
+      Stratosphere.AppMesh.Route.TcpRouteActionProperty
+      Stratosphere.AppMesh.Route.TcpRouteMatchProperty
+      Stratosphere.AppMesh.Route.TcpRouteProperty
+      Stratosphere.AppMesh.Route.TcpTimeoutProperty
+      Stratosphere.AppMesh.Route.WeightedTargetProperty
+      Stratosphere.AppMesh.VirtualGateway
+      Stratosphere.AppMesh.VirtualGateway.JsonFormatRefProperty
+      Stratosphere.AppMesh.VirtualGateway.LoggingFormatProperty
+      Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNameMatchersProperty
+      Stratosphere.AppMesh.VirtualGateway.SubjectAlternativeNamesProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayAccessLogProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayBackendDefaultsProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientPolicyTlsProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayClientTlsCertificateProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayFileAccessLogProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayGrpcConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHealthCheckPolicyProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttp2ConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayHttpConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsAcmCertificateProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsCertificateProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsFileCertificateProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsSdsCertificateProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayListenerTlsValidationContextTrustProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayLoggingProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayPortMappingProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewaySpecProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextAcmTrustProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextFileTrustProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextSdsTrustProperty
+      Stratosphere.AppMesh.VirtualGateway.VirtualGatewayTlsValidationContextTrustProperty
+      Stratosphere.AppMesh.VirtualNode
+      Stratosphere.AppMesh.VirtualNode.AccessLogProperty
+      Stratosphere.AppMesh.VirtualNode.AwsCloudMapInstanceAttributeProperty
+      Stratosphere.AppMesh.VirtualNode.AwsCloudMapServiceDiscoveryProperty
+      Stratosphere.AppMesh.VirtualNode.BackendDefaultsProperty
+      Stratosphere.AppMesh.VirtualNode.BackendProperty
+      Stratosphere.AppMesh.VirtualNode.ClientPolicyProperty
+      Stratosphere.AppMesh.VirtualNode.ClientPolicyTlsProperty
+      Stratosphere.AppMesh.VirtualNode.ClientTlsCertificateProperty
+      Stratosphere.AppMesh.VirtualNode.DnsServiceDiscoveryProperty
+      Stratosphere.AppMesh.VirtualNode.DurationProperty
+      Stratosphere.AppMesh.VirtualNode.FileAccessLogProperty
+      Stratosphere.AppMesh.VirtualNode.GrpcTimeoutProperty
+      Stratosphere.AppMesh.VirtualNode.HealthCheckProperty
+      Stratosphere.AppMesh.VirtualNode.HttpTimeoutProperty
+      Stratosphere.AppMesh.VirtualNode.JsonFormatRefProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTimeoutProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsAcmCertificateProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsCertificateProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsFileCertificateProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsSdsCertificateProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextProperty
+      Stratosphere.AppMesh.VirtualNode.ListenerTlsValidationContextTrustProperty
+      Stratosphere.AppMesh.VirtualNode.LoggingFormatProperty
+      Stratosphere.AppMesh.VirtualNode.LoggingProperty
+      Stratosphere.AppMesh.VirtualNode.OutlierDetectionProperty
+      Stratosphere.AppMesh.VirtualNode.PortMappingProperty
+      Stratosphere.AppMesh.VirtualNode.ServiceDiscoveryProperty
+      Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNameMatchersProperty
+      Stratosphere.AppMesh.VirtualNode.SubjectAlternativeNamesProperty
+      Stratosphere.AppMesh.VirtualNode.TcpTimeoutProperty
+      Stratosphere.AppMesh.VirtualNode.TlsValidationContextAcmTrustProperty
+      Stratosphere.AppMesh.VirtualNode.TlsValidationContextFileTrustProperty
+      Stratosphere.AppMesh.VirtualNode.TlsValidationContextProperty
+      Stratosphere.AppMesh.VirtualNode.TlsValidationContextSdsTrustProperty
+      Stratosphere.AppMesh.VirtualNode.TlsValidationContextTrustProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeGrpcConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeHttp2ConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeHttpConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeSpecProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualNodeTcpConnectionPoolProperty
+      Stratosphere.AppMesh.VirtualNode.VirtualServiceBackendProperty
+      Stratosphere.AppMesh.VirtualRouter
+      Stratosphere.AppMesh.VirtualRouter.PortMappingProperty
+      Stratosphere.AppMesh.VirtualRouter.VirtualRouterListenerProperty
+      Stratosphere.AppMesh.VirtualRouter.VirtualRouterSpecProperty
+      Stratosphere.AppMesh.VirtualService
+      Stratosphere.AppMesh.VirtualService.VirtualNodeServiceProviderProperty
+      Stratosphere.AppMesh.VirtualService.VirtualRouterServiceProviderProperty
+      Stratosphere.AppMesh.VirtualService.VirtualServiceProviderProperty
+      Stratosphere.AppMesh.VirtualService.VirtualServiceSpecProperty
+  other-modules:
+      Paths_stratosphere_appmesh
+  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
