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/CleanRoomsML/TrainingDataset.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset.hs
@@ -0,0 +1,74 @@
+module Stratosphere.CleanRoomsML.TrainingDataset (
+        module Exports, TrainingDataset(..), mkTrainingDataset
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CleanRoomsML.TrainingDataset.DatasetProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data TrainingDataset
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html>
+    TrainingDataset {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html#cfn-cleanroomsml-trainingdataset-description>
+                     description :: (Prelude.Maybe (Value Prelude.Text)),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html#cfn-cleanroomsml-trainingdataset-name>
+                     name :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html#cfn-cleanroomsml-trainingdataset-rolearn>
+                     roleArn :: (Value Prelude.Text),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html#cfn-cleanroomsml-trainingdataset-tags>
+                     tags :: (Prelude.Maybe [Tag]),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanroomsml-trainingdataset.html#cfn-cleanroomsml-trainingdataset-trainingdata>
+                     trainingData :: [DatasetProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkTrainingDataset ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> [DatasetProperty] -> TrainingDataset
+mkTrainingDataset name roleArn trainingData
+  = TrainingDataset
+      {haddock_workaround_ = (), name = name, roleArn = roleArn,
+       trainingData = trainingData, description = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties TrainingDataset where
+  toResourceProperties TrainingDataset {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Name" JSON..= name, "RoleArn" JSON..= roleArn,
+                            "TrainingData" JSON..= trainingData]
+                           (Prelude.catMaybes
+                              [(JSON..=) "Description" Prelude.<$> description,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON TrainingDataset where
+  toJSON TrainingDataset {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Name" JSON..= name, "RoleArn" JSON..= roleArn,
+               "TrainingData" JSON..= trainingData]
+              (Prelude.catMaybes
+                 [(JSON..=) "Description" Prelude.<$> description,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "Description" TrainingDataset where
+  type PropertyType "Description" TrainingDataset = Value Prelude.Text
+  set newValue TrainingDataset {..}
+    = TrainingDataset {description = Prelude.pure newValue, ..}
+instance Property "Name" TrainingDataset where
+  type PropertyType "Name" TrainingDataset = Value Prelude.Text
+  set newValue TrainingDataset {..}
+    = TrainingDataset {name = newValue, ..}
+instance Property "RoleArn" TrainingDataset where
+  type PropertyType "RoleArn" TrainingDataset = Value Prelude.Text
+  set newValue TrainingDataset {..}
+    = TrainingDataset {roleArn = newValue, ..}
+instance Property "Tags" TrainingDataset where
+  type PropertyType "Tags" TrainingDataset = [Tag]
+  set newValue TrainingDataset {..}
+    = TrainingDataset {tags = Prelude.pure newValue, ..}
+instance Property "TrainingData" TrainingDataset where
+  type PropertyType "TrainingData" TrainingDataset = [DatasetProperty]
+  set newValue TrainingDataset {..}
+    = TrainingDataset {trainingData = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs
@@ -0,0 +1,43 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.ColumnSchemaProperty (
+        ColumnSchemaProperty(..), mkColumnSchemaProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ColumnSchemaProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-columnschema.html>
+    ColumnSchemaProperty {haddock_workaround_ :: (),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-columnschema.html#cfn-cleanroomsml-trainingdataset-columnschema-columnname>
+                          columnName :: (Value Prelude.Text),
+                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-columnschema.html#cfn-cleanroomsml-trainingdataset-columnschema-columntypes>
+                          columnTypes :: (ValueList Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkColumnSchemaProperty ::
+  Value Prelude.Text
+  -> ValueList Prelude.Text -> ColumnSchemaProperty
+mkColumnSchemaProperty columnName columnTypes
+  = ColumnSchemaProperty
+      {haddock_workaround_ = (), columnName = columnName,
+       columnTypes = columnTypes}
+instance ToResourceProperties ColumnSchemaProperty where
+  toResourceProperties ColumnSchemaProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset.ColumnSchema",
+         supportsTags = Prelude.False,
+         properties = ["ColumnName" JSON..= columnName,
+                       "ColumnTypes" JSON..= columnTypes]}
+instance JSON.ToJSON ColumnSchemaProperty where
+  toJSON ColumnSchemaProperty {..}
+    = JSON.object
+        ["ColumnName" JSON..= columnName,
+         "ColumnTypes" JSON..= columnTypes]
+instance Property "ColumnName" ColumnSchemaProperty where
+  type PropertyType "ColumnName" ColumnSchemaProperty = Value Prelude.Text
+  set newValue ColumnSchemaProperty {..}
+    = ColumnSchemaProperty {columnName = newValue, ..}
+instance Property "ColumnTypes" ColumnSchemaProperty where
+  type PropertyType "ColumnTypes" ColumnSchemaProperty = ValueList Prelude.Text
+  set newValue ColumnSchemaProperty {..}
+    = ColumnSchemaProperty {columnTypes = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs-boot b/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/ColumnSchemaProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.ColumnSchemaProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ColumnSchemaProperty :: Prelude.Type
+instance ToResourceProperties ColumnSchemaProperty
+instance Prelude.Eq ColumnSchemaProperty
+instance Prelude.Show ColumnSchemaProperty
+instance JSON.ToJSON ColumnSchemaProperty
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs
@@ -0,0 +1,32 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DataSourceProperty (
+        module Exports, DataSourceProperty(..), mkDataSourceProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CleanRoomsML.TrainingDataset.GlueDataSourceProperty as Exports
+import Stratosphere.ResourceProperties
+data DataSourceProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-datasource.html>
+    DataSourceProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-datasource.html#cfn-cleanroomsml-trainingdataset-datasource-gluedatasource>
+                        glueDataSource :: GlueDataSourceProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDataSourceProperty ::
+  GlueDataSourceProperty -> DataSourceProperty
+mkDataSourceProperty glueDataSource
+  = DataSourceProperty
+      {haddock_workaround_ = (), glueDataSource = glueDataSource}
+instance ToResourceProperties DataSourceProperty where
+  toResourceProperties DataSourceProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset.DataSource",
+         supportsTags = Prelude.False,
+         properties = ["GlueDataSource" JSON..= glueDataSource]}
+instance JSON.ToJSON DataSourceProperty where
+  toJSON DataSourceProperty {..}
+    = JSON.object ["GlueDataSource" JSON..= glueDataSource]
+instance Property "GlueDataSource" DataSourceProperty where
+  type PropertyType "GlueDataSource" DataSourceProperty = GlueDataSourceProperty
+  set newValue DataSourceProperty {..}
+    = DataSourceProperty {glueDataSource = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs-boot b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DataSourceProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DataSourceProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DataSourceProperty :: Prelude.Type
+instance ToResourceProperties DataSourceProperty
+instance Prelude.Eq DataSourceProperty
+instance Prelude.Show DataSourceProperty
+instance JSON.ToJSON DataSourceProperty
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs
@@ -0,0 +1,44 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DatasetInputConfigProperty (
+        module Exports, DatasetInputConfigProperty(..),
+        mkDatasetInputConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CleanRoomsML.TrainingDataset.ColumnSchemaProperty as Exports
+import {-# SOURCE #-} Stratosphere.CleanRoomsML.TrainingDataset.DataSourceProperty as Exports
+import Stratosphere.ResourceProperties
+data DatasetInputConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-datasetinputconfig.html>
+    DatasetInputConfigProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-datasetinputconfig.html#cfn-cleanroomsml-trainingdataset-datasetinputconfig-datasource>
+                                dataSource :: DataSourceProperty,
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-datasetinputconfig.html#cfn-cleanroomsml-trainingdataset-datasetinputconfig-schema>
+                                schema :: [ColumnSchemaProperty]}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDatasetInputConfigProperty ::
+  DataSourceProperty
+  -> [ColumnSchemaProperty] -> DatasetInputConfigProperty
+mkDatasetInputConfigProperty dataSource schema
+  = DatasetInputConfigProperty
+      {haddock_workaround_ = (), dataSource = dataSource,
+       schema = schema}
+instance ToResourceProperties DatasetInputConfigProperty where
+  toResourceProperties DatasetInputConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset.DatasetInputConfig",
+         supportsTags = Prelude.False,
+         properties = ["DataSource" JSON..= dataSource,
+                       "Schema" JSON..= schema]}
+instance JSON.ToJSON DatasetInputConfigProperty where
+  toJSON DatasetInputConfigProperty {..}
+    = JSON.object
+        ["DataSource" JSON..= dataSource, "Schema" JSON..= schema]
+instance Property "DataSource" DatasetInputConfigProperty where
+  type PropertyType "DataSource" DatasetInputConfigProperty = DataSourceProperty
+  set newValue DatasetInputConfigProperty {..}
+    = DatasetInputConfigProperty {dataSource = newValue, ..}
+instance Property "Schema" DatasetInputConfigProperty where
+  type PropertyType "Schema" DatasetInputConfigProperty = [ColumnSchemaProperty]
+  set newValue DatasetInputConfigProperty {..}
+    = DatasetInputConfigProperty {schema = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs-boot b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetInputConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DatasetInputConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DatasetInputConfigProperty :: Prelude.Type
+instance ToResourceProperties DatasetInputConfigProperty
+instance Prelude.Eq DatasetInputConfigProperty
+instance Prelude.Show DatasetInputConfigProperty
+instance JSON.ToJSON DatasetInputConfigProperty
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs
@@ -0,0 +1,42 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DatasetProperty (
+        module Exports, DatasetProperty(..), mkDatasetProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.CleanRoomsML.TrainingDataset.DatasetInputConfigProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DatasetProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-dataset.html>
+    DatasetProperty {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-dataset.html#cfn-cleanroomsml-trainingdataset-dataset-inputconfig>
+                     inputConfig :: DatasetInputConfigProperty,
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-dataset.html#cfn-cleanroomsml-trainingdataset-dataset-type>
+                     type' :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDatasetProperty ::
+  DatasetInputConfigProperty -> Value Prelude.Text -> DatasetProperty
+mkDatasetProperty inputConfig type'
+  = DatasetProperty
+      {haddock_workaround_ = (), inputConfig = inputConfig,
+       type' = type'}
+instance ToResourceProperties DatasetProperty where
+  toResourceProperties DatasetProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset.Dataset",
+         supportsTags = Prelude.False,
+         properties = ["InputConfig" JSON..= inputConfig,
+                       "Type" JSON..= type']}
+instance JSON.ToJSON DatasetProperty where
+  toJSON DatasetProperty {..}
+    = JSON.object
+        ["InputConfig" JSON..= inputConfig, "Type" JSON..= type']
+instance Property "InputConfig" DatasetProperty where
+  type PropertyType "InputConfig" DatasetProperty = DatasetInputConfigProperty
+  set newValue DatasetProperty {..}
+    = DatasetProperty {inputConfig = newValue, ..}
+instance Property "Type" DatasetProperty where
+  type PropertyType "Type" DatasetProperty = Value Prelude.Text
+  set newValue DatasetProperty {..}
+    = DatasetProperty {type' = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs-boot b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/DatasetProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.DatasetProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DatasetProperty :: Prelude.Type
+instance ToResourceProperties DatasetProperty
+instance Prelude.Eq DatasetProperty
+instance Prelude.Show DatasetProperty
+instance JSON.ToJSON DatasetProperty
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs b/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs
@@ -0,0 +1,54 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.GlueDataSourceProperty (
+        GlueDataSourceProperty(..), mkGlueDataSourceProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data GlueDataSourceProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-gluedatasource.html>
+    GlueDataSourceProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-gluedatasource.html#cfn-cleanroomsml-trainingdataset-gluedatasource-catalogid>
+                            catalogId :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-gluedatasource.html#cfn-cleanroomsml-trainingdataset-gluedatasource-databasename>
+                            databaseName :: (Value Prelude.Text),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanroomsml-trainingdataset-gluedatasource.html#cfn-cleanroomsml-trainingdataset-gluedatasource-tablename>
+                            tableName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkGlueDataSourceProperty ::
+  Value Prelude.Text -> Value Prelude.Text -> GlueDataSourceProperty
+mkGlueDataSourceProperty databaseName tableName
+  = GlueDataSourceProperty
+      {haddock_workaround_ = (), databaseName = databaseName,
+       tableName = tableName, catalogId = Prelude.Nothing}
+instance ToResourceProperties GlueDataSourceProperty where
+  toResourceProperties GlueDataSourceProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::CleanRoomsML::TrainingDataset.GlueDataSource",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["DatabaseName" JSON..= databaseName,
+                            "TableName" JSON..= tableName]
+                           (Prelude.catMaybes [(JSON..=) "CatalogId" Prelude.<$> catalogId]))}
+instance JSON.ToJSON GlueDataSourceProperty where
+  toJSON GlueDataSourceProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["DatabaseName" JSON..= databaseName,
+               "TableName" JSON..= tableName]
+              (Prelude.catMaybes [(JSON..=) "CatalogId" Prelude.<$> catalogId])))
+instance Property "CatalogId" GlueDataSourceProperty where
+  type PropertyType "CatalogId" GlueDataSourceProperty = Value Prelude.Text
+  set newValue GlueDataSourceProperty {..}
+    = GlueDataSourceProperty {catalogId = Prelude.pure newValue, ..}
+instance Property "DatabaseName" GlueDataSourceProperty where
+  type PropertyType "DatabaseName" GlueDataSourceProperty = Value Prelude.Text
+  set newValue GlueDataSourceProperty {..}
+    = GlueDataSourceProperty {databaseName = newValue, ..}
+instance Property "TableName" GlueDataSourceProperty where
+  type PropertyType "TableName" GlueDataSourceProperty = Value Prelude.Text
+  set newValue GlueDataSourceProperty {..}
+    = GlueDataSourceProperty {tableName = newValue, ..}
diff --git a/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs-boot b/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/CleanRoomsML/TrainingDataset/GlueDataSourceProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.CleanRoomsML.TrainingDataset.GlueDataSourceProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data GlueDataSourceProperty :: Prelude.Type
+instance ToResourceProperties GlueDataSourceProperty
+instance Prelude.Eq GlueDataSourceProperty
+instance Prelude.Show GlueDataSourceProperty
+instance JSON.ToJSON GlueDataSourceProperty
diff --git a/stratosphere-cleanroomsml.cabal b/stratosphere-cleanroomsml.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-cleanroomsml.cabal
@@ -0,0 +1,78 @@
+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-cleanroomsml
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS CleanRoomsML.
+description:    Integration into stratosphere to generate resources and properties for AWS CleanRoomsML
+category:       AWS, Cloud, CleanRoomsML
+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.CleanRoomsML.TrainingDataset
+      Stratosphere.CleanRoomsML.TrainingDataset.ColumnSchemaProperty
+      Stratosphere.CleanRoomsML.TrainingDataset.DatasetInputConfigProperty
+      Stratosphere.CleanRoomsML.TrainingDataset.DatasetProperty
+      Stratosphere.CleanRoomsML.TrainingDataset.DataSourceProperty
+      Stratosphere.CleanRoomsML.TrainingDataset.GlueDataSourceProperty
+  other-modules:
+      Paths_stratosphere_cleanroomsml
+  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
