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/AppStream/AppBlock.hs b/gen/Stratosphere/AppStream/AppBlock.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlock.hs
@@ -0,0 +1,99 @@
+module Stratosphere.AppStream.AppBlock (
+        module Exports, AppBlock(..), mkAppBlock
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.AppBlock.S3LocationProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.AppBlock.ScriptDetailsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data AppBlock
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html>
+    AppBlock {haddock_workaround_ :: (),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-description>
+              description :: (Prelude.Maybe (Value Prelude.Text)),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-displayname>
+              displayName :: (Prelude.Maybe (Value Prelude.Text)),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-name>
+              name :: (Value Prelude.Text),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-packagingtype>
+              packagingType :: (Prelude.Maybe (Value Prelude.Text)),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-postsetupscriptdetails>
+              postSetupScriptDetails :: (Prelude.Maybe ScriptDetailsProperty),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-setupscriptdetails>
+              setupScriptDetails :: (Prelude.Maybe ScriptDetailsProperty),
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-sources3location>
+              sourceS3Location :: S3LocationProperty,
+              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-tags>
+              tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAppBlock :: Value Prelude.Text -> S3LocationProperty -> AppBlock
+mkAppBlock name sourceS3Location
+  = AppBlock
+      {haddock_workaround_ = (), name = name,
+       sourceS3Location = sourceS3Location, description = Prelude.Nothing,
+       displayName = Prelude.Nothing, packagingType = Prelude.Nothing,
+       postSetupScriptDetails = Prelude.Nothing,
+       setupScriptDetails = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties AppBlock where
+  toResourceProperties AppBlock {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlock", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name, "SourceS3Location" JSON..= sourceS3Location]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "DisplayName" Prelude.<$> displayName,
+                               (JSON..=) "PackagingType" Prelude.<$> packagingType,
+                               (JSON..=) "PostSetupScriptDetails"
+                                 Prelude.<$> postSetupScriptDetails,
+                               (JSON..=) "SetupScriptDetails" Prelude.<$> setupScriptDetails,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON AppBlock where
+  toJSON AppBlock {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name, "SourceS3Location" JSON..= sourceS3Location]
+              (Prelude.catMaybes
+                 [(JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "DisplayName" Prelude.<$> displayName,
+                  (JSON..=) "PackagingType" Prelude.<$> packagingType,
+                  (JSON..=) "PostSetupScriptDetails"
+                    Prelude.<$> postSetupScriptDetails,
+                  (JSON..=) "SetupScriptDetails" Prelude.<$> setupScriptDetails,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "Description" AppBlock where
+  type PropertyType "Description" AppBlock = Value Prelude.Text
+  set newValue AppBlock {..}
+    = AppBlock {description = Prelude.pure newValue, ..}
+instance Property "DisplayName" AppBlock where
+  type PropertyType "DisplayName" AppBlock = Value Prelude.Text
+  set newValue AppBlock {..}
+    = AppBlock {displayName = Prelude.pure newValue, ..}
+instance Property "Name" AppBlock where
+  type PropertyType "Name" AppBlock = Value Prelude.Text
+  set newValue AppBlock {..} = AppBlock {name = newValue, ..}
+instance Property "PackagingType" AppBlock where
+  type PropertyType "PackagingType" AppBlock = Value Prelude.Text
+  set newValue AppBlock {..}
+    = AppBlock {packagingType = Prelude.pure newValue, ..}
+instance Property "PostSetupScriptDetails" AppBlock where
+  type PropertyType "PostSetupScriptDetails" AppBlock = ScriptDetailsProperty
+  set newValue AppBlock {..}
+    = AppBlock {postSetupScriptDetails = Prelude.pure newValue, ..}
+instance Property "SetupScriptDetails" AppBlock where
+  type PropertyType "SetupScriptDetails" AppBlock = ScriptDetailsProperty
+  set newValue AppBlock {..}
+    = AppBlock {setupScriptDetails = Prelude.pure newValue, ..}
+instance Property "SourceS3Location" AppBlock where
+  type PropertyType "SourceS3Location" AppBlock = S3LocationProperty
+  set newValue AppBlock {..}
+    = AppBlock {sourceS3Location = newValue, ..}
+instance Property "Tags" AppBlock where
+  type PropertyType "Tags" AppBlock = [Tag]
+  set newValue AppBlock {..}
+    = AppBlock {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs b/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppStream.AppBlock.S3LocationProperty (
+        S3LocationProperty(..), mkS3LocationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data S3LocationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html>
+    S3LocationProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3bucket>
+                        s3Bucket :: (Value Prelude.Text),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3key>
+                        s3Key :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkS3LocationProperty :: Value Prelude.Text -> S3LocationProperty
+mkS3LocationProperty s3Bucket
+  = S3LocationProperty
+      {haddock_workaround_ = (), s3Bucket = s3Bucket,
+       s3Key = Prelude.Nothing}
+instance ToResourceProperties S3LocationProperty where
+  toResourceProperties S3LocationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlock.S3Location",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["S3Bucket" JSON..= s3Bucket]
+                           (Prelude.catMaybes [(JSON..=) "S3Key" Prelude.<$> s3Key]))}
+instance JSON.ToJSON S3LocationProperty where
+  toJSON S3LocationProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["S3Bucket" JSON..= s3Bucket]
+              (Prelude.catMaybes [(JSON..=) "S3Key" Prelude.<$> s3Key])))
+instance Property "S3Bucket" S3LocationProperty where
+  type PropertyType "S3Bucket" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Bucket = newValue, ..}
+instance Property "S3Key" S3LocationProperty where
+  type PropertyType "S3Key" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Key = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs-boot b/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlock/S3LocationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.AppBlock.S3LocationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data S3LocationProperty :: Prelude.Type
+instance ToResourceProperties S3LocationProperty
+instance Prelude.Eq S3LocationProperty
+instance Prelude.Show S3LocationProperty
+instance JSON.ToJSON S3LocationProperty
diff --git a/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs b/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs
@@ -0,0 +1,75 @@
+module Stratosphere.AppStream.AppBlock.ScriptDetailsProperty (
+        module Exports, ScriptDetailsProperty(..), mkScriptDetailsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.AppBlock.S3LocationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ScriptDetailsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html>
+    ScriptDetailsProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executableparameters>
+                           executableParameters :: (Prelude.Maybe (Value Prelude.Text)),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executablepath>
+                           executablePath :: (Value Prelude.Text),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-scripts3location>
+                           scriptS3Location :: S3LocationProperty,
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-timeoutinseconds>
+                           timeoutInSeconds :: (Value Prelude.Integer)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkScriptDetailsProperty ::
+  Value Prelude.Text
+  -> S3LocationProperty
+     -> Value Prelude.Integer -> ScriptDetailsProperty
+mkScriptDetailsProperty
+  executablePath
+  scriptS3Location
+  timeoutInSeconds
+  = ScriptDetailsProperty
+      {haddock_workaround_ = (), executablePath = executablePath,
+       scriptS3Location = scriptS3Location,
+       timeoutInSeconds = timeoutInSeconds,
+       executableParameters = Prelude.Nothing}
+instance ToResourceProperties ScriptDetailsProperty where
+  toResourceProperties ScriptDetailsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlock.ScriptDetails",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ExecutablePath" JSON..= executablePath,
+                            "ScriptS3Location" JSON..= scriptS3Location,
+                            "TimeoutInSeconds" JSON..= timeoutInSeconds]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ExecutableParameters"
+                                 Prelude.<$> executableParameters]))}
+instance JSON.ToJSON ScriptDetailsProperty where
+  toJSON ScriptDetailsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ExecutablePath" JSON..= executablePath,
+               "ScriptS3Location" JSON..= scriptS3Location,
+               "TimeoutInSeconds" JSON..= timeoutInSeconds]
+              (Prelude.catMaybes
+                 [(JSON..=) "ExecutableParameters"
+                    Prelude.<$> executableParameters])))
+instance Property "ExecutableParameters" ScriptDetailsProperty where
+  type PropertyType "ExecutableParameters" ScriptDetailsProperty = Value Prelude.Text
+  set newValue ScriptDetailsProperty {..}
+    = ScriptDetailsProperty
+        {executableParameters = Prelude.pure newValue, ..}
+instance Property "ExecutablePath" ScriptDetailsProperty where
+  type PropertyType "ExecutablePath" ScriptDetailsProperty = Value Prelude.Text
+  set newValue ScriptDetailsProperty {..}
+    = ScriptDetailsProperty {executablePath = newValue, ..}
+instance Property "ScriptS3Location" ScriptDetailsProperty where
+  type PropertyType "ScriptS3Location" ScriptDetailsProperty = S3LocationProperty
+  set newValue ScriptDetailsProperty {..}
+    = ScriptDetailsProperty {scriptS3Location = newValue, ..}
+instance Property "TimeoutInSeconds" ScriptDetailsProperty where
+  type PropertyType "TimeoutInSeconds" ScriptDetailsProperty = Value Prelude.Integer
+  set newValue ScriptDetailsProperty {..}
+    = ScriptDetailsProperty {timeoutInSeconds = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs-boot b/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlock/ScriptDetailsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.AppBlock.ScriptDetailsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ScriptDetailsProperty :: Prelude.Type
+instance ToResourceProperties ScriptDetailsProperty
+instance Prelude.Eq ScriptDetailsProperty
+instance Prelude.Show ScriptDetailsProperty
+instance JSON.ToJSON ScriptDetailsProperty
diff --git a/gen/Stratosphere/AppStream/AppBlockBuilder.hs b/gen/Stratosphere/AppStream/AppBlockBuilder.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlockBuilder.hs
@@ -0,0 +1,128 @@
+module Stratosphere.AppStream.AppBlockBuilder (
+        module Exports, AppBlockBuilder(..), mkAppBlockBuilder
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.AppBlockBuilder.AccessEndpointProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.AppBlockBuilder.VpcConfigProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data AppBlockBuilder
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html>
+    AppBlockBuilder {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-accessendpoints>
+                     accessEndpoints :: (Prelude.Maybe [AccessEndpointProperty]),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-appblockarns>
+                     appBlockArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-description>
+                     description :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-displayname>
+                     displayName :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-enabledefaultinternetaccess>
+                     enableDefaultInternetAccess :: (Prelude.Maybe (Value Prelude.Bool)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-iamrolearn>
+                     iamRoleArn :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-instancetype>
+                     instanceType :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-name>
+                     name :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-platform>
+                     platform :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-tags>
+                     tags :: (Prelude.Maybe [Tag]),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-vpcconfig>
+                     vpcConfig :: VpcConfigProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAppBlockBuilder ::
+  Value Prelude.Text
+  -> Value Prelude.Text
+     -> Value Prelude.Text -> VpcConfigProperty -> AppBlockBuilder
+mkAppBlockBuilder instanceType name platform vpcConfig
+  = AppBlockBuilder
+      {haddock_workaround_ = (), instanceType = instanceType,
+       name = name, platform = platform, vpcConfig = vpcConfig,
+       accessEndpoints = Prelude.Nothing, appBlockArns = Prelude.Nothing,
+       description = Prelude.Nothing, displayName = Prelude.Nothing,
+       enableDefaultInternetAccess = Prelude.Nothing,
+       iamRoleArn = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties AppBlockBuilder where
+  toResourceProperties AppBlockBuilder {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlockBuilder",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["InstanceType" JSON..= instanceType, "Name" JSON..= name,
+                            "Platform" JSON..= platform, "VpcConfig" JSON..= vpcConfig]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+                               (JSON..=) "AppBlockArns" Prelude.<$> appBlockArns,
+                               (JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "DisplayName" Prelude.<$> displayName,
+                               (JSON..=) "EnableDefaultInternetAccess"
+                                 Prelude.<$> enableDefaultInternetAccess,
+                               (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON AppBlockBuilder where
+  toJSON AppBlockBuilder {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["InstanceType" JSON..= instanceType, "Name" JSON..= name,
+               "Platform" JSON..= platform, "VpcConfig" JSON..= vpcConfig]
+              (Prelude.catMaybes
+                 [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+                  (JSON..=) "AppBlockArns" Prelude.<$> appBlockArns,
+                  (JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "DisplayName" Prelude.<$> displayName,
+                  (JSON..=) "EnableDefaultInternetAccess"
+                    Prelude.<$> enableDefaultInternetAccess,
+                  (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "AccessEndpoints" AppBlockBuilder where
+  type PropertyType "AccessEndpoints" AppBlockBuilder = [AccessEndpointProperty]
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {accessEndpoints = Prelude.pure newValue, ..}
+instance Property "AppBlockArns" AppBlockBuilder where
+  type PropertyType "AppBlockArns" AppBlockBuilder = ValueList Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {appBlockArns = Prelude.pure newValue, ..}
+instance Property "Description" AppBlockBuilder where
+  type PropertyType "Description" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {description = Prelude.pure newValue, ..}
+instance Property "DisplayName" AppBlockBuilder where
+  type PropertyType "DisplayName" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {displayName = Prelude.pure newValue, ..}
+instance Property "EnableDefaultInternetAccess" AppBlockBuilder where
+  type PropertyType "EnableDefaultInternetAccess" AppBlockBuilder = Value Prelude.Bool
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder
+        {enableDefaultInternetAccess = Prelude.pure newValue, ..}
+instance Property "IamRoleArn" AppBlockBuilder where
+  type PropertyType "IamRoleArn" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {iamRoleArn = Prelude.pure newValue, ..}
+instance Property "InstanceType" AppBlockBuilder where
+  type PropertyType "InstanceType" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {instanceType = newValue, ..}
+instance Property "Name" AppBlockBuilder where
+  type PropertyType "Name" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {name = newValue, ..}
+instance Property "Platform" AppBlockBuilder where
+  type PropertyType "Platform" AppBlockBuilder = Value Prelude.Text
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {platform = newValue, ..}
+instance Property "Tags" AppBlockBuilder where
+  type PropertyType "Tags" AppBlockBuilder = [Tag]
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {tags = Prelude.pure newValue, ..}
+instance Property "VpcConfig" AppBlockBuilder where
+  type PropertyType "VpcConfig" AppBlockBuilder = VpcConfigProperty
+  set newValue AppBlockBuilder {..}
+    = AppBlockBuilder {vpcConfig = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs b/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppStream.AppBlockBuilder.AccessEndpointProperty (
+        AccessEndpointProperty(..), mkAccessEndpointProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AccessEndpointProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html>
+    AccessEndpointProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html#cfn-appstream-appblockbuilder-accessendpoint-endpointtype>
+                            endpointType :: (Value Prelude.Text),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html#cfn-appstream-appblockbuilder-accessendpoint-vpceid>
+                            vpceId :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAccessEndpointProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> AccessEndpointProperty
+mkAccessEndpointProperty endpointType vpceId
+  = AccessEndpointProperty
+      {haddock_workaround_ = (), endpointType = endpointType,
+       vpceId = vpceId}
+instance ToResourceProperties AccessEndpointProperty where
+  toResourceProperties AccessEndpointProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlockBuilder.AccessEndpoint",
+         supportsTags = Prelude.False,
+         properties = ["EndpointType" JSON..= endpointType,
+                       "VpceId" JSON..= vpceId]}
+instance JSON.ToJSON AccessEndpointProperty where
+  toJSON AccessEndpointProperty {..}
+    = JSON.object
+        ["EndpointType" JSON..= endpointType, "VpceId" JSON..= vpceId]
+instance Property "EndpointType" AccessEndpointProperty where
+  type PropertyType "EndpointType" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {endpointType = newValue, ..}
+instance Property "VpceId" AccessEndpointProperty where
+  type PropertyType "VpceId" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {vpceId = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs-boot b/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlockBuilder/AccessEndpointProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.AppBlockBuilder.AccessEndpointProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AccessEndpointProperty :: Prelude.Type
+instance ToResourceProperties AccessEndpointProperty
+instance Prelude.Eq AccessEndpointProperty
+instance Prelude.Show AccessEndpointProperty
+instance JSON.ToJSON AccessEndpointProperty
diff --git a/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs b/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppStream.AppBlockBuilder.VpcConfigProperty (
+        VpcConfigProperty(..), mkVpcConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VpcConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html>
+    VpcConfigProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html#cfn-appstream-appblockbuilder-vpcconfig-securitygroupids>
+                       securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html#cfn-appstream-appblockbuilder-vpcconfig-subnetids>
+                       subnetIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVpcConfigProperty :: VpcConfigProperty
+mkVpcConfigProperty
+  = VpcConfigProperty
+      {haddock_workaround_ = (), securityGroupIds = Prelude.Nothing,
+       subnetIds = Prelude.Nothing}
+instance ToResourceProperties VpcConfigProperty where
+  toResourceProperties VpcConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::AppBlockBuilder.VpcConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                            (JSON..=) "SubnetIds" Prelude.<$> subnetIds])}
+instance JSON.ToJSON VpcConfigProperty where
+  toJSON VpcConfigProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+               (JSON..=) "SubnetIds" Prelude.<$> subnetIds]))
+instance Property "SecurityGroupIds" VpcConfigProperty where
+  type PropertyType "SecurityGroupIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "SubnetIds" VpcConfigProperty where
+  type PropertyType "SubnetIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {subnetIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs-boot b/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/AppBlockBuilder/VpcConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.AppBlockBuilder.VpcConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VpcConfigProperty :: Prelude.Type
+instance ToResourceProperties VpcConfigProperty
+instance Prelude.Eq VpcConfigProperty
+instance Prelude.Show VpcConfigProperty
+instance JSON.ToJSON VpcConfigProperty
diff --git a/gen/Stratosphere/AppStream/Application.hs b/gen/Stratosphere/AppStream/Application.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Application.hs
@@ -0,0 +1,143 @@
+module Stratosphere.AppStream.Application (
+        module Exports, Application(..), mkApplication
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.Application.S3LocationProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Application
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html>
+    Application {haddock_workaround_ :: (),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-appblockarn>
+                 appBlockArn :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-attributestodelete>
+                 attributesToDelete :: (Prelude.Maybe (ValueList Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-description>
+                 description :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-displayname>
+                 displayName :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-icons3location>
+                 iconS3Location :: S3LocationProperty,
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-instancefamilies>
+                 instanceFamilies :: (ValueList Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchparameters>
+                 launchParameters :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchpath>
+                 launchPath :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-name>
+                 name :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-platforms>
+                 platforms :: (ValueList Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-tags>
+                 tags :: (Prelude.Maybe [Tag]),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-workingdirectory>
+                 workingDirectory :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkApplication ::
+  Value Prelude.Text
+  -> S3LocationProperty
+     -> ValueList Prelude.Text
+        -> Value Prelude.Text
+           -> Value Prelude.Text -> ValueList Prelude.Text -> Application
+mkApplication
+  appBlockArn
+  iconS3Location
+  instanceFamilies
+  launchPath
+  name
+  platforms
+  = Application
+      {haddock_workaround_ = (), appBlockArn = appBlockArn,
+       iconS3Location = iconS3Location,
+       instanceFamilies = instanceFamilies, launchPath = launchPath,
+       name = name, platforms = platforms,
+       attributesToDelete = Prelude.Nothing,
+       description = Prelude.Nothing, displayName = Prelude.Nothing,
+       launchParameters = Prelude.Nothing, tags = Prelude.Nothing,
+       workingDirectory = Prelude.Nothing}
+instance ToResourceProperties Application where
+  toResourceProperties Application {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Application",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["AppBlockArn" JSON..= appBlockArn,
+                            "IconS3Location" JSON..= iconS3Location,
+                            "InstanceFamilies" JSON..= instanceFamilies,
+                            "LaunchPath" JSON..= launchPath, "Name" JSON..= name,
+                            "Platforms" JSON..= platforms]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AttributesToDelete" Prelude.<$> attributesToDelete,
+                               (JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "DisplayName" Prelude.<$> displayName,
+                               (JSON..=) "LaunchParameters" Prelude.<$> launchParameters,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "WorkingDirectory" Prelude.<$> workingDirectory]))}
+instance JSON.ToJSON Application where
+  toJSON Application {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["AppBlockArn" JSON..= appBlockArn,
+               "IconS3Location" JSON..= iconS3Location,
+               "InstanceFamilies" JSON..= instanceFamilies,
+               "LaunchPath" JSON..= launchPath, "Name" JSON..= name,
+               "Platforms" JSON..= platforms]
+              (Prelude.catMaybes
+                 [(JSON..=) "AttributesToDelete" Prelude.<$> attributesToDelete,
+                  (JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "DisplayName" Prelude.<$> displayName,
+                  (JSON..=) "LaunchParameters" Prelude.<$> launchParameters,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "WorkingDirectory" Prelude.<$> workingDirectory])))
+instance Property "AppBlockArn" Application where
+  type PropertyType "AppBlockArn" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {appBlockArn = newValue, ..}
+instance Property "AttributesToDelete" Application where
+  type PropertyType "AttributesToDelete" Application = ValueList Prelude.Text
+  set newValue Application {..}
+    = Application {attributesToDelete = Prelude.pure newValue, ..}
+instance Property "Description" Application where
+  type PropertyType "Description" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {description = Prelude.pure newValue, ..}
+instance Property "DisplayName" Application where
+  type PropertyType "DisplayName" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {displayName = Prelude.pure newValue, ..}
+instance Property "IconS3Location" Application where
+  type PropertyType "IconS3Location" Application = S3LocationProperty
+  set newValue Application {..}
+    = Application {iconS3Location = newValue, ..}
+instance Property "InstanceFamilies" Application where
+  type PropertyType "InstanceFamilies" Application = ValueList Prelude.Text
+  set newValue Application {..}
+    = Application {instanceFamilies = newValue, ..}
+instance Property "LaunchParameters" Application where
+  type PropertyType "LaunchParameters" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {launchParameters = Prelude.pure newValue, ..}
+instance Property "LaunchPath" Application where
+  type PropertyType "LaunchPath" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {launchPath = newValue, ..}
+instance Property "Name" Application where
+  type PropertyType "Name" Application = Value Prelude.Text
+  set newValue Application {..} = Application {name = newValue, ..}
+instance Property "Platforms" Application where
+  type PropertyType "Platforms" Application = ValueList Prelude.Text
+  set newValue Application {..}
+    = Application {platforms = newValue, ..}
+instance Property "Tags" Application where
+  type PropertyType "Tags" Application = [Tag]
+  set newValue Application {..}
+    = Application {tags = Prelude.pure newValue, ..}
+instance Property "WorkingDirectory" Application where
+  type PropertyType "WorkingDirectory" Application = Value Prelude.Text
+  set newValue Application {..}
+    = Application {workingDirectory = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs b/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppStream.Application.S3LocationProperty (
+        S3LocationProperty(..), mkS3LocationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data S3LocationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html>
+    S3LocationProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3bucket>
+                        s3Bucket :: (Value Prelude.Text),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3key>
+                        s3Key :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkS3LocationProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> S3LocationProperty
+mkS3LocationProperty s3Bucket s3Key
+  = S3LocationProperty
+      {haddock_workaround_ = (), s3Bucket = s3Bucket, s3Key = s3Key}
+instance ToResourceProperties S3LocationProperty where
+  toResourceProperties S3LocationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Application.S3Location",
+         supportsTags = Prelude.False,
+         properties = ["S3Bucket" JSON..= s3Bucket, "S3Key" JSON..= s3Key]}
+instance JSON.ToJSON S3LocationProperty where
+  toJSON S3LocationProperty {..}
+    = JSON.object ["S3Bucket" JSON..= s3Bucket, "S3Key" JSON..= s3Key]
+instance Property "S3Bucket" S3LocationProperty where
+  type PropertyType "S3Bucket" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Bucket = newValue, ..}
+instance Property "S3Key" S3LocationProperty where
+  type PropertyType "S3Key" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Key = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs-boot b/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Application/S3LocationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Application.S3LocationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data S3LocationProperty :: Prelude.Type
+instance ToResourceProperties S3LocationProperty
+instance Prelude.Eq S3LocationProperty
+instance Prelude.Show S3LocationProperty
+instance JSON.ToJSON S3LocationProperty
diff --git a/gen/Stratosphere/AppStream/ApplicationEntitlementAssociation.hs b/gen/Stratosphere/AppStream/ApplicationEntitlementAssociation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ApplicationEntitlementAssociation.hs
@@ -0,0 +1,60 @@
+module Stratosphere.AppStream.ApplicationEntitlementAssociation (
+        ApplicationEntitlementAssociation(..),
+        mkApplicationEntitlementAssociation
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ApplicationEntitlementAssociation
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html>
+    ApplicationEntitlementAssociation {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-applicationidentifier>
+                                       applicationIdentifier :: (Value Prelude.Text),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-entitlementname>
+                                       entitlementName :: (Value Prelude.Text),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-stackname>
+                                       stackName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkApplicationEntitlementAssociation ::
+  Value Prelude.Text
+  -> Value Prelude.Text
+     -> Value Prelude.Text -> ApplicationEntitlementAssociation
+mkApplicationEntitlementAssociation
+  applicationIdentifier
+  entitlementName
+  stackName
+  = ApplicationEntitlementAssociation
+      {haddock_workaround_ = (),
+       applicationIdentifier = applicationIdentifier,
+       entitlementName = entitlementName, stackName = stackName}
+instance ToResourceProperties ApplicationEntitlementAssociation where
+  toResourceProperties ApplicationEntitlementAssociation {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ApplicationEntitlementAssociation",
+         supportsTags = Prelude.False,
+         properties = ["ApplicationIdentifier"
+                         JSON..= applicationIdentifier,
+                       "EntitlementName" JSON..= entitlementName,
+                       "StackName" JSON..= stackName]}
+instance JSON.ToJSON ApplicationEntitlementAssociation where
+  toJSON ApplicationEntitlementAssociation {..}
+    = JSON.object
+        ["ApplicationIdentifier" JSON..= applicationIdentifier,
+         "EntitlementName" JSON..= entitlementName,
+         "StackName" JSON..= stackName]
+instance Property "ApplicationIdentifier" ApplicationEntitlementAssociation where
+  type PropertyType "ApplicationIdentifier" ApplicationEntitlementAssociation = Value Prelude.Text
+  set newValue ApplicationEntitlementAssociation {..}
+    = ApplicationEntitlementAssociation
+        {applicationIdentifier = newValue, ..}
+instance Property "EntitlementName" ApplicationEntitlementAssociation where
+  type PropertyType "EntitlementName" ApplicationEntitlementAssociation = Value Prelude.Text
+  set newValue ApplicationEntitlementAssociation {..}
+    = ApplicationEntitlementAssociation
+        {entitlementName = newValue, ..}
+instance Property "StackName" ApplicationEntitlementAssociation where
+  type PropertyType "StackName" ApplicationEntitlementAssociation = Value Prelude.Text
+  set newValue ApplicationEntitlementAssociation {..}
+    = ApplicationEntitlementAssociation {stackName = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/ApplicationFleetAssociation.hs b/gen/Stratosphere/AppStream/ApplicationFleetAssociation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ApplicationFleetAssociation.hs
@@ -0,0 +1,43 @@
+module Stratosphere.AppStream.ApplicationFleetAssociation (
+        ApplicationFleetAssociation(..), mkApplicationFleetAssociation
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ApplicationFleetAssociation
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html>
+    ApplicationFleetAssociation {haddock_workaround_ :: (),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-applicationarn>
+                                 applicationArn :: (Value Prelude.Text),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-fleetname>
+                                 fleetName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkApplicationFleetAssociation ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> ApplicationFleetAssociation
+mkApplicationFleetAssociation applicationArn fleetName
+  = ApplicationFleetAssociation
+      {haddock_workaround_ = (), applicationArn = applicationArn,
+       fleetName = fleetName}
+instance ToResourceProperties ApplicationFleetAssociation where
+  toResourceProperties ApplicationFleetAssociation {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ApplicationFleetAssociation",
+         supportsTags = Prelude.False,
+         properties = ["ApplicationArn" JSON..= applicationArn,
+                       "FleetName" JSON..= fleetName]}
+instance JSON.ToJSON ApplicationFleetAssociation where
+  toJSON ApplicationFleetAssociation {..}
+    = JSON.object
+        ["ApplicationArn" JSON..= applicationArn,
+         "FleetName" JSON..= fleetName]
+instance Property "ApplicationArn" ApplicationFleetAssociation where
+  type PropertyType "ApplicationArn" ApplicationFleetAssociation = Value Prelude.Text
+  set newValue ApplicationFleetAssociation {..}
+    = ApplicationFleetAssociation {applicationArn = newValue, ..}
+instance Property "FleetName" ApplicationFleetAssociation where
+  type PropertyType "FleetName" ApplicationFleetAssociation = Value Prelude.Text
+  set newValue ApplicationFleetAssociation {..}
+    = ApplicationFleetAssociation {fleetName = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/DirectoryConfig.hs b/gen/Stratosphere/AppStream/DirectoryConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/DirectoryConfig.hs
@@ -0,0 +1,79 @@
+module Stratosphere.AppStream.DirectoryConfig (
+        module Exports, DirectoryConfig(..), mkDirectoryConfig
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.DirectoryConfig.CertificateBasedAuthPropertiesProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.DirectoryConfig.ServiceAccountCredentialsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DirectoryConfig
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html>
+    DirectoryConfig {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-certificatebasedauthproperties>
+                     certificateBasedAuthProperties :: (Prelude.Maybe CertificateBasedAuthPropertiesProperty),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-directoryname>
+                     directoryName :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-organizationalunitdistinguishednames>
+                     organizationalUnitDistinguishedNames :: (ValueList Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-serviceaccountcredentials>
+                     serviceAccountCredentials :: ServiceAccountCredentialsProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDirectoryConfig ::
+  Value Prelude.Text
+  -> ValueList Prelude.Text
+     -> ServiceAccountCredentialsProperty -> DirectoryConfig
+mkDirectoryConfig
+  directoryName
+  organizationalUnitDistinguishedNames
+  serviceAccountCredentials
+  = DirectoryConfig
+      {haddock_workaround_ = (), directoryName = directoryName,
+       organizationalUnitDistinguishedNames = organizationalUnitDistinguishedNames,
+       serviceAccountCredentials = serviceAccountCredentials,
+       certificateBasedAuthProperties = Prelude.Nothing}
+instance ToResourceProperties DirectoryConfig where
+  toResourceProperties DirectoryConfig {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::DirectoryConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["DirectoryName" JSON..= directoryName,
+                            "OrganizationalUnitDistinguishedNames"
+                              JSON..= organizationalUnitDistinguishedNames,
+                            "ServiceAccountCredentials" JSON..= serviceAccountCredentials]
+                           (Prelude.catMaybes
+                              [(JSON..=) "CertificateBasedAuthProperties"
+                                 Prelude.<$> certificateBasedAuthProperties]))}
+instance JSON.ToJSON DirectoryConfig where
+  toJSON DirectoryConfig {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["DirectoryName" JSON..= directoryName,
+               "OrganizationalUnitDistinguishedNames"
+                 JSON..= organizationalUnitDistinguishedNames,
+               "ServiceAccountCredentials" JSON..= serviceAccountCredentials]
+              (Prelude.catMaybes
+                 [(JSON..=) "CertificateBasedAuthProperties"
+                    Prelude.<$> certificateBasedAuthProperties])))
+instance Property "CertificateBasedAuthProperties" DirectoryConfig where
+  type PropertyType "CertificateBasedAuthProperties" DirectoryConfig = CertificateBasedAuthPropertiesProperty
+  set newValue DirectoryConfig {..}
+    = DirectoryConfig
+        {certificateBasedAuthProperties = Prelude.pure newValue, ..}
+instance Property "DirectoryName" DirectoryConfig where
+  type PropertyType "DirectoryName" DirectoryConfig = Value Prelude.Text
+  set newValue DirectoryConfig {..}
+    = DirectoryConfig {directoryName = newValue, ..}
+instance Property "OrganizationalUnitDistinguishedNames" DirectoryConfig where
+  type PropertyType "OrganizationalUnitDistinguishedNames" DirectoryConfig = ValueList Prelude.Text
+  set newValue DirectoryConfig {..}
+    = DirectoryConfig
+        {organizationalUnitDistinguishedNames = newValue, ..}
+instance Property "ServiceAccountCredentials" DirectoryConfig where
+  type PropertyType "ServiceAccountCredentials" DirectoryConfig = ServiceAccountCredentialsProperty
+  set newValue DirectoryConfig {..}
+    = DirectoryConfig {serviceAccountCredentials = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs b/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs
@@ -0,0 +1,52 @@
+module Stratosphere.AppStream.DirectoryConfig.CertificateBasedAuthPropertiesProperty (
+        CertificateBasedAuthPropertiesProperty(..),
+        mkCertificateBasedAuthPropertiesProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CertificateBasedAuthPropertiesProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html>
+    CertificateBasedAuthPropertiesProperty {haddock_workaround_ :: (),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html#cfn-appstream-directoryconfig-certificatebasedauthproperties-certificateauthorityarn>
+                                            certificateAuthorityArn :: (Prelude.Maybe (Value Prelude.Text)),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html#cfn-appstream-directoryconfig-certificatebasedauthproperties-status>
+                                            status :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCertificateBasedAuthPropertiesProperty ::
+  CertificateBasedAuthPropertiesProperty
+mkCertificateBasedAuthPropertiesProperty
+  = CertificateBasedAuthPropertiesProperty
+      {haddock_workaround_ = (),
+       certificateAuthorityArn = Prelude.Nothing,
+       status = Prelude.Nothing}
+instance ToResourceProperties CertificateBasedAuthPropertiesProperty where
+  toResourceProperties CertificateBasedAuthPropertiesProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::DirectoryConfig.CertificateBasedAuthProperties",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "CertificateAuthorityArn"
+                              Prelude.<$> certificateAuthorityArn,
+                            (JSON..=) "Status" Prelude.<$> status])}
+instance JSON.ToJSON CertificateBasedAuthPropertiesProperty where
+  toJSON CertificateBasedAuthPropertiesProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "CertificateAuthorityArn"
+                 Prelude.<$> certificateAuthorityArn,
+               (JSON..=) "Status" Prelude.<$> status]))
+instance Property "CertificateAuthorityArn" CertificateBasedAuthPropertiesProperty where
+  type PropertyType "CertificateAuthorityArn" CertificateBasedAuthPropertiesProperty = Value Prelude.Text
+  set newValue CertificateBasedAuthPropertiesProperty {..}
+    = CertificateBasedAuthPropertiesProperty
+        {certificateAuthorityArn = Prelude.pure newValue, ..}
+instance Property "Status" CertificateBasedAuthPropertiesProperty where
+  type PropertyType "Status" CertificateBasedAuthPropertiesProperty = Value Prelude.Text
+  set newValue CertificateBasedAuthPropertiesProperty {..}
+    = CertificateBasedAuthPropertiesProperty
+        {status = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs-boot b/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/DirectoryConfig/CertificateBasedAuthPropertiesProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.DirectoryConfig.CertificateBasedAuthPropertiesProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CertificateBasedAuthPropertiesProperty :: Prelude.Type
+instance ToResourceProperties CertificateBasedAuthPropertiesProperty
+instance Prelude.Eq CertificateBasedAuthPropertiesProperty
+instance Prelude.Show CertificateBasedAuthPropertiesProperty
+instance JSON.ToJSON CertificateBasedAuthPropertiesProperty
diff --git a/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs b/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppStream.DirectoryConfig.ServiceAccountCredentialsProperty (
+        ServiceAccountCredentialsProperty(..),
+        mkServiceAccountCredentialsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ServiceAccountCredentialsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html>
+    ServiceAccountCredentialsProperty {haddock_workaround_ :: (),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html#cfn-appstream-directoryconfig-serviceaccountcredentials-accountname>
+                                       accountName :: (Value Prelude.Text),
+                                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html#cfn-appstream-directoryconfig-serviceaccountcredentials-accountpassword>
+                                       accountPassword :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkServiceAccountCredentialsProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> ServiceAccountCredentialsProperty
+mkServiceAccountCredentialsProperty accountName accountPassword
+  = ServiceAccountCredentialsProperty
+      {haddock_workaround_ = (), accountName = accountName,
+       accountPassword = accountPassword}
+instance ToResourceProperties ServiceAccountCredentialsProperty where
+  toResourceProperties ServiceAccountCredentialsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::DirectoryConfig.ServiceAccountCredentials",
+         supportsTags = Prelude.False,
+         properties = ["AccountName" JSON..= accountName,
+                       "AccountPassword" JSON..= accountPassword]}
+instance JSON.ToJSON ServiceAccountCredentialsProperty where
+  toJSON ServiceAccountCredentialsProperty {..}
+    = JSON.object
+        ["AccountName" JSON..= accountName,
+         "AccountPassword" JSON..= accountPassword]
+instance Property "AccountName" ServiceAccountCredentialsProperty where
+  type PropertyType "AccountName" ServiceAccountCredentialsProperty = Value Prelude.Text
+  set newValue ServiceAccountCredentialsProperty {..}
+    = ServiceAccountCredentialsProperty {accountName = newValue, ..}
+instance Property "AccountPassword" ServiceAccountCredentialsProperty where
+  type PropertyType "AccountPassword" ServiceAccountCredentialsProperty = Value Prelude.Text
+  set newValue ServiceAccountCredentialsProperty {..}
+    = ServiceAccountCredentialsProperty
+        {accountPassword = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs-boot b/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/DirectoryConfig/ServiceAccountCredentialsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.DirectoryConfig.ServiceAccountCredentialsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ServiceAccountCredentialsProperty :: Prelude.Type
+instance ToResourceProperties ServiceAccountCredentialsProperty
+instance Prelude.Eq ServiceAccountCredentialsProperty
+instance Prelude.Show ServiceAccountCredentialsProperty
+instance JSON.ToJSON ServiceAccountCredentialsProperty
diff --git a/gen/Stratosphere/AppStream/Entitlement.hs b/gen/Stratosphere/AppStream/Entitlement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Entitlement.hs
@@ -0,0 +1,73 @@
+module Stratosphere.AppStream.Entitlement (
+        module Exports, Entitlement(..), mkEntitlement
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.Entitlement.AttributeProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data Entitlement
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html>
+    Entitlement {haddock_workaround_ :: (),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-appvisibility>
+                 appVisibility :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-attributes>
+                 attributes :: [AttributeProperty],
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-description>
+                 description :: (Prelude.Maybe (Value Prelude.Text)),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-name>
+                 name :: (Value Prelude.Text),
+                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-stackname>
+                 stackName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEntitlement ::
+  Value Prelude.Text
+  -> [AttributeProperty]
+     -> Value Prelude.Text -> Value Prelude.Text -> Entitlement
+mkEntitlement appVisibility attributes name stackName
+  = Entitlement
+      {haddock_workaround_ = (), appVisibility = appVisibility,
+       attributes = attributes, name = name, stackName = stackName,
+       description = Prelude.Nothing}
+instance ToResourceProperties Entitlement where
+  toResourceProperties Entitlement {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Entitlement",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["AppVisibility" JSON..= appVisibility,
+                            "Attributes" JSON..= attributes, "Name" JSON..= name,
+                            "StackName" JSON..= stackName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Description" Prelude.<$> description]))}
+instance JSON.ToJSON Entitlement where
+  toJSON Entitlement {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["AppVisibility" JSON..= appVisibility,
+               "Attributes" JSON..= attributes, "Name" JSON..= name,
+               "StackName" JSON..= stackName]
+              (Prelude.catMaybes
+                 [(JSON..=) "Description" Prelude.<$> description])))
+instance Property "AppVisibility" Entitlement where
+  type PropertyType "AppVisibility" Entitlement = Value Prelude.Text
+  set newValue Entitlement {..}
+    = Entitlement {appVisibility = newValue, ..}
+instance Property "Attributes" Entitlement where
+  type PropertyType "Attributes" Entitlement = [AttributeProperty]
+  set newValue Entitlement {..}
+    = Entitlement {attributes = newValue, ..}
+instance Property "Description" Entitlement where
+  type PropertyType "Description" Entitlement = Value Prelude.Text
+  set newValue Entitlement {..}
+    = Entitlement {description = Prelude.pure newValue, ..}
+instance Property "Name" Entitlement where
+  type PropertyType "Name" Entitlement = Value Prelude.Text
+  set newValue Entitlement {..} = Entitlement {name = newValue, ..}
+instance Property "StackName" Entitlement where
+  type PropertyType "StackName" Entitlement = Value Prelude.Text
+  set newValue Entitlement {..}
+    = Entitlement {stackName = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs b/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppStream.Entitlement.AttributeProperty (
+        AttributeProperty(..), mkAttributeProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AttributeProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html>
+    AttributeProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-name>
+                       name :: (Value Prelude.Text),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-value>
+                       value :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAttributeProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> AttributeProperty
+mkAttributeProperty name value
+  = AttributeProperty
+      {haddock_workaround_ = (), name = name, value = value}
+instance ToResourceProperties AttributeProperty where
+  toResourceProperties AttributeProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Entitlement.Attribute",
+         supportsTags = Prelude.False,
+         properties = ["Name" JSON..= name, "Value" JSON..= value]}
+instance JSON.ToJSON AttributeProperty where
+  toJSON AttributeProperty {..}
+    = JSON.object ["Name" JSON..= name, "Value" JSON..= value]
+instance Property "Name" AttributeProperty where
+  type PropertyType "Name" AttributeProperty = Value Prelude.Text
+  set newValue AttributeProperty {..}
+    = AttributeProperty {name = newValue, ..}
+instance Property "Value" AttributeProperty where
+  type PropertyType "Value" AttributeProperty = Value Prelude.Text
+  set newValue AttributeProperty {..}
+    = AttributeProperty {value = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs-boot b/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Entitlement/AttributeProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Entitlement.AttributeProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AttributeProperty :: Prelude.Type
+instance ToResourceProperties AttributeProperty
+instance Prelude.Eq AttributeProperty
+instance Prelude.Show AttributeProperty
+instance JSON.ToJSON AttributeProperty
diff --git a/gen/Stratosphere/AppStream/Fleet.hs b/gen/Stratosphere/AppStream/Fleet.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet.hs
@@ -0,0 +1,238 @@
+module Stratosphere.AppStream.Fleet (
+        module Exports, Fleet(..), mkFleet
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.Fleet.ComputeCapacityProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Fleet.DomainJoinInfoProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Fleet.S3LocationProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Fleet.VpcConfigProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Fleet
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html>
+    Fleet {haddock_workaround_ :: (),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-computecapacity>
+           computeCapacity :: (Prelude.Maybe ComputeCapacityProperty),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-description>
+           description :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-disconnecttimeoutinseconds>
+           disconnectTimeoutInSeconds :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-displayname>
+           displayName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-domainjoininfo>
+           domainJoinInfo :: (Prelude.Maybe DomainJoinInfoProperty),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-enabledefaultinternetaccess>
+           enableDefaultInternetAccess :: (Prelude.Maybe (Value Prelude.Bool)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-fleettype>
+           fleetType :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-iamrolearn>
+           iamRoleArn :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-idledisconnecttimeoutinseconds>
+           idleDisconnectTimeoutInSeconds :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-imagearn>
+           imageArn :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-imagename>
+           imageName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-instancetype>
+           instanceType :: (Value Prelude.Text),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxconcurrentsessions>
+           maxConcurrentSessions :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxsessionsperinstance>
+           maxSessionsPerInstance :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxuserdurationinseconds>
+           maxUserDurationInSeconds :: (Prelude.Maybe (Value Prelude.Integer)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-name>
+           name :: (Value Prelude.Text),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-platform>
+           platform :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-sessionscripts3location>
+           sessionScriptS3Location :: (Prelude.Maybe S3LocationProperty),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-streamview>
+           streamView :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-tags>
+           tags :: (Prelude.Maybe [Tag]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-usbdevicefilterstrings>
+           usbDeviceFilterStrings :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-vpcconfig>
+           vpcConfig :: (Prelude.Maybe VpcConfigProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkFleet :: Value Prelude.Text -> Value Prelude.Text -> Fleet
+mkFleet instanceType name
+  = Fleet
+      {haddock_workaround_ = (), instanceType = instanceType,
+       name = name, computeCapacity = Prelude.Nothing,
+       description = Prelude.Nothing,
+       disconnectTimeoutInSeconds = Prelude.Nothing,
+       displayName = Prelude.Nothing, domainJoinInfo = Prelude.Nothing,
+       enableDefaultInternetAccess = Prelude.Nothing,
+       fleetType = Prelude.Nothing, iamRoleArn = Prelude.Nothing,
+       idleDisconnectTimeoutInSeconds = Prelude.Nothing,
+       imageArn = Prelude.Nothing, imageName = Prelude.Nothing,
+       maxConcurrentSessions = Prelude.Nothing,
+       maxSessionsPerInstance = Prelude.Nothing,
+       maxUserDurationInSeconds = Prelude.Nothing,
+       platform = Prelude.Nothing,
+       sessionScriptS3Location = Prelude.Nothing,
+       streamView = Prelude.Nothing, tags = Prelude.Nothing,
+       usbDeviceFilterStrings = Prelude.Nothing,
+       vpcConfig = Prelude.Nothing}
+instance ToResourceProperties Fleet where
+  toResourceProperties Fleet {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Fleet", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["InstanceType" JSON..= instanceType, "Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "ComputeCapacity" Prelude.<$> computeCapacity,
+                               (JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "DisconnectTimeoutInSeconds"
+                                 Prelude.<$> disconnectTimeoutInSeconds,
+                               (JSON..=) "DisplayName" Prelude.<$> displayName,
+                               (JSON..=) "DomainJoinInfo" Prelude.<$> domainJoinInfo,
+                               (JSON..=) "EnableDefaultInternetAccess"
+                                 Prelude.<$> enableDefaultInternetAccess,
+                               (JSON..=) "FleetType" Prelude.<$> fleetType,
+                               (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                               (JSON..=) "IdleDisconnectTimeoutInSeconds"
+                                 Prelude.<$> idleDisconnectTimeoutInSeconds,
+                               (JSON..=) "ImageArn" Prelude.<$> imageArn,
+                               (JSON..=) "ImageName" Prelude.<$> imageName,
+                               (JSON..=) "MaxConcurrentSessions"
+                                 Prelude.<$> maxConcurrentSessions,
+                               (JSON..=) "MaxSessionsPerInstance"
+                                 Prelude.<$> maxSessionsPerInstance,
+                               (JSON..=) "MaxUserDurationInSeconds"
+                                 Prelude.<$> maxUserDurationInSeconds,
+                               (JSON..=) "Platform" Prelude.<$> platform,
+                               (JSON..=) "SessionScriptS3Location"
+                                 Prelude.<$> sessionScriptS3Location,
+                               (JSON..=) "StreamView" Prelude.<$> streamView,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "UsbDeviceFilterStrings"
+                                 Prelude.<$> usbDeviceFilterStrings,
+                               (JSON..=) "VpcConfig" Prelude.<$> vpcConfig]))}
+instance JSON.ToJSON Fleet where
+  toJSON Fleet {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["InstanceType" JSON..= instanceType, "Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "ComputeCapacity" Prelude.<$> computeCapacity,
+                  (JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "DisconnectTimeoutInSeconds"
+                    Prelude.<$> disconnectTimeoutInSeconds,
+                  (JSON..=) "DisplayName" Prelude.<$> displayName,
+                  (JSON..=) "DomainJoinInfo" Prelude.<$> domainJoinInfo,
+                  (JSON..=) "EnableDefaultInternetAccess"
+                    Prelude.<$> enableDefaultInternetAccess,
+                  (JSON..=) "FleetType" Prelude.<$> fleetType,
+                  (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                  (JSON..=) "IdleDisconnectTimeoutInSeconds"
+                    Prelude.<$> idleDisconnectTimeoutInSeconds,
+                  (JSON..=) "ImageArn" Prelude.<$> imageArn,
+                  (JSON..=) "ImageName" Prelude.<$> imageName,
+                  (JSON..=) "MaxConcurrentSessions"
+                    Prelude.<$> maxConcurrentSessions,
+                  (JSON..=) "MaxSessionsPerInstance"
+                    Prelude.<$> maxSessionsPerInstance,
+                  (JSON..=) "MaxUserDurationInSeconds"
+                    Prelude.<$> maxUserDurationInSeconds,
+                  (JSON..=) "Platform" Prelude.<$> platform,
+                  (JSON..=) "SessionScriptS3Location"
+                    Prelude.<$> sessionScriptS3Location,
+                  (JSON..=) "StreamView" Prelude.<$> streamView,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "UsbDeviceFilterStrings"
+                    Prelude.<$> usbDeviceFilterStrings,
+                  (JSON..=) "VpcConfig" Prelude.<$> vpcConfig])))
+instance Property "ComputeCapacity" Fleet where
+  type PropertyType "ComputeCapacity" Fleet = ComputeCapacityProperty
+  set newValue Fleet {..}
+    = Fleet {computeCapacity = Prelude.pure newValue, ..}
+instance Property "Description" Fleet where
+  type PropertyType "Description" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {description = Prelude.pure newValue, ..}
+instance Property "DisconnectTimeoutInSeconds" Fleet where
+  type PropertyType "DisconnectTimeoutInSeconds" Fleet = Value Prelude.Integer
+  set newValue Fleet {..}
+    = Fleet {disconnectTimeoutInSeconds = Prelude.pure newValue, ..}
+instance Property "DisplayName" Fleet where
+  type PropertyType "DisplayName" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {displayName = Prelude.pure newValue, ..}
+instance Property "DomainJoinInfo" Fleet where
+  type PropertyType "DomainJoinInfo" Fleet = DomainJoinInfoProperty
+  set newValue Fleet {..}
+    = Fleet {domainJoinInfo = Prelude.pure newValue, ..}
+instance Property "EnableDefaultInternetAccess" Fleet where
+  type PropertyType "EnableDefaultInternetAccess" Fleet = Value Prelude.Bool
+  set newValue Fleet {..}
+    = Fleet {enableDefaultInternetAccess = Prelude.pure newValue, ..}
+instance Property "FleetType" Fleet where
+  type PropertyType "FleetType" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {fleetType = Prelude.pure newValue, ..}
+instance Property "IamRoleArn" Fleet where
+  type PropertyType "IamRoleArn" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {iamRoleArn = Prelude.pure newValue, ..}
+instance Property "IdleDisconnectTimeoutInSeconds" Fleet where
+  type PropertyType "IdleDisconnectTimeoutInSeconds" Fleet = Value Prelude.Integer
+  set newValue Fleet {..}
+    = Fleet
+        {idleDisconnectTimeoutInSeconds = Prelude.pure newValue, ..}
+instance Property "ImageArn" Fleet where
+  type PropertyType "ImageArn" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {imageArn = Prelude.pure newValue, ..}
+instance Property "ImageName" Fleet where
+  type PropertyType "ImageName" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {imageName = Prelude.pure newValue, ..}
+instance Property "InstanceType" Fleet where
+  type PropertyType "InstanceType" Fleet = Value Prelude.Text
+  set newValue Fleet {..} = Fleet {instanceType = newValue, ..}
+instance Property "MaxConcurrentSessions" Fleet where
+  type PropertyType "MaxConcurrentSessions" Fleet = Value Prelude.Integer
+  set newValue Fleet {..}
+    = Fleet {maxConcurrentSessions = Prelude.pure newValue, ..}
+instance Property "MaxSessionsPerInstance" Fleet where
+  type PropertyType "MaxSessionsPerInstance" Fleet = Value Prelude.Integer
+  set newValue Fleet {..}
+    = Fleet {maxSessionsPerInstance = Prelude.pure newValue, ..}
+instance Property "MaxUserDurationInSeconds" Fleet where
+  type PropertyType "MaxUserDurationInSeconds" Fleet = Value Prelude.Integer
+  set newValue Fleet {..}
+    = Fleet {maxUserDurationInSeconds = Prelude.pure newValue, ..}
+instance Property "Name" Fleet where
+  type PropertyType "Name" Fleet = Value Prelude.Text
+  set newValue Fleet {..} = Fleet {name = newValue, ..}
+instance Property "Platform" Fleet where
+  type PropertyType "Platform" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {platform = Prelude.pure newValue, ..}
+instance Property "SessionScriptS3Location" Fleet where
+  type PropertyType "SessionScriptS3Location" Fleet = S3LocationProperty
+  set newValue Fleet {..}
+    = Fleet {sessionScriptS3Location = Prelude.pure newValue, ..}
+instance Property "StreamView" Fleet where
+  type PropertyType "StreamView" Fleet = Value Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {streamView = Prelude.pure newValue, ..}
+instance Property "Tags" Fleet where
+  type PropertyType "Tags" Fleet = [Tag]
+  set newValue Fleet {..} = Fleet {tags = Prelude.pure newValue, ..}
+instance Property "UsbDeviceFilterStrings" Fleet where
+  type PropertyType "UsbDeviceFilterStrings" Fleet = ValueList Prelude.Text
+  set newValue Fleet {..}
+    = Fleet {usbDeviceFilterStrings = Prelude.pure newValue, ..}
+instance Property "VpcConfig" Fleet where
+  type PropertyType "VpcConfig" Fleet = VpcConfigProperty
+  set newValue Fleet {..}
+    = Fleet {vpcConfig = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs b/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs
@@ -0,0 +1,47 @@
+module Stratosphere.AppStream.Fleet.ComputeCapacityProperty (
+        ComputeCapacityProperty(..), mkComputeCapacityProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ComputeCapacityProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-computecapacity.html>
+    ComputeCapacityProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-computecapacity.html#cfn-appstream-fleet-computecapacity-desiredinstances>
+                             desiredInstances :: (Prelude.Maybe (Value Prelude.Integer)),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-computecapacity.html#cfn-appstream-fleet-computecapacity-desiredsessions>
+                             desiredSessions :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkComputeCapacityProperty :: ComputeCapacityProperty
+mkComputeCapacityProperty
+  = ComputeCapacityProperty
+      {haddock_workaround_ = (), desiredInstances = Prelude.Nothing,
+       desiredSessions = Prelude.Nothing}
+instance ToResourceProperties ComputeCapacityProperty where
+  toResourceProperties ComputeCapacityProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Fleet.ComputeCapacity",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DesiredInstances" Prelude.<$> desiredInstances,
+                            (JSON..=) "DesiredSessions" Prelude.<$> desiredSessions])}
+instance JSON.ToJSON ComputeCapacityProperty where
+  toJSON ComputeCapacityProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DesiredInstances" Prelude.<$> desiredInstances,
+               (JSON..=) "DesiredSessions" Prelude.<$> desiredSessions]))
+instance Property "DesiredInstances" ComputeCapacityProperty where
+  type PropertyType "DesiredInstances" ComputeCapacityProperty = Value Prelude.Integer
+  set newValue ComputeCapacityProperty {..}
+    = ComputeCapacityProperty
+        {desiredInstances = Prelude.pure newValue, ..}
+instance Property "DesiredSessions" ComputeCapacityProperty where
+  type PropertyType "DesiredSessions" ComputeCapacityProperty = Value Prelude.Integer
+  set newValue ComputeCapacityProperty {..}
+    = ComputeCapacityProperty
+        {desiredSessions = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs-boot b/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/ComputeCapacityProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Fleet.ComputeCapacityProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ComputeCapacityProperty :: Prelude.Type
+instance ToResourceProperties ComputeCapacityProperty
+instance Prelude.Eq ComputeCapacityProperty
+instance Prelude.Show ComputeCapacityProperty
+instance JSON.ToJSON ComputeCapacityProperty
diff --git a/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs b/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppStream.Fleet.DomainJoinInfoProperty (
+        DomainJoinInfoProperty(..), mkDomainJoinInfoProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DomainJoinInfoProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html>
+    DomainJoinInfoProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html#cfn-appstream-fleet-domainjoininfo-directoryname>
+                            directoryName :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html#cfn-appstream-fleet-domainjoininfo-organizationalunitdistinguishedname>
+                            organizationalUnitDistinguishedName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDomainJoinInfoProperty :: DomainJoinInfoProperty
+mkDomainJoinInfoProperty
+  = DomainJoinInfoProperty
+      {haddock_workaround_ = (), directoryName = Prelude.Nothing,
+       organizationalUnitDistinguishedName = Prelude.Nothing}
+instance ToResourceProperties DomainJoinInfoProperty where
+  toResourceProperties DomainJoinInfoProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Fleet.DomainJoinInfo",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DirectoryName" Prelude.<$> directoryName,
+                            (JSON..=) "OrganizationalUnitDistinguishedName"
+                              Prelude.<$> organizationalUnitDistinguishedName])}
+instance JSON.ToJSON DomainJoinInfoProperty where
+  toJSON DomainJoinInfoProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DirectoryName" Prelude.<$> directoryName,
+               (JSON..=) "OrganizationalUnitDistinguishedName"
+                 Prelude.<$> organizationalUnitDistinguishedName]))
+instance Property "DirectoryName" DomainJoinInfoProperty where
+  type PropertyType "DirectoryName" DomainJoinInfoProperty = Value Prelude.Text
+  set newValue DomainJoinInfoProperty {..}
+    = DomainJoinInfoProperty
+        {directoryName = Prelude.pure newValue, ..}
+instance Property "OrganizationalUnitDistinguishedName" DomainJoinInfoProperty where
+  type PropertyType "OrganizationalUnitDistinguishedName" DomainJoinInfoProperty = Value Prelude.Text
+  set newValue DomainJoinInfoProperty {..}
+    = DomainJoinInfoProperty
+        {organizationalUnitDistinguishedName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs-boot b/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/DomainJoinInfoProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Fleet.DomainJoinInfoProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DomainJoinInfoProperty :: Prelude.Type
+instance ToResourceProperties DomainJoinInfoProperty
+instance Prelude.Eq DomainJoinInfoProperty
+instance Prelude.Show DomainJoinInfoProperty
+instance JSON.ToJSON DomainJoinInfoProperty
diff --git a/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs b/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs
@@ -0,0 +1,38 @@
+module Stratosphere.AppStream.Fleet.S3LocationProperty (
+        S3LocationProperty(..), mkS3LocationProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data S3LocationProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html>
+    S3LocationProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html#cfn-appstream-fleet-s3location-s3bucket>
+                        s3Bucket :: (Value Prelude.Text),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html#cfn-appstream-fleet-s3location-s3key>
+                        s3Key :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkS3LocationProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> S3LocationProperty
+mkS3LocationProperty s3Bucket s3Key
+  = S3LocationProperty
+      {haddock_workaround_ = (), s3Bucket = s3Bucket, s3Key = s3Key}
+instance ToResourceProperties S3LocationProperty where
+  toResourceProperties S3LocationProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Fleet.S3Location",
+         supportsTags = Prelude.False,
+         properties = ["S3Bucket" JSON..= s3Bucket, "S3Key" JSON..= s3Key]}
+instance JSON.ToJSON S3LocationProperty where
+  toJSON S3LocationProperty {..}
+    = JSON.object ["S3Bucket" JSON..= s3Bucket, "S3Key" JSON..= s3Key]
+instance Property "S3Bucket" S3LocationProperty where
+  type PropertyType "S3Bucket" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Bucket = newValue, ..}
+instance Property "S3Key" S3LocationProperty where
+  type PropertyType "S3Key" S3LocationProperty = Value Prelude.Text
+  set newValue S3LocationProperty {..}
+    = S3LocationProperty {s3Key = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs-boot b/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/S3LocationProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Fleet.S3LocationProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data S3LocationProperty :: Prelude.Type
+instance ToResourceProperties S3LocationProperty
+instance Prelude.Eq S3LocationProperty
+instance Prelude.Show S3LocationProperty
+instance JSON.ToJSON S3LocationProperty
diff --git a/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs b/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppStream.Fleet.VpcConfigProperty (
+        VpcConfigProperty(..), mkVpcConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VpcConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html>
+    VpcConfigProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html#cfn-appstream-fleet-vpcconfig-securitygroupids>
+                       securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html#cfn-appstream-fleet-vpcconfig-subnetids>
+                       subnetIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVpcConfigProperty :: VpcConfigProperty
+mkVpcConfigProperty
+  = VpcConfigProperty
+      {haddock_workaround_ = (), securityGroupIds = Prelude.Nothing,
+       subnetIds = Prelude.Nothing}
+instance ToResourceProperties VpcConfigProperty where
+  toResourceProperties VpcConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Fleet.VpcConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                            (JSON..=) "SubnetIds" Prelude.<$> subnetIds])}
+instance JSON.ToJSON VpcConfigProperty where
+  toJSON VpcConfigProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+               (JSON..=) "SubnetIds" Prelude.<$> subnetIds]))
+instance Property "SecurityGroupIds" VpcConfigProperty where
+  type PropertyType "SecurityGroupIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "SubnetIds" VpcConfigProperty where
+  type PropertyType "SubnetIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {subnetIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs-boot b/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Fleet/VpcConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Fleet.VpcConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VpcConfigProperty :: Prelude.Type
+instance ToResourceProperties VpcConfigProperty
+instance Prelude.Eq VpcConfigProperty
+instance Prelude.Show VpcConfigProperty
+instance JSON.ToJSON VpcConfigProperty
diff --git a/gen/Stratosphere/AppStream/ImageBuilder.hs b/gen/Stratosphere/AppStream/ImageBuilder.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder.hs
@@ -0,0 +1,149 @@
+module Stratosphere.AppStream.ImageBuilder (
+        module Exports, ImageBuilder(..), mkImageBuilder
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.ImageBuilder.AccessEndpointProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.ImageBuilder.DomainJoinInfoProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.ImageBuilder.VpcConfigProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data ImageBuilder
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html>
+    ImageBuilder {haddock_workaround_ :: (),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-accessendpoints>
+                  accessEndpoints :: (Prelude.Maybe [AccessEndpointProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-appstreamagentversion>
+                  appstreamAgentVersion :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-description>
+                  description :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-displayname>
+                  displayName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-domainjoininfo>
+                  domainJoinInfo :: (Prelude.Maybe DomainJoinInfoProperty),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-enabledefaultinternetaccess>
+                  enableDefaultInternetAccess :: (Prelude.Maybe (Value Prelude.Bool)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-iamrolearn>
+                  iamRoleArn :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-imagearn>
+                  imageArn :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-imagename>
+                  imageName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-instancetype>
+                  instanceType :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-name>
+                  name :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-tags>
+                  tags :: (Prelude.Maybe [Tag]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-vpcconfig>
+                  vpcConfig :: (Prelude.Maybe VpcConfigProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkImageBuilder ::
+  Value Prelude.Text -> Value Prelude.Text -> ImageBuilder
+mkImageBuilder instanceType name
+  = ImageBuilder
+      {haddock_workaround_ = (), instanceType = instanceType,
+       name = name, accessEndpoints = Prelude.Nothing,
+       appstreamAgentVersion = Prelude.Nothing,
+       description = Prelude.Nothing, displayName = Prelude.Nothing,
+       domainJoinInfo = Prelude.Nothing,
+       enableDefaultInternetAccess = Prelude.Nothing,
+       iamRoleArn = Prelude.Nothing, imageArn = Prelude.Nothing,
+       imageName = Prelude.Nothing, tags = Prelude.Nothing,
+       vpcConfig = Prelude.Nothing}
+instance ToResourceProperties ImageBuilder where
+  toResourceProperties ImageBuilder {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ImageBuilder",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["InstanceType" JSON..= instanceType, "Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+                               (JSON..=) "AppstreamAgentVersion"
+                                 Prelude.<$> appstreamAgentVersion,
+                               (JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "DisplayName" Prelude.<$> displayName,
+                               (JSON..=) "DomainJoinInfo" Prelude.<$> domainJoinInfo,
+                               (JSON..=) "EnableDefaultInternetAccess"
+                                 Prelude.<$> enableDefaultInternetAccess,
+                               (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                               (JSON..=) "ImageArn" Prelude.<$> imageArn,
+                               (JSON..=) "ImageName" Prelude.<$> imageName,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "VpcConfig" Prelude.<$> vpcConfig]))}
+instance JSON.ToJSON ImageBuilder where
+  toJSON ImageBuilder {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["InstanceType" JSON..= instanceType, "Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+                  (JSON..=) "AppstreamAgentVersion"
+                    Prelude.<$> appstreamAgentVersion,
+                  (JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "DisplayName" Prelude.<$> displayName,
+                  (JSON..=) "DomainJoinInfo" Prelude.<$> domainJoinInfo,
+                  (JSON..=) "EnableDefaultInternetAccess"
+                    Prelude.<$> enableDefaultInternetAccess,
+                  (JSON..=) "IamRoleArn" Prelude.<$> iamRoleArn,
+                  (JSON..=) "ImageArn" Prelude.<$> imageArn,
+                  (JSON..=) "ImageName" Prelude.<$> imageName,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "VpcConfig" Prelude.<$> vpcConfig])))
+instance Property "AccessEndpoints" ImageBuilder where
+  type PropertyType "AccessEndpoints" ImageBuilder = [AccessEndpointProperty]
+  set newValue ImageBuilder {..}
+    = ImageBuilder {accessEndpoints = Prelude.pure newValue, ..}
+instance Property "AppstreamAgentVersion" ImageBuilder where
+  type PropertyType "AppstreamAgentVersion" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {appstreamAgentVersion = Prelude.pure newValue, ..}
+instance Property "Description" ImageBuilder where
+  type PropertyType "Description" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {description = Prelude.pure newValue, ..}
+instance Property "DisplayName" ImageBuilder where
+  type PropertyType "DisplayName" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {displayName = Prelude.pure newValue, ..}
+instance Property "DomainJoinInfo" ImageBuilder where
+  type PropertyType "DomainJoinInfo" ImageBuilder = DomainJoinInfoProperty
+  set newValue ImageBuilder {..}
+    = ImageBuilder {domainJoinInfo = Prelude.pure newValue, ..}
+instance Property "EnableDefaultInternetAccess" ImageBuilder where
+  type PropertyType "EnableDefaultInternetAccess" ImageBuilder = Value Prelude.Bool
+  set newValue ImageBuilder {..}
+    = ImageBuilder
+        {enableDefaultInternetAccess = Prelude.pure newValue, ..}
+instance Property "IamRoleArn" ImageBuilder where
+  type PropertyType "IamRoleArn" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {iamRoleArn = Prelude.pure newValue, ..}
+instance Property "ImageArn" ImageBuilder where
+  type PropertyType "ImageArn" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {imageArn = Prelude.pure newValue, ..}
+instance Property "ImageName" ImageBuilder where
+  type PropertyType "ImageName" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {imageName = Prelude.pure newValue, ..}
+instance Property "InstanceType" ImageBuilder where
+  type PropertyType "InstanceType" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..}
+    = ImageBuilder {instanceType = newValue, ..}
+instance Property "Name" ImageBuilder where
+  type PropertyType "Name" ImageBuilder = Value Prelude.Text
+  set newValue ImageBuilder {..} = ImageBuilder {name = newValue, ..}
+instance Property "Tags" ImageBuilder where
+  type PropertyType "Tags" ImageBuilder = [Tag]
+  set newValue ImageBuilder {..}
+    = ImageBuilder {tags = Prelude.pure newValue, ..}
+instance Property "VpcConfig" ImageBuilder where
+  type PropertyType "VpcConfig" ImageBuilder = VpcConfigProperty
+  set newValue ImageBuilder {..}
+    = ImageBuilder {vpcConfig = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs b/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppStream.ImageBuilder.AccessEndpointProperty (
+        AccessEndpointProperty(..), mkAccessEndpointProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AccessEndpointProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html>
+    AccessEndpointProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html#cfn-appstream-imagebuilder-accessendpoint-endpointtype>
+                            endpointType :: (Value Prelude.Text),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html#cfn-appstream-imagebuilder-accessendpoint-vpceid>
+                            vpceId :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAccessEndpointProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> AccessEndpointProperty
+mkAccessEndpointProperty endpointType vpceId
+  = AccessEndpointProperty
+      {haddock_workaround_ = (), endpointType = endpointType,
+       vpceId = vpceId}
+instance ToResourceProperties AccessEndpointProperty where
+  toResourceProperties AccessEndpointProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ImageBuilder.AccessEndpoint",
+         supportsTags = Prelude.False,
+         properties = ["EndpointType" JSON..= endpointType,
+                       "VpceId" JSON..= vpceId]}
+instance JSON.ToJSON AccessEndpointProperty where
+  toJSON AccessEndpointProperty {..}
+    = JSON.object
+        ["EndpointType" JSON..= endpointType, "VpceId" JSON..= vpceId]
+instance Property "EndpointType" AccessEndpointProperty where
+  type PropertyType "EndpointType" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {endpointType = newValue, ..}
+instance Property "VpceId" AccessEndpointProperty where
+  type PropertyType "VpceId" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {vpceId = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs-boot b/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/AccessEndpointProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.ImageBuilder.AccessEndpointProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AccessEndpointProperty :: Prelude.Type
+instance ToResourceProperties AccessEndpointProperty
+instance Prelude.Eq AccessEndpointProperty
+instance Prelude.Show AccessEndpointProperty
+instance JSON.ToJSON AccessEndpointProperty
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs b/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppStream.ImageBuilder.DomainJoinInfoProperty (
+        DomainJoinInfoProperty(..), mkDomainJoinInfoProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DomainJoinInfoProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html>
+    DomainJoinInfoProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html#cfn-appstream-imagebuilder-domainjoininfo-directoryname>
+                            directoryName :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html#cfn-appstream-imagebuilder-domainjoininfo-organizationalunitdistinguishedname>
+                            organizationalUnitDistinguishedName :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDomainJoinInfoProperty :: DomainJoinInfoProperty
+mkDomainJoinInfoProperty
+  = DomainJoinInfoProperty
+      {haddock_workaround_ = (), directoryName = Prelude.Nothing,
+       organizationalUnitDistinguishedName = Prelude.Nothing}
+instance ToResourceProperties DomainJoinInfoProperty where
+  toResourceProperties DomainJoinInfoProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ImageBuilder.DomainJoinInfo",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "DirectoryName" Prelude.<$> directoryName,
+                            (JSON..=) "OrganizationalUnitDistinguishedName"
+                              Prelude.<$> organizationalUnitDistinguishedName])}
+instance JSON.ToJSON DomainJoinInfoProperty where
+  toJSON DomainJoinInfoProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "DirectoryName" Prelude.<$> directoryName,
+               (JSON..=) "OrganizationalUnitDistinguishedName"
+                 Prelude.<$> organizationalUnitDistinguishedName]))
+instance Property "DirectoryName" DomainJoinInfoProperty where
+  type PropertyType "DirectoryName" DomainJoinInfoProperty = Value Prelude.Text
+  set newValue DomainJoinInfoProperty {..}
+    = DomainJoinInfoProperty
+        {directoryName = Prelude.pure newValue, ..}
+instance Property "OrganizationalUnitDistinguishedName" DomainJoinInfoProperty where
+  type PropertyType "OrganizationalUnitDistinguishedName" DomainJoinInfoProperty = Value Prelude.Text
+  set newValue DomainJoinInfoProperty {..}
+    = DomainJoinInfoProperty
+        {organizationalUnitDistinguishedName = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs-boot b/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/DomainJoinInfoProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.ImageBuilder.DomainJoinInfoProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DomainJoinInfoProperty :: Prelude.Type
+instance ToResourceProperties DomainJoinInfoProperty
+instance Prelude.Eq DomainJoinInfoProperty
+instance Prelude.Show DomainJoinInfoProperty
+instance JSON.ToJSON DomainJoinInfoProperty
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs b/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.AppStream.ImageBuilder.VpcConfigProperty (
+        VpcConfigProperty(..), mkVpcConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VpcConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html>
+    VpcConfigProperty {haddock_workaround_ :: (),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html#cfn-appstream-imagebuilder-vpcconfig-securitygroupids>
+                       securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                       -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html#cfn-appstream-imagebuilder-vpcconfig-subnetids>
+                       subnetIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVpcConfigProperty :: VpcConfigProperty
+mkVpcConfigProperty
+  = VpcConfigProperty
+      {haddock_workaround_ = (), securityGroupIds = Prelude.Nothing,
+       subnetIds = Prelude.Nothing}
+instance ToResourceProperties VpcConfigProperty where
+  toResourceProperties VpcConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::ImageBuilder.VpcConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                            (JSON..=) "SubnetIds" Prelude.<$> subnetIds])}
+instance JSON.ToJSON VpcConfigProperty where
+  toJSON VpcConfigProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+               (JSON..=) "SubnetIds" Prelude.<$> subnetIds]))
+instance Property "SecurityGroupIds" VpcConfigProperty where
+  type PropertyType "SecurityGroupIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "SubnetIds" VpcConfigProperty where
+  type PropertyType "SubnetIds" VpcConfigProperty = ValueList Prelude.Text
+  set newValue VpcConfigProperty {..}
+    = VpcConfigProperty {subnetIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs-boot b/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/ImageBuilder/VpcConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.ImageBuilder.VpcConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VpcConfigProperty :: Prelude.Type
+instance ToResourceProperties VpcConfigProperty
+instance Prelude.Eq VpcConfigProperty
+instance Prelude.Show VpcConfigProperty
+instance JSON.ToJSON VpcConfigProperty
diff --git a/gen/Stratosphere/AppStream/Stack.hs b/gen/Stratosphere/AppStream/Stack.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack.hs
@@ -0,0 +1,156 @@
+module Stratosphere.AppStream.Stack (
+        module Exports, Stack(..), mkStack
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.AppStream.Stack.AccessEndpointProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Stack.ApplicationSettingsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Stack.StorageConnectorProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Stack.StreamingExperienceSettingsProperty as Exports
+import {-# SOURCE #-} Stratosphere.AppStream.Stack.UserSettingProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Stack
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html>
+    Stack {haddock_workaround_ :: (),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-accessendpoints>
+           accessEndpoints :: (Prelude.Maybe [AccessEndpointProperty]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-applicationsettings>
+           applicationSettings :: (Prelude.Maybe ApplicationSettingsProperty),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-attributestodelete>
+           attributesToDelete :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-deletestorageconnectors>
+           deleteStorageConnectors :: (Prelude.Maybe (Value Prelude.Bool)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-description>
+           description :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-displayname>
+           displayName :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-embedhostdomains>
+           embedHostDomains :: (Prelude.Maybe (ValueList Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-feedbackurl>
+           feedbackURL :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-name>
+           name :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-redirecturl>
+           redirectURL :: (Prelude.Maybe (Value Prelude.Text)),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-storageconnectors>
+           storageConnectors :: (Prelude.Maybe [StorageConnectorProperty]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-streamingexperiencesettings>
+           streamingExperienceSettings :: (Prelude.Maybe StreamingExperienceSettingsProperty),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-tags>
+           tags :: (Prelude.Maybe [Tag]),
+           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-usersettings>
+           userSettings :: (Prelude.Maybe [UserSettingProperty])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkStack :: Stack
+mkStack
+  = Stack
+      {haddock_workaround_ = (), accessEndpoints = Prelude.Nothing,
+       applicationSettings = Prelude.Nothing,
+       attributesToDelete = Prelude.Nothing,
+       deleteStorageConnectors = Prelude.Nothing,
+       description = Prelude.Nothing, displayName = Prelude.Nothing,
+       embedHostDomains = Prelude.Nothing, feedbackURL = Prelude.Nothing,
+       name = Prelude.Nothing, redirectURL = Prelude.Nothing,
+       storageConnectors = Prelude.Nothing,
+       streamingExperienceSettings = Prelude.Nothing,
+       tags = Prelude.Nothing, userSettings = Prelude.Nothing}
+instance ToResourceProperties Stack where
+  toResourceProperties Stack {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack", supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+                            (JSON..=) "ApplicationSettings" Prelude.<$> applicationSettings,
+                            (JSON..=) "AttributesToDelete" Prelude.<$> attributesToDelete,
+                            (JSON..=) "DeleteStorageConnectors"
+                              Prelude.<$> deleteStorageConnectors,
+                            (JSON..=) "Description" Prelude.<$> description,
+                            (JSON..=) "DisplayName" Prelude.<$> displayName,
+                            (JSON..=) "EmbedHostDomains" Prelude.<$> embedHostDomains,
+                            (JSON..=) "FeedbackURL" Prelude.<$> feedbackURL,
+                            (JSON..=) "Name" Prelude.<$> name,
+                            (JSON..=) "RedirectURL" Prelude.<$> redirectURL,
+                            (JSON..=) "StorageConnectors" Prelude.<$> storageConnectors,
+                            (JSON..=) "StreamingExperienceSettings"
+                              Prelude.<$> streamingExperienceSettings,
+                            (JSON..=) "Tags" Prelude.<$> tags,
+                            (JSON..=) "UserSettings" Prelude.<$> userSettings])}
+instance JSON.ToJSON Stack where
+  toJSON Stack {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AccessEndpoints" Prelude.<$> accessEndpoints,
+               (JSON..=) "ApplicationSettings" Prelude.<$> applicationSettings,
+               (JSON..=) "AttributesToDelete" Prelude.<$> attributesToDelete,
+               (JSON..=) "DeleteStorageConnectors"
+                 Prelude.<$> deleteStorageConnectors,
+               (JSON..=) "Description" Prelude.<$> description,
+               (JSON..=) "DisplayName" Prelude.<$> displayName,
+               (JSON..=) "EmbedHostDomains" Prelude.<$> embedHostDomains,
+               (JSON..=) "FeedbackURL" Prelude.<$> feedbackURL,
+               (JSON..=) "Name" Prelude.<$> name,
+               (JSON..=) "RedirectURL" Prelude.<$> redirectURL,
+               (JSON..=) "StorageConnectors" Prelude.<$> storageConnectors,
+               (JSON..=) "StreamingExperienceSettings"
+                 Prelude.<$> streamingExperienceSettings,
+               (JSON..=) "Tags" Prelude.<$> tags,
+               (JSON..=) "UserSettings" Prelude.<$> userSettings]))
+instance Property "AccessEndpoints" Stack where
+  type PropertyType "AccessEndpoints" Stack = [AccessEndpointProperty]
+  set newValue Stack {..}
+    = Stack {accessEndpoints = Prelude.pure newValue, ..}
+instance Property "ApplicationSettings" Stack where
+  type PropertyType "ApplicationSettings" Stack = ApplicationSettingsProperty
+  set newValue Stack {..}
+    = Stack {applicationSettings = Prelude.pure newValue, ..}
+instance Property "AttributesToDelete" Stack where
+  type PropertyType "AttributesToDelete" Stack = ValueList Prelude.Text
+  set newValue Stack {..}
+    = Stack {attributesToDelete = Prelude.pure newValue, ..}
+instance Property "DeleteStorageConnectors" Stack where
+  type PropertyType "DeleteStorageConnectors" Stack = Value Prelude.Bool
+  set newValue Stack {..}
+    = Stack {deleteStorageConnectors = Prelude.pure newValue, ..}
+instance Property "Description" Stack where
+  type PropertyType "Description" Stack = Value Prelude.Text
+  set newValue Stack {..}
+    = Stack {description = Prelude.pure newValue, ..}
+instance Property "DisplayName" Stack where
+  type PropertyType "DisplayName" Stack = Value Prelude.Text
+  set newValue Stack {..}
+    = Stack {displayName = Prelude.pure newValue, ..}
+instance Property "EmbedHostDomains" Stack where
+  type PropertyType "EmbedHostDomains" Stack = ValueList Prelude.Text
+  set newValue Stack {..}
+    = Stack {embedHostDomains = Prelude.pure newValue, ..}
+instance Property "FeedbackURL" Stack where
+  type PropertyType "FeedbackURL" Stack = Value Prelude.Text
+  set newValue Stack {..}
+    = Stack {feedbackURL = Prelude.pure newValue, ..}
+instance Property "Name" Stack where
+  type PropertyType "Name" Stack = Value Prelude.Text
+  set newValue Stack {..} = Stack {name = Prelude.pure newValue, ..}
+instance Property "RedirectURL" Stack where
+  type PropertyType "RedirectURL" Stack = Value Prelude.Text
+  set newValue Stack {..}
+    = Stack {redirectURL = Prelude.pure newValue, ..}
+instance Property "StorageConnectors" Stack where
+  type PropertyType "StorageConnectors" Stack = [StorageConnectorProperty]
+  set newValue Stack {..}
+    = Stack {storageConnectors = Prelude.pure newValue, ..}
+instance Property "StreamingExperienceSettings" Stack where
+  type PropertyType "StreamingExperienceSettings" Stack = StreamingExperienceSettingsProperty
+  set newValue Stack {..}
+    = Stack {streamingExperienceSettings = Prelude.pure newValue, ..}
+instance Property "Tags" Stack where
+  type PropertyType "Tags" Stack = [Tag]
+  set newValue Stack {..} = Stack {tags = Prelude.pure newValue, ..}
+instance Property "UserSettings" Stack where
+  type PropertyType "UserSettings" Stack = [UserSettingProperty]
+  set newValue Stack {..}
+    = Stack {userSettings = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs b/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppStream.Stack.AccessEndpointProperty (
+        AccessEndpointProperty(..), mkAccessEndpointProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AccessEndpointProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html>
+    AccessEndpointProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html#cfn-appstream-stack-accessendpoint-endpointtype>
+                            endpointType :: (Value Prelude.Text),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html#cfn-appstream-stack-accessendpoint-vpceid>
+                            vpceId :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAccessEndpointProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> AccessEndpointProperty
+mkAccessEndpointProperty endpointType vpceId
+  = AccessEndpointProperty
+      {haddock_workaround_ = (), endpointType = endpointType,
+       vpceId = vpceId}
+instance ToResourceProperties AccessEndpointProperty where
+  toResourceProperties AccessEndpointProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack.AccessEndpoint",
+         supportsTags = Prelude.False,
+         properties = ["EndpointType" JSON..= endpointType,
+                       "VpceId" JSON..= vpceId]}
+instance JSON.ToJSON AccessEndpointProperty where
+  toJSON AccessEndpointProperty {..}
+    = JSON.object
+        ["EndpointType" JSON..= endpointType, "VpceId" JSON..= vpceId]
+instance Property "EndpointType" AccessEndpointProperty where
+  type PropertyType "EndpointType" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {endpointType = newValue, ..}
+instance Property "VpceId" AccessEndpointProperty where
+  type PropertyType "VpceId" AccessEndpointProperty = Value Prelude.Text
+  set newValue AccessEndpointProperty {..}
+    = AccessEndpointProperty {vpceId = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs-boot b/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/AccessEndpointProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Stack.AccessEndpointProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AccessEndpointProperty :: Prelude.Type
+instance ToResourceProperties AccessEndpointProperty
+instance Prelude.Eq AccessEndpointProperty
+instance Prelude.Show AccessEndpointProperty
+instance JSON.ToJSON AccessEndpointProperty
diff --git a/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs b/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.AppStream.Stack.ApplicationSettingsProperty (
+        ApplicationSettingsProperty(..), mkApplicationSettingsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ApplicationSettingsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html>
+    ApplicationSettingsProperty {haddock_workaround_ :: (),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html#cfn-appstream-stack-applicationsettings-enabled>
+                                 enabled :: (Value Prelude.Bool),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html#cfn-appstream-stack-applicationsettings-settingsgroup>
+                                 settingsGroup :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkApplicationSettingsProperty ::
+  Value Prelude.Bool -> ApplicationSettingsProperty
+mkApplicationSettingsProperty enabled
+  = ApplicationSettingsProperty
+      {haddock_workaround_ = (), enabled = enabled,
+       settingsGroup = Prelude.Nothing}
+instance ToResourceProperties ApplicationSettingsProperty where
+  toResourceProperties ApplicationSettingsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack.ApplicationSettings",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Enabled" JSON..= enabled]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SettingsGroup" Prelude.<$> settingsGroup]))}
+instance JSON.ToJSON ApplicationSettingsProperty where
+  toJSON ApplicationSettingsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Enabled" JSON..= enabled]
+              (Prelude.catMaybes
+                 [(JSON..=) "SettingsGroup" Prelude.<$> settingsGroup])))
+instance Property "Enabled" ApplicationSettingsProperty where
+  type PropertyType "Enabled" ApplicationSettingsProperty = Value Prelude.Bool
+  set newValue ApplicationSettingsProperty {..}
+    = ApplicationSettingsProperty {enabled = newValue, ..}
+instance Property "SettingsGroup" ApplicationSettingsProperty where
+  type PropertyType "SettingsGroup" ApplicationSettingsProperty = Value Prelude.Text
+  set newValue ApplicationSettingsProperty {..}
+    = ApplicationSettingsProperty
+        {settingsGroup = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs-boot b/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/ApplicationSettingsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Stack.ApplicationSettingsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ApplicationSettingsProperty :: Prelude.Type
+instance ToResourceProperties ApplicationSettingsProperty
+instance Prelude.Eq ApplicationSettingsProperty
+instance Prelude.Show ApplicationSettingsProperty
+instance JSON.ToJSON ApplicationSettingsProperty
diff --git a/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs b/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs
@@ -0,0 +1,57 @@
+module Stratosphere.AppStream.Stack.StorageConnectorProperty (
+        StorageConnectorProperty(..), mkStorageConnectorProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data StorageConnectorProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html>
+    StorageConnectorProperty {haddock_workaround_ :: (),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-connectortype>
+                              connectorType :: (Value Prelude.Text),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-domains>
+                              domains :: (Prelude.Maybe (ValueList Prelude.Text)),
+                              -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-resourceidentifier>
+                              resourceIdentifier :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkStorageConnectorProperty ::
+  Value Prelude.Text -> StorageConnectorProperty
+mkStorageConnectorProperty connectorType
+  = StorageConnectorProperty
+      {haddock_workaround_ = (), connectorType = connectorType,
+       domains = Prelude.Nothing, resourceIdentifier = Prelude.Nothing}
+instance ToResourceProperties StorageConnectorProperty where
+  toResourceProperties StorageConnectorProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack.StorageConnector",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ConnectorType" JSON..= connectorType]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Domains" Prelude.<$> domains,
+                               (JSON..=) "ResourceIdentifier" Prelude.<$> resourceIdentifier]))}
+instance JSON.ToJSON StorageConnectorProperty where
+  toJSON StorageConnectorProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ConnectorType" JSON..= connectorType]
+              (Prelude.catMaybes
+                 [(JSON..=) "Domains" Prelude.<$> domains,
+                  (JSON..=) "ResourceIdentifier" Prelude.<$> resourceIdentifier])))
+instance Property "ConnectorType" StorageConnectorProperty where
+  type PropertyType "ConnectorType" StorageConnectorProperty = Value Prelude.Text
+  set newValue StorageConnectorProperty {..}
+    = StorageConnectorProperty {connectorType = newValue, ..}
+instance Property "Domains" StorageConnectorProperty where
+  type PropertyType "Domains" StorageConnectorProperty = ValueList Prelude.Text
+  set newValue StorageConnectorProperty {..}
+    = StorageConnectorProperty {domains = Prelude.pure newValue, ..}
+instance Property "ResourceIdentifier" StorageConnectorProperty where
+  type PropertyType "ResourceIdentifier" StorageConnectorProperty = Value Prelude.Text
+  set newValue StorageConnectorProperty {..}
+    = StorageConnectorProperty
+        {resourceIdentifier = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs-boot b/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/StorageConnectorProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Stack.StorageConnectorProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data StorageConnectorProperty :: Prelude.Type
+instance ToResourceProperties StorageConnectorProperty
+instance Prelude.Eq StorageConnectorProperty
+instance Prelude.Show StorageConnectorProperty
+instance JSON.ToJSON StorageConnectorProperty
diff --git a/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs b/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.AppStream.Stack.StreamingExperienceSettingsProperty (
+        StreamingExperienceSettingsProperty(..),
+        mkStreamingExperienceSettingsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data StreamingExperienceSettingsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-streamingexperiencesettings.html>
+    StreamingExperienceSettingsProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-streamingexperiencesettings.html#cfn-appstream-stack-streamingexperiencesettings-preferredprotocol>
+                                         preferredProtocol :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkStreamingExperienceSettingsProperty ::
+  StreamingExperienceSettingsProperty
+mkStreamingExperienceSettingsProperty
+  = StreamingExperienceSettingsProperty
+      {haddock_workaround_ = (), preferredProtocol = Prelude.Nothing}
+instance ToResourceProperties StreamingExperienceSettingsProperty where
+  toResourceProperties StreamingExperienceSettingsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack.StreamingExperienceSettings",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "PreferredProtocol" Prelude.<$> preferredProtocol])}
+instance JSON.ToJSON StreamingExperienceSettingsProperty where
+  toJSON StreamingExperienceSettingsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "PreferredProtocol" Prelude.<$> preferredProtocol]))
+instance Property "PreferredProtocol" StreamingExperienceSettingsProperty where
+  type PropertyType "PreferredProtocol" StreamingExperienceSettingsProperty = Value Prelude.Text
+  set newValue StreamingExperienceSettingsProperty {..}
+    = StreamingExperienceSettingsProperty
+        {preferredProtocol = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs-boot b/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/StreamingExperienceSettingsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Stack.StreamingExperienceSettingsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data StreamingExperienceSettingsProperty :: Prelude.Type
+instance ToResourceProperties StreamingExperienceSettingsProperty
+instance Prelude.Eq StreamingExperienceSettingsProperty
+instance Prelude.Show StreamingExperienceSettingsProperty
+instance JSON.ToJSON StreamingExperienceSettingsProperty
diff --git a/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs b/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs
@@ -0,0 +1,54 @@
+module Stratosphere.AppStream.Stack.UserSettingProperty (
+        UserSettingProperty(..), mkUserSettingProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data UserSettingProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html>
+    UserSettingProperty {haddock_workaround_ :: (),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html#cfn-appstream-stack-usersetting-action>
+                         action :: (Value Prelude.Text),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html#cfn-appstream-stack-usersetting-maximumlength>
+                         maximumLength :: (Prelude.Maybe (Value Prelude.Integer)),
+                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html#cfn-appstream-stack-usersetting-permission>
+                         permission :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkUserSettingProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> UserSettingProperty
+mkUserSettingProperty action permission
+  = UserSettingProperty
+      {haddock_workaround_ = (), action = action,
+       permission = permission, maximumLength = Prelude.Nothing}
+instance ToResourceProperties UserSettingProperty where
+  toResourceProperties UserSettingProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::Stack.UserSetting",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Action" JSON..= action, "Permission" JSON..= permission]
+                           (Prelude.catMaybes
+                              [(JSON..=) "MaximumLength" Prelude.<$> maximumLength]))}
+instance JSON.ToJSON UserSettingProperty where
+  toJSON UserSettingProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Action" JSON..= action, "Permission" JSON..= permission]
+              (Prelude.catMaybes
+                 [(JSON..=) "MaximumLength" Prelude.<$> maximumLength])))
+instance Property "Action" UserSettingProperty where
+  type PropertyType "Action" UserSettingProperty = Value Prelude.Text
+  set newValue UserSettingProperty {..}
+    = UserSettingProperty {action = newValue, ..}
+instance Property "MaximumLength" UserSettingProperty where
+  type PropertyType "MaximumLength" UserSettingProperty = Value Prelude.Integer
+  set newValue UserSettingProperty {..}
+    = UserSettingProperty {maximumLength = Prelude.pure newValue, ..}
+instance Property "Permission" UserSettingProperty where
+  type PropertyType "Permission" UserSettingProperty = Value Prelude.Text
+  set newValue UserSettingProperty {..}
+    = UserSettingProperty {permission = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs-boot b/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/Stack/UserSettingProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.AppStream.Stack.UserSettingProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data UserSettingProperty :: Prelude.Type
+instance ToResourceProperties UserSettingProperty
+instance Prelude.Eq UserSettingProperty
+instance Prelude.Show UserSettingProperty
+instance JSON.ToJSON UserSettingProperty
diff --git a/gen/Stratosphere/AppStream/StackFleetAssociation.hs b/gen/Stratosphere/AppStream/StackFleetAssociation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/StackFleetAssociation.hs
@@ -0,0 +1,41 @@
+module Stratosphere.AppStream.StackFleetAssociation (
+        StackFleetAssociation(..), mkStackFleetAssociation
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data StackFleetAssociation
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html>
+    StackFleetAssociation {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html#cfn-appstream-stackfleetassociation-fleetname>
+                           fleetName :: (Value Prelude.Text),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html#cfn-appstream-stackfleetassociation-stackname>
+                           stackName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkStackFleetAssociation ::
+  Value Prelude.Text -> Value Prelude.Text -> StackFleetAssociation
+mkStackFleetAssociation fleetName stackName
+  = StackFleetAssociation
+      {haddock_workaround_ = (), fleetName = fleetName,
+       stackName = stackName}
+instance ToResourceProperties StackFleetAssociation where
+  toResourceProperties StackFleetAssociation {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::StackFleetAssociation",
+         supportsTags = Prelude.False,
+         properties = ["FleetName" JSON..= fleetName,
+                       "StackName" JSON..= stackName]}
+instance JSON.ToJSON StackFleetAssociation where
+  toJSON StackFleetAssociation {..}
+    = JSON.object
+        ["FleetName" JSON..= fleetName, "StackName" JSON..= stackName]
+instance Property "FleetName" StackFleetAssociation where
+  type PropertyType "FleetName" StackFleetAssociation = Value Prelude.Text
+  set newValue StackFleetAssociation {..}
+    = StackFleetAssociation {fleetName = newValue, ..}
+instance Property "StackName" StackFleetAssociation where
+  type PropertyType "StackName" StackFleetAssociation = Value Prelude.Text
+  set newValue StackFleetAssociation {..}
+    = StackFleetAssociation {stackName = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/StackUserAssociation.hs b/gen/Stratosphere/AppStream/StackUserAssociation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/StackUserAssociation.hs
@@ -0,0 +1,67 @@
+module Stratosphere.AppStream.StackUserAssociation (
+        StackUserAssociation(..), mkStackUserAssociation
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data StackUserAssociation
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html>
+    StackUserAssociation {haddock_workaround_ :: (),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-authenticationtype>
+                          authenticationType :: (Value Prelude.Text),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-sendemailnotification>
+                          sendEmailNotification :: (Prelude.Maybe (Value Prelude.Bool)),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-stackname>
+                          stackName :: (Value Prelude.Text),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-username>
+                          userName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkStackUserAssociation ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> Value Prelude.Text -> StackUserAssociation
+mkStackUserAssociation authenticationType stackName userName
+  = StackUserAssociation
+      {haddock_workaround_ = (), authenticationType = authenticationType,
+       stackName = stackName, userName = userName,
+       sendEmailNotification = Prelude.Nothing}
+instance ToResourceProperties StackUserAssociation where
+  toResourceProperties StackUserAssociation {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::StackUserAssociation",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["AuthenticationType" JSON..= authenticationType,
+                            "StackName" JSON..= stackName, "UserName" JSON..= userName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SendEmailNotification"
+                                 Prelude.<$> sendEmailNotification]))}
+instance JSON.ToJSON StackUserAssociation where
+  toJSON StackUserAssociation {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["AuthenticationType" JSON..= authenticationType,
+               "StackName" JSON..= stackName, "UserName" JSON..= userName]
+              (Prelude.catMaybes
+                 [(JSON..=) "SendEmailNotification"
+                    Prelude.<$> sendEmailNotification])))
+instance Property "AuthenticationType" StackUserAssociation where
+  type PropertyType "AuthenticationType" StackUserAssociation = Value Prelude.Text
+  set newValue StackUserAssociation {..}
+    = StackUserAssociation {authenticationType = newValue, ..}
+instance Property "SendEmailNotification" StackUserAssociation where
+  type PropertyType "SendEmailNotification" StackUserAssociation = Value Prelude.Bool
+  set newValue StackUserAssociation {..}
+    = StackUserAssociation
+        {sendEmailNotification = Prelude.pure newValue, ..}
+instance Property "StackName" StackUserAssociation where
+  type PropertyType "StackName" StackUserAssociation = Value Prelude.Text
+  set newValue StackUserAssociation {..}
+    = StackUserAssociation {stackName = newValue, ..}
+instance Property "UserName" StackUserAssociation where
+  type PropertyType "UserName" StackUserAssociation = Value Prelude.Text
+  set newValue StackUserAssociation {..}
+    = StackUserAssociation {userName = newValue, ..}
diff --git a/gen/Stratosphere/AppStream/User.hs b/gen/Stratosphere/AppStream/User.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/AppStream/User.hs
@@ -0,0 +1,69 @@
+module Stratosphere.AppStream.User (
+        User(..), mkUser
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data User
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html>
+    User {haddock_workaround_ :: (),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-authenticationtype>
+          authenticationType :: (Value Prelude.Text),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-firstname>
+          firstName :: (Prelude.Maybe (Value Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-lastname>
+          lastName :: (Prelude.Maybe (Value Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-messageaction>
+          messageAction :: (Prelude.Maybe (Value Prelude.Text)),
+          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-username>
+          userName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkUser :: Value Prelude.Text -> Value Prelude.Text -> User
+mkUser authenticationType userName
+  = User
+      {haddock_workaround_ = (), authenticationType = authenticationType,
+       userName = userName, firstName = Prelude.Nothing,
+       lastName = Prelude.Nothing, messageAction = Prelude.Nothing}
+instance ToResourceProperties User where
+  toResourceProperties User {..}
+    = ResourceProperties
+        {awsType = "AWS::AppStream::User", supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["AuthenticationType" JSON..= authenticationType,
+                            "UserName" JSON..= userName]
+                           (Prelude.catMaybes
+                              [(JSON..=) "FirstName" Prelude.<$> firstName,
+                               (JSON..=) "LastName" Prelude.<$> lastName,
+                               (JSON..=) "MessageAction" Prelude.<$> messageAction]))}
+instance JSON.ToJSON User where
+  toJSON User {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["AuthenticationType" JSON..= authenticationType,
+               "UserName" JSON..= userName]
+              (Prelude.catMaybes
+                 [(JSON..=) "FirstName" Prelude.<$> firstName,
+                  (JSON..=) "LastName" Prelude.<$> lastName,
+                  (JSON..=) "MessageAction" Prelude.<$> messageAction])))
+instance Property "AuthenticationType" User where
+  type PropertyType "AuthenticationType" User = Value Prelude.Text
+  set newValue User {..} = User {authenticationType = newValue, ..}
+instance Property "FirstName" User where
+  type PropertyType "FirstName" User = Value Prelude.Text
+  set newValue User {..}
+    = User {firstName = Prelude.pure newValue, ..}
+instance Property "LastName" User where
+  type PropertyType "LastName" User = Value Prelude.Text
+  set newValue User {..}
+    = User {lastName = Prelude.pure newValue, ..}
+instance Property "MessageAction" User where
+  type PropertyType "MessageAction" User = Value Prelude.Text
+  set newValue User {..}
+    = User {messageAction = Prelude.pure newValue, ..}
+instance Property "UserName" User where
+  type PropertyType "UserName" User = Value Prelude.Text
+  set newValue User {..} = User {userName = newValue, ..}
diff --git a/stratosphere-appstream.cabal b/stratosphere-appstream.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-appstream.cabal
@@ -0,0 +1,105 @@
+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-appstream
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS AppStream.
+description:    Integration into stratosphere to generate resources and properties for AWS AppStream
+category:       AWS, Cloud, AppStream
+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.AppStream.AppBlock
+      Stratosphere.AppStream.AppBlock.S3LocationProperty
+      Stratosphere.AppStream.AppBlock.ScriptDetailsProperty
+      Stratosphere.AppStream.AppBlockBuilder
+      Stratosphere.AppStream.AppBlockBuilder.AccessEndpointProperty
+      Stratosphere.AppStream.AppBlockBuilder.VpcConfigProperty
+      Stratosphere.AppStream.Application
+      Stratosphere.AppStream.Application.S3LocationProperty
+      Stratosphere.AppStream.ApplicationEntitlementAssociation
+      Stratosphere.AppStream.ApplicationFleetAssociation
+      Stratosphere.AppStream.DirectoryConfig
+      Stratosphere.AppStream.DirectoryConfig.CertificateBasedAuthPropertiesProperty
+      Stratosphere.AppStream.DirectoryConfig.ServiceAccountCredentialsProperty
+      Stratosphere.AppStream.Entitlement
+      Stratosphere.AppStream.Entitlement.AttributeProperty
+      Stratosphere.AppStream.Fleet
+      Stratosphere.AppStream.Fleet.ComputeCapacityProperty
+      Stratosphere.AppStream.Fleet.DomainJoinInfoProperty
+      Stratosphere.AppStream.Fleet.S3LocationProperty
+      Stratosphere.AppStream.Fleet.VpcConfigProperty
+      Stratosphere.AppStream.ImageBuilder
+      Stratosphere.AppStream.ImageBuilder.AccessEndpointProperty
+      Stratosphere.AppStream.ImageBuilder.DomainJoinInfoProperty
+      Stratosphere.AppStream.ImageBuilder.VpcConfigProperty
+      Stratosphere.AppStream.Stack
+      Stratosphere.AppStream.Stack.AccessEndpointProperty
+      Stratosphere.AppStream.Stack.ApplicationSettingsProperty
+      Stratosphere.AppStream.Stack.StorageConnectorProperty
+      Stratosphere.AppStream.Stack.StreamingExperienceSettingsProperty
+      Stratosphere.AppStream.Stack.UserSettingProperty
+      Stratosphere.AppStream.StackFleetAssociation
+      Stratosphere.AppStream.StackUserAssociation
+      Stratosphere.AppStream.User
+  other-modules:
+      Paths_stratosphere_appstream
+  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
