diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,14 @@
 # Change Log
 
-## Unreleased
+## 0.2.1
+
+* Added Dynamo DB table resources (@ababkin)
+* Fix the Python docs scraper mishandling the `required` value in some cases,
+  and also missing some properties of resources (@amar47shah)
+* Added a ton of SNS and SQS resources (@ababkin)
+* Added a experimental checker for duplicate resource names (@amar47shah)
+
+## 0.2.0
 
 * Breaking change: The `DependsOn` property previously allowed lists of `Val
   Text`, when in fact CloudFormation only accepts literal `Text` values. The
diff --git a/examples/api-gateway-lambda.hs b/examples/api-gateway-lambda.hs
deleted file mode 100644
--- a/examples/api-gateway-lambda.hs
+++ /dev/null
@@ -1,193 +0,0 @@
-{-# LANGUAGE OverloadedLists   #-}
-{-# LANGUAGE OverloadedStrings #-}
-
-module Main where
-
-import           Control.Lens
-import           Data.Aeson                 (Value (Array), object)
-import qualified Data.ByteString.Lazy.Char8 as B
-import           Data.Text                  (Text)
-import           Stratosphere
-
-
--- to curl the endpoint: (substitute your APIGW deployment URL)
--- curl -v -X POST -H "Content-Type: application/json" -d "{\"description\": \"test task\"}" "https://t04rmwbtgj.execute-api.us-east-1.amazonaws.com/v1/stack"
-
-main :: IO ()
-main = B.putStrLn $ encodeTemplate myTemplate
-
-myTemplate :: Template
-myTemplate = template
-  [ role
-  , incomingS3Bucket
-  , lambda
-  , permission
-  , apiGWRestApi
-  , apiGWResource
-  , apiGWMethod
-  , apiGWDeployment
-  ]
-  & description ?~ "Simple api gateway attached to a lambda that writes the request body to a S3 object"
-  & formatVersion ?~ "2010-09-09"
-
-apiGWRestApi :: Resource
-apiGWRestApi = (resource "ApiGWRestApi" $
-  ApiGatewayRestApiProperties $
-  apiGatewayRestApi
-    "myApi"
-  )
-
-apiGWResource :: Resource
-apiGWResource = (resource "ApiGWResource" $
-  ApiGatewayResourceProperties $
-  apiGatewayResource
-    (GetAtt "ApiGWRestApi" "RootResourceId")
-    "stack"
-    (toRef apiGWRestApi)
-  )
-  & dependsOn ?~ deps [ apiGWRestApi ]
-
-apiGWMethod :: Resource
-apiGWMethod = (resource "ApiGWMethod" $
-  ApiGatewayMethodProperties $
-  apiGatewayMethod
-    "NONE"
-    "POST"
-    (toRef apiGWResource)
-    (toRef apiGWRestApi)
-    & agmeIntegration ?~ integration
-    & agmeMethodResponses ?~ [ methodResponse ]
-  )
-  & dependsOn ?~ deps [
-      apiGWRestApi
-    , apiGWResource
-    , lambda
-    ]
-
-  where
-    integration = apiGatewayIntegration "AWS"
-      & agiIntegrationHttpMethod ?~ "POST"
-      & agiUri ?~ (Join "" [
-          "arn:aws:apigateway:"
-        , Ref "AWS::Region"
-        , ":lambda:path/2015-03-31/functions/"
-        , GetAtt "WriteS3ObjectLambda" "Arn"
-        , "/invocations"])
-      & agiIntegrationResponses ?~ [ integrationResponse ]
-      & agiPassthroughBehavior ?~ "NEVER"
-      & agiRequestTemplates ?~ [ ("application/json", "{\"body\": $input.body}") ]
-
-    integrationResponse = apiGatewayIntegrationResponse
-      & agirResponseTemplates ?~ [ ("application/json", "$input.json('$.body')") ]
-      & agirStatusCode ?~ "200"
-
-    methodResponse = apiGatewayMethodResponse "200"
-
-apiGWDeployment :: Resource
-apiGWDeployment = (resource "ApiGWDeployment" $
-  ApiGatewayDeploymentProperties $
-  apiGatewayDeployment
-    (toRef apiGWRestApi)
-    & agdStageName ?~ "v1"
-  )
-  & dependsOn ?~ deps [
-      apiGWRestApi
-    , apiGWMethod
-    ]
-
-lambda :: Resource
-lambda = (resource "WriteS3ObjectLambda" $
-  LambdaFunctionProperties $
-  lambdaFunction
-    lambdaCode
-    "index.handler"
-    (GetAtt "IAMRole" "Arn")
-    "nodejs4.3"
-    & lfFunctionName ?~ "writeS3Object"
-  )
-  & dependsOn ?~ deps [ role ]
-
-  where
-    lambdaCode :: LambdaFunctionCode
-    lambdaCode = lambdaFunctionCode
-      & lfcZipFile ?~ code
-
-    code :: Val Text
-    code = "\
-    \ var AWS = require('aws-sdk');\n\
-    \ var s3 = new AWS.S3({apiVersion: '2006-03-01'});\n\
-    \ exports.handler = function(event, context, callback) {\n\
-    \   console.log(JSON.stringify(event));\n\
-    \   s3.putObject({Bucket: \"stratosphere-api-gateway-lambda-incoming\", Key: \"content.json\", ContentType: \"application/json\", Body: JSON.stringify(event.body)}, function(err){\n\
-    \     if (err) { \n\
-    \       console.log(\"Error:\", err); \n\
-    \       callback(err) \n\
-    \     } else { \n\
-    \       callback(null, {\"body\": event.body});\n\
-    \     } \n\
-    \   });\n\
-    \ }\n\
-    \ "
-
-role :: Resource
-role = resource "IAMRole" $
-  IAMRoleProperties $
-  iamRole rolePolicyDocumentObject
-  & iamrPolicies ?~ [ executePolicy ]
-  & iamrRoleName ?~ "MyLambdaBasicExecutionRole"
-  & iamrPath ?~ "/"
-
-  where
-    executePolicy =
-      iamPolicies
-      [ ("Version", "2012-10-17")
-      , ("Statement", statement)
-      ]
-      "MyLambdaExecutionPolicy"
-
-      where
-        statement = object
-          [ ("Effect", "Allow")
-          , ("Action", actions)
-          , ("Resource", "*")
-          ]
-
-        actions = Array
-          [ "logs:CreateLogGroup"
-          , "logs:CreateLogStream"
-          , "logs:PutLogEvents"
-          , "s3:PutObject"
-          ]
-
-
-    rolePolicyDocumentObject =
-      [ ("Version", "2012-10-17")
-      , ("Statement", statement)
-      ]
-
-      where
-        statement = object
-          [ ("Effect", "Allow")
-          , ("Principal", principal)
-          , ("Action", "sts:AssumeRole")
-          ]
-
-        principal = object
-          [ ("Service", "lambda.amazonaws.com") ]
-
-incomingS3Bucket :: Resource
-incomingS3Bucket = resource "IncomingBucket" $
-  BucketProperties $
-  bucket
-  & bBucketName ?~ "stratosphere-api-gateway-lambda-incoming"
-
-permission :: Resource
-permission = resource "LambdaPermission" $
-  LambdaPermissionProperties $
-  lambdaPermission
-    "lambda:*"
-    (GetAtt "WriteS3ObjectLambda" "Arn")
-    "apigateway.amazonaws.com"
-
-deps :: [Resource] -> [Text]
-deps = map (\d -> d ^. resName)
diff --git a/examples/apigw-lambda-dynamodb.hs b/examples/apigw-lambda-dynamodb.hs
new file mode 100644
--- /dev/null
+++ b/examples/apigw-lambda-dynamodb.hs
@@ -0,0 +1,338 @@
+{-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Main where
+
+import Control.Lens
+import Data.Aeson (Value (Array), object)
+import qualified Data.ByteString.Lazy.Char8 as B
+import Data.Text (Text)
+import Stratosphere
+
+
+-- to curl the endpoints: (substitute your APIGW deployment URL)
+-- curl -v -X POST -H "Content-Type: application/json" -d "{\"property\": 3}" "https://k99jn3an8a.execute-api.us-east-1.amazonaws.com/v1/thing"
+-- curl -v "https://k99jn3an8a.execute-api.us-east-1.amazonaws.com/v1/thing"
+
+main :: IO ()
+main = B.putStrLn $ encodeTemplate myTemplate
+
+myTemplate :: Template
+myTemplate = template
+  [ readLambdaRole
+  , writeLambdaRole
+  , readLambda
+  , writeLambda
+  , readLambdaPermission
+  , writeLambdaPermission
+  , dynamoDbTable
+  , apiGWRestApi
+  , apiGWResource
+  , getMethod
+  , postMethod
+  , apiGWDeployment
+  ]
+  & description ?~ "Simple restful API gateway attached to a Lambda that reads from and writes the request body to a DynamoDB table"
+  & formatVersion ?~ "2010-09-09"
+
+apiGWRestApi :: Resource
+apiGWRestApi = (resource "ApiGWRestApi" $
+  ApiGatewayRestApiProperties $
+  apiGatewayRestApi
+    "myApi"
+  )
+
+apiGWResource :: Resource
+apiGWResource = (resource "ApiGWResource" $
+  ApiGatewayResourceProperties $
+  apiGatewayResource
+    (GetAtt "ApiGWRestApi" "RootResourceId")
+    "thing"
+    (toRef apiGWRestApi)
+  )
+
+getMethod :: Resource
+getMethod = (resource "ApiGWGetMethod" $
+  ApiGatewayMethodProperties $
+  apiGatewayMethod
+    NONE
+    GET
+    (toRef apiGWResource)
+    (toRef apiGWRestApi)
+    & agmeIntegration ?~ integration
+    & agmeMethodResponses ?~ [ methodResponse ]
+  )
+  & dependsOn ?~ deps [
+      readLambdaPermission
+    ]
+
+  where
+    integration = apiGatewayIntegration AWS
+      & agiIntegrationHttpMethod ?~ POST
+      & agiUri ?~ (Join "" [
+          "arn:aws:apigateway:"
+        , Ref "AWS::Region"
+        , ":lambda:path/2015-03-31/functions/"
+        , GetAtt "ReadTableLambda" "Arn"
+        , "/invocations"])
+      & agiIntegrationResponses ?~ [ integrationResponse ]
+      & agiPassthroughBehavior ?~ WHEN_NO_TEMPLATES
+      & agiRequestTemplates ?~ [ ]
+
+    integrationResponse = apiGatewayIntegrationResponse
+      & agirResponseTemplates ?~ [ ("application/json", "$input.json('$.body')") ]
+      & agirStatusCode ?~ "200"
+
+    methodResponse = apiGatewayMethodResponse "200"
+
+
+postMethod :: Resource
+postMethod = (resource "ApiGWPutMethod" $
+  ApiGatewayMethodProperties $
+  apiGatewayMethod
+    NONE
+    POST
+    (toRef apiGWResource)
+    (toRef apiGWRestApi)
+    & agmeIntegration ?~ integration
+    & agmeMethodResponses ?~ [ methodResponse ]
+  )
+  & dependsOn ?~ deps [
+      writeLambdaPermission
+    ]
+
+  where
+    integration = apiGatewayIntegration AWS
+      & agiIntegrationHttpMethod ?~ POST
+      & agiUri ?~ (Join "" [
+          "arn:aws:apigateway:"
+        , Ref "AWS::Region"
+        , ":lambda:path/2015-03-31/functions/"
+        , GetAtt "WriteTableLambda" "Arn"
+        , "/invocations"])
+      & agiIntegrationResponses ?~ [ integrationResponse ]
+      & agiPassthroughBehavior ?~ WHEN_NO_TEMPLATES
+      & agiRequestTemplates ?~ [ ("application/json", "{\"body\": $input.body}") ]
+
+    integrationResponse = apiGatewayIntegrationResponse
+      & agirResponseTemplates ?~ [ ("application/json", "$input.json('$.body')") ]
+      & agirStatusCode ?~ "200"
+
+    methodResponse = apiGatewayMethodResponse "200"
+
+apiGWDeployment :: Resource
+apiGWDeployment = (resource "ApiGWDeployment" $
+  ApiGatewayDeploymentProperties $
+  apiGatewayDeployment
+    (toRef apiGWRestApi)
+    & agdStageName ?~ "v1"
+  )
+  & dependsOn ?~ deps [
+      apiGWResource
+    , getMethod
+    , postMethod
+    ]
+
+readLambda :: Resource
+readLambda = (resource "ReadTableLambda" $
+  LambdaFunctionProperties $
+  lambdaFunction
+    lambdaCode
+    "index.handler"
+    (GetAtt "ReadLambdaRole" "Arn")
+    NodeJS43
+    & lfFunctionName ?~ "readTable"
+  )
+
+  where
+    lambdaCode :: LambdaFunctionCode
+    lambdaCode = lambdaFunctionCode
+      & lfcZipFile ?~ code
+
+    code :: Val Text
+    code = "\
+    \ var AWS = require('aws-sdk');\n\
+    \ var awsConfig = { region: 'us-east-1' }; \n\
+    \ AWS.config.apiVersions = { dynamodb: '2012-08-10' }; \n\
+    \ var dynamoDoc = new AWS.DynamoDB.DocumentClient(awsConfig); \n\
+    \ exports.handler = function(event, context, callback) {\n\
+    \   console.log(JSON.stringify(event));\n\
+    \   var params = { TableName : 'stratosphere-dynamodb-table', Key: { Id: 'abc123' } }; \n\
+    \   dynamoDoc.get(params, function(err, data) { \n\
+    \     if (err) { \n\
+    \       console.log(\"Error:\", err); \n\
+    \       callback(err) \n\
+    \     } else { \n\
+    \       callback(null, {\"body\": data.Item.Data});\n\
+    \     } \n\
+    \   });\n\
+    \ }\n\
+    \ "
+
+
+writeLambda :: Resource
+writeLambda = (resource "WriteTableLambda" $
+  LambdaFunctionProperties $
+  lambdaFunction
+    lambdaCode
+    "index.handler"
+    (GetAtt "WriteLambdaRole" "Arn")
+    NodeJS43
+    & lfFunctionName ?~ "writeTable"
+  )
+
+  where
+    lambdaCode :: LambdaFunctionCode
+    lambdaCode = lambdaFunctionCode
+      & lfcZipFile ?~ code
+
+    code :: Val Text
+    code = "\
+    \ var AWS = require('aws-sdk');\n\
+    \ var awsConfig = { region: 'us-east-1' }; \n\
+    \ AWS.config.apiVersions = { dynamodb: '2012-08-10' }; \n\
+    \ var dynamoDoc = new AWS.DynamoDB.DocumentClient(awsConfig); \n\
+    \ exports.handler = function(event, context, callback) {\n\
+    \   console.log(JSON.stringify(event));\n\
+    \   var params = { TableName : 'stratosphere-dynamodb-table', Item: { Id: 'abc123', Data: event.body } }; \n\
+    \   dynamoDoc.put(params, function(err, data) { \n\
+    \     if (err) { \n\
+    \       console.log(\"Error:\", err); \n\
+    \       callback(err) \n\
+    \     } else { \n\
+    \       callback(null, {\"body\": 'success!'});\n\
+    \     } \n\
+    \   });\n\
+    \ }\n\
+    \ "
+
+readLambdaRole :: Resource
+readLambdaRole = resource "ReadLambdaRole" $
+  IAMRoleProperties $
+  iamRole rolePolicyDocumentObject
+  & iamrPolicies ?~ [ executePolicy ]
+  & iamrRoleName ?~ "ReadLambdaRole"
+  & iamrPath ?~ "/"
+
+  where
+    executePolicy =
+      iamPolicies
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+      "MyLambdaExecutionPolicy"
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Action", actions)
+          , ("Resource", "*")
+          ]
+
+        actions = Array
+          [ "logs:CreateLogGroup"
+          , "logs:CreateLogStream"
+          , "logs:PutLogEvents"
+          , "dynamodb:GetItem"
+          ]
+
+
+    rolePolicyDocumentObject =
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Principal", principal)
+          , ("Action", "sts:AssumeRole")
+          ]
+
+        principal = object
+          [ ("Service", "lambda.amazonaws.com") ]
+
+writeLambdaRole :: Resource
+writeLambdaRole = resource "WriteLambdaRole" $
+  IAMRoleProperties $
+  iamRole rolePolicyDocumentObject
+  & iamrPolicies ?~ [ executePolicy ]
+  & iamrRoleName ?~ "WriteLambdaRole"
+  & iamrPath ?~ "/"
+
+  where
+    executePolicy =
+      iamPolicies
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+      "MyLambdaExecutionPolicy"
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Action", actions)
+          , ("Resource", "*")
+          ]
+
+        actions = Array
+          [ "logs:CreateLogGroup"
+          , "logs:CreateLogStream"
+          , "logs:PutLogEvents"
+          , "dynamodb:PutItem"
+          ]
+
+
+    rolePolicyDocumentObject =
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Principal", principal)
+          , ("Action", "sts:AssumeRole")
+          ]
+
+        principal = object
+          [ ("Service", "lambda.amazonaws.com") ]
+
+readLambdaPermission :: Resource
+readLambdaPermission = resource "ReadLambdaPermission" $
+  LambdaPermissionProperties $
+  lambdaPermission
+    "lambda:*"
+    (GetAtt "ReadTableLambda" "Arn")
+    "apigateway.amazonaws.com"
+
+writeLambdaPermission :: Resource
+writeLambdaPermission = resource "WriteLambdaPermission" $
+  LambdaPermissionProperties $
+  lambdaPermission
+    "lambda:*"
+    (GetAtt "WriteTableLambda" "Arn")
+    "apigateway.amazonaws.com"
+
+dynamoDbTable :: Resource
+dynamoDbTable = resource "Table" $
+  DynamoDBTableProperties $
+  dynamoDBTable
+    attributeDefinitions
+    keySchema
+    provisionedThroughput
+  & ddbtTableName ?~ "stratosphere-dynamodb-table"
+
+  where
+    attributeDefinitions = [
+        dynamoDBAttributeDefinition "Id" S
+      ]
+    keySchema = [
+        dynamoDBKeySchema "Id" HASH
+      ]
+    provisionedThroughput =
+      dynamoDBProvisionedThroughput (Literal 1) (Literal 1)
+
+deps :: [Resource] -> [Text]
+deps = map (\d -> d ^. resName)
+
diff --git a/examples/apigw-lambda-s3.hs b/examples/apigw-lambda-s3.hs
new file mode 100644
--- /dev/null
+++ b/examples/apigw-lambda-s3.hs
@@ -0,0 +1,189 @@
+{-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Main where
+
+import Control.Lens
+import Data.Aeson (Value (Array), object)
+import qualified Data.ByteString.Lazy.Char8 as B
+import Data.Text (Text)
+import Stratosphere
+
+
+-- to curl the endpoint: (substitute your APIGW deployment URL)
+-- curl -v -X POST -H "Content-Type: application/json" -d "{\"property\": 3}" "https://t04rmwbtgj.execute-api.us-east-1.amazonaws.com/v1/thing"
+
+main :: IO ()
+main = B.putStrLn $ encodeTemplate myTemplate
+
+myTemplate :: Template
+myTemplate = template
+  [ role
+  , incomingS3Bucket
+  , lambda
+  , permission
+  , apiGWRestApi
+  , apiGWResource
+  , apiGWMethod
+  , apiGWDeployment
+  ]
+  & description ?~ "Simple api gateway attached to a lambda that writes the request body to a S3 object"
+  & formatVersion ?~ "2010-09-09"
+
+apiGWRestApi :: Resource
+apiGWRestApi = (resource "ApiGWRestApi" $
+  ApiGatewayRestApiProperties $
+  apiGatewayRestApi
+    "myApi"
+  )
+
+apiGWResource :: Resource
+apiGWResource = (resource "ApiGWResource" $
+  ApiGatewayResourceProperties $
+  apiGatewayResource
+    (GetAtt "ApiGWRestApi" "RootResourceId")
+    "thing"
+    (toRef apiGWRestApi)
+  )
+
+apiGWMethod :: Resource
+apiGWMethod = (resource "ApiGWMethod" $
+  ApiGatewayMethodProperties $
+  apiGatewayMethod
+    NONE
+    POST
+    (toRef apiGWResource)
+    (toRef apiGWRestApi)
+    & agmeIntegration ?~ integration
+    & agmeMethodResponses ?~ [ methodResponse ]
+  )
+  & dependsOn ?~ deps [
+      permission
+    ]
+
+  where
+    integration = apiGatewayIntegration AWS
+      & agiIntegrationHttpMethod ?~ POST
+      & agiUri ?~ (Join "" [
+          "arn:aws:apigateway:"
+        , Ref "AWS::Region"
+        , ":lambda:path/2015-03-31/functions/"
+        , GetAtt "WriteS3ObjectLambda" "Arn"
+        , "/invocations"])
+      & agiIntegrationResponses ?~ [ integrationResponse ]
+      & agiPassthroughBehavior ?~ WHEN_NO_TEMPLATES
+      & agiRequestTemplates ?~ [ ("application/json", "{\"body\": $input.body}") ]
+
+    integrationResponse = apiGatewayIntegrationResponse
+      & agirResponseTemplates ?~ [ ("application/json", "$input.json('$.body')") ]
+      & agirStatusCode ?~ "200"
+
+    methodResponse = apiGatewayMethodResponse "200"
+
+apiGWDeployment :: Resource
+apiGWDeployment = (resource "ApiGWDeployment" $
+  ApiGatewayDeploymentProperties $
+  apiGatewayDeployment
+    (toRef apiGWRestApi)
+    & agdStageName ?~ "v1"
+  )
+  & dependsOn ?~ deps [
+      apiGWResource
+    , apiGWMethod
+    ]
+
+lambda :: Resource
+lambda = (resource "WriteS3ObjectLambda" $
+  LambdaFunctionProperties $
+  lambdaFunction
+    lambdaCode
+    "index.handler"
+    (GetAtt "IAMRole" "Arn")
+    NodeJS43
+    & lfFunctionName ?~ "writeS3Object"
+  )
+
+  where
+    lambdaCode :: LambdaFunctionCode
+    lambdaCode = lambdaFunctionCode
+      & lfcZipFile ?~ code
+
+    code :: Val Text
+    code = "\
+    \ var AWS = require('aws-sdk');\n\
+    \ var s3 = new AWS.S3({apiVersion: '2006-03-01'});\n\
+    \ exports.handler = function(event, context, callback) {\n\
+    \   console.log(JSON.stringify(event));\n\
+    \   s3.putObject({Bucket: \"stratosphere-api-gateway-lambda-incoming\", Key: \"content.json\", ContentType: \"application/json\", Body: JSON.stringify(event.body)}, function(err){\n\
+    \     if (err) { \n\
+    \       console.log(\"Error:\", err); \n\
+    \       callback(err) \n\
+    \     } else { \n\
+    \       callback(null, {\"body\": event.body});\n\
+    \     } \n\
+    \   });\n\
+    \ }\n\
+    \ "
+
+role :: Resource
+role = resource "IAMRole" $
+  IAMRoleProperties $
+  iamRole rolePolicyDocumentObject
+  & iamrPolicies ?~ [ executePolicy ]
+  & iamrRoleName ?~ "MyLambdaBasicExecutionRole"
+  & iamrPath ?~ "/"
+
+  where
+    executePolicy =
+      iamPolicies
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+      "MyLambdaExecutionPolicy"
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Action", actions)
+          , ("Resource", "*")
+          ]
+
+        actions = Array
+          [ "logs:CreateLogGroup"
+          , "logs:CreateLogStream"
+          , "logs:PutLogEvents"
+          , "s3:PutObject"
+          ]
+
+
+    rolePolicyDocumentObject =
+      [ ("Version", "2012-10-17")
+      , ("Statement", statement)
+      ]
+
+      where
+        statement = object
+          [ ("Effect", "Allow")
+          , ("Principal", principal)
+          , ("Action", "sts:AssumeRole")
+          ]
+
+        principal = object
+          [ ("Service", "lambda.amazonaws.com") ]
+
+incomingS3Bucket :: Resource
+incomingS3Bucket = resource "IncomingBucket" $
+  BucketProperties $
+  bucket
+  & bBucketName ?~ "stratosphere-api-gateway-lambda-incoming"
+
+permission :: Resource
+permission = resource "LambdaPermission" $
+  LambdaPermissionProperties $
+  lambdaPermission
+    "lambda:*"
+    (GetAtt "WriteS3ObjectLambda" "Arn")
+    "apigateway.amazonaws.com"
+
+deps :: [Resource] -> [Text]
+deps = map (\d -> d ^. resName)
diff --git a/examples/s3-copy.hs b/examples/s3-copy.hs
--- a/examples/s3-copy.hs
+++ b/examples/s3-copy.hs
@@ -4,11 +4,12 @@
 module Main where
 
 import Control.Lens
+import Data.Aeson (Value (Array), object)
 import qualified Data.ByteString.Lazy.Char8 as B
 import Data.Text (Text)
 import Stratosphere
-import Data.Aeson (object, Value(Array))
 
+
 main :: IO ()
 main = B.putStrLn $ encodeTemplate myTemplate
 
@@ -25,7 +26,7 @@
     lambdaCode
     "index.handler"
     (GetAtt "IAMRole" "Arn")
-    "nodejs4.3"
+    NodeJS43
     & lfFunctionName ?~ "copyS3Object"
   )
   & dependsOn ?~ [ role ^. resName ]
diff --git a/examples/simple-lambda.hs b/examples/simple-lambda.hs
--- a/examples/simple-lambda.hs
+++ b/examples/simple-lambda.hs
@@ -4,11 +4,12 @@
 module Main where
 
 import Control.Lens
+import Data.Aeson (Value (Array), object)
 import qualified Data.ByteString.Lazy.Char8 as B
 import Data.Text (Text)
 import Stratosphere
-import Data.Aeson (object, Value(Array))
 
+
 main :: IO ()
 main = B.putStrLn $ encodeTemplate myTemplate
 
@@ -27,7 +28,7 @@
     lambdaCode
     "index.handler"
     (GetAtt "IAMRole" "Arn")
-    "nodejs4.3"
+    NodeJS43
   )
   & dependsOn ?~ [ role ^. resName ]
 
diff --git a/library-gen/Stratosphere/ResourceProperties/APIGatewayDeploymentStageDescriptionMethodSetting.hs b/library-gen/Stratosphere/ResourceProperties/APIGatewayDeploymentStageDescriptionMethodSetting.hs
--- a/library-gen/Stratosphere/ResourceProperties/APIGatewayDeploymentStageDescriptionMethodSetting.hs
+++ b/library-gen/Stratosphere/ResourceProperties/APIGatewayDeploymentStageDescriptionMethodSetting.hs
@@ -14,7 +14,7 @@
 import GHC.Generics
 
 import Stratosphere.Values
-
+import Stratosphere.Types
 
 -- | Full data type definition for
 -- APIGatewayDeploymentStageDescriptionMethodSetting. See
@@ -26,8 +26,8 @@
   , _aPIGatewayDeploymentStageDescriptionMethodSettingCacheTtlInSeconds :: Maybe (Val Integer')
   , _aPIGatewayDeploymentStageDescriptionMethodSettingCachingEnabled :: Maybe (Val Bool')
   , _aPIGatewayDeploymentStageDescriptionMethodSettingDataTraceEnabled :: Maybe (Val Bool')
-  , _aPIGatewayDeploymentStageDescriptionMethodSettingHttpMethod :: Maybe (Val Text)
-  , _aPIGatewayDeploymentStageDescriptionMethodSettingLoggingLevel :: Maybe (Val Text)
+  , _aPIGatewayDeploymentStageDescriptionMethodSettingHttpMethod :: Maybe HttpMethod
+  , _aPIGatewayDeploymentStageDescriptionMethodSettingLoggingLevel :: Maybe LoggingLevel
   , _aPIGatewayDeploymentStageDescriptionMethodSettingMetricsEnabled :: Maybe (Val Bool')
   , _aPIGatewayDeploymentStageDescriptionMethodSettingResourcePath :: Maybe (Val Text)
   , _aPIGatewayDeploymentStageDescriptionMethodSettingThrottlingBurstLimit :: Maybe (Val Integer')
@@ -80,12 +80,12 @@
 apigdsdmsDataTraceEnabled = lens _aPIGatewayDeploymentStageDescriptionMethodSettingDataTraceEnabled (\s a -> s { _aPIGatewayDeploymentStageDescriptionMethodSettingDataTraceEnabled = a })
 
 -- | The HTTP method.
-apigdsdmsHttpMethod :: Lens' APIGatewayDeploymentStageDescriptionMethodSetting (Maybe (Val Text))
+apigdsdmsHttpMethod :: Lens' APIGatewayDeploymentStageDescriptionMethodSetting (Maybe HttpMethod)
 apigdsdmsHttpMethod = lens _aPIGatewayDeploymentStageDescriptionMethodSettingHttpMethod (\s a -> s { _aPIGatewayDeploymentStageDescriptionMethodSettingHttpMethod = a })
 
 -- | The logging level for this method. For valid values, see the loggingLevel
 -- property of the Stage resource in the Amazon API Gateway API Reference.
-apigdsdmsLoggingLevel :: Lens' APIGatewayDeploymentStageDescriptionMethodSetting (Maybe (Val Text))
+apigdsdmsLoggingLevel :: Lens' APIGatewayDeploymentStageDescriptionMethodSetting (Maybe LoggingLevel)
 apigdsdmsLoggingLevel = lens _aPIGatewayDeploymentStageDescriptionMethodSettingLoggingLevel (\s a -> s { _aPIGatewayDeploymentStageDescriptionMethodSettingLoggingLevel = a })
 
 -- | Indicates whether Amazon CloudWatch metrics are enabled for methods in
diff --git a/library-gen/Stratosphere/ResourceProperties/ApiGatewayIntegration.hs b/library-gen/Stratosphere/ResourceProperties/ApiGatewayIntegration.hs
--- a/library-gen/Stratosphere/ResourceProperties/ApiGatewayIntegration.hs
+++ b/library-gen/Stratosphere/ResourceProperties/ApiGatewayIntegration.hs
@@ -15,6 +15,7 @@
 
 import Stratosphere.Values
 import Stratosphere.ResourceProperties.ApiGatewayIntegrationResponse
+import Stratosphere.Types
 
 -- | Full data type definition for ApiGatewayIntegration. See
 -- 'apiGatewayIntegration' for a more convenient constructor.
@@ -23,12 +24,12 @@
   { _apiGatewayIntegrationCacheKeyParameters :: Maybe [Val Text]
   , _apiGatewayIntegrationCacheNamespace :: Maybe (Val Text)
   , _apiGatewayIntegrationCredentials :: Maybe (Val Text)
-  , _apiGatewayIntegrationIntegrationHttpMethod :: Maybe (Val Text)
+  , _apiGatewayIntegrationIntegrationHttpMethod :: Maybe HttpMethod
   , _apiGatewayIntegrationIntegrationResponses :: Maybe [ApiGatewayIntegrationResponse]
-  , _apiGatewayIntegrationPassthroughBehavior :: Maybe (Val Text)
+  , _apiGatewayIntegrationPassthroughBehavior :: Maybe PassthroughBehavior
   , _apiGatewayIntegrationRequestParameters :: Maybe Object
   , _apiGatewayIntegrationRequestTemplates :: Maybe Object
-  , _apiGatewayIntegrationType :: Val Text
+  , _apiGatewayIntegrationType :: ApiBackendType
   , _apiGatewayIntegrationUri :: Maybe (Val Text)
   } deriving (Show, Generic)
 
@@ -41,7 +42,7 @@
 -- | Constructor for 'ApiGatewayIntegration' containing required fields as
 -- arguments.
 apiGatewayIntegration
-  :: Val Text -- ^ 'agiType'
+  :: ApiBackendType -- ^ 'agiType'
   -> ApiGatewayIntegration
 apiGatewayIntegration typearg =
   ApiGatewayIntegration
@@ -77,7 +78,7 @@
 agiCredentials = lens _apiGatewayIntegrationCredentials (\s a -> s { _apiGatewayIntegrationCredentials = a })
 
 -- | The integration's HTTP method type.
-agiIntegrationHttpMethod :: Lens' ApiGatewayIntegration (Maybe (Val Text))
+agiIntegrationHttpMethod :: Lens' ApiGatewayIntegration (Maybe HttpMethod)
 agiIntegrationHttpMethod = lens _apiGatewayIntegrationIntegrationHttpMethod (\s a -> s { _apiGatewayIntegrationIntegrationHttpMethod = a })
 
 -- | The response that API Gateway provides after a method's back end
@@ -92,7 +93,7 @@
 -- behavior depends on the request's Content-Type header and whether you
 -- defined a mapping template for it. For more information and valid values,
 -- see the passthroughBehavior field in the API Gateway API Reference.
-agiPassthroughBehavior :: Lens' ApiGatewayIntegration (Maybe (Val Text))
+agiPassthroughBehavior :: Lens' ApiGatewayIntegration (Maybe PassthroughBehavior)
 agiPassthroughBehavior = lens _apiGatewayIntegrationPassthroughBehavior (\s a -> s { _apiGatewayIntegrationPassthroughBehavior = a })
 
 -- | The request parameters that API Gateway sends with the back-end request.
@@ -119,7 +120,7 @@
 -- | The type of back end your method is running, such as HTTP, AWS, or MOCK.
 -- For valid values, see the type property in the Amazon API Gateway REST API
 -- Reference.
-agiType :: Lens' ApiGatewayIntegration (Val Text)
+agiType :: Lens' ApiGatewayIntegration ApiBackendType
 agiType = lens _apiGatewayIntegrationType (\s a -> s { _apiGatewayIntegrationType = a })
 
 -- | The integration's Uniform Resource Identifier (URI). If you specify HTTP
diff --git a/library-gen/Stratosphere/ResourceProperties/ApiGatewayStageMethodSetting.hs b/library-gen/Stratosphere/ResourceProperties/ApiGatewayStageMethodSetting.hs
--- a/library-gen/Stratosphere/ResourceProperties/ApiGatewayStageMethodSetting.hs
+++ b/library-gen/Stratosphere/ResourceProperties/ApiGatewayStageMethodSetting.hs
@@ -14,7 +14,7 @@
 import GHC.Generics
 
 import Stratosphere.Values
-
+import Stratosphere.Types
 
 -- | Full data type definition for ApiGatewayStageMethodSetting. See
 -- 'apiGatewayStageMethodSetting' for a more convenient constructor.
@@ -24,8 +24,8 @@
   , _apiGatewayStageMethodSettingCacheTtlInSeconds :: Maybe (Val Integer')
   , _apiGatewayStageMethodSettingCachingEnabled :: Maybe (Val Bool')
   , _apiGatewayStageMethodSettingDataTraceEnabled :: Maybe (Val Bool')
-  , _apiGatewayStageMethodSettingHttpMethod :: Val Text
-  , _apiGatewayStageMethodSettingLoggingLevel :: Maybe (Val Text)
+  , _apiGatewayStageMethodSettingHttpMethod :: HttpMethod
+  , _apiGatewayStageMethodSettingLoggingLevel :: Maybe LoggingLevel
   , _apiGatewayStageMethodSettingMetricsEnabled :: Maybe (Val Bool')
   , _apiGatewayStageMethodSettingResourcePath :: Val Text
   , _apiGatewayStageMethodSettingThrottlingBurstLimit :: Maybe (Val Integer')
@@ -41,7 +41,7 @@
 -- | Constructor for 'ApiGatewayStageMethodSetting' containing required fields
 -- as arguments.
 apiGatewayStageMethodSetting
-  :: Val Text -- ^ 'agsmsHttpMethod'
+  :: HttpMethod -- ^ 'agsmsHttpMethod'
   -> Val Text -- ^ 'agsmsResourcePath'
   -> ApiGatewayStageMethodSetting
 apiGatewayStageMethodSetting httpMethodarg resourcePatharg =
@@ -78,12 +78,12 @@
 agsmsDataTraceEnabled = lens _apiGatewayStageMethodSettingDataTraceEnabled (\s a -> s { _apiGatewayStageMethodSettingDataTraceEnabled = a })
 
 -- | The HTTP method.
-agsmsHttpMethod :: Lens' ApiGatewayStageMethodSetting (Val Text)
+agsmsHttpMethod :: Lens' ApiGatewayStageMethodSetting HttpMethod
 agsmsHttpMethod = lens _apiGatewayStageMethodSettingHttpMethod (\s a -> s { _apiGatewayStageMethodSettingHttpMethod = a })
 
 -- | The logging level for this method. For valid values, see the loggingLevel
 -- property of the Stage resource in the Amazon API Gateway API Reference.
-agsmsLoggingLevel :: Lens' ApiGatewayStageMethodSetting (Maybe (Val Text))
+agsmsLoggingLevel :: Lens' ApiGatewayStageMethodSetting (Maybe LoggingLevel)
 agsmsLoggingLevel = lens _apiGatewayStageMethodSettingLoggingLevel (\s a -> s { _apiGatewayStageMethodSettingLoggingLevel = a })
 
 -- | Indicates whether Amazon CloudWatch metrics are enabled for methods in
diff --git a/library-gen/Stratosphere/ResourceProperties/ApiGatewayUsagePlanQuotaSettings.hs b/library-gen/Stratosphere/ResourceProperties/ApiGatewayUsagePlanQuotaSettings.hs
--- a/library-gen/Stratosphere/ResourceProperties/ApiGatewayUsagePlanQuotaSettings.hs
+++ b/library-gen/Stratosphere/ResourceProperties/ApiGatewayUsagePlanQuotaSettings.hs
@@ -14,7 +14,7 @@
 import GHC.Generics
 
 import Stratosphere.Values
-
+import Stratosphere.Types
 
 -- | Full data type definition for ApiGatewayUsagePlanQuotaSettings. See
 -- 'apiGatewayUsagePlanQuotaSettings' for a more convenient constructor.
@@ -22,7 +22,7 @@
   ApiGatewayUsagePlanQuotaSettings
   { _apiGatewayUsagePlanQuotaSettingsLimit :: Maybe (Val Integer')
   , _apiGatewayUsagePlanQuotaSettingsOffset :: Maybe (Val Integer')
-  , _apiGatewayUsagePlanQuotaSettingsPeriod :: Maybe (Val Text)
+  , _apiGatewayUsagePlanQuotaSettingsPeriod :: Maybe Period
   } deriving (Show, Generic)
 
 instance ToJSON ApiGatewayUsagePlanQuotaSettings where
@@ -57,5 +57,5 @@
 -- | The time period for which the maximum limit of requests applies, such as
 -- DAY or WEEK. For valid values, see the period property for the UsagePlan
 -- resource in the Amazon API Gateway REST API Reference.
-agupqsPeriod :: Lens' ApiGatewayUsagePlanQuotaSettings (Maybe (Val Text))
+agupqsPeriod :: Lens' ApiGatewayUsagePlanQuotaSettings (Maybe Period)
 agupqsPeriod = lens _apiGatewayUsagePlanQuotaSettingsPeriod (\s a -> s { _apiGatewayUsagePlanQuotaSettingsPeriod = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBAttributeDefinition.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBAttributeDefinition.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBAttributeDefinition.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | A list of attribute definitions for the AWS::DynamoDB::Table resource.
+-- Each element is composed of an AttributeName and AttributeType.
+
+module Stratosphere.ResourceProperties.DynamoDBAttributeDefinition where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for DynamoDBAttributeDefinition. See
+-- 'dynamoDBAttributeDefinition' for a more convenient constructor.
+data DynamoDBAttributeDefinition =
+  DynamoDBAttributeDefinition
+  { _dynamoDBAttributeDefinitionAttributeName :: Val Text
+  , _dynamoDBAttributeDefinitionAttributeType :: AttributeType
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBAttributeDefinition where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+instance FromJSON DynamoDBAttributeDefinition where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBAttributeDefinition' containing required fields
+-- as arguments.
+dynamoDBAttributeDefinition
+  :: Val Text -- ^ 'ddbadAttributeName'
+  -> AttributeType -- ^ 'ddbadAttributeType'
+  -> DynamoDBAttributeDefinition
+dynamoDBAttributeDefinition attributeNamearg attributeTypearg =
+  DynamoDBAttributeDefinition
+  { _dynamoDBAttributeDefinitionAttributeName = attributeNamearg
+  , _dynamoDBAttributeDefinitionAttributeType = attributeTypearg
+  }
+
+-- | The name of an attribute. Attribute names can be 1 – 255 characters long
+-- and have no character restrictions.
+ddbadAttributeName :: Lens' DynamoDBAttributeDefinition (Val Text)
+ddbadAttributeName = lens _dynamoDBAttributeDefinitionAttributeName (\s a -> s { _dynamoDBAttributeDefinitionAttributeName = a })
+
+-- | The data type for the attribute. You can specify S for string data, N for
+-- numeric data, or B for binary data.
+ddbadAttributeType :: Lens' DynamoDBAttributeDefinition AttributeType
+ddbadAttributeType = lens _dynamoDBAttributeDefinitionAttributeType (\s a -> s { _dynamoDBAttributeDefinitionAttributeType = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBGlobalSecondaryIndex.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBGlobalSecondaryIndex.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBGlobalSecondaryIndex.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Describes global secondary indexes for the AWS::DynamoDB::Table resource.
+
+module Stratosphere.ResourceProperties.DynamoDBGlobalSecondaryIndex where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.ResourceProperties.DynamoDBKeySchema
+import Stratosphere.ResourceProperties.DynamoDBProjectionObject
+import Stratosphere.ResourceProperties.DynamoDBProvisionedThroughput
+
+-- | Full data type definition for DynamoDBGlobalSecondaryIndex. See
+-- 'dynamoDBGlobalSecondaryIndex' for a more convenient constructor.
+data DynamoDBGlobalSecondaryIndex =
+  DynamoDBGlobalSecondaryIndex
+  { _dynamoDBGlobalSecondaryIndexIndexName :: Val Text
+  , _dynamoDBGlobalSecondaryIndexKeySchema :: [DynamoDBKeySchema]
+  , _dynamoDBGlobalSecondaryIndexProjection :: DynamoDBProjectionObject
+  , _dynamoDBGlobalSecondaryIndexProvisionedThroughput :: DynamoDBProvisionedThroughput
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBGlobalSecondaryIndex where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 29, omitNothingFields = True }
+
+instance FromJSON DynamoDBGlobalSecondaryIndex where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 29, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBGlobalSecondaryIndex' containing required fields
+-- as arguments.
+dynamoDBGlobalSecondaryIndex
+  :: Val Text -- ^ 'ddbgsiIndexName'
+  -> [DynamoDBKeySchema] -- ^ 'ddbgsiKeySchema'
+  -> DynamoDBProjectionObject -- ^ 'ddbgsiProjection'
+  -> DynamoDBProvisionedThroughput -- ^ 'ddbgsiProvisionedThroughput'
+  -> DynamoDBGlobalSecondaryIndex
+dynamoDBGlobalSecondaryIndex indexNamearg keySchemaarg projectionarg provisionedThroughputarg =
+  DynamoDBGlobalSecondaryIndex
+  { _dynamoDBGlobalSecondaryIndexIndexName = indexNamearg
+  , _dynamoDBGlobalSecondaryIndexKeySchema = keySchemaarg
+  , _dynamoDBGlobalSecondaryIndexProjection = projectionarg
+  , _dynamoDBGlobalSecondaryIndexProvisionedThroughput = provisionedThroughputarg
+  }
+
+-- | The name of the global secondary index. The index name can be 3 – 255
+-- characters long and have no character restrictions.
+ddbgsiIndexName :: Lens' DynamoDBGlobalSecondaryIndex (Val Text)
+ddbgsiIndexName = lens _dynamoDBGlobalSecondaryIndexIndexName (\s a -> s { _dynamoDBGlobalSecondaryIndexIndexName = a })
+
+-- | The complete index key schema for the global secondary index, which
+-- consists of one or more pairs of attribute names and key types.
+ddbgsiKeySchema :: Lens' DynamoDBGlobalSecondaryIndex [DynamoDBKeySchema]
+ddbgsiKeySchema = lens _dynamoDBGlobalSecondaryIndexKeySchema (\s a -> s { _dynamoDBGlobalSecondaryIndexKeySchema = a })
+
+-- | Attributes that are copied (projected) from the source table into the
+-- index. These attributes are in addition to the primary key attributes and
+-- index key attributes, which are automatically projected.
+ddbgsiProjection :: Lens' DynamoDBGlobalSecondaryIndex DynamoDBProjectionObject
+ddbgsiProjection = lens _dynamoDBGlobalSecondaryIndexProjection (\s a -> s { _dynamoDBGlobalSecondaryIndexProjection = a })
+
+-- | The provisioned throughput settings for the index.
+ddbgsiProvisionedThroughput :: Lens' DynamoDBGlobalSecondaryIndex DynamoDBProvisionedThroughput
+ddbgsiProvisionedThroughput = lens _dynamoDBGlobalSecondaryIndexProvisionedThroughput (\s a -> s { _dynamoDBGlobalSecondaryIndexProvisionedThroughput = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBKeySchema.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBKeySchema.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBKeySchema.hs
@@ -0,0 +1,59 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Describes a primary key for the AWS::DynamoDB::Table resource or a key
+-- schema for an index. Each element is composed of an AttributeName and
+-- KeyType. For the primary key of an Amazon DynamoDB table that consists of
+-- only a hash attribute, specify one element with a KeyType of HASH. For the
+-- primary key of an Amazon DynamoDB table that consists of a hash and range
+-- attributes, specify two elements: one with a KeyType of HASH and one with a
+-- KeyType of RANGE. For a complete discussion of DynamoDB primary keys, see
+-- Primary Key in the Amazon DynamoDB Developer Guide.
+
+module Stratosphere.ResourceProperties.DynamoDBKeySchema where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for DynamoDBKeySchema. See 'dynamoDBKeySchema'
+-- for a more convenient constructor.
+data DynamoDBKeySchema =
+  DynamoDBKeySchema
+  { _dynamoDBKeySchemaAttributeName :: Val Text
+  , _dynamoDBKeySchemaKeyType :: KeyType
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBKeySchema where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 18, omitNothingFields = True }
+
+instance FromJSON DynamoDBKeySchema where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 18, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBKeySchema' containing required fields as
+-- arguments.
+dynamoDBKeySchema
+  :: Val Text -- ^ 'ddbksAttributeName'
+  -> KeyType -- ^ 'ddbksKeyType'
+  -> DynamoDBKeySchema
+dynamoDBKeySchema attributeNamearg keyTypearg =
+  DynamoDBKeySchema
+  { _dynamoDBKeySchemaAttributeName = attributeNamearg
+  , _dynamoDBKeySchemaKeyType = keyTypearg
+  }
+
+-- | The attribute name that is used as the primary key for this table.
+-- Primary key element names can be 1 – 255 characters long and have no
+-- character restrictions.
+ddbksAttributeName :: Lens' DynamoDBKeySchema (Val Text)
+ddbksAttributeName = lens _dynamoDBKeySchemaAttributeName (\s a -> s { _dynamoDBKeySchemaAttributeName = a })
+
+-- | Represents the attribute data, consisting of the data type and the
+-- attribute value itself. You can specify HASH or RANGE.
+ddbksKeyType :: Lens' DynamoDBKeySchema KeyType
+ddbksKeyType = lens _dynamoDBKeySchemaKeyType (\s a -> s { _dynamoDBKeySchemaKeyType = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBLocalSecondaryIndex.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBLocalSecondaryIndex.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBLocalSecondaryIndex.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Describes local secondary indexes for the AWS::DynamoDB::Table resource.
+-- Each index is scoped to a given hash key value. Tables with one or more
+-- local secondary indexes are subject to an item collection size limit, where
+-- the amount of data within a given item collection cannot exceed 10 GB.
+
+module Stratosphere.ResourceProperties.DynamoDBLocalSecondaryIndex where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.ResourceProperties.DynamoDBKeySchema
+import Stratosphere.ResourceProperties.DynamoDBProjectionObject
+
+-- | Full data type definition for DynamoDBLocalSecondaryIndex. See
+-- 'dynamoDBLocalSecondaryIndex' for a more convenient constructor.
+data DynamoDBLocalSecondaryIndex =
+  DynamoDBLocalSecondaryIndex
+  { _dynamoDBLocalSecondaryIndexIndexName :: Val Text
+  , _dynamoDBLocalSecondaryIndexKeySchema :: [DynamoDBKeySchema]
+  , _dynamoDBLocalSecondaryIndexProjection :: DynamoDBProjectionObject
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBLocalSecondaryIndex where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+instance FromJSON DynamoDBLocalSecondaryIndex where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBLocalSecondaryIndex' containing required fields
+-- as arguments.
+dynamoDBLocalSecondaryIndex
+  :: Val Text -- ^ 'ddblsiIndexName'
+  -> [DynamoDBKeySchema] -- ^ 'ddblsiKeySchema'
+  -> DynamoDBProjectionObject -- ^ 'ddblsiProjection'
+  -> DynamoDBLocalSecondaryIndex
+dynamoDBLocalSecondaryIndex indexNamearg keySchemaarg projectionarg =
+  DynamoDBLocalSecondaryIndex
+  { _dynamoDBLocalSecondaryIndexIndexName = indexNamearg
+  , _dynamoDBLocalSecondaryIndexKeySchema = keySchemaarg
+  , _dynamoDBLocalSecondaryIndexProjection = projectionarg
+  }
+
+-- | The name of the local secondary index. The index name can be 3 – 255
+-- characters long and have no character restrictions.
+ddblsiIndexName :: Lens' DynamoDBLocalSecondaryIndex (Val Text)
+ddblsiIndexName = lens _dynamoDBLocalSecondaryIndexIndexName (\s a -> s { _dynamoDBLocalSecondaryIndexIndexName = a })
+
+-- | The complete index key schema for the local secondary index, which
+-- consists of one or more pairs of attribute names and key types. For local
+-- secondary indexes, the hash key must be the same as that of the source
+-- table.
+ddblsiKeySchema :: Lens' DynamoDBLocalSecondaryIndex [DynamoDBKeySchema]
+ddblsiKeySchema = lens _dynamoDBLocalSecondaryIndexKeySchema (\s a -> s { _dynamoDBLocalSecondaryIndexKeySchema = a })
+
+-- | Attributes that are copied (projected) from the source table into the
+-- index. These attributes are additions to the primary key attributes and
+-- index key attributes, which are automatically projected.
+ddblsiProjection :: Lens' DynamoDBLocalSecondaryIndex DynamoDBProjectionObject
+ddblsiProjection = lens _dynamoDBLocalSecondaryIndexProjection (\s a -> s { _dynamoDBLocalSecondaryIndexProjection = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBProjectionObject.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBProjectionObject.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBProjectionObject.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Attributes that are copied (projected) from the source table into the
+-- index. These attributes are additions to the primary key attributes and
+-- index key attributes, which are automatically projected.
+
+module Stratosphere.ResourceProperties.DynamoDBProjectionObject where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for DynamoDBProjectionObject. See
+-- 'dynamoDBProjectionObject' for a more convenient constructor.
+data DynamoDBProjectionObject =
+  DynamoDBProjectionObject
+  { _dynamoDBProjectionObjectNonKeyAttributes :: Maybe [Val Text]
+  , _dynamoDBProjectionObjectProjectionType :: Maybe ProjectionType
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBProjectionObject where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 25, omitNothingFields = True }
+
+instance FromJSON DynamoDBProjectionObject where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 25, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBProjectionObject' containing required fields as
+-- arguments.
+dynamoDBProjectionObject
+  :: DynamoDBProjectionObject
+dynamoDBProjectionObject  =
+  DynamoDBProjectionObject
+  { _dynamoDBProjectionObjectNonKeyAttributes = Nothing
+  , _dynamoDBProjectionObjectProjectionType = Nothing
+  }
+
+-- | The non-key attribute names that are projected into the index. For local
+-- secondary indexes, the total count of NonKeyAttributes summed across all of
+-- the local secondary indexes must not exceed 20. If you project the same
+-- attribute into two different indexes, this counts as two distinct
+-- attributes in determining the total.
+ddbpoNonKeyAttributes :: Lens' DynamoDBProjectionObject (Maybe [Val Text])
+ddbpoNonKeyAttributes = lens _dynamoDBProjectionObjectNonKeyAttributes (\s a -> s { _dynamoDBProjectionObjectNonKeyAttributes = a })
+
+-- | The set of attributes that are projected into the index: Only the index
+-- and primary keys are projected into the index. Only the specified table
+-- attributes are projected into the index. The list of projected attributes
+-- are in NonKeyAttributes. All of the table attributes are projected into the
+-- index.
+ddbpoProjectionType :: Lens' DynamoDBProjectionObject (Maybe ProjectionType)
+ddbpoProjectionType = lens _dynamoDBProjectionObjectProjectionType (\s a -> s { _dynamoDBProjectionObjectProjectionType = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBProvisionedThroughput.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBProvisionedThroughput.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBProvisionedThroughput.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Describes a set of provisioned throughput values for an
+-- AWS::DynamoDB::Table resource. DynamoDB uses these capacity units to
+-- allocate sufficient resources to provide the requested throughput. For a
+-- complete discussion of DynamoDB provisioned throughput values, see
+-- Specifying Read and Write Requirements in the DynamoDB Developer Guide.
+
+module Stratosphere.ResourceProperties.DynamoDBProvisionedThroughput where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for DynamoDBProvisionedThroughput. See
+-- 'dynamoDBProvisionedThroughput' for a more convenient constructor.
+data DynamoDBProvisionedThroughput =
+  DynamoDBProvisionedThroughput
+  { _dynamoDBProvisionedThroughputReadCapacityUnits :: Val Integer'
+  , _dynamoDBProvisionedThroughputWriteCapacityUnits :: Val Integer'
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBProvisionedThroughput where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 30, omitNothingFields = True }
+
+instance FromJSON DynamoDBProvisionedThroughput where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 30, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBProvisionedThroughput' containing required
+-- fields as arguments.
+dynamoDBProvisionedThroughput
+  :: Val Integer' -- ^ 'ddbptReadCapacityUnits'
+  -> Val Integer' -- ^ 'ddbptWriteCapacityUnits'
+  -> DynamoDBProvisionedThroughput
+dynamoDBProvisionedThroughput readCapacityUnitsarg writeCapacityUnitsarg =
+  DynamoDBProvisionedThroughput
+  { _dynamoDBProvisionedThroughputReadCapacityUnits = readCapacityUnitsarg
+  , _dynamoDBProvisionedThroughputWriteCapacityUnits = writeCapacityUnitsarg
+  }
+
+-- | Sets the desired minimum number of consistent reads of items (up to 1KB
+-- in size) per second for the specified table before Amazon DynamoDB balances
+-- the load.
+ddbptReadCapacityUnits :: Lens' DynamoDBProvisionedThroughput (Val Integer')
+ddbptReadCapacityUnits = lens _dynamoDBProvisionedThroughputReadCapacityUnits (\s a -> s { _dynamoDBProvisionedThroughputReadCapacityUnits = a })
+
+-- | Sets the desired minimum number of consistent writes of items (up to 1KB
+-- in size) per second for the specified table before Amazon DynamoDB balances
+-- the load.
+ddbptWriteCapacityUnits :: Lens' DynamoDBProvisionedThroughput (Val Integer')
+ddbptWriteCapacityUnits = lens _dynamoDBProvisionedThroughputWriteCapacityUnits (\s a -> s { _dynamoDBProvisionedThroughputWriteCapacityUnits = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/DynamoDBStreamSpecification.hs b/library-gen/Stratosphere/ResourceProperties/DynamoDBStreamSpecification.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/DynamoDBStreamSpecification.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | StreamSpecification is a property of the AWS::DynamoDB::Table resource
+-- that defines the settings of a DynamoDB table's stream.
+
+module Stratosphere.ResourceProperties.DynamoDBStreamSpecification where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for DynamoDBStreamSpecification. See
+-- 'dynamoDBStreamSpecification' for a more convenient constructor.
+data DynamoDBStreamSpecification =
+  DynamoDBStreamSpecification
+  { _dynamoDBStreamSpecificationStreamViewType :: StreamViewType
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBStreamSpecification where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+instance FromJSON DynamoDBStreamSpecification where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 28, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBStreamSpecification' containing required fields
+-- as arguments.
+dynamoDBStreamSpecification
+  :: StreamViewType -- ^ 'ddbssStreamViewType'
+  -> DynamoDBStreamSpecification
+dynamoDBStreamSpecification streamViewTypearg =
+  DynamoDBStreamSpecification
+  { _dynamoDBStreamSpecificationStreamViewType = streamViewTypearg
+  }
+
+-- | Determines the information that the stream captures when an item in the
+-- table is modified. For valid values, see StreamSpecification in the Amazon
+-- DynamoDB API Reference.
+ddbssStreamViewType :: Lens' DynamoDBStreamSpecification StreamViewType
+ddbssStreamViewType = lens _dynamoDBStreamSpecificationStreamViewType (\s a -> s { _dynamoDBStreamSpecificationStreamViewType = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/SNSTopicSubscription.hs b/library-gen/Stratosphere/ResourceProperties/SNSTopicSubscription.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/SNSTopicSubscription.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Subscription is an embedded property of the AWS::SNS::Topic resource that
+-- describes the subscription endpoints for an Amazon Simple Notification
+-- Service (Amazon SNS) topic.
+
+module Stratosphere.ResourceProperties.SNSTopicSubscription where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for SNSTopicSubscription. See
+-- 'snsTopicSubscription' for a more convenient constructor.
+data SNSTopicSubscription =
+  SNSTopicSubscription
+  { _sNSTopicSubscriptionEndpoint :: Val Text
+  , _sNSTopicSubscriptionProtocol :: SNSProtocol
+  } deriving (Show, Generic)
+
+instance ToJSON SNSTopicSubscription where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 21, omitNothingFields = True }
+
+instance FromJSON SNSTopicSubscription where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 21, omitNothingFields = True }
+
+-- | Constructor for 'SNSTopicSubscription' containing required fields as
+-- arguments.
+snsTopicSubscription
+  :: Val Text -- ^ 'snstsEndpoint'
+  -> SNSProtocol -- ^ 'snstsProtocol'
+  -> SNSTopicSubscription
+snsTopicSubscription endpointarg protocolarg =
+  SNSTopicSubscription
+  { _sNSTopicSubscriptionEndpoint = endpointarg
+  , _sNSTopicSubscriptionProtocol = protocolarg
+  }
+
+-- | The subscription's endpoint (format depends on the protocol). For more
+-- information, see the Subscribe Endpoint parameter in the Amazon Simple
+-- Notification Service API Reference.
+snstsEndpoint :: Lens' SNSTopicSubscription (Val Text)
+snstsEndpoint = lens _sNSTopicSubscriptionEndpoint (\s a -> s { _sNSTopicSubscriptionEndpoint = a })
+
+-- | The subscription's protocol. For more information, see the Subscribe
+-- Protocol parameter in the Amazon Simple Notification Service API Reference.
+snstsProtocol :: Lens' SNSTopicSubscription SNSProtocol
+snstsProtocol = lens _sNSTopicSubscriptionProtocol (\s a -> s { _sNSTopicSubscriptionProtocol = a })
diff --git a/library-gen/Stratosphere/ResourceProperties/SQSRedrivePolicy.hs b/library-gen/Stratosphere/ResourceProperties/SQSRedrivePolicy.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/ResourceProperties/SQSRedrivePolicy.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The RedrivePolicy type is a property of the AWS::SQS::Queue resource.
+
+module Stratosphere.ResourceProperties.SQSRedrivePolicy where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for SQSRedrivePolicy. See 'sqsRedrivePolicy'
+-- for a more convenient constructor.
+data SQSRedrivePolicy =
+  SQSRedrivePolicy
+  { _sQSRedrivePolicydeadLetterTargetArn :: Val Text
+  , _sQSRedrivePolicymaxReceiveCount :: Maybe (Val Integer')
+  } deriving (Show, Generic)
+
+instance ToJSON SQSRedrivePolicy where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 17, omitNothingFields = True }
+
+instance FromJSON SQSRedrivePolicy where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 17, omitNothingFields = True }
+
+-- | Constructor for 'SQSRedrivePolicy' containing required fields as
+-- arguments.
+sqsRedrivePolicy
+  :: Val Text -- ^ 'sqsrpdeadLetterTargetArn'
+  -> SQSRedrivePolicy
+sqsRedrivePolicy deadLetterTargetArnarg =
+  SQSRedrivePolicy
+  { _sQSRedrivePolicydeadLetterTargetArn = deadLetterTargetArnarg
+  , _sQSRedrivePolicymaxReceiveCount = Nothing
+  }
+
+-- | The Amazon Resource Name (ARN) of the dead letter queue to which the
+-- messages are sent to after the maxReceiveCount value has been exceeded.
+sqsrpdeadLetterTargetArn :: Lens' SQSRedrivePolicy (Val Text)
+sqsrpdeadLetterTargetArn = lens _sQSRedrivePolicydeadLetterTargetArn (\s a -> s { _sQSRedrivePolicydeadLetterTargetArn = a })
+
+-- | The number of times a message is delivered to the source queue before
+-- being sent to the dead letter queue.
+sqsrpmaxReceiveCount :: Lens' SQSRedrivePolicy (Maybe (Val Integer'))
+sqsrpmaxReceiveCount = lens _sQSRedrivePolicymaxReceiveCount (\s a -> s { _sQSRedrivePolicymaxReceiveCount = a })
diff --git a/library-gen/Stratosphere/Resources.hs b/library-gen/Stratosphere/Resources.hs
--- a/library-gen/Stratosphere/Resources.hs
+++ b/library-gen/Stratosphere/Resources.hs
@@ -59,16 +59,20 @@
 import Stratosphere.Resources.DBSecurityGroupIngress as X
 import Stratosphere.Resources.DBSubnetGroup as X
 import Stratosphere.Resources.DeliveryStream as X
+import Stratosphere.Resources.DynamoDBTable as X
 import Stratosphere.Resources.EC2Instance as X
 import Stratosphere.Resources.EIP as X
 import Stratosphere.Resources.EIPAssociation as X
+import Stratosphere.Resources.EventsRule as X
 import Stratosphere.Resources.Group as X
 import Stratosphere.Resources.IAMRole as X
 import Stratosphere.Resources.InstanceProfile as X
 import Stratosphere.Resources.InternetGateway as X
 import Stratosphere.Resources.KinesisStream as X
+import Stratosphere.Resources.LambdaAlias as X
 import Stratosphere.Resources.LambdaFunction as X
 import Stratosphere.Resources.LambdaPermission as X
+import Stratosphere.Resources.LambdaVersion as X
 import Stratosphere.Resources.LaunchConfiguration as X
 import Stratosphere.Resources.LifecycleHook as X
 import Stratosphere.Resources.LoadBalancer as X
@@ -82,6 +86,11 @@
 import Stratosphere.Resources.Route as X
 import Stratosphere.Resources.RouteTable as X
 import Stratosphere.Resources.S3BucketPolicy as X
+import Stratosphere.Resources.SNSSubscription as X
+import Stratosphere.Resources.SNSTopic as X
+import Stratosphere.Resources.SNSTopicPolicy as X
+import Stratosphere.Resources.SQSQueue as X
+import Stratosphere.Resources.SQSQueuePolicy as X
 import Stratosphere.Resources.ScalingPolicy as X
 import Stratosphere.Resources.ScheduledAction as X
 import Stratosphere.Resources.SecurityGroup as X
@@ -119,6 +128,13 @@
 import Stratosphere.ResourceProperties.AutoScalingTags as X
 import Stratosphere.ResourceProperties.ConnectionDrainingPolicy as X
 import Stratosphere.ResourceProperties.ConnectionSettings as X
+import Stratosphere.ResourceProperties.DynamoDBAttributeDefinition as X
+import Stratosphere.ResourceProperties.DynamoDBGlobalSecondaryIndex as X
+import Stratosphere.ResourceProperties.DynamoDBKeySchema as X
+import Stratosphere.ResourceProperties.DynamoDBLocalSecondaryIndex as X
+import Stratosphere.ResourceProperties.DynamoDBProjectionObject as X
+import Stratosphere.ResourceProperties.DynamoDBProvisionedThroughput as X
+import Stratosphere.ResourceProperties.DynamoDBStreamSpecification as X
 import Stratosphere.ResourceProperties.EBSBlockDevice as X
 import Stratosphere.ResourceProperties.EC2BlockDeviceMapping as X
 import Stratosphere.ResourceProperties.EC2MountPoint as X
@@ -169,6 +185,8 @@
 import Stratosphere.ResourceProperties.S3WebsiteRedirectRule as X
 import Stratosphere.ResourceProperties.S3WebsiteRoutingRuleCondition as X
 import Stratosphere.ResourceProperties.S3WebsiteRoutingRules as X
+import Stratosphere.ResourceProperties.SNSTopicSubscription as X
+import Stratosphere.ResourceProperties.SQSRedrivePolicy as X
 import Stratosphere.ResourceProperties.SecurityGroupEgressRule as X
 import Stratosphere.ResourceProperties.SecurityGroupIngressRule as X
 import Stratosphere.ResourceProperties.StepAdjustments as X
@@ -204,16 +222,20 @@
   | DBSecurityGroupIngressProperties DBSecurityGroupIngress
   | DBSubnetGroupProperties DBSubnetGroup
   | DeliveryStreamProperties DeliveryStream
+  | DynamoDBTableProperties DynamoDBTable
   | EC2InstanceProperties EC2Instance
   | EIPProperties EIP
   | EIPAssociationProperties EIPAssociation
+  | EventsRuleProperties EventsRule
   | GroupProperties Group
   | IAMRoleProperties IAMRole
   | InstanceProfileProperties InstanceProfile
   | InternetGatewayProperties InternetGateway
   | KinesisStreamProperties KinesisStream
+  | LambdaAliasProperties LambdaAlias
   | LambdaFunctionProperties LambdaFunction
   | LambdaPermissionProperties LambdaPermission
+  | LambdaVersionProperties LambdaVersion
   | LaunchConfigurationProperties LaunchConfiguration
   | LifecycleHookProperties LifecycleHook
   | LoadBalancerProperties LoadBalancer
@@ -227,6 +249,11 @@
   | RouteProperties Route
   | RouteTableProperties RouteTable
   | S3BucketPolicyProperties S3BucketPolicy
+  | SNSSubscriptionProperties SNSSubscription
+  | SNSTopicProperties SNSTopic
+  | SNSTopicPolicyProperties SNSTopicPolicy
+  | SQSQueueProperties SQSQueue
+  | SQSQueuePolicyProperties SQSQueuePolicy
   | ScalingPolicyProperties ScalingPolicy
   | ScheduledActionProperties ScheduledAction
   | SecurityGroupProperties SecurityGroup
@@ -333,12 +360,16 @@
   [ "Type" .= ("AWS::RDS::DBSubnetGroup" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (DeliveryStreamProperties x) =
   [ "Type" .= ("AWS::KinesisFirehose::DeliveryStream" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (DynamoDBTableProperties x) =
+  [ "Type" .= ("AWS::DynamoDB::Table" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (EC2InstanceProperties x) =
   [ "Type" .= ("AWS::EC2::Instance" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (EIPProperties x) =
   [ "Type" .= ("AWS::EC2::EIP" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (EIPAssociationProperties x) =
   [ "Type" .= ("AWS::EC2::EIPAssociation" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (EventsRuleProperties x) =
+  [ "Type" .= ("AWS::Events::Rule" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (GroupProperties x) =
   [ "Type" .= ("AWS::IAM::Group" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (IAMRoleProperties x) =
@@ -349,10 +380,14 @@
   [ "Type" .= ("AWS::EC2::InternetGateway" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (KinesisStreamProperties x) =
   [ "Type" .= ("AWS::Kinesis::Stream" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (LambdaAliasProperties x) =
+  [ "Type" .= ("AWS::Lambda::Alias" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (LambdaFunctionProperties x) =
   [ "Type" .= ("AWS::Lambda::Function" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (LambdaPermissionProperties x) =
   [ "Type" .= ("AWS::Lambda::Permission" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (LambdaVersionProperties x) =
+  [ "Type" .= ("AWS::Lambda::Version" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (LaunchConfigurationProperties x) =
   [ "Type" .= ("AWS::AutoScaling::LaunchConfiguration" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (LifecycleHookProperties x) =
@@ -379,6 +414,16 @@
   [ "Type" .= ("AWS::EC2::RouteTable" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (S3BucketPolicyProperties x) =
   [ "Type" .= ("AWS::S3::BucketPolicy" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (SNSSubscriptionProperties x) =
+  [ "Type" .= ("AWS::SNS::Subscription" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (SNSTopicProperties x) =
+  [ "Type" .= ("AWS::SNS::Topic" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (SNSTopicPolicyProperties x) =
+  [ "Type" .= ("AWS::SNS::TopicPolicy" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (SQSQueueProperties x) =
+  [ "Type" .= ("AWS::SQS::Queue" :: String), "Properties" .= toJSON x]
+resourcePropertiesJSON (SQSQueuePolicyProperties x) =
+  [ "Type" .= ("AWS::SQS::QueuePolicy" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (ScalingPolicyProperties x) =
   [ "Type" .= ("AWS::AutoScaling::ScalingPolicy" :: String), "Properties" .= toJSON x]
 resourcePropertiesJSON (ScheduledActionProperties x) =
@@ -436,16 +481,20 @@
          "AWS::RDS::DBSecurityGroupIngress" -> DBSecurityGroupIngressProperties <$> (o .: "Properties")
          "AWS::RDS::DBSubnetGroup" -> DBSubnetGroupProperties <$> (o .: "Properties")
          "AWS::KinesisFirehose::DeliveryStream" -> DeliveryStreamProperties <$> (o .: "Properties")
+         "AWS::DynamoDB::Table" -> DynamoDBTableProperties <$> (o .: "Properties")
          "AWS::EC2::Instance" -> EC2InstanceProperties <$> (o .: "Properties")
          "AWS::EC2::EIP" -> EIPProperties <$> (o .: "Properties")
          "AWS::EC2::EIPAssociation" -> EIPAssociationProperties <$> (o .: "Properties")
+         "AWS::Events::Rule" -> EventsRuleProperties <$> (o .: "Properties")
          "AWS::IAM::Group" -> GroupProperties <$> (o .: "Properties")
          "AWS::IAM::Role" -> IAMRoleProperties <$> (o .: "Properties")
          "AWS::IAM::InstanceProfile" -> InstanceProfileProperties <$> (o .: "Properties")
          "AWS::EC2::InternetGateway" -> InternetGatewayProperties <$> (o .: "Properties")
          "AWS::Kinesis::Stream" -> KinesisStreamProperties <$> (o .: "Properties")
+         "AWS::Lambda::Alias" -> LambdaAliasProperties <$> (o .: "Properties")
          "AWS::Lambda::Function" -> LambdaFunctionProperties <$> (o .: "Properties")
          "AWS::Lambda::Permission" -> LambdaPermissionProperties <$> (o .: "Properties")
+         "AWS::Lambda::Version" -> LambdaVersionProperties <$> (o .: "Properties")
          "AWS::AutoScaling::LaunchConfiguration" -> LaunchConfigurationProperties <$> (o .: "Properties")
          "AWS::AutoScaling::LifecycleHook" -> LifecycleHookProperties <$> (o .: "Properties")
          "AWS::ElasticLoadBalancing::LoadBalancer" -> LoadBalancerProperties <$> (o .: "Properties")
@@ -459,6 +508,11 @@
          "AWS::EC2::Route" -> RouteProperties <$> (o .: "Properties")
          "AWS::EC2::RouteTable" -> RouteTableProperties <$> (o .: "Properties")
          "AWS::S3::BucketPolicy" -> S3BucketPolicyProperties <$> (o .: "Properties")
+         "AWS::SNS::Subscription" -> SNSSubscriptionProperties <$> (o .: "Properties")
+         "AWS::SNS::Topic" -> SNSTopicProperties <$> (o .: "Properties")
+         "AWS::SNS::TopicPolicy" -> SNSTopicPolicyProperties <$> (o .: "Properties")
+         "AWS::SQS::Queue" -> SQSQueueProperties <$> (o .: "Properties")
+         "AWS::SQS::QueuePolicy" -> SQSQueuePolicyProperties <$> (o .: "Properties")
          "AWS::AutoScaling::ScalingPolicy" -> ScalingPolicyProperties <$> (o .: "Properties")
          "AWS::AutoScaling::ScheduledAction" -> ScheduledActionProperties <$> (o .: "Properties")
          "AWS::EC2::SecurityGroup" -> SecurityGroupProperties <$> (o .: "Properties")
diff --git a/library-gen/Stratosphere/Resources/ApiGatewayMethod.hs b/library-gen/Stratosphere/Resources/ApiGatewayMethod.hs
--- a/library-gen/Stratosphere/Resources/ApiGatewayMethod.hs
+++ b/library-gen/Stratosphere/Resources/ApiGatewayMethod.hs
@@ -16,15 +16,16 @@
 import Stratosphere.Values
 import Stratosphere.ResourceProperties.ApiGatewayIntegration
 import Stratosphere.ResourceProperties.ApiGatewayMethodResponse
+import Stratosphere.Types
 
 -- | Full data type definition for ApiGatewayMethod. See 'apiGatewayMethod'
 -- for a more convenient constructor.
 data ApiGatewayMethod =
   ApiGatewayMethod
   { _apiGatewayMethodApiKeyRequired :: Maybe (Val Bool')
-  , _apiGatewayMethodAuthorizationType :: Val Text
+  , _apiGatewayMethodAuthorizationType :: AuthorizationType
   , _apiGatewayMethodAuthorizerId :: Maybe (Val Text)
-  , _apiGatewayMethodHttpMethod :: Val Text
+  , _apiGatewayMethodHttpMethod :: HttpMethod
   , _apiGatewayMethodIntegration :: Maybe ApiGatewayIntegration
   , _apiGatewayMethodMethodResponses :: Maybe [ApiGatewayMethodResponse]
   , _apiGatewayMethodRequestModels :: Maybe Object
@@ -42,8 +43,8 @@
 -- | Constructor for 'ApiGatewayMethod' containing required fields as
 -- arguments.
 apiGatewayMethod
-  :: Val Text -- ^ 'agmeAuthorizationType'
-  -> Val Text -- ^ 'agmeHttpMethod'
+  :: AuthorizationType -- ^ 'agmeAuthorizationType'
+  -> HttpMethod -- ^ 'agmeHttpMethod'
   -> Val Text -- ^ 'agmeResourceId'
   -> Val Text -- ^ 'agmeRestApiId'
   -> ApiGatewayMethod
@@ -66,7 +67,7 @@
 agmeApiKeyRequired = lens _apiGatewayMethodApiKeyRequired (\s a -> s { _apiGatewayMethodApiKeyRequired = a })
 
 -- | The method's authorization type.
-agmeAuthorizationType :: Lens' ApiGatewayMethod (Val Text)
+agmeAuthorizationType :: Lens' ApiGatewayMethod AuthorizationType
 agmeAuthorizationType = lens _apiGatewayMethodAuthorizationType (\s a -> s { _apiGatewayMethodAuthorizationType = a })
 
 -- | The identifier of the authorizer to use on this method. If you specify
@@ -75,7 +76,7 @@
 agmeAuthorizerId = lens _apiGatewayMethodAuthorizerId (\s a -> s { _apiGatewayMethodAuthorizerId = a })
 
 -- | The HTTP method that clients will use to call this method.
-agmeHttpMethod :: Lens' ApiGatewayMethod (Val Text)
+agmeHttpMethod :: Lens' ApiGatewayMethod HttpMethod
 agmeHttpMethod = lens _apiGatewayMethodHttpMethod (\s a -> s { _apiGatewayMethodHttpMethod = a })
 
 -- | The back-end system that the method calls when it receives a request.
diff --git a/library-gen/Stratosphere/Resources/DynamoDBTable.hs b/library-gen/Stratosphere/Resources/DynamoDBTable.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/DynamoDBTable.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Creates a DynamoDB table.
+
+module Stratosphere.Resources.DynamoDBTable where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.ResourceProperties.DynamoDBAttributeDefinition
+import Stratosphere.ResourceProperties.DynamoDBGlobalSecondaryIndex
+import Stratosphere.ResourceProperties.DynamoDBKeySchema
+import Stratosphere.ResourceProperties.DynamoDBLocalSecondaryIndex
+import Stratosphere.ResourceProperties.DynamoDBProvisionedThroughput
+import Stratosphere.ResourceProperties.DynamoDBStreamSpecification
+
+-- | Full data type definition for DynamoDBTable. See 'dynamoDBTable' for a
+-- more convenient constructor.
+data DynamoDBTable =
+  DynamoDBTable
+  { _dynamoDBTableAttributeDefinitions :: [DynamoDBAttributeDefinition]
+  , _dynamoDBTableGlobalSecondaryIndexes :: Maybe [DynamoDBGlobalSecondaryIndex]
+  , _dynamoDBTableKeySchema :: [DynamoDBKeySchema]
+  , _dynamoDBTableLocalSecondaryIndexes :: Maybe [DynamoDBLocalSecondaryIndex]
+  , _dynamoDBTableProvisionedThroughput :: DynamoDBProvisionedThroughput
+  , _dynamoDBTableStreamSpecification :: Maybe DynamoDBStreamSpecification
+  , _dynamoDBTableTableName :: Maybe (Val Text)
+  } deriving (Show, Generic)
+
+instance ToJSON DynamoDBTable where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 14, omitNothingFields = True }
+
+instance FromJSON DynamoDBTable where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 14, omitNothingFields = True }
+
+-- | Constructor for 'DynamoDBTable' containing required fields as arguments.
+dynamoDBTable
+  :: [DynamoDBAttributeDefinition] -- ^ 'ddbtAttributeDefinitions'
+  -> [DynamoDBKeySchema] -- ^ 'ddbtKeySchema'
+  -> DynamoDBProvisionedThroughput -- ^ 'ddbtProvisionedThroughput'
+  -> DynamoDBTable
+dynamoDBTable attributeDefinitionsarg keySchemaarg provisionedThroughputarg =
+  DynamoDBTable
+  { _dynamoDBTableAttributeDefinitions = attributeDefinitionsarg
+  , _dynamoDBTableGlobalSecondaryIndexes = Nothing
+  , _dynamoDBTableKeySchema = keySchemaarg
+  , _dynamoDBTableLocalSecondaryIndexes = Nothing
+  , _dynamoDBTableProvisionedThroughput = provisionedThroughputarg
+  , _dynamoDBTableStreamSpecification = Nothing
+  , _dynamoDBTableTableName = Nothing
+  }
+
+-- | A list of AttributeName and AttributeType objects that describe the key
+-- schema for the table and indexes.
+ddbtAttributeDefinitions :: Lens' DynamoDBTable [DynamoDBAttributeDefinition]
+ddbtAttributeDefinitions = lens _dynamoDBTableAttributeDefinitions (\s a -> s { _dynamoDBTableAttributeDefinitions = a })
+
+-- | Global secondary indexes to be created on the table. You can create up to
+-- 5 global secondary indexes. Important If you update a table to include a
+-- new global secondary index, AWS CloudFormation initiates the index creation
+-- and then proceeds with the stack update. AWS CloudFormation doesn't wait
+-- for the index to complete creation because the backfilling phase can take a
+-- long time, depending on the size of the table. You cannot use the index or
+-- update the table until the index's status is ACTIVE. You can track its
+-- status by using the DynamoDB DescribeTable command. If you add or delete an
+-- index during an update, we recommend that you don't update any other
+-- resources. If your stack fails to update and is rolled back while adding a
+-- new index, you must manually delete the index.
+ddbtGlobalSecondaryIndexes :: Lens' DynamoDBTable (Maybe [DynamoDBGlobalSecondaryIndex])
+ddbtGlobalSecondaryIndexes = lens _dynamoDBTableGlobalSecondaryIndexes (\s a -> s { _dynamoDBTableGlobalSecondaryIndexes = a })
+
+-- | Specifies the attributes that make up the primary key for the table. The
+-- attributes in the KeySchema property must also be defined in the
+-- AttributeDefinitions property.
+ddbtKeySchema :: Lens' DynamoDBTable [DynamoDBKeySchema]
+ddbtKeySchema = lens _dynamoDBTableKeySchema (\s a -> s { _dynamoDBTableKeySchema = a })
+
+-- | Local secondary indexes to be created on the table. You can create up to
+-- 5 local secondary indexes. Each index is scoped to a given hash key value.
+-- The size of each hash key can be up to 10 gigabytes.
+ddbtLocalSecondaryIndexes :: Lens' DynamoDBTable (Maybe [DynamoDBLocalSecondaryIndex])
+ddbtLocalSecondaryIndexes = lens _dynamoDBTableLocalSecondaryIndexes (\s a -> s { _dynamoDBTableLocalSecondaryIndexes = a })
+
+-- | Throughput for the specified table, consisting of values for
+-- ReadCapacityUnits and WriteCapacityUnits. For more information about the
+-- contents of a provisioned throughput structure, see DynamoDB Provisioned
+-- Throughput.
+ddbtProvisionedThroughput :: Lens' DynamoDBTable DynamoDBProvisionedThroughput
+ddbtProvisionedThroughput = lens _dynamoDBTableProvisionedThroughput (\s a -> s { _dynamoDBTableProvisionedThroughput = a })
+
+-- | The settings for the DynamoDB table stream, which capture changes to
+-- items stored in the table.
+ddbtStreamSpecification :: Lens' DynamoDBTable (Maybe DynamoDBStreamSpecification)
+ddbtStreamSpecification = lens _dynamoDBTableStreamSpecification (\s a -> s { _dynamoDBTableStreamSpecification = a })
+
+-- | A name for the table. If you don't specify a name, AWS CloudFormation
+-- generates a unique physical ID and uses that ID for the table name. For
+-- more information, see Name Type. Important If you specify a name, you
+-- cannot do updates that require this resource to be replaced. You can still
+-- do updates that require no or some interruption. If you must replace the
+-- resource, specify a new name.
+ddbtTableName :: Lens' DynamoDBTable (Maybe (Val Text))
+ddbtTableName = lens _dynamoDBTableTableName (\s a -> s { _dynamoDBTableTableName = a })
diff --git a/library-gen/Stratosphere/Resources/EventsRule.hs b/library-gen/Stratosphere/Resources/EventsRule.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/EventsRule.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::Events::Rule resource creates a rule that matches incoming
+-- Amazon CloudWatch Events (CloudWatch Events) events and routes them to one
+-- or more targets for processing. For more information, see Using CloudWatch
+-- Events in the Amazon CloudWatch User Guide.
+
+module Stratosphere.Resources.EventsRule where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for EventsRule. See 'eventsRule' for a more
+-- convenient constructor.
+data EventsRule =
+  EventsRule
+  { _eventsRuleDescription :: Maybe (Val Text)
+  , _eventsRuleEventPattern :: Maybe Object
+  , _eventsRuleName :: Maybe (Val Text)
+  , _eventsRuleRoleArn :: Maybe (Val Text)
+  , _eventsRuleScheduleExpression :: Maybe (Val Text)
+  , _eventsRuleState :: Maybe EnabledState
+  , _eventsRuleTargets :: Maybe [Object]
+  } deriving (Show, Generic)
+
+instance ToJSON EventsRule where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 11, omitNothingFields = True }
+
+instance FromJSON EventsRule where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 11, omitNothingFields = True }
+
+-- | Constructor for 'EventsRule' containing required fields as arguments.
+eventsRule
+  :: EventsRule
+eventsRule  =
+  EventsRule
+  { _eventsRuleDescription = Nothing
+  , _eventsRuleEventPattern = Nothing
+  , _eventsRuleName = Nothing
+  , _eventsRuleRoleArn = Nothing
+  , _eventsRuleScheduleExpression = Nothing
+  , _eventsRuleState = Nothing
+  , _eventsRuleTargets = Nothing
+  }
+
+-- | A description of the rule's purpose.
+erDescription :: Lens' EventsRule (Maybe (Val Text))
+erDescription = lens _eventsRuleDescription (\s a -> s { _eventsRuleDescription = a })
+
+-- | Describes which events CloudWatch Events routes to the specified target.
+-- These routed events are matched events. For more information, see Events
+-- and Event Patterns in the Amazon CloudWatch User Guide.
+erEventPattern :: Lens' EventsRule (Maybe Object)
+erEventPattern = lens _eventsRuleEventPattern (\s a -> s { _eventsRuleEventPattern = a })
+
+-- | A name for the rule. If you don't specify a name, AWS CloudFormation
+-- generates a unique physical ID and uses that ID for the rule name. For more
+-- information, see Name Type. Important If you specify a name, you cannot do
+-- updates that require this resource to be replaced. You can still do updates
+-- that require no or some interruption. If you must replace the resource,
+-- specify a new name.
+erName :: Lens' EventsRule (Maybe (Val Text))
+erName = lens _eventsRuleName (\s a -> s { _eventsRuleName = a })
+
+-- | The Amazon Resource Name (ARN) of the AWS Identity and Access Management
+-- (IAM) role that grants CloudWatch Events permission to make calls to target
+-- services, such as AWS Lambda (Lambda) or Amazon Kinesis streams.
+erRoleArn :: Lens' EventsRule (Maybe (Val Text))
+erRoleArn = lens _eventsRuleRoleArn (\s a -> s { _eventsRuleRoleArn = a })
+
+-- | The schedule or rate (frequency) that determines when CloudWatch Events
+-- runs the rule. For more information, see Schedule Expression Syntax for
+-- Rules in the Amazon CloudWatch User Guide.
+erScheduleExpression :: Lens' EventsRule (Maybe (Val Text))
+erScheduleExpression = lens _eventsRuleScheduleExpression (\s a -> s { _eventsRuleScheduleExpression = a })
+
+-- | Indicates whether the rule is enabled. For valid values, see the State
+-- parameter for the PutRule action in the Amazon CloudWatch Events API
+-- Reference.
+erState :: Lens' EventsRule (Maybe EnabledState)
+erState = lens _eventsRuleState (\s a -> s { _eventsRuleState = a })
+
+-- | The resources, such as Lambda functions or Amazon Kinesis streams, that
+-- CloudWatch Events routes events to and invokes when the rule is triggered.
+-- For information about valid targets, see the PutTargets action in the
+-- Amazon CloudWatch Events API Reference.
+erTargets :: Lens' EventsRule (Maybe [Object])
+erTargets = lens _eventsRuleTargets (\s a -> s { _eventsRuleTargets = a })
diff --git a/library-gen/Stratosphere/Resources/LambdaAlias.hs b/library-gen/Stratosphere/Resources/LambdaAlias.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/LambdaAlias.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::Lambda::Alias resource creates an alias that points to the
+-- version of an AWS Lambda (Lambda) function that you specify. Use aliases
+-- when you want to control which version of your function other services or
+-- applications invoke. Those services or applications can use your function's
+-- alias so that they don't need to be updated whenever you release a new
+-- version of your function. For more information, see Introduction to AWS
+-- Lambda Aliases in the AWS Lambda Developer Guide.
+
+module Stratosphere.Resources.LambdaAlias where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for LambdaAlias. See 'lambdaAlias' for a more
+-- convenient constructor.
+data LambdaAlias =
+  LambdaAlias
+  { _lambdaAliasDescription :: Maybe (Val Text)
+  , _lambdaAliasFunctionName :: Val Text
+  , _lambdaAliasFunctionVersion :: Val Text
+  , _lambdaAliasName :: Val Text
+  } deriving (Show, Generic)
+
+instance ToJSON LambdaAlias where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }
+
+instance FromJSON LambdaAlias where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }
+
+-- | Constructor for 'LambdaAlias' containing required fields as arguments.
+lambdaAlias
+  :: Val Text -- ^ 'laFunctionName'
+  -> Val Text -- ^ 'laFunctionVersion'
+  -> Val Text -- ^ 'laName'
+  -> LambdaAlias
+lambdaAlias functionNamearg functionVersionarg namearg =
+  LambdaAlias
+  { _lambdaAliasDescription = Nothing
+  , _lambdaAliasFunctionName = functionNamearg
+  , _lambdaAliasFunctionVersion = functionVersionarg
+  , _lambdaAliasName = namearg
+  }
+
+-- | Information about the alias, such as its purpose or the Lambda function
+-- that is associated with it.
+laDescription :: Lens' LambdaAlias (Maybe (Val Text))
+laDescription = lens _lambdaAliasDescription (\s a -> s { _lambdaAliasDescription = a })
+
+-- | The Lambda function that you want to associate with this alias. You can
+-- specify the function's name or its Amazon Resource Name (ARN).
+laFunctionName :: Lens' LambdaAlias (Val Text)
+laFunctionName = lens _lambdaAliasFunctionName (\s a -> s { _lambdaAliasFunctionName = a })
+
+-- | The version of the Lambda function that you want to associate with this
+-- alias.
+laFunctionVersion :: Lens' LambdaAlias (Val Text)
+laFunctionVersion = lens _lambdaAliasFunctionVersion (\s a -> s { _lambdaAliasFunctionVersion = a })
+
+-- | A name for the alias.
+laName :: Lens' LambdaAlias (Val Text)
+laName = lens _lambdaAliasName (\s a -> s { _lambdaAliasName = a })
diff --git a/library-gen/Stratosphere/Resources/LambdaFunction.hs b/library-gen/Stratosphere/Resources/LambdaFunction.hs
--- a/library-gen/Stratosphere/Resources/LambdaFunction.hs
+++ b/library-gen/Stratosphere/Resources/LambdaFunction.hs
@@ -16,6 +16,7 @@
 import Stratosphere.Values
 import Stratosphere.ResourceProperties.LambdaFunctionCode
 import Stratosphere.ResourceProperties.LambdaFunctionVPCConfig
+import Stratosphere.Types
 
 -- | Full data type definition for LambdaFunction. See 'lambdaFunction' for a
 -- more convenient constructor.
@@ -27,7 +28,7 @@
   , _lambdaFunctionHandler :: Val Text
   , _lambdaFunctionMemorySize :: Maybe (Val Integer')
   , _lambdaFunctionRole :: Val Text
-  , _lambdaFunctionRuntime :: Val Text
+  , _lambdaFunctionRuntime :: Runtime
   , _lambdaFunctionTimeout :: Maybe (Val Integer')
   , _lambdaFunctionVpcConfig :: Maybe LambdaFunctionVPCConfig
   } deriving (Show, Generic)
@@ -43,7 +44,7 @@
   :: LambdaFunctionCode -- ^ 'lfCode'
   -> Val Text -- ^ 'lfHandler'
   -> Val Text -- ^ 'lfRole'
-  -> Val Text -- ^ 'lfRuntime'
+  -> Runtime -- ^ 'lfRuntime'
   -> LambdaFunction
 lambdaFunction codearg handlerarg rolearg runtimearg =
   LambdaFunction
@@ -105,7 +106,7 @@
 -- | The runtime environment for the Lambda function that you are uploading.
 -- For valid values, see the Runtime property in the AWS Lambda Developer
 -- Guide.
-lfRuntime :: Lens' LambdaFunction (Val Text)
+lfRuntime :: Lens' LambdaFunction Runtime
 lfRuntime = lens _lambdaFunctionRuntime (\s a -> s { _lambdaFunctionRuntime = a })
 
 -- | The function execution time (in seconds) after which Lambda terminates
diff --git a/library-gen/Stratosphere/Resources/LambdaVersion.hs b/library-gen/Stratosphere/Resources/LambdaVersion.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/LambdaVersion.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::Lambda::Version resource publishes a specified version of an AWS
+-- Lambda (Lambda) function. When publishing a new version of your function,
+-- Lambda copies the latest version of your function. For more information,
+-- see Introduction to AWS Lambda Versioning in the AWS Lambda Developer
+-- Guide.
+
+module Stratosphere.Resources.LambdaVersion where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for LambdaVersion. See 'lambdaVersion' for a
+-- more convenient constructor.
+data LambdaVersion =
+  LambdaVersion
+  { _lambdaVersionCodeSha256 :: Maybe (Val Text)
+  , _lambdaVersionDescription :: Maybe (Val Text)
+  , _lambdaVersionFunctionName :: Val Text
+  } deriving (Show, Generic)
+
+instance ToJSON LambdaVersion where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 14, omitNothingFields = True }
+
+instance FromJSON LambdaVersion where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 14, omitNothingFields = True }
+
+-- | Constructor for 'LambdaVersion' containing required fields as arguments.
+lambdaVersion
+  :: Val Text -- ^ 'lvFunctionName'
+  -> LambdaVersion
+lambdaVersion functionNamearg =
+  LambdaVersion
+  { _lambdaVersionCodeSha256 = Nothing
+  , _lambdaVersionDescription = Nothing
+  , _lambdaVersionFunctionName = functionNamearg
+  }
+
+-- | The SHA-256 hash of the deployment package that you want to publish. This
+-- value must match the SHA-256 hash of the $LATEST version of the function.
+-- Specify this property to validate that you are publishing the correct
+-- package.
+lvCodeSha256 :: Lens' LambdaVersion (Maybe (Val Text))
+lvCodeSha256 = lens _lambdaVersionCodeSha256 (\s a -> s { _lambdaVersionCodeSha256 = a })
+
+-- | A description of the version you are publishing. If you don't specify a
+-- value, Lambda copies the description from the $LATEST version of the
+-- function.
+lvDescription :: Lens' LambdaVersion (Maybe (Val Text))
+lvDescription = lens _lambdaVersionDescription (\s a -> s { _lambdaVersionDescription = a })
+
+-- | The Lambda function for which you want to publish a version. You can
+-- specify the function's name or its Amazon Resource Name (ARN).
+lvFunctionName :: Lens' LambdaVersion (Val Text)
+lvFunctionName = lens _lambdaVersionFunctionName (\s a -> s { _lambdaVersionFunctionName = a })
diff --git a/library-gen/Stratosphere/Resources/SNSSubscription.hs b/library-gen/Stratosphere/Resources/SNSSubscription.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/SNSSubscription.hs
@@ -0,0 +1,59 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::SNS::Subscription resource subscribes an endpoint to an Amazon
+-- Simple Notification Service (Amazon SNS) topic. The owner of the endpoint
+-- must confirm the subscription before Amazon SNS creates the subscription.
+
+module Stratosphere.Resources.SNSSubscription where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.Types
+
+-- | Full data type definition for SNSSubscription. See 'snsSubscription' for
+-- a more convenient constructor.
+data SNSSubscription =
+  SNSSubscription
+  { _sNSSubscriptionEndpoint :: Maybe (Val Text)
+  , _sNSSubscriptionProtocol :: Maybe SNSProtocol
+  , _sNSSubscriptionTopicArn :: Maybe (Val Text)
+  } deriving (Show, Generic)
+
+instance ToJSON SNSSubscription where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 16, omitNothingFields = True }
+
+instance FromJSON SNSSubscription where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 16, omitNothingFields = True }
+
+-- | Constructor for 'SNSSubscription' containing required fields as
+-- arguments.
+snsSubscription
+  :: SNSSubscription
+snsSubscription  =
+  SNSSubscription
+  { _sNSSubscriptionEndpoint = Nothing
+  , _sNSSubscriptionProtocol = Nothing
+  , _sNSSubscriptionTopicArn = Nothing
+  }
+
+-- | The endpoint that receives notifications from the Amazon SNS topic. The
+-- endpoint value depends on the protocol that you specify. For more
+-- information, see the Subscribe Endpoint parameter in the Amazon Simple
+-- Notification Service API Reference.
+snssEndpoint :: Lens' SNSSubscription (Maybe (Val Text))
+snssEndpoint = lens _sNSSubscriptionEndpoint (\s a -> s { _sNSSubscriptionEndpoint = a })
+
+-- | The subscription's protocol. For more information, see the Subscribe
+-- Protocol parameter in the Amazon Simple Notification Service API Reference.
+snssProtocol :: Lens' SNSSubscription (Maybe SNSProtocol)
+snssProtocol = lens _sNSSubscriptionProtocol (\s a -> s { _sNSSubscriptionProtocol = a })
+
+-- | The Amazon Resource Name (ARN) of the topic to subscribe to.
+snssTopicArn :: Lens' SNSSubscription (Maybe (Val Text))
+snssTopicArn = lens _sNSSubscriptionTopicArn (\s a -> s { _sNSSubscriptionTopicArn = a })
diff --git a/library-gen/Stratosphere/Resources/SNSTopic.hs b/library-gen/Stratosphere/Resources/SNSTopic.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/SNSTopic.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::SNS::Topic type creates an Amazon Simple Notification Service
+-- (Amazon SNS) topic.
+
+module Stratosphere.Resources.SNSTopic where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.ResourceProperties.SNSTopicSubscription
+
+-- | Full data type definition for SNSTopic. See 'snsTopic' for a more
+-- convenient constructor.
+data SNSTopic =
+  SNSTopic
+  { _sNSTopicDisplayName :: Maybe (Val Text)
+  , _sNSTopicSubscription :: Maybe [SNSTopicSubscription]
+  , _sNSTopicTopicName :: Maybe (Val Text)
+  } deriving (Show, Generic)
+
+instance ToJSON SNSTopic where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 9, omitNothingFields = True }
+
+instance FromJSON SNSTopic where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 9, omitNothingFields = True }
+
+-- | Constructor for 'SNSTopic' containing required fields as arguments.
+snsTopic
+  :: SNSTopic
+snsTopic  =
+  SNSTopic
+  { _sNSTopicDisplayName = Nothing
+  , _sNSTopicSubscription = Nothing
+  , _sNSTopicTopicName = Nothing
+  }
+
+-- | A developer-defined string that can be used to identify this SNS topic.
+snstDisplayName :: Lens' SNSTopic (Maybe (Val Text))
+snstDisplayName = lens _sNSTopicDisplayName (\s a -> s { _sNSTopicDisplayName = a })
+
+-- | The SNS subscriptions (endpoints) for this topic.
+snstSubscription :: Lens' SNSTopic (Maybe [SNSTopicSubscription])
+snstSubscription = lens _sNSTopicSubscription (\s a -> s { _sNSTopicSubscription = a })
+
+-- | A name for the topic. If you don't specify a name, AWS CloudFormation
+-- generates a unique physical ID and uses that ID for the topic name. For
+-- more information, see Name Type. Important If you specify a name, you
+-- cannot do updates that require this resource to be replaced. You can still
+-- do updates that require no or some interruption. If you must replace the
+-- resource, specify a new name.
+snstTopicName :: Lens' SNSTopic (Maybe (Val Text))
+snstTopicName = lens _sNSTopicTopicName (\s a -> s { _sNSTopicTopicName = a })
diff --git a/library-gen/Stratosphere/Resources/SNSTopicPolicy.hs b/library-gen/Stratosphere/Resources/SNSTopicPolicy.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/SNSTopicPolicy.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::SNS::TopicPolicy resource associates Amazon SNS topics with a
+-- policy.
+
+module Stratosphere.Resources.SNSTopicPolicy where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for SNSTopicPolicy. See 'snsTopicPolicy' for a
+-- more convenient constructor.
+data SNSTopicPolicy =
+  SNSTopicPolicy
+  { _sNSTopicPolicyPolicyDocument :: Object
+  , _sNSTopicPolicyTopics :: [String]
+  } deriving (Show, Generic)
+
+instance ToJSON SNSTopicPolicy where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 15, omitNothingFields = True }
+
+instance FromJSON SNSTopicPolicy where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 15, omitNothingFields = True }
+
+-- | Constructor for 'SNSTopicPolicy' containing required fields as arguments.
+snsTopicPolicy
+  :: Object -- ^ 'snstpPolicyDocument'
+  -> [String] -- ^ 'snstpTopics'
+  -> SNSTopicPolicy
+snsTopicPolicy policyDocumentarg topicsarg =
+  SNSTopicPolicy
+  { _sNSTopicPolicyPolicyDocument = policyDocumentarg
+  , _sNSTopicPolicyTopics = topicsarg
+  }
+
+-- | A policy document that contains permissions to add to the specified SNS
+-- topics.
+snstpPolicyDocument :: Lens' SNSTopicPolicy Object
+snstpPolicyDocument = lens _sNSTopicPolicyPolicyDocument (\s a -> s { _sNSTopicPolicyPolicyDocument = a })
+
+-- | The Amazon Resource Names (ARN) of the topics to which you want to add
+-- the policy. You can use the Ref function to specify an AWS::SNS::Topic
+-- resource.
+snstpTopics :: Lens' SNSTopicPolicy [String]
+snstpTopics = lens _sNSTopicPolicyTopics (\s a -> s { _sNSTopicPolicyTopics = a })
diff --git a/library-gen/Stratosphere/Resources/SQSQueue.hs b/library-gen/Stratosphere/Resources/SQSQueue.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/SQSQueue.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::SQS::Queue type creates an Amazon SQS queue.
+
+module Stratosphere.Resources.SQSQueue where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+import Stratosphere.ResourceProperties.SQSRedrivePolicy
+
+-- | Full data type definition for SQSQueue. See 'sqsQueue' for a more
+-- convenient constructor.
+data SQSQueue =
+  SQSQueue
+  { _sQSQueueDelaySeconds :: Maybe (Val Integer')
+  , _sQSQueueMaximumMessageSize :: Maybe (Val Integer')
+  , _sQSQueueMessageRetentionPeriod :: Maybe (Val Integer')
+  , _sQSQueueQueueName :: Maybe (Val Text)
+  , _sQSQueueReceiveMessageWaitTimeSeconds :: Maybe (Val Integer')
+  , _sQSQueueRedrivePolicy :: Maybe SQSRedrivePolicy
+  , _sQSQueueVisibilityTimeout :: Maybe (Val Integer')
+  } deriving (Show, Generic)
+
+instance ToJSON SQSQueue where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 9, omitNothingFields = True }
+
+instance FromJSON SQSQueue where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 9, omitNothingFields = True }
+
+-- | Constructor for 'SQSQueue' containing required fields as arguments.
+sqsQueue
+  :: SQSQueue
+sqsQueue  =
+  SQSQueue
+  { _sQSQueueDelaySeconds = Nothing
+  , _sQSQueueMaximumMessageSize = Nothing
+  , _sQSQueueMessageRetentionPeriod = Nothing
+  , _sQSQueueQueueName = Nothing
+  , _sQSQueueReceiveMessageWaitTimeSeconds = Nothing
+  , _sQSQueueRedrivePolicy = Nothing
+  , _sQSQueueVisibilityTimeout = Nothing
+  }
+
+-- | The time in seconds that the delivery of all messages in the queue will
+-- be delayed. You can specify an integer value of 0 to 900 (15 minutes). The
+-- default value is 0.
+sqsqDelaySeconds :: Lens' SQSQueue (Maybe (Val Integer'))
+sqsqDelaySeconds = lens _sQSQueueDelaySeconds (\s a -> s { _sQSQueueDelaySeconds = a })
+
+-- | The limit of how many bytes a message can contain before Amazon SQS
+-- rejects it. You can specify an integer value from 1024 bytes (1 KiB) to
+-- 262144 bytes (256 KiB). The default value is 262144 (256 KiB).
+sqsqMaximumMessageSize :: Lens' SQSQueue (Maybe (Val Integer'))
+sqsqMaximumMessageSize = lens _sQSQueueMaximumMessageSize (\s a -> s { _sQSQueueMaximumMessageSize = a })
+
+-- | The number of seconds Amazon SQS retains a message. You can specify an
+-- integer value from 60 seconds (1 minute) to 1209600 seconds (14 days). The
+-- default value is 345600 seconds (4 days).
+sqsqMessageRetentionPeriod :: Lens' SQSQueue (Maybe (Val Integer'))
+sqsqMessageRetentionPeriod = lens _sQSQueueMessageRetentionPeriod (\s a -> s { _sQSQueueMessageRetentionPeriod = a })
+
+-- | A name for the queue. If you don't specify a name, AWS CloudFormation
+-- generates a unique physical ID and uses that ID for the queue name. For
+-- more information, see Name Type. Important If you specify a name, you
+-- cannot do updates that require this resource to be replaced. You can still
+-- do updates that require no or some interruption. If you must replace the
+-- resource, specify a new name.
+sqsqQueueName :: Lens' SQSQueue (Maybe (Val Text))
+sqsqQueueName = lens _sQSQueueQueueName (\s a -> s { _sQSQueueQueueName = a })
+
+-- | Specifies the duration, in seconds, that the ReceiveMessage action call
+-- waits until a message is in the queue in order to include it in the
+-- response, as opposed to returning an empty response if a message is not yet
+-- available. You can specify an integer from 1 to 20. The short polling is
+-- used as the default or when you specify 0 for this property. For more
+-- information, see Amazon SQS Long Poll.
+sqsqReceiveMessageWaitTimeSeconds :: Lens' SQSQueue (Maybe (Val Integer'))
+sqsqReceiveMessageWaitTimeSeconds = lens _sQSQueueReceiveMessageWaitTimeSeconds (\s a -> s { _sQSQueueReceiveMessageWaitTimeSeconds = a })
+
+-- | Specifies an existing dead letter queue to receive messages after the
+-- source queue (this queue) fails to process a message a specified number of
+-- times.
+sqsqRedrivePolicy :: Lens' SQSQueue (Maybe SQSRedrivePolicy)
+sqsqRedrivePolicy = lens _sQSQueueRedrivePolicy (\s a -> s { _sQSQueueRedrivePolicy = a })
+
+-- | The length of time during which a message will be unavailable once a
+-- message is delivered from the queue. This blocks other components from
+-- receiving the same message and gives the initial component time to process
+-- and delete the message from the queue. Values must be from 0 to 43200
+-- seconds (12 hours). If no value is specified, the default value of 30
+-- seconds will be used. For more information about SQS Queue visibility
+-- timeouts, see Visibility Timeout in the Amazon Simple Queue Service
+-- Developer Guide.
+sqsqVisibilityTimeout :: Lens' SQSQueue (Maybe (Val Integer'))
+sqsqVisibilityTimeout = lens _sQSQueueVisibilityTimeout (\s a -> s { _sQSQueueVisibilityTimeout = a })
diff --git a/library-gen/Stratosphere/Resources/SQSQueuePolicy.hs b/library-gen/Stratosphere/Resources/SQSQueuePolicy.hs
new file mode 100644
--- /dev/null
+++ b/library-gen/Stratosphere/Resources/SQSQueuePolicy.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The AWS::SQS::QueuePolicy type applies a policy to SQS queues.
+-- AWS::SQS::QueuePolicy Snippet: Declaring an Amazon SQS Policy
+
+module Stratosphere.Resources.SQSQueuePolicy where
+
+import Control.Lens
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text
+import GHC.Generics
+
+import Stratosphere.Values
+
+
+-- | Full data type definition for SQSQueuePolicy. See 'sqsQueuePolicy' for a
+-- more convenient constructor.
+data SQSQueuePolicy =
+  SQSQueuePolicy
+  { _sQSQueuePolicyPolicyDocument :: Object
+  , _sQSQueuePolicyQueues :: [Val Text]
+  } deriving (Show, Generic)
+
+instance ToJSON SQSQueuePolicy where
+  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 15, omitNothingFields = True }
+
+instance FromJSON SQSQueuePolicy where
+  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 15, omitNothingFields = True }
+
+-- | Constructor for 'SQSQueuePolicy' containing required fields as arguments.
+sqsQueuePolicy
+  :: Object -- ^ 'sqsqpPolicyDocument'
+  -> [Val Text] -- ^ 'sqsqpQueues'
+  -> SQSQueuePolicy
+sqsQueuePolicy policyDocumentarg queuesarg =
+  SQSQueuePolicy
+  { _sQSQueuePolicyPolicyDocument = policyDocumentarg
+  , _sQSQueuePolicyQueues = queuesarg
+  }
+
+-- | A policy document containing permissions to add to the specified SQS
+-- queues.
+sqsqpPolicyDocument :: Lens' SQSQueuePolicy Object
+sqsqpPolicyDocument = lens _sQSQueuePolicyPolicyDocument (\s a -> s { _sQSQueuePolicyPolicyDocument = a })
+
+-- | The URLs of the queues to which you want to add the policy. You can use
+-- the Ref function to specify an AWS::SQS::Queue resource.
+sqsqpQueues :: Lens' SQSQueuePolicy [Val Text]
+sqsqpQueues = lens _sQSQueuePolicyQueues (\s a -> s { _sQSQueuePolicyQueues = a })
diff --git a/library/Stratosphere.hs b/library/Stratosphere.hs
--- a/library/Stratosphere.hs
+++ b/library/Stratosphere.hs
@@ -22,6 +22,7 @@
        , module Stratosphere.Template
        , module Stratosphere.Values
        , module Stratosphere.Types
+       , module Stratosphere.Check
        , module Control.Lens
        ) where
 
@@ -32,6 +33,7 @@
 import Stratosphere.Template
 import Stratosphere.Values
 import Stratosphere.Types
+import Stratosphere.Check
 
 {-# ANN module "HLint: ignore Use import/export shortcut" #-}
 
diff --git a/library/Stratosphere/Check.hs b/library/Stratosphere/Check.hs
new file mode 100644
--- /dev/null
+++ b/library/Stratosphere/Check.hs
@@ -0,0 +1,34 @@
+-- | `Stratosphere.Check` exports functions to catch errors
+-- that would be too expensive or unwieldy to encode in types.
+--
+-- Stability: Experimental
+
+module Stratosphere.Check
+     ( duplicateProperties
+     ) where
+
+import Data.Hashable (Hashable)
+import qualified Data.HashMap.Strict as HM
+import qualified Data.Text as T
+
+import Stratosphere.Resources (resourceResName, unResources)
+import Stratosphere.Template (Template, templateResources)
+
+data DuplicateProperty = DuplicateProperty T.Text deriving Show
+
+duplicateProperties :: Template -> [DuplicateProperty]
+duplicateProperties =
+    map DuplicateProperty
+  . duplicates
+  . map resourceResName
+  . unResources
+  . templateResources
+
+duplicates :: (Foldable f, Eq a, Hashable a) => f a -> [a]
+duplicates =
+  HM.keys . HM.filter (> one) . foldr (insertByAdding one) HM.empty
+  where one :: Int
+        one = 1
+
+insertByAdding :: (Eq k, Hashable k, Num v) => v -> k -> HM.HashMap k v -> HM.HashMap k v
+insertByAdding = flip $ HM.insertWith (+)
diff --git a/library/Stratosphere/Types.hs b/library/Stratosphere/Types.hs
--- a/library/Stratosphere/Types.hs
+++ b/library/Stratosphere/Types.hs
@@ -5,7 +5,20 @@
 -- | Module for hand-written types that are used in generated modules.
 
 module Stratosphere.Types
-  ( CannedACL (..)
+  ( EnabledState (..)
+  , AuthorizationType (..)
+  , HttpMethod (..)
+  , LoggingLevel (..)
+  , ApiBackendType (..)
+  , Period (..)
+  , AttributeType (..)
+  , KeyType (..)
+  , ProjectionType (..)
+  , StreamViewType (..)
+  , SNSProtocol (..)
+  , Runtime (..)
+  , PassthroughBehavior (..)
+  , CannedACL (..)
   , KinesisFirehoseS3CompressionFormat(..)
   , KinesisFirehoseElasticsearchS3BackupMode(..)
   , KinesisFirehoseNoEncryptionConfig(..)
@@ -15,6 +28,153 @@
 import Data.Text (unpack)
 import GHC.Generics
 
+
+data EnabledState
+  = ENABLED
+  | DISABLED
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data AuthorizationType
+  = NONE
+  | AWS_IAM
+  | CUSTOM
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data HttpMethod
+  = GET
+  | POST
+  | PUT
+  | HEAD
+  | DELETE
+  | OPTIONS
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data LoggingLevel
+  = OFF
+  | ERROR
+  | INFO
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data ApiBackendType
+  = HTTP
+  | AWS
+  | MOCK
+  | HTTP_PROXY
+  | AWS_PROXY
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data Period
+  = DAY
+  | WEEK
+  | MONTH
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data AttributeType
+  = S
+  | N
+  | B
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data KeyType
+  = HASH
+  | RANGE
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+
+data ProjectionType
+  = ProjectKeysOnly
+  | ProjectIncluded
+  | ProjectAll
+  deriving (Show, Read, Eq, Generic)
+
+instance FromJSON ProjectionType where
+  parseJSON = withText "ProjectionType" parse
+    where
+      parse "KEYS_ONLY"     = pure ProjectKeysOnly
+      parse "INCLUDE"       = pure ProjectIncluded
+      parse "ALL"           = pure ProjectAll
+      parse projectionType  = fail ("Unexpected projection type " ++ unpack projectionType)
+
+instance ToJSON ProjectionType where
+  toJSON ProjectKeysOnly = String "KEYS_ONLY"
+  toJSON ProjectIncluded = String "INCLUDE"
+  toJSON ProjectAll      = String "ALL"
+
+
+data StreamViewType
+  = KEYS_ONLY
+  | NEW_IMAGE
+  | OLD_IMAGE
+  | NEW_AND_OLD_IMAGES
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
+data SNSProtocol
+  = SnsHttp
+  | SnsHttps
+  | SnsEmail
+  | SnsEmailJson
+  | SnsSms
+  | SnsSqs
+  | SnsApplication
+  | SnsLambda
+  deriving (Show, Read, Eq, Generic)
+
+
+instance FromJSON SNSProtocol where
+  parseJSON = withText "SNSProtocol" parse
+    where
+      parse "http"        = pure SnsHttp
+      parse "https"       = pure SnsHttps
+      parse "email"       = pure SnsEmail
+      parse "email-json"  = pure SnsEmailJson
+      parse "sms"         = pure SnsSms
+      parse "sqs"         = pure SnsSqs
+      parse "application" = pure SnsApplication
+      parse "lambda"      = pure SnsLambda
+      parse protocol = fail ("Unexpected SNS protocol " ++ unpack protocol)
+
+instance ToJSON SNSProtocol where
+  toJSON SnsHttp        = String "http"
+  toJSON SnsHttps       = String "https"
+  toJSON SnsEmail       = String "email"
+  toJSON SnsEmailJson   = String "email-json"
+  toJSON SnsSms         = String "sms"
+  toJSON SnsSqs         = String "sqs"
+  toJSON SnsApplication = String "application"
+  toJSON SnsLambda      = String "lambda"
+
+
+data Runtime
+  = NodeJS
+  | NodeJS43
+  | Java8
+  | Python27
+  deriving (Show, Read, Eq, Generic)
+
+instance FromJSON Runtime where
+  parseJSON = withText "Runtime" parse
+    where
+      parse "nodejs"    = pure NodeJS
+      parse "nodejs4.3" = pure NodeJS43
+      parse "java8"     = pure Java8
+      parse "python2.7" = pure Python27
+      parse runtime     = fail ("Unexpected Runtime " ++ unpack runtime)
+
+instance ToJSON Runtime where
+  toJSON NodeJS   = String "nodejs"
+  toJSON NodeJS43 = String "nodejs4.3"
+  toJSON Java8    = String "java8"
+  toJSON Python27 = String "python2.7"
+
+
+-- | See:
+-- https://docs.aws.amazon.com/apigateway/api-reference/link-relation/integration-put/#passthroughBehavior
+data PassthroughBehavior
+  = WHEN_NO_MATCH
+  | WHEN_NO_TEMPLATES
+  | NEVER
+  deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
+
 -- | Amazon S3 supports a set of predefined grants, known as canned ACLs. Each
 -- canned ACL has a predefined a set of grantees and permissions. The following
 -- table lists the set of canned ACLs and the associated predefined grants.
@@ -30,7 +190,6 @@
   | PublicRead
   | PublicReadWrite
   deriving (Show, Read, Eq, Generic, FromJSON, ToJSON)
-
 
 -- | See:
 -- http://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html
diff --git a/stratosphere.cabal b/stratosphere.cabal
--- a/stratosphere.cabal
+++ b/stratosphere.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           stratosphere
-version:        0.2.0
+version:        0.2.1
 synopsis:       EDSL for AWS CloudFormation
 description:    EDSL for AWS CloudFormation
 category:       AWS, Cloud
@@ -40,12 +40,14 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
     , unordered-containers >= 0.2
   exposed-modules:
       Stratosphere
+      Stratosphere.Check
       Stratosphere.Helpers
       Stratosphere.Outputs
       Stratosphere.Parameters
@@ -78,6 +80,13 @@
       Stratosphere.ResourceProperties.AutoScalingTags
       Stratosphere.ResourceProperties.ConnectionDrainingPolicy
       Stratosphere.ResourceProperties.ConnectionSettings
+      Stratosphere.ResourceProperties.DynamoDBAttributeDefinition
+      Stratosphere.ResourceProperties.DynamoDBGlobalSecondaryIndex
+      Stratosphere.ResourceProperties.DynamoDBKeySchema
+      Stratosphere.ResourceProperties.DynamoDBLocalSecondaryIndex
+      Stratosphere.ResourceProperties.DynamoDBProjectionObject
+      Stratosphere.ResourceProperties.DynamoDBProvisionedThroughput
+      Stratosphere.ResourceProperties.DynamoDBStreamSpecification
       Stratosphere.ResourceProperties.EBSBlockDevice
       Stratosphere.ResourceProperties.EC2BlockDeviceMapping
       Stratosphere.ResourceProperties.EC2MountPoint
@@ -130,6 +139,8 @@
       Stratosphere.ResourceProperties.S3WebsiteRoutingRules
       Stratosphere.ResourceProperties.SecurityGroupEgressRule
       Stratosphere.ResourceProperties.SecurityGroupIngressRule
+      Stratosphere.ResourceProperties.SNSTopicSubscription
+      Stratosphere.ResourceProperties.SQSRedrivePolicy
       Stratosphere.ResourceProperties.StepAdjustments
       Stratosphere.ResourceProperties.UserLoginProfile
       Stratosphere.Resources
@@ -152,16 +163,20 @@
       Stratosphere.Resources.DBSecurityGroupIngress
       Stratosphere.Resources.DBSubnetGroup
       Stratosphere.Resources.DeliveryStream
+      Stratosphere.Resources.DynamoDBTable
       Stratosphere.Resources.EC2Instance
       Stratosphere.Resources.EIP
       Stratosphere.Resources.EIPAssociation
+      Stratosphere.Resources.EventsRule
       Stratosphere.Resources.Group
       Stratosphere.Resources.IAMRole
       Stratosphere.Resources.InstanceProfile
       Stratosphere.Resources.InternetGateway
       Stratosphere.Resources.KinesisStream
+      Stratosphere.Resources.LambdaAlias
       Stratosphere.Resources.LambdaFunction
       Stratosphere.Resources.LambdaPermission
+      Stratosphere.Resources.LambdaVersion
       Stratosphere.Resources.LaunchConfiguration
       Stratosphere.Resources.LifecycleHook
       Stratosphere.Resources.LoadBalancer
@@ -180,6 +195,11 @@
       Stratosphere.Resources.SecurityGroup
       Stratosphere.Resources.SecurityGroupEgress
       Stratosphere.Resources.SecurityGroupIngress
+      Stratosphere.Resources.SNSSubscription
+      Stratosphere.Resources.SNSTopic
+      Stratosphere.Resources.SNSTopicPolicy
+      Stratosphere.Resources.SQSQueue
+      Stratosphere.Resources.SQSQueuePolicy
       Stratosphere.Resources.Stack
       Stratosphere.Resources.Subnet
       Stratosphere.Resources.SubnetRouteTableAssociation
@@ -193,8 +213,8 @@
       Stratosphere.Resources.VPCGatewayAttachment
   default-language: Haskell2010
 
-executable api-gateway-lambda
-  main-is: api-gateway-lambda.hs
+executable apigw-lambda-dynamodb
+  main-is: apigw-lambda-dynamodb.hs
   hs-source-dirs:
       examples
   ghc-options: -Wall
@@ -203,6 +223,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -212,6 +233,26 @@
     buildable: False
   default-language: Haskell2010
 
+executable apigw-lambda-s3
+  main-is: apigw-lambda-s3.hs
+  hs-source-dirs:
+      examples
+  ghc-options: -Wall
+  build-depends:
+      base >= 4.8 && < 5
+    , aeson >= 0.11
+    , aeson-pretty >= 0.8
+    , bytestring
+    , hashable
+    , lens >= 4.5
+    , template-haskell >= 2.0
+    , text >= 1.1
+    , unordered-containers >= 0.2
+    , stratosphere
+  if flag(library-only)
+    buildable: False
+  default-language: Haskell2010
+
 executable auto-scaling-group
   main-is: auto-scaling-group.hs
   hs-source-dirs:
@@ -222,6 +263,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -241,6 +283,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -260,6 +303,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -279,6 +323,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -298,6 +343,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -317,6 +363,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
@@ -338,6 +385,7 @@
     , aeson >= 0.11
     , aeson-pretty >= 0.8
     , bytestring
+    , hashable
     , lens >= 4.5
     , template-haskell >= 2.0
     , text >= 1.1
