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/Elasticsearch/Domain.hs b/gen/Stratosphere/Elasticsearch/Domain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain.hs
@@ -0,0 +1,181 @@
+module Stratosphere.Elasticsearch.Domain (
+        module Exports, Domain(..), mkDomain
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.AdvancedSecurityOptionsInputProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.CognitoOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.DomainEndpointOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.EBSOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.ElasticsearchClusterConfigProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.EncryptionAtRestOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.LogPublishingOptionProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.NodeToNodeEncryptionOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.SnapshotOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.VPCOptionsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data Domain
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html>
+    Domain {haddock_workaround_ :: (),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-accesspolicies>
+            accessPolicies :: (Prelude.Maybe JSON.Object),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedoptions>
+            advancedOptions :: (Prelude.Maybe (Prelude.Map Prelude.Text (Value Prelude.Text))),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedsecurityoptions>
+            advancedSecurityOptions :: (Prelude.Maybe AdvancedSecurityOptionsInputProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-cognitooptions>
+            cognitoOptions :: (Prelude.Maybe CognitoOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainendpointoptions>
+            domainEndpointOptions :: (Prelude.Maybe DomainEndpointOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainname>
+            domainName :: (Prelude.Maybe (Value Prelude.Text)),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-ebsoptions>
+            eBSOptions :: (Prelude.Maybe EBSOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchclusterconfig>
+            elasticsearchClusterConfig :: (Prelude.Maybe ElasticsearchClusterConfigProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchversion>
+            elasticsearchVersion :: (Prelude.Maybe (Value Prelude.Text)),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-encryptionatrestoptions>
+            encryptionAtRestOptions :: (Prelude.Maybe EncryptionAtRestOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-logpublishingoptions>
+            logPublishingOptions :: (Prelude.Maybe (Prelude.Map Prelude.Text LogPublishingOptionProperty)),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions>
+            nodeToNodeEncryptionOptions :: (Prelude.Maybe NodeToNodeEncryptionOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-snapshotoptions>
+            snapshotOptions :: (Prelude.Maybe SnapshotOptionsProperty),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-tags>
+            tags :: (Prelude.Maybe [Tag]),
+            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-vpcoptions>
+            vPCOptions :: (Prelude.Maybe VPCOptionsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDomain :: Domain
+mkDomain
+  = Domain
+      {haddock_workaround_ = (), accessPolicies = Prelude.Nothing,
+       advancedOptions = Prelude.Nothing,
+       advancedSecurityOptions = Prelude.Nothing,
+       cognitoOptions = Prelude.Nothing,
+       domainEndpointOptions = Prelude.Nothing,
+       domainName = Prelude.Nothing, eBSOptions = Prelude.Nothing,
+       elasticsearchClusterConfig = Prelude.Nothing,
+       elasticsearchVersion = Prelude.Nothing,
+       encryptionAtRestOptions = Prelude.Nothing,
+       logPublishingOptions = Prelude.Nothing,
+       nodeToNodeEncryptionOptions = Prelude.Nothing,
+       snapshotOptions = Prelude.Nothing, tags = Prelude.Nothing,
+       vPCOptions = Prelude.Nothing}
+instance ToResourceProperties Domain where
+  toResourceProperties Domain {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AccessPolicies" Prelude.<$> accessPolicies,
+                            (JSON..=) "AdvancedOptions" Prelude.<$> advancedOptions,
+                            (JSON..=) "AdvancedSecurityOptions"
+                              Prelude.<$> advancedSecurityOptions,
+                            (JSON..=) "CognitoOptions" Prelude.<$> cognitoOptions,
+                            (JSON..=) "DomainEndpointOptions"
+                              Prelude.<$> domainEndpointOptions,
+                            (JSON..=) "DomainName" Prelude.<$> domainName,
+                            (JSON..=) "EBSOptions" Prelude.<$> eBSOptions,
+                            (JSON..=) "ElasticsearchClusterConfig"
+                              Prelude.<$> elasticsearchClusterConfig,
+                            (JSON..=) "ElasticsearchVersion" Prelude.<$> elasticsearchVersion,
+                            (JSON..=) "EncryptionAtRestOptions"
+                              Prelude.<$> encryptionAtRestOptions,
+                            (JSON..=) "LogPublishingOptions" Prelude.<$> logPublishingOptions,
+                            (JSON..=) "NodeToNodeEncryptionOptions"
+                              Prelude.<$> nodeToNodeEncryptionOptions,
+                            (JSON..=) "SnapshotOptions" Prelude.<$> snapshotOptions,
+                            (JSON..=) "Tags" Prelude.<$> tags,
+                            (JSON..=) "VPCOptions" Prelude.<$> vPCOptions])}
+instance JSON.ToJSON Domain where
+  toJSON Domain {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AccessPolicies" Prelude.<$> accessPolicies,
+               (JSON..=) "AdvancedOptions" Prelude.<$> advancedOptions,
+               (JSON..=) "AdvancedSecurityOptions"
+                 Prelude.<$> advancedSecurityOptions,
+               (JSON..=) "CognitoOptions" Prelude.<$> cognitoOptions,
+               (JSON..=) "DomainEndpointOptions"
+                 Prelude.<$> domainEndpointOptions,
+               (JSON..=) "DomainName" Prelude.<$> domainName,
+               (JSON..=) "EBSOptions" Prelude.<$> eBSOptions,
+               (JSON..=) "ElasticsearchClusterConfig"
+                 Prelude.<$> elasticsearchClusterConfig,
+               (JSON..=) "ElasticsearchVersion" Prelude.<$> elasticsearchVersion,
+               (JSON..=) "EncryptionAtRestOptions"
+                 Prelude.<$> encryptionAtRestOptions,
+               (JSON..=) "LogPublishingOptions" Prelude.<$> logPublishingOptions,
+               (JSON..=) "NodeToNodeEncryptionOptions"
+                 Prelude.<$> nodeToNodeEncryptionOptions,
+               (JSON..=) "SnapshotOptions" Prelude.<$> snapshotOptions,
+               (JSON..=) "Tags" Prelude.<$> tags,
+               (JSON..=) "VPCOptions" Prelude.<$> vPCOptions]))
+instance Property "AccessPolicies" Domain where
+  type PropertyType "AccessPolicies" Domain = JSON.Object
+  set newValue Domain {..}
+    = Domain {accessPolicies = Prelude.pure newValue, ..}
+instance Property "AdvancedOptions" Domain where
+  type PropertyType "AdvancedOptions" Domain = Prelude.Map Prelude.Text (Value Prelude.Text)
+  set newValue Domain {..}
+    = Domain {advancedOptions = Prelude.pure newValue, ..}
+instance Property "AdvancedSecurityOptions" Domain where
+  type PropertyType "AdvancedSecurityOptions" Domain = AdvancedSecurityOptionsInputProperty
+  set newValue Domain {..}
+    = Domain {advancedSecurityOptions = Prelude.pure newValue, ..}
+instance Property "CognitoOptions" Domain where
+  type PropertyType "CognitoOptions" Domain = CognitoOptionsProperty
+  set newValue Domain {..}
+    = Domain {cognitoOptions = Prelude.pure newValue, ..}
+instance Property "DomainEndpointOptions" Domain where
+  type PropertyType "DomainEndpointOptions" Domain = DomainEndpointOptionsProperty
+  set newValue Domain {..}
+    = Domain {domainEndpointOptions = Prelude.pure newValue, ..}
+instance Property "DomainName" Domain where
+  type PropertyType "DomainName" Domain = Value Prelude.Text
+  set newValue Domain {..}
+    = Domain {domainName = Prelude.pure newValue, ..}
+instance Property "EBSOptions" Domain where
+  type PropertyType "EBSOptions" Domain = EBSOptionsProperty
+  set newValue Domain {..}
+    = Domain {eBSOptions = Prelude.pure newValue, ..}
+instance Property "ElasticsearchClusterConfig" Domain where
+  type PropertyType "ElasticsearchClusterConfig" Domain = ElasticsearchClusterConfigProperty
+  set newValue Domain {..}
+    = Domain {elasticsearchClusterConfig = Prelude.pure newValue, ..}
+instance Property "ElasticsearchVersion" Domain where
+  type PropertyType "ElasticsearchVersion" Domain = Value Prelude.Text
+  set newValue Domain {..}
+    = Domain {elasticsearchVersion = Prelude.pure newValue, ..}
+instance Property "EncryptionAtRestOptions" Domain where
+  type PropertyType "EncryptionAtRestOptions" Domain = EncryptionAtRestOptionsProperty
+  set newValue Domain {..}
+    = Domain {encryptionAtRestOptions = Prelude.pure newValue, ..}
+instance Property "LogPublishingOptions" Domain where
+  type PropertyType "LogPublishingOptions" Domain = Prelude.Map Prelude.Text LogPublishingOptionProperty
+  set newValue Domain {..}
+    = Domain {logPublishingOptions = Prelude.pure newValue, ..}
+instance Property "NodeToNodeEncryptionOptions" Domain where
+  type PropertyType "NodeToNodeEncryptionOptions" Domain = NodeToNodeEncryptionOptionsProperty
+  set newValue Domain {..}
+    = Domain {nodeToNodeEncryptionOptions = Prelude.pure newValue, ..}
+instance Property "SnapshotOptions" Domain where
+  type PropertyType "SnapshotOptions" Domain = SnapshotOptionsProperty
+  set newValue Domain {..}
+    = Domain {snapshotOptions = Prelude.pure newValue, ..}
+instance Property "Tags" Domain where
+  type PropertyType "Tags" Domain = [Tag]
+  set newValue Domain {..}
+    = Domain {tags = Prelude.pure newValue, ..}
+instance Property "VPCOptions" Domain where
+  type PropertyType "VPCOptions" Domain = VPCOptionsProperty
+  set newValue Domain {..}
+    = Domain {vPCOptions = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs
@@ -0,0 +1,72 @@
+module Stratosphere.Elasticsearch.Domain.AdvancedSecurityOptionsInputProperty (
+        module Exports, AdvancedSecurityOptionsInputProperty(..),
+        mkAdvancedSecurityOptionsInputProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.MasterUserOptionsProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data AdvancedSecurityOptionsInputProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html>
+    AdvancedSecurityOptionsInputProperty {haddock_workaround_ :: (),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-anonymousauthenabled>
+                                          anonymousAuthEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-enabled>
+                                          enabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-internaluserdatabaseenabled>
+                                          internalUserDatabaseEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                          -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-masteruseroptions>
+                                          masterUserOptions :: (Prelude.Maybe MasterUserOptionsProperty)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkAdvancedSecurityOptionsInputProperty ::
+  AdvancedSecurityOptionsInputProperty
+mkAdvancedSecurityOptionsInputProperty
+  = AdvancedSecurityOptionsInputProperty
+      {haddock_workaround_ = (), anonymousAuthEnabled = Prelude.Nothing,
+       enabled = Prelude.Nothing,
+       internalUserDatabaseEnabled = Prelude.Nothing,
+       masterUserOptions = Prelude.Nothing}
+instance ToResourceProperties AdvancedSecurityOptionsInputProperty where
+  toResourceProperties AdvancedSecurityOptionsInputProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.AdvancedSecurityOptionsInput",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AnonymousAuthEnabled" Prelude.<$> anonymousAuthEnabled,
+                            (JSON..=) "Enabled" Prelude.<$> enabled,
+                            (JSON..=) "InternalUserDatabaseEnabled"
+                              Prelude.<$> internalUserDatabaseEnabled,
+                            (JSON..=) "MasterUserOptions" Prelude.<$> masterUserOptions])}
+instance JSON.ToJSON AdvancedSecurityOptionsInputProperty where
+  toJSON AdvancedSecurityOptionsInputProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AnonymousAuthEnabled" Prelude.<$> anonymousAuthEnabled,
+               (JSON..=) "Enabled" Prelude.<$> enabled,
+               (JSON..=) "InternalUserDatabaseEnabled"
+                 Prelude.<$> internalUserDatabaseEnabled,
+               (JSON..=) "MasterUserOptions" Prelude.<$> masterUserOptions]))
+instance Property "AnonymousAuthEnabled" AdvancedSecurityOptionsInputProperty where
+  type PropertyType "AnonymousAuthEnabled" AdvancedSecurityOptionsInputProperty = Value Prelude.Bool
+  set newValue AdvancedSecurityOptionsInputProperty {..}
+    = AdvancedSecurityOptionsInputProperty
+        {anonymousAuthEnabled = Prelude.pure newValue, ..}
+instance Property "Enabled" AdvancedSecurityOptionsInputProperty where
+  type PropertyType "Enabled" AdvancedSecurityOptionsInputProperty = Value Prelude.Bool
+  set newValue AdvancedSecurityOptionsInputProperty {..}
+    = AdvancedSecurityOptionsInputProperty
+        {enabled = Prelude.pure newValue, ..}
+instance Property "InternalUserDatabaseEnabled" AdvancedSecurityOptionsInputProperty where
+  type PropertyType "InternalUserDatabaseEnabled" AdvancedSecurityOptionsInputProperty = Value Prelude.Bool
+  set newValue AdvancedSecurityOptionsInputProperty {..}
+    = AdvancedSecurityOptionsInputProperty
+        {internalUserDatabaseEnabled = Prelude.pure newValue, ..}
+instance Property "MasterUserOptions" AdvancedSecurityOptionsInputProperty where
+  type PropertyType "MasterUserOptions" AdvancedSecurityOptionsInputProperty = MasterUserOptionsProperty
+  set newValue AdvancedSecurityOptionsInputProperty {..}
+    = AdvancedSecurityOptionsInputProperty
+        {masterUserOptions = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/AdvancedSecurityOptionsInputProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.AdvancedSecurityOptionsInputProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data AdvancedSecurityOptionsInputProperty :: Prelude.Type
+instance ToResourceProperties AdvancedSecurityOptionsInputProperty
+instance Prelude.Eq AdvancedSecurityOptionsInputProperty
+instance Prelude.Show AdvancedSecurityOptionsInputProperty
+instance JSON.ToJSON AdvancedSecurityOptionsInputProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs
@@ -0,0 +1,63 @@
+module Stratosphere.Elasticsearch.Domain.CognitoOptionsProperty (
+        CognitoOptionsProperty(..), mkCognitoOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data CognitoOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html>
+    CognitoOptionsProperty {haddock_workaround_ :: (),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-enabled>
+                            enabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-identitypoolid>
+                            identityPoolId :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-rolearn>
+                            roleArn :: (Prelude.Maybe (Value Prelude.Text)),
+                            -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-userpoolid>
+                            userPoolId :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkCognitoOptionsProperty :: CognitoOptionsProperty
+mkCognitoOptionsProperty
+  = CognitoOptionsProperty
+      {haddock_workaround_ = (), enabled = Prelude.Nothing,
+       identityPoolId = Prelude.Nothing, roleArn = Prelude.Nothing,
+       userPoolId = Prelude.Nothing}
+instance ToResourceProperties CognitoOptionsProperty where
+  toResourceProperties CognitoOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.CognitoOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Enabled" Prelude.<$> enabled,
+                            (JSON..=) "IdentityPoolId" Prelude.<$> identityPoolId,
+                            (JSON..=) "RoleArn" Prelude.<$> roleArn,
+                            (JSON..=) "UserPoolId" Prelude.<$> userPoolId])}
+instance JSON.ToJSON CognitoOptionsProperty where
+  toJSON CognitoOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Enabled" Prelude.<$> enabled,
+               (JSON..=) "IdentityPoolId" Prelude.<$> identityPoolId,
+               (JSON..=) "RoleArn" Prelude.<$> roleArn,
+               (JSON..=) "UserPoolId" Prelude.<$> userPoolId]))
+instance Property "Enabled" CognitoOptionsProperty where
+  type PropertyType "Enabled" CognitoOptionsProperty = Value Prelude.Bool
+  set newValue CognitoOptionsProperty {..}
+    = CognitoOptionsProperty {enabled = Prelude.pure newValue, ..}
+instance Property "IdentityPoolId" CognitoOptionsProperty where
+  type PropertyType "IdentityPoolId" CognitoOptionsProperty = Value Prelude.Text
+  set newValue CognitoOptionsProperty {..}
+    = CognitoOptionsProperty
+        {identityPoolId = Prelude.pure newValue, ..}
+instance Property "RoleArn" CognitoOptionsProperty where
+  type PropertyType "RoleArn" CognitoOptionsProperty = Value Prelude.Text
+  set newValue CognitoOptionsProperty {..}
+    = CognitoOptionsProperty {roleArn = Prelude.pure newValue, ..}
+instance Property "UserPoolId" CognitoOptionsProperty where
+  type PropertyType "UserPoolId" CognitoOptionsProperty = Value Prelude.Text
+  set newValue CognitoOptionsProperty {..}
+    = CognitoOptionsProperty {userPoolId = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/CognitoOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.CognitoOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data CognitoOptionsProperty :: Prelude.Type
+instance ToResourceProperties CognitoOptionsProperty
+instance Prelude.Eq CognitoOptionsProperty
+instance Prelude.Show CognitoOptionsProperty
+instance JSON.ToJSON CognitoOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs
@@ -0,0 +1,34 @@
+module Stratosphere.Elasticsearch.Domain.ColdStorageOptionsProperty (
+        ColdStorageOptionsProperty(..), mkColdStorageOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ColdStorageOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html>
+    ColdStorageOptionsProperty {haddock_workaround_ :: (),
+                                -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html#cfn-elasticsearch-domain-coldstorageoptions-enabled>
+                                enabled :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkColdStorageOptionsProperty :: ColdStorageOptionsProperty
+mkColdStorageOptionsProperty
+  = ColdStorageOptionsProperty
+      {haddock_workaround_ = (), enabled = Prelude.Nothing}
+instance ToResourceProperties ColdStorageOptionsProperty where
+  toResourceProperties ColdStorageOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.ColdStorageOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Enabled" Prelude.<$> enabled])}
+instance JSON.ToJSON ColdStorageOptionsProperty where
+  toJSON ColdStorageOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Enabled" Prelude.<$> enabled]))
+instance Property "Enabled" ColdStorageOptionsProperty where
+  type PropertyType "Enabled" ColdStorageOptionsProperty = Value Prelude.Bool
+  set newValue ColdStorageOptionsProperty {..}
+    = ColdStorageOptionsProperty {enabled = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ColdStorageOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.ColdStorageOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ColdStorageOptionsProperty :: Prelude.Type
+instance ToResourceProperties ColdStorageOptionsProperty
+instance Prelude.Eq ColdStorageOptionsProperty
+instance Prelude.Show ColdStorageOptionsProperty
+instance JSON.ToJSON ColdStorageOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs
@@ -0,0 +1,81 @@
+module Stratosphere.Elasticsearch.Domain.DomainEndpointOptionsProperty (
+        DomainEndpointOptionsProperty(..), mkDomainEndpointOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data DomainEndpointOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html>
+    DomainEndpointOptionsProperty {haddock_workaround_ :: (),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpoint>
+                                   customEndpoint :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpointcertificatearn>
+                                   customEndpointCertificateArn :: (Prelude.Maybe (Value Prelude.Text)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpointenabled>
+                                   customEndpointEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-enforcehttps>
+                                   enforceHTTPS :: (Prelude.Maybe (Value Prelude.Bool)),
+                                   -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-tlssecuritypolicy>
+                                   tLSSecurityPolicy :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkDomainEndpointOptionsProperty :: DomainEndpointOptionsProperty
+mkDomainEndpointOptionsProperty
+  = DomainEndpointOptionsProperty
+      {haddock_workaround_ = (), customEndpoint = Prelude.Nothing,
+       customEndpointCertificateArn = Prelude.Nothing,
+       customEndpointEnabled = Prelude.Nothing,
+       enforceHTTPS = Prelude.Nothing,
+       tLSSecurityPolicy = Prelude.Nothing}
+instance ToResourceProperties DomainEndpointOptionsProperty where
+  toResourceProperties DomainEndpointOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.DomainEndpointOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "CustomEndpoint" Prelude.<$> customEndpoint,
+                            (JSON..=) "CustomEndpointCertificateArn"
+                              Prelude.<$> customEndpointCertificateArn,
+                            (JSON..=) "CustomEndpointEnabled"
+                              Prelude.<$> customEndpointEnabled,
+                            (JSON..=) "EnforceHTTPS" Prelude.<$> enforceHTTPS,
+                            (JSON..=) "TLSSecurityPolicy" Prelude.<$> tLSSecurityPolicy])}
+instance JSON.ToJSON DomainEndpointOptionsProperty where
+  toJSON DomainEndpointOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "CustomEndpoint" Prelude.<$> customEndpoint,
+               (JSON..=) "CustomEndpointCertificateArn"
+                 Prelude.<$> customEndpointCertificateArn,
+               (JSON..=) "CustomEndpointEnabled"
+                 Prelude.<$> customEndpointEnabled,
+               (JSON..=) "EnforceHTTPS" Prelude.<$> enforceHTTPS,
+               (JSON..=) "TLSSecurityPolicy" Prelude.<$> tLSSecurityPolicy]))
+instance Property "CustomEndpoint" DomainEndpointOptionsProperty where
+  type PropertyType "CustomEndpoint" DomainEndpointOptionsProperty = Value Prelude.Text
+  set newValue DomainEndpointOptionsProperty {..}
+    = DomainEndpointOptionsProperty
+        {customEndpoint = Prelude.pure newValue, ..}
+instance Property "CustomEndpointCertificateArn" DomainEndpointOptionsProperty where
+  type PropertyType "CustomEndpointCertificateArn" DomainEndpointOptionsProperty = Value Prelude.Text
+  set newValue DomainEndpointOptionsProperty {..}
+    = DomainEndpointOptionsProperty
+        {customEndpointCertificateArn = Prelude.pure newValue, ..}
+instance Property "CustomEndpointEnabled" DomainEndpointOptionsProperty where
+  type PropertyType "CustomEndpointEnabled" DomainEndpointOptionsProperty = Value Prelude.Bool
+  set newValue DomainEndpointOptionsProperty {..}
+    = DomainEndpointOptionsProperty
+        {customEndpointEnabled = Prelude.pure newValue, ..}
+instance Property "EnforceHTTPS" DomainEndpointOptionsProperty where
+  type PropertyType "EnforceHTTPS" DomainEndpointOptionsProperty = Value Prelude.Bool
+  set newValue DomainEndpointOptionsProperty {..}
+    = DomainEndpointOptionsProperty
+        {enforceHTTPS = Prelude.pure newValue, ..}
+instance Property "TLSSecurityPolicy" DomainEndpointOptionsProperty where
+  type PropertyType "TLSSecurityPolicy" DomainEndpointOptionsProperty = Value Prelude.Text
+  set newValue DomainEndpointOptionsProperty {..}
+    = DomainEndpointOptionsProperty
+        {tLSSecurityPolicy = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/DomainEndpointOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.DomainEndpointOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data DomainEndpointOptionsProperty :: Prelude.Type
+instance ToResourceProperties DomainEndpointOptionsProperty
+instance Prelude.Eq DomainEndpointOptionsProperty
+instance Prelude.Show DomainEndpointOptionsProperty
+instance JSON.ToJSON DomainEndpointOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs
@@ -0,0 +1,62 @@
+module Stratosphere.Elasticsearch.Domain.EBSOptionsProperty (
+        EBSOptionsProperty(..), mkEBSOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data EBSOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html>
+    EBSOptionsProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-ebsenabled>
+                        eBSEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-iops>
+                        iops :: (Prelude.Maybe (Value Prelude.Integer)),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-volumesize>
+                        volumeSize :: (Prelude.Maybe (Value Prelude.Integer)),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-volumetype>
+                        volumeType :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEBSOptionsProperty :: EBSOptionsProperty
+mkEBSOptionsProperty
+  = EBSOptionsProperty
+      {haddock_workaround_ = (), eBSEnabled = Prelude.Nothing,
+       iops = Prelude.Nothing, volumeSize = Prelude.Nothing,
+       volumeType = Prelude.Nothing}
+instance ToResourceProperties EBSOptionsProperty where
+  toResourceProperties EBSOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.EBSOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "EBSEnabled" Prelude.<$> eBSEnabled,
+                            (JSON..=) "Iops" Prelude.<$> iops,
+                            (JSON..=) "VolumeSize" Prelude.<$> volumeSize,
+                            (JSON..=) "VolumeType" Prelude.<$> volumeType])}
+instance JSON.ToJSON EBSOptionsProperty where
+  toJSON EBSOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "EBSEnabled" Prelude.<$> eBSEnabled,
+               (JSON..=) "Iops" Prelude.<$> iops,
+               (JSON..=) "VolumeSize" Prelude.<$> volumeSize,
+               (JSON..=) "VolumeType" Prelude.<$> volumeType]))
+instance Property "EBSEnabled" EBSOptionsProperty where
+  type PropertyType "EBSEnabled" EBSOptionsProperty = Value Prelude.Bool
+  set newValue EBSOptionsProperty {..}
+    = EBSOptionsProperty {eBSEnabled = Prelude.pure newValue, ..}
+instance Property "Iops" EBSOptionsProperty where
+  type PropertyType "Iops" EBSOptionsProperty = Value Prelude.Integer
+  set newValue EBSOptionsProperty {..}
+    = EBSOptionsProperty {iops = Prelude.pure newValue, ..}
+instance Property "VolumeSize" EBSOptionsProperty where
+  type PropertyType "VolumeSize" EBSOptionsProperty = Value Prelude.Integer
+  set newValue EBSOptionsProperty {..}
+    = EBSOptionsProperty {volumeSize = Prelude.pure newValue, ..}
+instance Property "VolumeType" EBSOptionsProperty where
+  type PropertyType "VolumeType" EBSOptionsProperty = Value Prelude.Text
+  set newValue EBSOptionsProperty {..}
+    = EBSOptionsProperty {volumeType = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/EBSOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.EBSOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data EBSOptionsProperty :: Prelude.Type
+instance ToResourceProperties EBSOptionsProperty
+instance Prelude.Eq EBSOptionsProperty
+instance Prelude.Show EBSOptionsProperty
+instance JSON.ToJSON EBSOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs
@@ -0,0 +1,142 @@
+module Stratosphere.Elasticsearch.Domain.ElasticsearchClusterConfigProperty (
+        module Exports, ElasticsearchClusterConfigProperty(..),
+        mkElasticsearchClusterConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.ColdStorageOptionsProperty as Exports
+import {-# SOURCE #-} Stratosphere.Elasticsearch.Domain.ZoneAwarenessConfigProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ElasticsearchClusterConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html>
+    ElasticsearchClusterConfigProperty {haddock_workaround_ :: (),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-coldstorageoptions>
+                                        coldStorageOptions :: (Prelude.Maybe ColdStorageOptionsProperty),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmastercount>
+                                        dedicatedMasterCount :: (Prelude.Maybe (Value Prelude.Integer)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmasterenabled>
+                                        dedicatedMasterEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmastertype>
+                                        dedicatedMasterType :: (Prelude.Maybe (Value Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-instancecount>
+                                        instanceCount :: (Prelude.Maybe (Value Prelude.Integer)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-instnacetype>
+                                        instanceType :: (Prelude.Maybe (Value Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmcount>
+                                        warmCount :: (Prelude.Maybe (Value Prelude.Integer)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmenabled>
+                                        warmEnabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmtype>
+                                        warmType :: (Prelude.Maybe (Value Prelude.Text)),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-zoneawarenessconfig>
+                                        zoneAwarenessConfig :: (Prelude.Maybe ZoneAwarenessConfigProperty),
+                                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-zoneawarenessenabled>
+                                        zoneAwarenessEnabled :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkElasticsearchClusterConfigProperty ::
+  ElasticsearchClusterConfigProperty
+mkElasticsearchClusterConfigProperty
+  = ElasticsearchClusterConfigProperty
+      {haddock_workaround_ = (), coldStorageOptions = Prelude.Nothing,
+       dedicatedMasterCount = Prelude.Nothing,
+       dedicatedMasterEnabled = Prelude.Nothing,
+       dedicatedMasterType = Prelude.Nothing,
+       instanceCount = Prelude.Nothing, instanceType = Prelude.Nothing,
+       warmCount = Prelude.Nothing, warmEnabled = Prelude.Nothing,
+       warmType = Prelude.Nothing, zoneAwarenessConfig = Prelude.Nothing,
+       zoneAwarenessEnabled = Prelude.Nothing}
+instance ToResourceProperties ElasticsearchClusterConfigProperty where
+  toResourceProperties ElasticsearchClusterConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.ElasticsearchClusterConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "ColdStorageOptions" Prelude.<$> coldStorageOptions,
+                            (JSON..=) "DedicatedMasterCount" Prelude.<$> dedicatedMasterCount,
+                            (JSON..=) "DedicatedMasterEnabled"
+                              Prelude.<$> dedicatedMasterEnabled,
+                            (JSON..=) "DedicatedMasterType" Prelude.<$> dedicatedMasterType,
+                            (JSON..=) "InstanceCount" Prelude.<$> instanceCount,
+                            (JSON..=) "InstanceType" Prelude.<$> instanceType,
+                            (JSON..=) "WarmCount" Prelude.<$> warmCount,
+                            (JSON..=) "WarmEnabled" Prelude.<$> warmEnabled,
+                            (JSON..=) "WarmType" Prelude.<$> warmType,
+                            (JSON..=) "ZoneAwarenessConfig" Prelude.<$> zoneAwarenessConfig,
+                            (JSON..=) "ZoneAwarenessEnabled"
+                              Prelude.<$> zoneAwarenessEnabled])}
+instance JSON.ToJSON ElasticsearchClusterConfigProperty where
+  toJSON ElasticsearchClusterConfigProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "ColdStorageOptions" Prelude.<$> coldStorageOptions,
+               (JSON..=) "DedicatedMasterCount" Prelude.<$> dedicatedMasterCount,
+               (JSON..=) "DedicatedMasterEnabled"
+                 Prelude.<$> dedicatedMasterEnabled,
+               (JSON..=) "DedicatedMasterType" Prelude.<$> dedicatedMasterType,
+               (JSON..=) "InstanceCount" Prelude.<$> instanceCount,
+               (JSON..=) "InstanceType" Prelude.<$> instanceType,
+               (JSON..=) "WarmCount" Prelude.<$> warmCount,
+               (JSON..=) "WarmEnabled" Prelude.<$> warmEnabled,
+               (JSON..=) "WarmType" Prelude.<$> warmType,
+               (JSON..=) "ZoneAwarenessConfig" Prelude.<$> zoneAwarenessConfig,
+               (JSON..=) "ZoneAwarenessEnabled"
+                 Prelude.<$> zoneAwarenessEnabled]))
+instance Property "ColdStorageOptions" ElasticsearchClusterConfigProperty where
+  type PropertyType "ColdStorageOptions" ElasticsearchClusterConfigProperty = ColdStorageOptionsProperty
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {coldStorageOptions = Prelude.pure newValue, ..}
+instance Property "DedicatedMasterCount" ElasticsearchClusterConfigProperty where
+  type PropertyType "DedicatedMasterCount" ElasticsearchClusterConfigProperty = Value Prelude.Integer
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {dedicatedMasterCount = Prelude.pure newValue, ..}
+instance Property "DedicatedMasterEnabled" ElasticsearchClusterConfigProperty where
+  type PropertyType "DedicatedMasterEnabled" ElasticsearchClusterConfigProperty = Value Prelude.Bool
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {dedicatedMasterEnabled = Prelude.pure newValue, ..}
+instance Property "DedicatedMasterType" ElasticsearchClusterConfigProperty where
+  type PropertyType "DedicatedMasterType" ElasticsearchClusterConfigProperty = Value Prelude.Text
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {dedicatedMasterType = Prelude.pure newValue, ..}
+instance Property "InstanceCount" ElasticsearchClusterConfigProperty where
+  type PropertyType "InstanceCount" ElasticsearchClusterConfigProperty = Value Prelude.Integer
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {instanceCount = Prelude.pure newValue, ..}
+instance Property "InstanceType" ElasticsearchClusterConfigProperty where
+  type PropertyType "InstanceType" ElasticsearchClusterConfigProperty = Value Prelude.Text
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {instanceType = Prelude.pure newValue, ..}
+instance Property "WarmCount" ElasticsearchClusterConfigProperty where
+  type PropertyType "WarmCount" ElasticsearchClusterConfigProperty = Value Prelude.Integer
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {warmCount = Prelude.pure newValue, ..}
+instance Property "WarmEnabled" ElasticsearchClusterConfigProperty where
+  type PropertyType "WarmEnabled" ElasticsearchClusterConfigProperty = Value Prelude.Bool
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {warmEnabled = Prelude.pure newValue, ..}
+instance Property "WarmType" ElasticsearchClusterConfigProperty where
+  type PropertyType "WarmType" ElasticsearchClusterConfigProperty = Value Prelude.Text
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {warmType = Prelude.pure newValue, ..}
+instance Property "ZoneAwarenessConfig" ElasticsearchClusterConfigProperty where
+  type PropertyType "ZoneAwarenessConfig" ElasticsearchClusterConfigProperty = ZoneAwarenessConfigProperty
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {zoneAwarenessConfig = Prelude.pure newValue, ..}
+instance Property "ZoneAwarenessEnabled" ElasticsearchClusterConfigProperty where
+  type PropertyType "ZoneAwarenessEnabled" ElasticsearchClusterConfigProperty = Value Prelude.Bool
+  set newValue ElasticsearchClusterConfigProperty {..}
+    = ElasticsearchClusterConfigProperty
+        {zoneAwarenessEnabled = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ElasticsearchClusterConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.ElasticsearchClusterConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ElasticsearchClusterConfigProperty :: Prelude.Type
+instance ToResourceProperties ElasticsearchClusterConfigProperty
+instance Prelude.Eq ElasticsearchClusterConfigProperty
+instance Prelude.Show ElasticsearchClusterConfigProperty
+instance JSON.ToJSON ElasticsearchClusterConfigProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.Elasticsearch.Domain.EncryptionAtRestOptionsProperty (
+        EncryptionAtRestOptionsProperty(..),
+        mkEncryptionAtRestOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data EncryptionAtRestOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html>
+    EncryptionAtRestOptionsProperty {haddock_workaround_ :: (),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html#cfn-elasticsearch-domain-encryptionatrestoptions-enabled>
+                                     enabled :: (Prelude.Maybe (Value Prelude.Bool)),
+                                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html#cfn-elasticsearch-domain-encryptionatrestoptions-kmskeyid>
+                                     kmsKeyId :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEncryptionAtRestOptionsProperty ::
+  EncryptionAtRestOptionsProperty
+mkEncryptionAtRestOptionsProperty
+  = EncryptionAtRestOptionsProperty
+      {haddock_workaround_ = (), enabled = Prelude.Nothing,
+       kmsKeyId = Prelude.Nothing}
+instance ToResourceProperties EncryptionAtRestOptionsProperty where
+  toResourceProperties EncryptionAtRestOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.EncryptionAtRestOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "Enabled" Prelude.<$> enabled,
+                            (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId])}
+instance JSON.ToJSON EncryptionAtRestOptionsProperty where
+  toJSON EncryptionAtRestOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "Enabled" Prelude.<$> enabled,
+               (JSON..=) "KmsKeyId" Prelude.<$> kmsKeyId]))
+instance Property "Enabled" EncryptionAtRestOptionsProperty where
+  type PropertyType "Enabled" EncryptionAtRestOptionsProperty = Value Prelude.Bool
+  set newValue EncryptionAtRestOptionsProperty {..}
+    = EncryptionAtRestOptionsProperty
+        {enabled = Prelude.pure newValue, ..}
+instance Property "KmsKeyId" EncryptionAtRestOptionsProperty where
+  type PropertyType "KmsKeyId" EncryptionAtRestOptionsProperty = Value Prelude.Text
+  set newValue EncryptionAtRestOptionsProperty {..}
+    = EncryptionAtRestOptionsProperty
+        {kmsKeyId = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/EncryptionAtRestOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.EncryptionAtRestOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data EncryptionAtRestOptionsProperty :: Prelude.Type
+instance ToResourceProperties EncryptionAtRestOptionsProperty
+instance Prelude.Eq EncryptionAtRestOptionsProperty
+instance Prelude.Show EncryptionAtRestOptionsProperty
+instance JSON.ToJSON EncryptionAtRestOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs
@@ -0,0 +1,49 @@
+module Stratosphere.Elasticsearch.Domain.LogPublishingOptionProperty (
+        LogPublishingOptionProperty(..), mkLogPublishingOptionProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data LogPublishingOptionProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html>
+    LogPublishingOptionProperty {haddock_workaround_ :: (),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html#cfn-elasticsearch-domain-logpublishingoption-cloudwatchlogsloggrouparn>
+                                 cloudWatchLogsLogGroupArn :: (Prelude.Maybe (Value Prelude.Text)),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html#cfn-elasticsearch-domain-logpublishingoption-enabled>
+                                 enabled :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkLogPublishingOptionProperty :: LogPublishingOptionProperty
+mkLogPublishingOptionProperty
+  = LogPublishingOptionProperty
+      {haddock_workaround_ = (),
+       cloudWatchLogsLogGroupArn = Prelude.Nothing,
+       enabled = Prelude.Nothing}
+instance ToResourceProperties LogPublishingOptionProperty where
+  toResourceProperties LogPublishingOptionProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.LogPublishingOption",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "CloudWatchLogsLogGroupArn"
+                              Prelude.<$> cloudWatchLogsLogGroupArn,
+                            (JSON..=) "Enabled" Prelude.<$> enabled])}
+instance JSON.ToJSON LogPublishingOptionProperty where
+  toJSON LogPublishingOptionProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "CloudWatchLogsLogGroupArn"
+                 Prelude.<$> cloudWatchLogsLogGroupArn,
+               (JSON..=) "Enabled" Prelude.<$> enabled]))
+instance Property "CloudWatchLogsLogGroupArn" LogPublishingOptionProperty where
+  type PropertyType "CloudWatchLogsLogGroupArn" LogPublishingOptionProperty = Value Prelude.Text
+  set newValue LogPublishingOptionProperty {..}
+    = LogPublishingOptionProperty
+        {cloudWatchLogsLogGroupArn = Prelude.pure newValue, ..}
+instance Property "Enabled" LogPublishingOptionProperty where
+  type PropertyType "Enabled" LogPublishingOptionProperty = Value Prelude.Bool
+  set newValue LogPublishingOptionProperty {..}
+    = LogPublishingOptionProperty {enabled = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/LogPublishingOptionProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.LogPublishingOptionProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data LogPublishingOptionProperty :: Prelude.Type
+instance ToResourceProperties LogPublishingOptionProperty
+instance Prelude.Eq LogPublishingOptionProperty
+instance Prelude.Show LogPublishingOptionProperty
+instance JSON.ToJSON LogPublishingOptionProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs
@@ -0,0 +1,57 @@
+module Stratosphere.Elasticsearch.Domain.MasterUserOptionsProperty (
+        MasterUserOptionsProperty(..), mkMasterUserOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data MasterUserOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html>
+    MasterUserOptionsProperty {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masteruserarn>
+                               masterUserARN :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masterusername>
+                               masterUserName :: (Prelude.Maybe (Value Prelude.Text)),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masteruserpassword>
+                               masterUserPassword :: (Prelude.Maybe (Value Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkMasterUserOptionsProperty :: MasterUserOptionsProperty
+mkMasterUserOptionsProperty
+  = MasterUserOptionsProperty
+      {haddock_workaround_ = (), masterUserARN = Prelude.Nothing,
+       masterUserName = Prelude.Nothing,
+       masterUserPassword = Prelude.Nothing}
+instance ToResourceProperties MasterUserOptionsProperty where
+  toResourceProperties MasterUserOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.MasterUserOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "MasterUserARN" Prelude.<$> masterUserARN,
+                            (JSON..=) "MasterUserName" Prelude.<$> masterUserName,
+                            (JSON..=) "MasterUserPassword" Prelude.<$> masterUserPassword])}
+instance JSON.ToJSON MasterUserOptionsProperty where
+  toJSON MasterUserOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "MasterUserARN" Prelude.<$> masterUserARN,
+               (JSON..=) "MasterUserName" Prelude.<$> masterUserName,
+               (JSON..=) "MasterUserPassword" Prelude.<$> masterUserPassword]))
+instance Property "MasterUserARN" MasterUserOptionsProperty where
+  type PropertyType "MasterUserARN" MasterUserOptionsProperty = Value Prelude.Text
+  set newValue MasterUserOptionsProperty {..}
+    = MasterUserOptionsProperty
+        {masterUserARN = Prelude.pure newValue, ..}
+instance Property "MasterUserName" MasterUserOptionsProperty where
+  type PropertyType "MasterUserName" MasterUserOptionsProperty = Value Prelude.Text
+  set newValue MasterUserOptionsProperty {..}
+    = MasterUserOptionsProperty
+        {masterUserName = Prelude.pure newValue, ..}
+instance Property "MasterUserPassword" MasterUserOptionsProperty where
+  type PropertyType "MasterUserPassword" MasterUserOptionsProperty = Value Prelude.Text
+  set newValue MasterUserOptionsProperty {..}
+    = MasterUserOptionsProperty
+        {masterUserPassword = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/MasterUserOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.MasterUserOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data MasterUserOptionsProperty :: Prelude.Type
+instance ToResourceProperties MasterUserOptionsProperty
+instance Prelude.Eq MasterUserOptionsProperty
+instance Prelude.Show MasterUserOptionsProperty
+instance JSON.ToJSON MasterUserOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs
@@ -0,0 +1,37 @@
+module Stratosphere.Elasticsearch.Domain.NodeToNodeEncryptionOptionsProperty (
+        NodeToNodeEncryptionOptionsProperty(..),
+        mkNodeToNodeEncryptionOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data NodeToNodeEncryptionOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-nodetonodeencryptionoptions.html>
+    NodeToNodeEncryptionOptionsProperty {haddock_workaround_ :: (),
+                                         -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-nodetonodeencryptionoptions.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions-enabled>
+                                         enabled :: (Prelude.Maybe (Value Prelude.Bool))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkNodeToNodeEncryptionOptionsProperty ::
+  NodeToNodeEncryptionOptionsProperty
+mkNodeToNodeEncryptionOptionsProperty
+  = NodeToNodeEncryptionOptionsProperty
+      {haddock_workaround_ = (), enabled = Prelude.Nothing}
+instance ToResourceProperties NodeToNodeEncryptionOptionsProperty where
+  toResourceProperties NodeToNodeEncryptionOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.NodeToNodeEncryptionOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes [(JSON..=) "Enabled" Prelude.<$> enabled])}
+instance JSON.ToJSON NodeToNodeEncryptionOptionsProperty where
+  toJSON NodeToNodeEncryptionOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes [(JSON..=) "Enabled" Prelude.<$> enabled]))
+instance Property "Enabled" NodeToNodeEncryptionOptionsProperty where
+  type PropertyType "Enabled" NodeToNodeEncryptionOptionsProperty = Value Prelude.Bool
+  set newValue NodeToNodeEncryptionOptionsProperty {..}
+    = NodeToNodeEncryptionOptionsProperty
+        {enabled = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/NodeToNodeEncryptionOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.NodeToNodeEncryptionOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data NodeToNodeEncryptionOptionsProperty :: Prelude.Type
+instance ToResourceProperties NodeToNodeEncryptionOptionsProperty
+instance Prelude.Eq NodeToNodeEncryptionOptionsProperty
+instance Prelude.Show NodeToNodeEncryptionOptionsProperty
+instance JSON.ToJSON NodeToNodeEncryptionOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs
@@ -0,0 +1,40 @@
+module Stratosphere.Elasticsearch.Domain.SnapshotOptionsProperty (
+        SnapshotOptionsProperty(..), mkSnapshotOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data SnapshotOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-snapshotoptions.html>
+    SnapshotOptionsProperty {haddock_workaround_ :: (),
+                             -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-snapshotoptions.html#cfn-elasticsearch-domain-snapshotoptions-automatedsnapshotstarthour>
+                             automatedSnapshotStartHour :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkSnapshotOptionsProperty :: SnapshotOptionsProperty
+mkSnapshotOptionsProperty
+  = SnapshotOptionsProperty
+      {haddock_workaround_ = (),
+       automatedSnapshotStartHour = Prelude.Nothing}
+instance ToResourceProperties SnapshotOptionsProperty where
+  toResourceProperties SnapshotOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.SnapshotOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AutomatedSnapshotStartHour"
+                              Prelude.<$> automatedSnapshotStartHour])}
+instance JSON.ToJSON SnapshotOptionsProperty where
+  toJSON SnapshotOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AutomatedSnapshotStartHour"
+                 Prelude.<$> automatedSnapshotStartHour]))
+instance Property "AutomatedSnapshotStartHour" SnapshotOptionsProperty where
+  type PropertyType "AutomatedSnapshotStartHour" SnapshotOptionsProperty = Value Prelude.Integer
+  set newValue SnapshotOptionsProperty {..}
+    = SnapshotOptionsProperty
+        {automatedSnapshotStartHour = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/SnapshotOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.SnapshotOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data SnapshotOptionsProperty :: Prelude.Type
+instance ToResourceProperties SnapshotOptionsProperty
+instance Prelude.Eq SnapshotOptionsProperty
+instance Prelude.Show SnapshotOptionsProperty
+instance JSON.ToJSON SnapshotOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs
@@ -0,0 +1,45 @@
+module Stratosphere.Elasticsearch.Domain.VPCOptionsProperty (
+        VPCOptionsProperty(..), mkVPCOptionsProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data VPCOptionsProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html>
+    VPCOptionsProperty {haddock_workaround_ :: (),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html#cfn-elasticsearch-domain-vpcoptions-securitygroupids>
+                        securityGroupIds :: (Prelude.Maybe (ValueList Prelude.Text)),
+                        -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html#cfn-elasticsearch-domain-vpcoptions-subnetids>
+                        subnetIds :: (Prelude.Maybe (ValueList Prelude.Text))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVPCOptionsProperty :: VPCOptionsProperty
+mkVPCOptionsProperty
+  = VPCOptionsProperty
+      {haddock_workaround_ = (), securityGroupIds = Prelude.Nothing,
+       subnetIds = Prelude.Nothing}
+instance ToResourceProperties VPCOptionsProperty where
+  toResourceProperties VPCOptionsProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.VPCOptions",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+                            (JSON..=) "SubnetIds" Prelude.<$> subnetIds])}
+instance JSON.ToJSON VPCOptionsProperty where
+  toJSON VPCOptionsProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "SecurityGroupIds" Prelude.<$> securityGroupIds,
+               (JSON..=) "SubnetIds" Prelude.<$> subnetIds]))
+instance Property "SecurityGroupIds" VPCOptionsProperty where
+  type PropertyType "SecurityGroupIds" VPCOptionsProperty = ValueList Prelude.Text
+  set newValue VPCOptionsProperty {..}
+    = VPCOptionsProperty {securityGroupIds = Prelude.pure newValue, ..}
+instance Property "SubnetIds" VPCOptionsProperty where
+  type PropertyType "SubnetIds" VPCOptionsProperty = ValueList Prelude.Text
+  set newValue VPCOptionsProperty {..}
+    = VPCOptionsProperty {subnetIds = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/VPCOptionsProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.VPCOptionsProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data VPCOptionsProperty :: Prelude.Type
+instance ToResourceProperties VPCOptionsProperty
+instance Prelude.Eq VPCOptionsProperty
+instance Prelude.Show VPCOptionsProperty
+instance JSON.ToJSON VPCOptionsProperty
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs b/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs
@@ -0,0 +1,39 @@
+module Stratosphere.Elasticsearch.Domain.ZoneAwarenessConfigProperty (
+        ZoneAwarenessConfigProperty(..), mkZoneAwarenessConfigProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ZoneAwarenessConfigProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-zoneawarenessconfig.html>
+    ZoneAwarenessConfigProperty {haddock_workaround_ :: (),
+                                 -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-zoneawarenessconfig.html#cfn-elasticsearch-domain-zoneawarenessconfig-availabilityzonecount>
+                                 availabilityZoneCount :: (Prelude.Maybe (Value Prelude.Integer))}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkZoneAwarenessConfigProperty :: ZoneAwarenessConfigProperty
+mkZoneAwarenessConfigProperty
+  = ZoneAwarenessConfigProperty
+      {haddock_workaround_ = (), availabilityZoneCount = Prelude.Nothing}
+instance ToResourceProperties ZoneAwarenessConfigProperty where
+  toResourceProperties ZoneAwarenessConfigProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::Elasticsearch::Domain.ZoneAwarenessConfig",
+         supportsTags = Prelude.False,
+         properties = Prelude.fromList
+                        (Prelude.catMaybes
+                           [(JSON..=) "AvailabilityZoneCount"
+                              Prelude.<$> availabilityZoneCount])}
+instance JSON.ToJSON ZoneAwarenessConfigProperty where
+  toJSON ZoneAwarenessConfigProperty {..}
+    = JSON.object
+        (Prelude.fromList
+           (Prelude.catMaybes
+              [(JSON..=) "AvailabilityZoneCount"
+                 Prelude.<$> availabilityZoneCount]))
+instance Property "AvailabilityZoneCount" ZoneAwarenessConfigProperty where
+  type PropertyType "AvailabilityZoneCount" ZoneAwarenessConfigProperty = Value Prelude.Integer
+  set newValue ZoneAwarenessConfigProperty {..}
+    = ZoneAwarenessConfigProperty
+        {availabilityZoneCount = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs-boot b/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/Elasticsearch/Domain/ZoneAwarenessConfigProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.Elasticsearch.Domain.ZoneAwarenessConfigProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ZoneAwarenessConfigProperty :: Prelude.Type
+instance ToResourceProperties ZoneAwarenessConfigProperty
+instance Prelude.Eq ZoneAwarenessConfigProperty
+instance Prelude.Show ZoneAwarenessConfigProperty
+instance JSON.ToJSON ZoneAwarenessConfigProperty
diff --git a/stratosphere-elasticsearch.cabal b/stratosphere-elasticsearch.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-elasticsearch.cabal
@@ -0,0 +1,86 @@
+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-elasticsearch
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS Elasticsearch.
+description:    Integration into stratosphere to generate resources and properties for AWS Elasticsearch
+category:       AWS, Cloud, Elasticsearch
+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.Elasticsearch.Domain
+      Stratosphere.Elasticsearch.Domain.AdvancedSecurityOptionsInputProperty
+      Stratosphere.Elasticsearch.Domain.CognitoOptionsProperty
+      Stratosphere.Elasticsearch.Domain.ColdStorageOptionsProperty
+      Stratosphere.Elasticsearch.Domain.DomainEndpointOptionsProperty
+      Stratosphere.Elasticsearch.Domain.EBSOptionsProperty
+      Stratosphere.Elasticsearch.Domain.ElasticsearchClusterConfigProperty
+      Stratosphere.Elasticsearch.Domain.EncryptionAtRestOptionsProperty
+      Stratosphere.Elasticsearch.Domain.LogPublishingOptionProperty
+      Stratosphere.Elasticsearch.Domain.MasterUserOptionsProperty
+      Stratosphere.Elasticsearch.Domain.NodeToNodeEncryptionOptionsProperty
+      Stratosphere.Elasticsearch.Domain.SnapshotOptionsProperty
+      Stratosphere.Elasticsearch.Domain.VPCOptionsProperty
+      Stratosphere.Elasticsearch.Domain.ZoneAwarenessConfigProperty
+  other-modules:
+      Paths_stratosphere_elasticsearch
+  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
