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/EMRContainers/VirtualCluster.hs b/gen/Stratosphere/EMRContainers/VirtualCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster.hs
@@ -0,0 +1,70 @@
+module Stratosphere.EMRContainers.VirtualCluster (
+        module Exports, VirtualCluster(..), mkVirtualCluster
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.EMRContainers.VirtualCluster.ContainerProviderProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Tag
+import Stratosphere.Value
+data VirtualCluster
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html>
+    VirtualCluster {haddock_workaround_ :: (),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-containerprovider>
+                    containerProvider :: ContainerProviderProperty,
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-name>
+                    name :: (Value Prelude.Text),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-securityconfigurationid>
+                    securityConfigurationId :: (Prelude.Maybe (Value Prelude.Text)),
+                    -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-tags>
+                    tags :: (Prelude.Maybe [Tag])}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkVirtualCluster ::
+  ContainerProviderProperty -> Value Prelude.Text -> VirtualCluster
+mkVirtualCluster containerProvider name
+  = VirtualCluster
+      {haddock_workaround_ = (), containerProvider = containerProvider,
+       name = name, securityConfigurationId = Prelude.Nothing,
+       tags = Prelude.Nothing}
+instance ToResourceProperties VirtualCluster where
+  toResourceProperties VirtualCluster {..}
+    = ResourceProperties
+        {awsType = "AWS::EMRContainers::VirtualCluster",
+         supportsTags = Prelude.True,
+         properties = Prelude.fromList
+                        ((Prelude.<>)
+                           ["ContainerProvider" JSON..= containerProvider,
+                            "Name" JSON..= name]
+                           (Prelude.catMaybes
+                              [(JSON..=) "SecurityConfigurationId"
+                                 Prelude.<$> securityConfigurationId,
+                               (JSON..=) "Tags" Prelude.<$> tags]))}
+instance JSON.ToJSON VirtualCluster where
+  toJSON VirtualCluster {..}
+    = JSON.object
+        (Prelude.fromList
+           ((Prelude.<>)
+              ["ContainerProvider" JSON..= containerProvider,
+               "Name" JSON..= name]
+              (Prelude.catMaybes
+                 [(JSON..=) "SecurityConfigurationId"
+                    Prelude.<$> securityConfigurationId,
+                  (JSON..=) "Tags" Prelude.<$> tags])))
+instance Property "ContainerProvider" VirtualCluster where
+  type PropertyType "ContainerProvider" VirtualCluster = ContainerProviderProperty
+  set newValue VirtualCluster {..}
+    = VirtualCluster {containerProvider = newValue, ..}
+instance Property "Name" VirtualCluster where
+  type PropertyType "Name" VirtualCluster = Value Prelude.Text
+  set newValue VirtualCluster {..}
+    = VirtualCluster {name = newValue, ..}
+instance Property "SecurityConfigurationId" VirtualCluster where
+  type PropertyType "SecurityConfigurationId" VirtualCluster = Value Prelude.Text
+  set newValue VirtualCluster {..}
+    = VirtualCluster
+        {securityConfigurationId = Prelude.pure newValue, ..}
+instance Property "Tags" VirtualCluster where
+  type PropertyType "Tags" VirtualCluster = [Tag]
+  set newValue VirtualCluster {..}
+    = VirtualCluster {tags = Prelude.pure newValue, ..}
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs
@@ -0,0 +1,31 @@
+module Stratosphere.EMRContainers.VirtualCluster.ContainerInfoProperty (
+        module Exports, ContainerInfoProperty(..), mkContainerInfoProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.EMRContainers.VirtualCluster.EksInfoProperty as Exports
+import Stratosphere.ResourceProperties
+data ContainerInfoProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerinfo.html>
+    ContainerInfoProperty {haddock_workaround_ :: (),
+                           -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerinfo.html#cfn-emrcontainers-virtualcluster-containerinfo-eksinfo>
+                           eksInfo :: EksInfoProperty}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkContainerInfoProperty :: EksInfoProperty -> ContainerInfoProperty
+mkContainerInfoProperty eksInfo
+  = ContainerInfoProperty
+      {haddock_workaround_ = (), eksInfo = eksInfo}
+instance ToResourceProperties ContainerInfoProperty where
+  toResourceProperties ContainerInfoProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::EMRContainers::VirtualCluster.ContainerInfo",
+         supportsTags = Prelude.False,
+         properties = ["EksInfo" JSON..= eksInfo]}
+instance JSON.ToJSON ContainerInfoProperty where
+  toJSON ContainerInfoProperty {..}
+    = JSON.object ["EksInfo" JSON..= eksInfo]
+instance Property "EksInfo" ContainerInfoProperty where
+  type PropertyType "EksInfo" ContainerInfoProperty = EksInfoProperty
+  set newValue ContainerInfoProperty {..}
+    = ContainerInfoProperty {eksInfo = newValue, ..}
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs-boot b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerInfoProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.EMRContainers.VirtualCluster.ContainerInfoProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ContainerInfoProperty :: Prelude.Type
+instance ToResourceProperties ContainerInfoProperty
+instance Prelude.Eq ContainerInfoProperty
+instance Prelude.Show ContainerInfoProperty
+instance JSON.ToJSON ContainerInfoProperty
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs
@@ -0,0 +1,50 @@
+module Stratosphere.EMRContainers.VirtualCluster.ContainerProviderProperty (
+        module Exports, ContainerProviderProperty(..),
+        mkContainerProviderProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import {-# SOURCE #-} Stratosphere.EMRContainers.VirtualCluster.ContainerInfoProperty as Exports
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data ContainerProviderProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html>
+    ContainerProviderProperty {haddock_workaround_ :: (),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-id>
+                               id :: (Value Prelude.Text),
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-info>
+                               info :: ContainerInfoProperty,
+                               -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-type>
+                               type' :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkContainerProviderProperty ::
+  Value Prelude.Text
+  -> ContainerInfoProperty
+     -> Value Prelude.Text -> ContainerProviderProperty
+mkContainerProviderProperty id info type'
+  = ContainerProviderProperty
+      {haddock_workaround_ = (), id = id, info = info, type' = type'}
+instance ToResourceProperties ContainerProviderProperty where
+  toResourceProperties ContainerProviderProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::EMRContainers::VirtualCluster.ContainerProvider",
+         supportsTags = Prelude.False,
+         properties = ["Id" JSON..= id, "Info" JSON..= info,
+                       "Type" JSON..= type']}
+instance JSON.ToJSON ContainerProviderProperty where
+  toJSON ContainerProviderProperty {..}
+    = JSON.object
+        ["Id" JSON..= id, "Info" JSON..= info, "Type" JSON..= type']
+instance Property "Id" ContainerProviderProperty where
+  type PropertyType "Id" ContainerProviderProperty = Value Prelude.Text
+  set newValue ContainerProviderProperty {..}
+    = ContainerProviderProperty {id = newValue, ..}
+instance Property "Info" ContainerProviderProperty where
+  type PropertyType "Info" ContainerProviderProperty = ContainerInfoProperty
+  set newValue ContainerProviderProperty {..}
+    = ContainerProviderProperty {info = newValue, ..}
+instance Property "Type" ContainerProviderProperty where
+  type PropertyType "Type" ContainerProviderProperty = Value Prelude.Text
+  set newValue ContainerProviderProperty {..}
+    = ContainerProviderProperty {type' = newValue, ..}
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs-boot b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/ContainerProviderProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.EMRContainers.VirtualCluster.ContainerProviderProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data ContainerProviderProperty :: Prelude.Type
+instance ToResourceProperties ContainerProviderProperty
+instance Prelude.Eq ContainerProviderProperty
+instance Prelude.Show ContainerProviderProperty
+instance JSON.ToJSON ContainerProviderProperty
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs b/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs
@@ -0,0 +1,30 @@
+module Stratosphere.EMRContainers.VirtualCluster.EksInfoProperty (
+        EksInfoProperty(..), mkEksInfoProperty
+    ) where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.Property
+import Stratosphere.ResourceProperties
+import Stratosphere.Value
+data EksInfoProperty
+  = -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-eksinfo.html>
+    EksInfoProperty {haddock_workaround_ :: (),
+                     -- | See: <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-eksinfo.html#cfn-emrcontainers-virtualcluster-eksinfo-namespace>
+                     namespace :: (Value Prelude.Text)}
+  deriving stock (Prelude.Eq, Prelude.Show)
+mkEksInfoProperty :: Value Prelude.Text -> EksInfoProperty
+mkEksInfoProperty namespace
+  = EksInfoProperty {haddock_workaround_ = (), namespace = namespace}
+instance ToResourceProperties EksInfoProperty where
+  toResourceProperties EksInfoProperty {..}
+    = ResourceProperties
+        {awsType = "AWS::EMRContainers::VirtualCluster.EksInfo",
+         supportsTags = Prelude.False,
+         properties = ["Namespace" JSON..= namespace]}
+instance JSON.ToJSON EksInfoProperty where
+  toJSON EksInfoProperty {..}
+    = JSON.object ["Namespace" JSON..= namespace]
+instance Property "Namespace" EksInfoProperty where
+  type PropertyType "Namespace" EksInfoProperty = Value Prelude.Text
+  set newValue EksInfoProperty {..}
+    = EksInfoProperty {namespace = newValue, ..}
diff --git a/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs-boot b/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs-boot
new file mode 100644
--- /dev/null
+++ b/gen/Stratosphere/EMRContainers/VirtualCluster/EksInfoProperty.hs-boot
@@ -0,0 +1,9 @@
+module Stratosphere.EMRContainers.VirtualCluster.EksInfoProperty where
+import qualified Data.Aeson as JSON
+import qualified Stratosphere.Prelude as Prelude
+import Stratosphere.ResourceProperties
+data EksInfoProperty :: Prelude.Type
+instance ToResourceProperties EksInfoProperty
+instance Prelude.Eq EksInfoProperty
+instance Prelude.Show EksInfoProperty
+instance JSON.ToJSON EksInfoProperty
diff --git a/stratosphere-emrcontainers.cabal b/stratosphere-emrcontainers.cabal
new file mode 100644
--- /dev/null
+++ b/stratosphere-emrcontainers.cabal
@@ -0,0 +1,76 @@
+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-emrcontainers
+version:        1.0.0
+synopsis:       Stratosphere integration for AWS EMRContainers.
+description:    Integration into stratosphere to generate resources and properties for AWS EMRContainers
+category:       AWS, Cloud, EMRContainers
+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.EMRContainers.VirtualCluster
+      Stratosphere.EMRContainers.VirtualCluster.ContainerInfoProperty
+      Stratosphere.EMRContainers.VirtualCluster.ContainerProviderProperty
+      Stratosphere.EMRContainers.VirtualCluster.EksInfoProperty
+  other-modules:
+      Paths_stratosphere_emrcontainers
+  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
