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/Chatbot/CustomAction.hs b/gen/Stratosphere/Chatbot/CustomAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction.hs
@@ -0,0 +1,75 @@
+module Stratosphere.Chatbot.CustomAction (
+        module Exports, CustomAction(..), mkCustomAction
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.Chatbot.CustomAction.CustomActionAttachmentProperty as Exports
+import {-# SOURCE #-} Stratosphere.Chatbot.CustomAction.CustomActionDefinitionProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data CustomAction
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html>
+    CustomAction {haddock_workaround_ :: (),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html#cfn-chatbot-customaction-actionname>
+                  actionName :: (Value Prelude.Text),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html#cfn-chatbot-customaction-aliasname>
+                  aliasName :: (Prelude.Maybe (Value Prelude.Text)),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html#cfn-chatbot-customaction-attachments>
+                  attachments :: (Prelude.Maybe [CustomActionAttachmentProperty]),
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html#cfn-chatbot-customaction-definition>
+                  definition :: CustomActionDefinitionProperty,
+                  -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-customaction.html#cfn-chatbot-customaction-tags>
+                  tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCustomAction ::
+  Value Prelude.Text
+  -> CustomActionDefinitionProperty -> CustomAction
+mkCustomAction actionName definition
+  = CustomAction
+      {haddock_workaround_ = (), actionName = actionName,
+       definition = definition, aliasName = Prelude.Nothing,
+       attachments = Prelude.Nothing, tags = Prelude.Nothing}
+instance ToResourceProperties CustomAction where
+  toResourceProperties CustomAction {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::CustomAction",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ActionName" JSON..= actionName, "Definition" JSON..= definition]
+                           (Prelude.catMaybes
+                              [(JSON..=) "AliasName" Prelude.<$> aliasName,
+                               (JSON..=) "Attachments" Prelude.<$> attachments,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON CustomAction where
+  toJSON CustomAction {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ActionName" JSON..= actionName, "Definition" JSON..= definition]
+              (Prelude.catMaybes
+                 [(JSON..=) "AliasName" Prelude.<$> aliasName,
+                  (JSON..=) "Attachments" Prelude.<$> attachments,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "ActionName" CustomAction where
+  type PropertyType "ActionName" CustomAction = Value Prelude.Text
+  set newValue CustomAction {..}
+    = CustomAction {actionName = newValue, ..}
+instance Property "AliasName" CustomAction where
+  type PropertyType "AliasName" CustomAction = Value Prelude.Text
+  set newValue CustomAction {..}
+    = CustomAction {aliasName = Prelude.pure newValue, ..}
+instance Property "Attachments" CustomAction where
+  type PropertyType "Attachments" CustomAction = [CustomActionAttachmentProperty]
+  set newValue CustomAction {..}
+    = CustomAction {attachments = Prelude.pure newValue, ..}
+instance Property "Definition" CustomAction where
+  type PropertyType "Definition" CustomAction = CustomActionDefinitionProperty
+  set newValue CustomAction {..}
+    = CustomAction {definition = newValue, ..}
+instance Property "Tags" CustomAction where
+  type PropertyType "Tags" CustomAction = [Tag]
+  set newValue CustomAction {..}
+    = CustomAction {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs
@@ -0,0 +1,56 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionAttachmentCriteriaProperty (
+        CustomActionAttachmentCriteriaProperty(..),
+        mkCustomActionAttachmentCriteriaProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CustomActionAttachmentCriteriaProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachmentcriteria.html>
+    CustomActionAttachmentCriteriaProperty {haddock_workaround_ :: (),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachmentcriteria.html#cfn-chatbot-customaction-customactionattachmentcriteria-operator>
+                                            operator :: (Value Prelude.Text),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachmentcriteria.html#cfn-chatbot-customaction-customactionattachmentcriteria-value>
+                                            value :: (Prelude.Maybe (Value Prelude.Text)),
+                                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachmentcriteria.html#cfn-chatbot-customaction-customactionattachmentcriteria-variablename>
+                                            variableName :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCustomActionAttachmentCriteriaProperty ::
+  Value Prelude.Text
+  -> Value Prelude.Text -> CustomActionAttachmentCriteriaProperty
+mkCustomActionAttachmentCriteriaProperty operator variableName
+  = CustomActionAttachmentCriteriaProperty
+      {haddock_workaround_ = (), operator = operator,
+       variableName = variableName, value = Prelude.Nothing}
+instance ToResourceProperties CustomActionAttachmentCriteriaProperty where
+  toResourceProperties CustomActionAttachmentCriteriaProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::CustomAction.CustomActionAttachmentCriteria",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["Operator" JSON..= operator, "VariableName" JSON..= variableName]
+                           (Prelude.catMaybes [(JSON..=) "Value" Prelude.<$> value]))}
+instance JSON.ToJSON CustomActionAttachmentCriteriaProperty where
+  toJSON CustomActionAttachmentCriteriaProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["Operator" JSON..= operator, "VariableName" JSON..= variableName]
+              (Prelude.catMaybes [(JSON..=) "Value" Prelude.<$> value])))
+instance Property "Operator" CustomActionAttachmentCriteriaProperty where
+  type PropertyType "Operator" CustomActionAttachmentCriteriaProperty = Value Prelude.Text
+  set newValue CustomActionAttachmentCriteriaProperty {..}
+    = CustomActionAttachmentCriteriaProperty {operator = newValue, ..}
+instance Property "Value" CustomActionAttachmentCriteriaProperty where
+  type PropertyType "Value" CustomActionAttachmentCriteriaProperty = Value Prelude.Text
+  set newValue CustomActionAttachmentCriteriaProperty {..}
+    = CustomActionAttachmentCriteriaProperty
+        {value = Prelude.pure newValue, ..}
+instance Property "VariableName" CustomActionAttachmentCriteriaProperty where
+  type PropertyType "VariableName" CustomActionAttachmentCriteriaProperty = Value Prelude.Text
+  set newValue CustomActionAttachmentCriteriaProperty {..}
+    = CustomActionAttachmentCriteriaProperty
+        {variableName = newValue, ..}
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs-boot b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentCriteriaProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionAttachmentCriteriaProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CustomActionAttachmentCriteriaProperty :: Prelude.Type
+instance ToResourceProperties CustomActionAttachmentCriteriaProperty
+instance Prelude.Eq CustomActionAttachmentCriteriaProperty
+instance Prelude.Show CustomActionAttachmentCriteriaProperty
+instance JSON.ToJSON CustomActionAttachmentCriteriaProperty
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs
@@ -0,0 +1,68 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionAttachmentProperty (
+        module Exports, CustomActionAttachmentProperty(..),
+        mkCustomActionAttachmentProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.Chatbot.CustomAction.CustomActionAttachmentCriteriaProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CustomActionAttachmentProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachment.html>
+    CustomActionAttachmentProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachment.html#cfn-chatbot-customaction-customactionattachment-buttontext>
+                                    buttonText :: (Prelude.Maybe (Value Prelude.Text)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachment.html#cfn-chatbot-customaction-customactionattachment-criteria>
+                                    criteria :: (Prelude.Maybe [CustomActionAttachmentCriteriaProperty]),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachment.html#cfn-chatbot-customaction-customactionattachment-notificationtype>
+                                    notificationType :: (Prelude.Maybe (Value Prelude.Text)),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactionattachment.html#cfn-chatbot-customaction-customactionattachment-variables>
+                                    variables :: (Prelude.Maybe (Prelude.Map Prelude.Text (Value Prelude.Text)))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCustomActionAttachmentProperty :: CustomActionAttachmentProperty
+mkCustomActionAttachmentProperty
+  = CustomActionAttachmentProperty
+      {haddock_workaround_ = (), buttonText = Prelude.Nothing,
+       criteria = Prelude.Nothing, notificationType = Prelude.Nothing,
+       variables = Prelude.Nothing}
+instance ToResourceProperties CustomActionAttachmentProperty where
+  toResourceProperties CustomActionAttachmentProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::CustomAction.CustomActionAttachment",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ButtonText" Prelude.<$> buttonText,
+                            (JSON..=) "Criteria" Prelude.<$> criteria,
+                            (JSON..=) "NotificationType" Prelude.<$> notificationType,
+                            (JSON..=) "Variables" Prelude.<$> variables])}
+instance JSON.ToJSON CustomActionAttachmentProperty where
+  toJSON CustomActionAttachmentProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ButtonText" Prelude.<$> buttonText,
+               (JSON..=) "Criteria" Prelude.<$> criteria,
+               (JSON..=) "NotificationType" Prelude.<$> notificationType,
+               (JSON..=) "Variables" Prelude.<$> variables]))
+instance Property "ButtonText" CustomActionAttachmentProperty where
+  type PropertyType "ButtonText" CustomActionAttachmentProperty = Value Prelude.Text
+  set newValue CustomActionAttachmentProperty {..}
+    = CustomActionAttachmentProperty
+        {buttonText = Prelude.pure newValue, ..}
+instance Property "Criteria" CustomActionAttachmentProperty where
+  type PropertyType "Criteria" CustomActionAttachmentProperty = [CustomActionAttachmentCriteriaProperty]
+  set newValue CustomActionAttachmentProperty {..}
+    = CustomActionAttachmentProperty
+        {criteria = Prelude.pure newValue, ..}
+instance Property "NotificationType" CustomActionAttachmentProperty where
+  type PropertyType "NotificationType" CustomActionAttachmentProperty = Value Prelude.Text
+  set newValue CustomActionAttachmentProperty {..}
+    = CustomActionAttachmentProperty
+        {notificationType = Prelude.pure newValue, ..}
+instance Property "Variables" CustomActionAttachmentProperty where
+  type PropertyType "Variables" CustomActionAttachmentProperty = Prelude.Map Prelude.Text (Value Prelude.Text)
+  set newValue CustomActionAttachmentProperty {..}
+    = CustomActionAttachmentProperty
+        {variables = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs-boot b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionAttachmentProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionAttachmentProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CustomActionAttachmentProperty :: Prelude.Type
+instance ToResourceProperties CustomActionAttachmentProperty
+instance Prelude.Eq CustomActionAttachmentProperty
+instance Prelude.Show CustomActionAttachmentProperty
+instance JSON.ToJSON CustomActionAttachmentProperty
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs b/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs
@@ -0,0 +1,33 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionDefinitionProperty (
+        CustomActionDefinitionProperty(..),
+        mkCustomActionDefinitionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CustomActionDefinitionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactiondefinition.html>
+    CustomActionDefinitionProperty {haddock_workaround_ :: (),
+                                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-chatbot-customaction-customactiondefinition.html#cfn-chatbot-customaction-customactiondefinition-commandtext>
+                                    commandText :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCustomActionDefinitionProperty ::
+  Value Prelude.Text -> CustomActionDefinitionProperty
+mkCustomActionDefinitionProperty commandText
+  = CustomActionDefinitionProperty
+      {haddock_workaround_ = (), commandText = commandText}
+instance ToResourceProperties CustomActionDefinitionProperty where
+  toResourceProperties CustomActionDefinitionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::CustomAction.CustomActionDefinition",
+         supportsTags = Prelude.False,
+         properties = ["CommandText" JSON..= commandText]}
+instance JSON.ToJSON CustomActionDefinitionProperty where
+  toJSON CustomActionDefinitionProperty {..}
+    = JSON.object ["CommandText" JSON..= commandText]
+instance Property "CommandText" CustomActionDefinitionProperty where
+  type PropertyType "CommandText" CustomActionDefinitionProperty = Value Prelude.Text
+  set newValue CustomActionDefinitionProperty {..}
+    = CustomActionDefinitionProperty {commandText = newValue, ..}
diff --git a/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs-boot b/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/CustomAction/CustomActionDefinitionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Chatbot.CustomAction.CustomActionDefinitionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CustomActionDefinitionProperty :: Prelude.Type
+instance ToResourceProperties CustomActionDefinitionProperty
+instance Prelude.Eq CustomActionDefinitionProperty
+instance Prelude.Show CustomActionDefinitionProperty
+instance JSON.ToJSON CustomActionDefinitionProperty
diff --git a/gen/Stratosphere/Chatbot/MicrosoftTeamsChannelConfiguration.hs b/gen/Stratosphere/Chatbot/MicrosoftTeamsChannelConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/MicrosoftTeamsChannelConfiguration.hs
@@ -0,0 +1,154 @@
+module Stratosphere.Chatbot.MicrosoftTeamsChannelConfiguration (
+        MicrosoftTeamsChannelConfiguration(..),
+        mkMicrosoftTeamsChannelConfiguration
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data MicrosoftTeamsChannelConfiguration
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html>
+    MicrosoftTeamsChannelConfiguration {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-configurationname>
+                                        configurationName :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-customizationresourcearns>
+                                        customizationResourceArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-guardrailpolicies>
+                                        guardrailPolicies :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-iamrolearn>
+                                        iamRoleArn :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-logginglevel>
+                                        loggingLevel :: (Prelude.Maybe (Value Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-snstopicarns>
+                                        snsTopicArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-tags>
+                                        tags :: (Prelude.Maybe [Tag]),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamid>
+                                        teamId :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamschannelid>
+                                        teamsChannelId :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamschannelname>
+                                        teamsChannelName :: (Prelude.Maybe (Value Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamstenantid>
+                                        teamsTenantId :: (Value Prelude.Text),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-userrolerequired>
+                                        userRoleRequired :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMicrosoftTeamsChannelConfiguration ::
+  Value Prelude.Text
+  -> Value Prelude.Text
+     -> Value Prelude.Text
+        -> Value Prelude.Text
+           -> Value Prelude.Text -> MicrosoftTeamsChannelConfiguration
+mkMicrosoftTeamsChannelConfiguration
+  configurationName
+  iamRoleArn
+  teamId
+  teamsChannelId
+  teamsTenantId
+  = MicrosoftTeamsChannelConfiguration
+      {haddock_workaround_ = (), configurationName = configurationName,
+       iamRoleArn = iamRoleArn, teamId = teamId,
+       teamsChannelId = teamsChannelId, teamsTenantId = teamsTenantId,
+       customizationResourceArns = Prelude.Nothing,
+       guardrailPolicies = Prelude.Nothing,
+       loggingLevel = Prelude.Nothing, snsTopicArns = Prelude.Nothing,
+       tags = Prelude.Nothing, teamsChannelName = Prelude.Nothing,
+       userRoleRequired = Prelude.Nothing}
+instance ToResourceProperties MicrosoftTeamsChannelConfiguration where
+  toResourceProperties MicrosoftTeamsChannelConfiguration {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::MicrosoftTeamsChannelConfiguration",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ConfigurationName" JSON..= configurationName,
+                            "IamRoleArn" JSON..= iamRoleArn, "TeamId" JSON..= teamId,
+                            "TeamsChannelId" JSON..= teamsChannelId,
+                            "TeamsTenantId" JSON..= teamsTenantId]
+                           (Prelude.catMaybes
+                              [(JSON..=) "CustomizationResourceArns"
+                                 Prelude.<$> customizationResourceArns,
+                               (JSON..=) "GuardrailPolicies" Prelude.<$> guardrailPolicies,
+                               (JSON..=) "LoggingLevel" Prelude.<$> loggingLevel,
+                               (JSON..=) "SnsTopicArns" Prelude.<$> snsTopicArns,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "TeamsChannelName" Prelude.<$> teamsChannelName,
+                               (JSON..=) "UserRoleRequired" Prelude.<$> userRoleRequired]))}
+instance JSON.ToJSON MicrosoftTeamsChannelConfiguration where
+  toJSON MicrosoftTeamsChannelConfiguration {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ConfigurationName" JSON..= configurationName,
+               "IamRoleArn" JSON..= iamRoleArn, "TeamId" JSON..= teamId,
+               "TeamsChannelId" JSON..= teamsChannelId,
+               "TeamsTenantId" JSON..= teamsTenantId]
+              (Prelude.catMaybes
+                 [(JSON..=) "CustomizationResourceArns"
+                    Prelude.<$> customizationResourceArns,
+                  (JSON..=) "GuardrailPolicies" Prelude.<$> guardrailPolicies,
+                  (JSON..=) "LoggingLevel" Prelude.<$> loggingLevel,
+                  (JSON..=) "SnsTopicArns" Prelude.<$> snsTopicArns,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "TeamsChannelName" Prelude.<$> teamsChannelName,
+                  (JSON..=) "UserRoleRequired" Prelude.<$> userRoleRequired])))
+instance Property "ConfigurationName" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "ConfigurationName" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {configurationName = newValue, ..}
+instance Property "CustomizationResourceArns" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "CustomizationResourceArns" MicrosoftTeamsChannelConfiguration = ValueList Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {customizationResourceArns = Prelude.pure newValue, ..}
+instance Property "GuardrailPolicies" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "GuardrailPolicies" MicrosoftTeamsChannelConfiguration = ValueList Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {guardrailPolicies = Prelude.pure newValue, ..}
+instance Property "IamRoleArn" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "IamRoleArn" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration {iamRoleArn = newValue, ..}
+instance Property "LoggingLevel" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "LoggingLevel" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {loggingLevel = Prelude.pure newValue, ..}
+instance Property "SnsTopicArns" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "SnsTopicArns" MicrosoftTeamsChannelConfiguration = ValueList Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {snsTopicArns = Prelude.pure newValue, ..}
+instance Property "Tags" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "Tags" MicrosoftTeamsChannelConfiguration = [Tag]
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {tags = Prelude.pure newValue, ..}
+instance Property "TeamId" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "TeamId" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration {teamId = newValue, ..}
+instance Property "TeamsChannelId" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "TeamsChannelId" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {teamsChannelId = newValue, ..}
+instance Property "TeamsChannelName" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "TeamsChannelName" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {teamsChannelName = Prelude.pure newValue, ..}
+instance Property "TeamsTenantId" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "TeamsTenantId" MicrosoftTeamsChannelConfiguration = Value Prelude.Text
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration {teamsTenantId = newValue, ..}
+instance Property "UserRoleRequired" MicrosoftTeamsChannelConfiguration where
+  type PropertyType "UserRoleRequired" MicrosoftTeamsChannelConfiguration = Value Prelude.Bool
+  set newValue MicrosoftTeamsChannelConfiguration {..}
+    = MicrosoftTeamsChannelConfiguration
+        {userRoleRequired = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Chatbot/SlackChannelConfiguration.hs b/gen/Stratosphere/Chatbot/SlackChannelConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Chatbot/SlackChannelConfiguration.hs
@@ -0,0 +1,132 @@
+module Stratosphere.Chatbot.SlackChannelConfiguration (
+        SlackChannelConfiguration(..), mkSlackChannelConfiguration
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data SlackChannelConfiguration
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html>
+    SlackChannelConfiguration {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-configurationname>
+                               configurationName :: (Value Prelude.Text),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-customizationresourcearns>
+                               customizationResourceArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-guardrailpolicies>
+                               guardrailPolicies :: (Prelude.Maybe (ValueList Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-iamrolearn>
+                               iamRoleArn :: (Value Prelude.Text),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-logginglevel>
+                               loggingLevel :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-slackchannelid>
+                               slackChannelId :: (Value Prelude.Text),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-slackworkspaceid>
+                               slackWorkspaceId :: (Value Prelude.Text),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-snstopicarns>
+                               snsTopicArns :: (Prelude.Maybe (ValueList Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-tags>
+                               tags :: (Prelude.Maybe [Tag]),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-userrolerequired>
+                               userRoleRequired :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSlackChannelConfiguration ::
+  Value Prelude.Text
+  -> Value Prelude.Text
+     -> Value Prelude.Text
+        -> Value Prelude.Text -> SlackChannelConfiguration
+mkSlackChannelConfiguration
+  configurationName
+  iamRoleArn
+  slackChannelId
+  slackWorkspaceId
+  = SlackChannelConfiguration
+      {haddock_workaround_ = (), configurationName = configurationName,
+       iamRoleArn = iamRoleArn, slackChannelId = slackChannelId,
+       slackWorkspaceId = slackWorkspaceId,
+       customizationResourceArns = Prelude.Nothing,
+       guardrailPolicies = Prelude.Nothing,
+       loggingLevel = Prelude.Nothing, snsTopicArns = Prelude.Nothing,
+       tags = Prelude.Nothing, userRoleRequired = Prelude.Nothing}
+instance ToResourceProperties SlackChannelConfiguration where
+  toResourceProperties SlackChannelConfiguration {..}
+    = ResourceProperties
+        {awsType = "AWS::Chatbot::SlackChannelConfiguration",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ConfigurationName" JSON..= configurationName,
+                            "IamRoleArn" JSON..= iamRoleArn,
+                            "SlackChannelId" JSON..= slackChannelId,
+                            "SlackWorkspaceId" JSON..= slackWorkspaceId]
+                           (Prelude.catMaybes
+                              [(JSON..=) "CustomizationResourceArns"
+                                 Prelude.<$> customizationResourceArns,
+                               (JSON..=) "GuardrailPolicies" Prelude.<$> guardrailPolicies,
+                               (JSON..=) "LoggingLevel" Prelude.<$> loggingLevel,
+                               (JSON..=) "SnsTopicArns" Prelude.<$> snsTopicArns,
+                               (JSON..=) "Tags" Prelude.<$> tags,
+                               (JSON..=) "UserRoleRequired" Prelude.<$> userRoleRequired]))}
+instance JSON.ToJSON SlackChannelConfiguration where
+  toJSON SlackChannelConfiguration {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ConfigurationName" JSON..= configurationName,
+               "IamRoleArn" JSON..= iamRoleArn,
+               "SlackChannelId" JSON..= slackChannelId,
+               "SlackWorkspaceId" JSON..= slackWorkspaceId]
+              (Prelude.catMaybes
+                 [(JSON..=) "CustomizationResourceArns"
+                    Prelude.<$> customizationResourceArns,
+                  (JSON..=) "GuardrailPolicies" Prelude.<$> guardrailPolicies,
+                  (JSON..=) "LoggingLevel" Prelude.<$> loggingLevel,
+                  (JSON..=) "SnsTopicArns" Prelude.<$> snsTopicArns,
+                  (JSON..=) "Tags" Prelude.<$> tags,
+                  (JSON..=) "UserRoleRequired" Prelude.<$> userRoleRequired])))
+instance Property "ConfigurationName" SlackChannelConfiguration where
+  type PropertyType "ConfigurationName" SlackChannelConfiguration = Value Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration {configurationName = newValue, ..}
+instance Property "CustomizationResourceArns" SlackChannelConfiguration where
+  type PropertyType "CustomizationResourceArns" SlackChannelConfiguration = ValueList Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration
+        {customizationResourceArns = Prelude.pure newValue, ..}
+instance Property "GuardrailPolicies" SlackChannelConfiguration where
+  type PropertyType "GuardrailPolicies" SlackChannelConfiguration = ValueList Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration
+        {guardrailPolicies = Prelude.pure newValue, ..}
+instance Property "IamRoleArn" SlackChannelConfiguration where
+  type PropertyType "IamRoleArn" SlackChannelConfiguration = Value Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration {iamRoleArn = newValue, ..}
+instance Property "LoggingLevel" SlackChannelConfiguration where
+  type PropertyType "LoggingLevel" SlackChannelConfiguration = Value Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration
+        {loggingLevel = Prelude.pure newValue, ..}
+instance Property "SlackChannelId" SlackChannelConfiguration where
+  type PropertyType "SlackChannelId" SlackChannelConfiguration = Value Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration {slackChannelId = newValue, ..}
+instance Property "SlackWorkspaceId" SlackChannelConfiguration where
+  type PropertyType "SlackWorkspaceId" SlackChannelConfiguration = Value Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration {slackWorkspaceId = newValue, ..}
+instance Property "SnsTopicArns" SlackChannelConfiguration where
+  type PropertyType "SnsTopicArns" SlackChannelConfiguration = ValueList Prelude.Text
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration
+        {snsTopicArns = Prelude.pure newValue, ..}
+instance Property "Tags" SlackChannelConfiguration where
+  type PropertyType "Tags" SlackChannelConfiguration = [Tag]
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration {tags = Prelude.pure newValue, ..}
+instance Property "UserRoleRequired" SlackChannelConfiguration where
+  type PropertyType "UserRoleRequired" SlackChannelConfiguration = Value Prelude.Bool
+  set newValue SlackChannelConfiguration {..}
+    = SlackChannelConfiguration
+        {userRoleRequired = Prelude.pure newValue, ..}
diff --git a/stratosphere-chatbot.cabal b/stratosphere-chatbot.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-chatbot.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-chatbot
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS Chatbot.
+description:    Integration into stratosphere to generate resources and properties for AWS Chatbot
+category:       AWS, Cloud, Chatbot
+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.Chatbot.CustomAction
+      Stratosphere.Chatbot.CustomAction.CustomActionAttachmentCriteriaProperty
+      Stratosphere.Chatbot.CustomAction.CustomActionAttachmentProperty
+      Stratosphere.Chatbot.CustomAction.CustomActionDefinitionProperty
+      Stratosphere.Chatbot.MicrosoftTeamsChannelConfiguration
+      Stratosphere.Chatbot.SlackChannelConfiguration
+  other-modules:
+      Paths_stratosphere_chatbot
+  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
