diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.4.5`
+`1.5.0`
 
 
 ## Description
diff --git a/amazonka-elasticsearch.cabal b/amazonka-elasticsearch.cabal
--- a/amazonka-elasticsearch.cabal
+++ b/amazonka-elasticsearch.cabal
@@ -1,13 +1,13 @@
 name:                  amazonka-elasticsearch
-version:               1.4.5
+version:               1.5.0
 synopsis:              Amazon Elasticsearch Service SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
-license:               OtherLicense
+license:               MPL-2.0
 license-file:          LICENSE
 author:                Brendan Hay
-maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
-copyright:             Copyright (c) 2013-2016 Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+copyright:             Copyright (c) 2013-2017 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
@@ -29,24 +29,33 @@
     to get started.
 
 source-repository head
-    type:     git
-    location: git://github.com/brendanhay/amazonka.git
+    type:              git
+    location:          git://github.com/brendanhay/amazonka.git
+    subdir:            amazonka-elasticsearch
 
 library
     default-language:  Haskell2010
     hs-source-dirs:    src gen
 
-    ghc-options:       -Wall
+    ghc-options:
+        -Wall
+        -fwarn-incomplete-uni-patterns
+        -fwarn-incomplete-record-updates
+        -funbox-strict-fields
 
     exposed-modules:
           Network.AWS.ElasticSearch
         , Network.AWS.ElasticSearch.AddTags
         , Network.AWS.ElasticSearch.CreateElasticsearchDomain
         , Network.AWS.ElasticSearch.DeleteElasticsearchDomain
+        , Network.AWS.ElasticSearch.DeleteElasticsearchServiceRole
         , Network.AWS.ElasticSearch.DescribeElasticsearchDomain
         , Network.AWS.ElasticSearch.DescribeElasticsearchDomainConfig
         , Network.AWS.ElasticSearch.DescribeElasticsearchDomains
+        , Network.AWS.ElasticSearch.DescribeElasticsearchInstanceTypeLimits
         , Network.AWS.ElasticSearch.ListDomainNames
+        , Network.AWS.ElasticSearch.ListElasticsearchInstanceTypes
+        , Network.AWS.ElasticSearch.ListElasticsearchVersions
         , Network.AWS.ElasticSearch.ListTags
         , Network.AWS.ElasticSearch.RemoveTags
         , Network.AWS.ElasticSearch.Types
@@ -58,7 +67,7 @@
         , Network.AWS.ElasticSearch.Types.Sum
 
     build-depends:
-          amazonka-core == 1.4.5.*
+          amazonka-core == 1.5.0.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-elasticsearch-test
@@ -78,9 +87,9 @@
         , Test.AWS.ElasticSearch.Internal
 
     build-depends:
-          amazonka-core == 1.4.5.*
-        , amazonka-test == 1.4.5.*
-        , amazonka-elasticsearch == 1.4.5.*
+          amazonka-core == 1.5.0.*
+        , amazonka-test == 1.5.0.*
+        , amazonka-elasticsearch
         , base
         , bytestring
         , tasty
diff --git a/fixture/DeleteElasticsearchServiceRole.yaml b/fixture/DeleteElasticsearchServiceRole.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteElasticsearchServiceRole.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteElasticsearchServiceRoleResponse.proto b/fixture/DeleteElasticsearchServiceRoleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteElasticsearchServiceRoleResponse.proto
diff --git a/fixture/DescribeElasticsearchInstanceTypeLimits.yaml b/fixture/DescribeElasticsearchInstanceTypeLimits.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeElasticsearchInstanceTypeLimits.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeElasticsearchInstanceTypeLimitsResponse.proto b/fixture/DescribeElasticsearchInstanceTypeLimitsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeElasticsearchInstanceTypeLimitsResponse.proto
diff --git a/fixture/ListElasticsearchInstanceTypes.yaml b/fixture/ListElasticsearchInstanceTypes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListElasticsearchInstanceTypes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListElasticsearchInstanceTypesResponse.proto b/fixture/ListElasticsearchInstanceTypesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListElasticsearchInstanceTypesResponse.proto
diff --git a/fixture/ListElasticsearchVersions.yaml b/fixture/ListElasticsearchVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListElasticsearchVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/es/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  es.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListElasticsearchVersionsResponse.proto b/fixture/ListElasticsearchVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListElasticsearchVersionsResponse.proto
diff --git a/gen/Network/AWS/ElasticSearch.hs b/gen/Network/AWS/ElasticSearch.hs
--- a/gen/Network/AWS/ElasticSearch.hs
+++ b/gen/Network/AWS/ElasticSearch.hs
@@ -5,9 +5,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -64,12 +64,21 @@
     -- ** DescribeElasticsearchDomains
     , module Network.AWS.ElasticSearch.DescribeElasticsearchDomains
 
+    -- ** ListElasticsearchInstanceTypes
+    , module Network.AWS.ElasticSearch.ListElasticsearchInstanceTypes
+
+    -- ** DeleteElasticsearchServiceRole
+    , module Network.AWS.ElasticSearch.DeleteElasticsearchServiceRole
+
     -- ** DescribeElasticsearchDomain
     , module Network.AWS.ElasticSearch.DescribeElasticsearchDomain
 
     -- ** ListDomainNames
     , module Network.AWS.ElasticSearch.ListDomainNames
 
+    -- ** DescribeElasticsearchInstanceTypeLimits
+    , module Network.AWS.ElasticSearch.DescribeElasticsearchInstanceTypeLimits
+
     -- ** DescribeElasticsearchDomainConfig
     , module Network.AWS.ElasticSearch.DescribeElasticsearchDomainConfig
 
@@ -79,6 +88,9 @@
     -- ** UpdateElasticsearchDomainConfig
     , module Network.AWS.ElasticSearch.UpdateElasticsearchDomainConfig
 
+    -- ** ListElasticsearchVersions
+    , module Network.AWS.ElasticSearch.ListElasticsearchVersions
+
     -- ** AddTags
     , module Network.AWS.ElasticSearch.AddTags
 
@@ -90,6 +102,9 @@
     -- ** ESPartitionInstanceType
     , ESPartitionInstanceType (..)
 
+    -- ** LogType
+    , LogType (..)
+
     -- ** OptionState
     , OptionState (..)
 
@@ -102,6 +117,12 @@
     , apsOptions
     , apsStatus
 
+    -- ** AdditionalLimit
+    , AdditionalLimit
+    , additionalLimit
+    , alLimitName
+    , alLimitValues
+
     -- ** AdvancedOptionsStatus
     , AdvancedOptionsStatus
     , advancedOptionsStatus
@@ -148,8 +169,10 @@
     , elasticsearchDomainConfig
     , edcEBSOptions
     , edcAccessPolicies
+    , edcLogPublishingOptions
     , edcElasticsearchClusterConfig
     , edcSnapshotOptions
+    , edcVPCOptions
     , edcAdvancedOptions
     , edcElasticsearchVersion
 
@@ -158,9 +181,12 @@
     , elasticsearchDomainStatus
     , edsEBSOptions
     , edsAccessPolicies
+    , edsLogPublishingOptions
     , edsCreated
     , edsSnapshotOptions
     , edsDeleted
+    , edsVPCOptions
+    , edsEndpoints
     , edsProcessing
     , edsEndpoint
     , edsAdvancedOptions
@@ -176,6 +202,36 @@
     , evsOptions
     , evsStatus
 
+    -- ** InstanceCountLimits
+    , InstanceCountLimits
+    , instanceCountLimits
+    , iclMaximumInstanceCount
+    , iclMinimumInstanceCount
+
+    -- ** InstanceLimits
+    , InstanceLimits
+    , instanceLimits
+    , ilInstanceCountLimits
+
+    -- ** Limits
+    , Limits
+    , limits
+    , lInstanceLimits
+    , lAdditionalLimits
+    , lStorageTypes
+
+    -- ** LogPublishingOption
+    , LogPublishingOption
+    , logPublishingOption
+    , lpoEnabled
+    , lpoCloudWatchLogsLogGroupARN
+
+    -- ** LogPublishingOptionsStatus
+    , LogPublishingOptionsStatus
+    , logPublishingOptionsStatus
+    , lposStatus
+    , lposOptions
+
     -- ** OptionStatus
     , OptionStatus
     , optionStatus
@@ -196,25 +252,62 @@
     , sosOptions
     , sosStatus
 
+    -- ** StorageType
+    , StorageType
+    , storageType
+    , stStorageTypeLimits
+    , stStorageSubTypeName
+    , stStorageTypeName
+
+    -- ** StorageTypeLimit
+    , StorageTypeLimit
+    , storageTypeLimit
+    , stlLimitName
+    , stlLimitValues
+
     -- ** Tag
     , Tag
     , tag
     , tagKey
     , tagValue
+
+    -- ** VPCDerivedInfo
+    , VPCDerivedInfo
+    , vpcDerivedInfo
+    , vdiSecurityGroupIds
+    , vdiSubnetIds
+    , vdiVPCId
+    , vdiAvailabilityZones
+
+    -- ** VPCDerivedInfoStatus
+    , VPCDerivedInfoStatus
+    , vpcDerivedInfoStatus
+    , vdisOptions
+    , vdisStatus
+
+    -- ** VPCOptions
+    , VPCOptions
+    , vpcOptions
+    , voSecurityGroupIds
+    , voSubnetIds
     ) where
 
-import           Network.AWS.ElasticSearch.AddTags
-import           Network.AWS.ElasticSearch.CreateElasticsearchDomain
-import           Network.AWS.ElasticSearch.DeleteElasticsearchDomain
-import           Network.AWS.ElasticSearch.DescribeElasticsearchDomain
-import           Network.AWS.ElasticSearch.DescribeElasticsearchDomainConfig
-import           Network.AWS.ElasticSearch.DescribeElasticsearchDomains
-import           Network.AWS.ElasticSearch.ListDomainNames
-import           Network.AWS.ElasticSearch.ListTags
-import           Network.AWS.ElasticSearch.RemoveTags
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.UpdateElasticsearchDomainConfig
-import           Network.AWS.ElasticSearch.Waiters
+import Network.AWS.ElasticSearch.AddTags
+import Network.AWS.ElasticSearch.CreateElasticsearchDomain
+import Network.AWS.ElasticSearch.DeleteElasticsearchDomain
+import Network.AWS.ElasticSearch.DeleteElasticsearchServiceRole
+import Network.AWS.ElasticSearch.DescribeElasticsearchDomain
+import Network.AWS.ElasticSearch.DescribeElasticsearchDomainConfig
+import Network.AWS.ElasticSearch.DescribeElasticsearchDomains
+import Network.AWS.ElasticSearch.DescribeElasticsearchInstanceTypeLimits
+import Network.AWS.ElasticSearch.ListDomainNames
+import Network.AWS.ElasticSearch.ListElasticsearchInstanceTypes
+import Network.AWS.ElasticSearch.ListElasticsearchVersions
+import Network.AWS.ElasticSearch.ListTags
+import Network.AWS.ElasticSearch.RemoveTags
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.UpdateElasticsearchDomainConfig
+import Network.AWS.ElasticSearch.Waiters
 
 {- $errors
 Error matchers are designed for use with the functions provided by
diff --git a/gen/Network/AWS/ElasticSearch/AddTags.hs b/gen/Network/AWS/ElasticSearch/AddTags.hs
--- a/gen/Network/AWS/ElasticSearch/AddTags.hs
+++ b/gen/Network/AWS/ElasticSearch/AddTags.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.AddTags
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -35,12 +35,12 @@
     , AddTagsResponse
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'AddTags' @ operation. Specify the tags that you want to attach to the Elasticsearch domain.
 --
@@ -48,10 +48,11 @@
 --
 -- /See:/ 'addTags' smart constructor.
 data AddTags = AddTags'
-    { _atARN     :: !Text
-    , _atTagList :: ![Tag]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _atARN     :: !Text
+  , _atTagList :: ![Tag]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'AddTags' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -62,12 +63,9 @@
 addTags
     :: Text -- ^ 'atARN'
     -> AddTags
-addTags pARN_ =
-    AddTags'
-    { _atARN = pARN_
-    , _atTagList = mempty
-    }
+addTags pARN_ = AddTags' {_atARN = pARN_, _atTagList = mempty}
 
+
 -- | Specify the @ARN@ for which you want to add the tags.
 atARN :: Lens' AddTags Text
 atARN = lens _atARN (\ s a -> s{_atARN = a});
@@ -81,9 +79,9 @@
         request = postJSON elasticSearch
         response = receiveNull AddTagsResponse'
 
-instance Hashable AddTags
+instance Hashable AddTags where
 
-instance NFData AddTags
+instance NFData AddTags where
 
 instance ToHeaders AddTags where
         toHeaders = const mempty
@@ -103,13 +101,15 @@
 
 -- | /See:/ 'addTagsResponse' smart constructor.
 data AddTagsResponse =
-    AddTagsResponse'
-    deriving (Eq,Read,Show,Data,Typeable,Generic)
+  AddTagsResponse'
+  deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'AddTagsResponse' with the minimum fields required to make a request.
 --
 addTagsResponse
     :: AddTagsResponse
 addTagsResponse = AddTagsResponse'
 
-instance NFData AddTagsResponse
+
+instance NFData AddTagsResponse where
diff --git a/gen/Network/AWS/ElasticSearch/CreateElasticsearchDomain.hs b/gen/Network/AWS/ElasticSearch/CreateElasticsearchDomain.hs
--- a/gen/Network/AWS/ElasticSearch/CreateElasticsearchDomain.hs
+++ b/gen/Network/AWS/ElasticSearch/CreateElasticsearchDomain.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.CreateElasticsearchDomain
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -29,8 +29,10 @@
     -- * Request Lenses
     , cedEBSOptions
     , cedAccessPolicies
+    , cedLogPublishingOptions
     , cedElasticsearchClusterConfig
     , cedSnapshotOptions
+    , cedVPCOptions
     , cedAdvancedOptions
     , cedElasticsearchVersion
     , cedDomainName
@@ -43,24 +45,27 @@
     , cedrsResponseStatus
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | /See:/ 'createElasticsearchDomain' smart constructor.
 data CreateElasticsearchDomain = CreateElasticsearchDomain'
-    { _cedEBSOptions                 :: !(Maybe EBSOptions)
-    , _cedAccessPolicies             :: !(Maybe Text)
-    , _cedElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfig)
-    , _cedSnapshotOptions            :: !(Maybe SnapshotOptions)
-    , _cedAdvancedOptions            :: !(Maybe (Map Text Text))
-    , _cedElasticsearchVersion       :: !(Maybe Text)
-    , _cedDomainName                 :: !Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _cedEBSOptions                 :: !(Maybe EBSOptions)
+  , _cedAccessPolicies             :: !(Maybe Text)
+  , _cedLogPublishingOptions       :: !(Maybe (Map LogType LogPublishingOption))
+  , _cedElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfig)
+  , _cedSnapshotOptions            :: !(Maybe SnapshotOptions)
+  , _cedVPCOptions                 :: !(Maybe VPCOptions)
+  , _cedAdvancedOptions            :: !(Maybe (Map Text Text))
+  , _cedElasticsearchVersion       :: !(Maybe Text)
+  , _cedDomainName                 :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'CreateElasticsearchDomain' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -69,10 +74,14 @@
 --
 -- * 'cedAccessPolicies' - IAM access policy as a JSON-formatted string.
 --
+-- * 'cedLogPublishingOptions' - Map of @LogType@ and @LogPublishingOption@ , each containing options to publish a given type of Elasticsearch log.
+--
 -- * 'cedElasticsearchClusterConfig' - Configuration options for an Elasticsearch domain. Specifies the instance type and number of instances in the domain cluster.
 --
 -- * 'cedSnapshotOptions' - Option to set time, in UTC format, of the daily automated snapshot. Default value is 0 hours.
 --
+-- * 'cedVPCOptions' - Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html#es-creating-vpc Creating a VPC> in /VPC Endpoints for Amazon Elasticsearch Service Domains/
+--
 -- * 'cedAdvancedOptions' - Option to allow references to indices in an HTTP request body. Must be @false@ when configuring access to individual sub-resources. By default, the value is @true@ . See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuration Advanced Options> for more information.
 --
 -- * 'cedElasticsearchVersion' - String of format X.Y to specify version for the Elasticsearch domain eg. "1.5" or "2.3". For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomains Creating Elasticsearch Domains> in the /Amazon Elasticsearch Service Developer Guide/ .
@@ -82,16 +91,19 @@
     :: Text -- ^ 'cedDomainName'
     -> CreateElasticsearchDomain
 createElasticsearchDomain pDomainName_ =
-    CreateElasticsearchDomain'
-    { _cedEBSOptions = Nothing
-    , _cedAccessPolicies = Nothing
-    , _cedElasticsearchClusterConfig = Nothing
-    , _cedSnapshotOptions = Nothing
-    , _cedAdvancedOptions = Nothing
-    , _cedElasticsearchVersion = Nothing
-    , _cedDomainName = pDomainName_
-    }
+  CreateElasticsearchDomain'
+  { _cedEBSOptions = Nothing
+  , _cedAccessPolicies = Nothing
+  , _cedLogPublishingOptions = Nothing
+  , _cedElasticsearchClusterConfig = Nothing
+  , _cedSnapshotOptions = Nothing
+  , _cedVPCOptions = Nothing
+  , _cedAdvancedOptions = Nothing
+  , _cedElasticsearchVersion = Nothing
+  , _cedDomainName = pDomainName_
+  }
 
+
 -- | Options to enable, disable and specify the type and size of EBS storage volumes.
 cedEBSOptions :: Lens' CreateElasticsearchDomain (Maybe EBSOptions)
 cedEBSOptions = lens _cedEBSOptions (\ s a -> s{_cedEBSOptions = a});
@@ -100,6 +112,10 @@
 cedAccessPolicies :: Lens' CreateElasticsearchDomain (Maybe Text)
 cedAccessPolicies = lens _cedAccessPolicies (\ s a -> s{_cedAccessPolicies = a});
 
+-- | Map of @LogType@ and @LogPublishingOption@ , each containing options to publish a given type of Elasticsearch log.
+cedLogPublishingOptions :: Lens' CreateElasticsearchDomain (HashMap LogType LogPublishingOption)
+cedLogPublishingOptions = lens _cedLogPublishingOptions (\ s a -> s{_cedLogPublishingOptions = a}) . _Default . _Map;
+
 -- | Configuration options for an Elasticsearch domain. Specifies the instance type and number of instances in the domain cluster.
 cedElasticsearchClusterConfig :: Lens' CreateElasticsearchDomain (Maybe ElasticsearchClusterConfig)
 cedElasticsearchClusterConfig = lens _cedElasticsearchClusterConfig (\ s a -> s{_cedElasticsearchClusterConfig = a});
@@ -108,6 +124,10 @@
 cedSnapshotOptions :: Lens' CreateElasticsearchDomain (Maybe SnapshotOptions)
 cedSnapshotOptions = lens _cedSnapshotOptions (\ s a -> s{_cedSnapshotOptions = a});
 
+-- | Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html#es-creating-vpc Creating a VPC> in /VPC Endpoints for Amazon Elasticsearch Service Domains/
+cedVPCOptions :: Lens' CreateElasticsearchDomain (Maybe VPCOptions)
+cedVPCOptions = lens _cedVPCOptions (\ s a -> s{_cedVPCOptions = a});
+
 -- | Option to allow references to indices in an HTTP request body. Must be @false@ when configuring access to individual sub-resources. By default, the value is @true@ . See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuration Advanced Options> for more information.
 cedAdvancedOptions :: Lens' CreateElasticsearchDomain (HashMap Text Text)
 cedAdvancedOptions = lens _cedAdvancedOptions (\ s a -> s{_cedAdvancedOptions = a}) . _Default . _Map;
@@ -130,9 +150,9 @@
                  CreateElasticsearchDomainResponse' <$>
                    (x .?> "DomainStatus") <*> (pure (fromEnum s)))
 
-instance Hashable CreateElasticsearchDomain
+instance Hashable CreateElasticsearchDomain where
 
-instance NFData CreateElasticsearchDomain
+instance NFData CreateElasticsearchDomain where
 
 instance ToHeaders CreateElasticsearchDomain where
         toHeaders = const mempty
@@ -143,9 +163,12 @@
               (catMaybes
                  [("EBSOptions" .=) <$> _cedEBSOptions,
                   ("AccessPolicies" .=) <$> _cedAccessPolicies,
+                  ("LogPublishingOptions" .=) <$>
+                    _cedLogPublishingOptions,
                   ("ElasticsearchClusterConfig" .=) <$>
                     _cedElasticsearchClusterConfig,
                   ("SnapshotOptions" .=) <$> _cedSnapshotOptions,
+                  ("VPCOptions" .=) <$> _cedVPCOptions,
                   ("AdvancedOptions" .=) <$> _cedAdvancedOptions,
                   ("ElasticsearchVersion" .=) <$>
                     _cedElasticsearchVersion,
@@ -163,10 +186,11 @@
 --
 -- /See:/ 'createElasticsearchDomainResponse' smart constructor.
 data CreateElasticsearchDomainResponse = CreateElasticsearchDomainResponse'
-    { _cedrsDomainStatus   :: !(Maybe ElasticsearchDomainStatus)
-    , _cedrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _cedrsDomainStatus   :: !(Maybe ElasticsearchDomainStatus)
+  , _cedrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'CreateElasticsearchDomainResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -178,11 +202,10 @@
     :: Int -- ^ 'cedrsResponseStatus'
     -> CreateElasticsearchDomainResponse
 createElasticsearchDomainResponse pResponseStatus_ =
-    CreateElasticsearchDomainResponse'
-    { _cedrsDomainStatus = Nothing
-    , _cedrsResponseStatus = pResponseStatus_
-    }
+  CreateElasticsearchDomainResponse'
+  {_cedrsDomainStatus = Nothing, _cedrsResponseStatus = pResponseStatus_}
 
+
 -- | The status of the newly created Elasticsearch domain.
 cedrsDomainStatus :: Lens' CreateElasticsearchDomainResponse (Maybe ElasticsearchDomainStatus)
 cedrsDomainStatus = lens _cedrsDomainStatus (\ s a -> s{_cedrsDomainStatus = a});
@@ -192,3 +215,4 @@
 cedrsResponseStatus = lens _cedrsResponseStatus (\ s a -> s{_cedrsResponseStatus = a});
 
 instance NFData CreateElasticsearchDomainResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DeleteElasticsearchDomain.hs b/gen/Network/AWS/ElasticSearch/DeleteElasticsearchDomain.hs
--- a/gen/Network/AWS/ElasticSearch/DeleteElasticsearchDomain.hs
+++ b/gen/Network/AWS/ElasticSearch/DeleteElasticsearchDomain.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.DeleteElasticsearchDomain
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,12 +37,12 @@
     , delrsResponseStatus
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'DeleteElasticsearchDomain' @ operation. Specifies the name of the Elasticsearch domain that you want to delete.
 --
@@ -50,9 +50,10 @@
 --
 -- /See:/ 'deleteElasticsearchDomain' smart constructor.
 newtype DeleteElasticsearchDomain = DeleteElasticsearchDomain'
-    { _dDomainName :: Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dDomainName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DeleteElasticsearchDomain' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -62,10 +63,9 @@
     :: Text -- ^ 'dDomainName'
     -> DeleteElasticsearchDomain
 deleteElasticsearchDomain pDomainName_ =
-    DeleteElasticsearchDomain'
-    { _dDomainName = pDomainName_
-    }
+  DeleteElasticsearchDomain' {_dDomainName = pDomainName_}
 
+
 -- | The name of the Elasticsearch domain that you want to permanently delete.
 dDomainName :: Lens' DeleteElasticsearchDomain Text
 dDomainName = lens _dDomainName (\ s a -> s{_dDomainName = a});
@@ -80,9 +80,9 @@
                  DeleteElasticsearchDomainResponse' <$>
                    (x .?> "DomainStatus") <*> (pure (fromEnum s)))
 
-instance Hashable DeleteElasticsearchDomain
+instance Hashable DeleteElasticsearchDomain where
 
-instance NFData DeleteElasticsearchDomain
+instance NFData DeleteElasticsearchDomain where
 
 instance ToHeaders DeleteElasticsearchDomain where
         toHeaders = const mempty
@@ -101,10 +101,11 @@
 --
 -- /See:/ 'deleteElasticsearchDomainResponse' smart constructor.
 data DeleteElasticsearchDomainResponse = DeleteElasticsearchDomainResponse'
-    { _delrsDomainStatus   :: !(Maybe ElasticsearchDomainStatus)
-    , _delrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _delrsDomainStatus   :: !(Maybe ElasticsearchDomainStatus)
+  , _delrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DeleteElasticsearchDomainResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -116,11 +117,10 @@
     :: Int -- ^ 'delrsResponseStatus'
     -> DeleteElasticsearchDomainResponse
 deleteElasticsearchDomainResponse pResponseStatus_ =
-    DeleteElasticsearchDomainResponse'
-    { _delrsDomainStatus = Nothing
-    , _delrsResponseStatus = pResponseStatus_
-    }
+  DeleteElasticsearchDomainResponse'
+  {_delrsDomainStatus = Nothing, _delrsResponseStatus = pResponseStatus_}
 
+
 -- | The status of the Elasticsearch domain being deleted.
 delrsDomainStatus :: Lens' DeleteElasticsearchDomainResponse (Maybe ElasticsearchDomainStatus)
 delrsDomainStatus = lens _delrsDomainStatus (\ s a -> s{_delrsDomainStatus = a});
@@ -130,3 +130,4 @@
 delrsResponseStatus = lens _delrsResponseStatus (\ s a -> s{_delrsResponseStatus = a});
 
 instance NFData DeleteElasticsearchDomainResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DeleteElasticsearchServiceRole.hs b/gen/Network/AWS/ElasticSearch/DeleteElasticsearchServiceRole.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElasticSearch/DeleteElasticsearchServiceRole.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElasticSearch.DeleteElasticsearchServiceRole
+-- Copyright   : (c) 2013-2017 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the service-linked role that Elasticsearch Service uses to manage and maintain VPC domains. Role deletion will fail if any existing VPC domains use the role. You must delete any such Elasticsearch domains before deleting the role. See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html#es-enabling-slr Deleting Elasticsearch Service Role> in /VPC Endpoints for Amazon Elasticsearch Service Domains/ .
+--
+--
+module Network.AWS.ElasticSearch.DeleteElasticsearchServiceRole
+    (
+    -- * Creating a Request
+      deleteElasticsearchServiceRole
+    , DeleteElasticsearchServiceRole
+
+    -- * Destructuring the Response
+    , deleteElasticsearchServiceRoleResponse
+    , DeleteElasticsearchServiceRoleResponse
+    ) where
+
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | /See:/ 'deleteElasticsearchServiceRole' smart constructor.
+data DeleteElasticsearchServiceRole =
+  DeleteElasticsearchServiceRole'
+  deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteElasticsearchServiceRole' with the minimum fields required to make a request.
+--
+deleteElasticsearchServiceRole
+    :: DeleteElasticsearchServiceRole
+deleteElasticsearchServiceRole = DeleteElasticsearchServiceRole'
+
+
+instance AWSRequest DeleteElasticsearchServiceRole
+         where
+        type Rs DeleteElasticsearchServiceRole =
+             DeleteElasticsearchServiceRoleResponse
+        request = delete elasticSearch
+        response
+          = receiveNull DeleteElasticsearchServiceRoleResponse'
+
+instance Hashable DeleteElasticsearchServiceRole
+         where
+
+instance NFData DeleteElasticsearchServiceRole where
+
+instance ToHeaders DeleteElasticsearchServiceRole
+         where
+        toHeaders = const mempty
+
+instance ToPath DeleteElasticsearchServiceRole where
+        toPath = const "/2015-01-01/es/role"
+
+instance ToQuery DeleteElasticsearchServiceRole where
+        toQuery = const mempty
+
+-- | /See:/ 'deleteElasticsearchServiceRoleResponse' smart constructor.
+data DeleteElasticsearchServiceRoleResponse =
+  DeleteElasticsearchServiceRoleResponse'
+  deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DeleteElasticsearchServiceRoleResponse' with the minimum fields required to make a request.
+--
+deleteElasticsearchServiceRoleResponse
+    :: DeleteElasticsearchServiceRoleResponse
+deleteElasticsearchServiceRoleResponse = DeleteElasticsearchServiceRoleResponse'
+
+
+instance NFData
+           DeleteElasticsearchServiceRoleResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomain.hs b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomain.hs
--- a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomain.hs
+++ b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomain.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.DescribeElasticsearchDomain
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,12 +37,12 @@
     , dedrsDomainStatus
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'DescribeElasticsearchDomain' @ operation.
 --
@@ -50,9 +50,10 @@
 --
 -- /See:/ 'describeElasticsearchDomain' smart constructor.
 newtype DescribeElasticsearchDomain = DescribeElasticsearchDomain'
-    { _dedDomainName :: Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dedDomainName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomain' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -62,10 +63,9 @@
     :: Text -- ^ 'dedDomainName'
     -> DescribeElasticsearchDomain
 describeElasticsearchDomain pDomainName_ =
-    DescribeElasticsearchDomain'
-    { _dedDomainName = pDomainName_
-    }
+  DescribeElasticsearchDomain' {_dedDomainName = pDomainName_}
 
+
 -- | The name of the Elasticsearch domain for which you want information.
 dedDomainName :: Lens' DescribeElasticsearchDomain Text
 dedDomainName = lens _dedDomainName (\ s a -> s{_dedDomainName = a});
@@ -80,9 +80,9 @@
                  DescribeElasticsearchDomainResponse' <$>
                    (pure (fromEnum s)) <*> (x .:> "DomainStatus"))
 
-instance Hashable DescribeElasticsearchDomain
+instance Hashable DescribeElasticsearchDomain where
 
-instance NFData DescribeElasticsearchDomain
+instance NFData DescribeElasticsearchDomain where
 
 instance ToHeaders DescribeElasticsearchDomain where
         toHeaders = const mempty
@@ -101,10 +101,11 @@
 --
 -- /See:/ 'describeElasticsearchDomainResponse' smart constructor.
 data DescribeElasticsearchDomainResponse = DescribeElasticsearchDomainResponse'
-    { _dedrsResponseStatus :: !Int
-    , _dedrsDomainStatus   :: !ElasticsearchDomainStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dedrsResponseStatus :: !Int
+  , _dedrsDomainStatus   :: !ElasticsearchDomainStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomainResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -117,11 +118,10 @@
     -> ElasticsearchDomainStatus -- ^ 'dedrsDomainStatus'
     -> DescribeElasticsearchDomainResponse
 describeElasticsearchDomainResponse pResponseStatus_ pDomainStatus_ =
-    DescribeElasticsearchDomainResponse'
-    { _dedrsResponseStatus = pResponseStatus_
-    , _dedrsDomainStatus = pDomainStatus_
-    }
+  DescribeElasticsearchDomainResponse'
+  {_dedrsResponseStatus = pResponseStatus_, _dedrsDomainStatus = pDomainStatus_}
 
+
 -- | -- | The response status code.
 dedrsResponseStatus :: Lens' DescribeElasticsearchDomainResponse Int
 dedrsResponseStatus = lens _dedrsResponseStatus (\ s a -> s{_dedrsResponseStatus = a});
@@ -131,3 +131,4 @@
 dedrsDomainStatus = lens _dedrsDomainStatus (\ s a -> s{_dedrsDomainStatus = a});
 
 instance NFData DescribeElasticsearchDomainResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomainConfig.hs b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomainConfig.hs
--- a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomainConfig.hs
+++ b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomainConfig.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.DescribeElasticsearchDomainConfig
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,12 +37,12 @@
     , dedcrsDomainConfig
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @DescribeElasticsearchDomainConfig@ operation. Specifies the domain name for which you want configuration information.
 --
@@ -50,9 +50,10 @@
 --
 -- /See:/ 'describeElasticsearchDomainConfig' smart constructor.
 newtype DescribeElasticsearchDomainConfig = DescribeElasticsearchDomainConfig'
-    { _dedcDomainName :: Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dedcDomainName :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomainConfig' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -62,10 +63,9 @@
     :: Text -- ^ 'dedcDomainName'
     -> DescribeElasticsearchDomainConfig
 describeElasticsearchDomainConfig pDomainName_ =
-    DescribeElasticsearchDomainConfig'
-    { _dedcDomainName = pDomainName_
-    }
+  DescribeElasticsearchDomainConfig' {_dedcDomainName = pDomainName_}
 
+
 -- | The Elasticsearch domain that you want to get information about.
 dedcDomainName :: Lens' DescribeElasticsearchDomainConfig Text
 dedcDomainName = lens _dedcDomainName (\ s a -> s{_dedcDomainName = a});
@@ -82,8 +82,10 @@
                    (pure (fromEnum s)) <*> (x .:> "DomainConfig"))
 
 instance Hashable DescribeElasticsearchDomainConfig
+         where
 
 instance NFData DescribeElasticsearchDomainConfig
+         where
 
 instance ToHeaders DescribeElasticsearchDomainConfig
          where
@@ -106,10 +108,11 @@
 --
 -- /See:/ 'describeElasticsearchDomainConfigResponse' smart constructor.
 data DescribeElasticsearchDomainConfigResponse = DescribeElasticsearchDomainConfigResponse'
-    { _dedcrsResponseStatus :: !Int
-    , _dedcrsDomainConfig   :: !ElasticsearchDomainConfig
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dedcrsResponseStatus :: !Int
+  , _dedcrsDomainConfig   :: !ElasticsearchDomainConfig
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomainConfigResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -122,11 +125,12 @@
     -> ElasticsearchDomainConfig -- ^ 'dedcrsDomainConfig'
     -> DescribeElasticsearchDomainConfigResponse
 describeElasticsearchDomainConfigResponse pResponseStatus_ pDomainConfig_ =
-    DescribeElasticsearchDomainConfigResponse'
-    { _dedcrsResponseStatus = pResponseStatus_
-    , _dedcrsDomainConfig = pDomainConfig_
-    }
+  DescribeElasticsearchDomainConfigResponse'
+  { _dedcrsResponseStatus = pResponseStatus_
+  , _dedcrsDomainConfig = pDomainConfig_
+  }
 
+
 -- | -- | The response status code.
 dedcrsResponseStatus :: Lens' DescribeElasticsearchDomainConfigResponse Int
 dedcrsResponseStatus = lens _dedcrsResponseStatus (\ s a -> s{_dedcrsResponseStatus = a});
@@ -136,4 +140,5 @@
 dedcrsDomainConfig = lens _dedcrsDomainConfig (\ s a -> s{_dedcrsDomainConfig = a});
 
 instance NFData
-         DescribeElasticsearchDomainConfigResponse
+           DescribeElasticsearchDomainConfigResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomains.hs b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomains.hs
--- a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomains.hs
+++ b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchDomains.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.DescribeElasticsearchDomains
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,12 +37,12 @@
     , drsDomainStatusList
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'DescribeElasticsearchDomains' @ operation. By default, the API returns the status of all Elasticsearch domains.
 --
@@ -50,9 +50,10 @@
 --
 -- /See:/ 'describeElasticsearchDomains' smart constructor.
 newtype DescribeElasticsearchDomains = DescribeElasticsearchDomains'
-    { _dedDomainNames :: [Text]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _dedDomainNames :: [Text]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomains' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -61,10 +62,9 @@
 describeElasticsearchDomains
     :: DescribeElasticsearchDomains
 describeElasticsearchDomains =
-    DescribeElasticsearchDomains'
-    { _dedDomainNames = mempty
-    }
+  DescribeElasticsearchDomains' {_dedDomainNames = mempty}
 
+
 -- | The Elasticsearch domains for which you want information.
 dedDomainNames :: Lens' DescribeElasticsearchDomains [Text]
 dedDomainNames = lens _dedDomainNames (\ s a -> s{_dedDomainNames = a}) . _Coerce;
@@ -81,9 +81,9 @@
                    (pure (fromEnum s)) <*>
                      (x .?> "DomainStatusList" .!@ mempty))
 
-instance Hashable DescribeElasticsearchDomains
+instance Hashable DescribeElasticsearchDomains where
 
-instance NFData DescribeElasticsearchDomains
+instance NFData DescribeElasticsearchDomains where
 
 instance ToHeaders DescribeElasticsearchDomains where
         toHeaders = const mempty
@@ -105,10 +105,11 @@
 --
 -- /See:/ 'describeElasticsearchDomainsResponse' smart constructor.
 data DescribeElasticsearchDomainsResponse = DescribeElasticsearchDomainsResponse'
-    { _drsResponseStatus   :: !Int
-    , _drsDomainStatusList :: ![ElasticsearchDomainStatus]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _drsResponseStatus   :: !Int
+  , _drsDomainStatusList :: ![ElasticsearchDomainStatus]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DescribeElasticsearchDomainsResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -120,11 +121,10 @@
     :: Int -- ^ 'drsResponseStatus'
     -> DescribeElasticsearchDomainsResponse
 describeElasticsearchDomainsResponse pResponseStatus_ =
-    DescribeElasticsearchDomainsResponse'
-    { _drsResponseStatus = pResponseStatus_
-    , _drsDomainStatusList = mempty
-    }
+  DescribeElasticsearchDomainsResponse'
+  {_drsResponseStatus = pResponseStatus_, _drsDomainStatusList = mempty}
 
+
 -- | -- | The response status code.
 drsResponseStatus :: Lens' DescribeElasticsearchDomainsResponse Int
 drsResponseStatus = lens _drsResponseStatus (\ s a -> s{_drsResponseStatus = a});
@@ -134,3 +134,4 @@
 drsDomainStatusList = lens _drsDomainStatusList (\ s a -> s{_drsDomainStatusList = a}) . _Coerce;
 
 instance NFData DescribeElasticsearchDomainsResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/DescribeElasticsearchInstanceTypeLimits.hs b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchInstanceTypeLimits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElasticSearch/DescribeElasticsearchInstanceTypeLimits.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElasticSearch.DescribeElasticsearchInstanceTypeLimits
+-- Copyright   : (c) 2013-2017 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describe Elasticsearch Limits for a given InstanceType and ElasticsearchVersion. When modifying existing Domain, specify the @'DomainName' @ to know what Limits are supported for modifying.
+--
+--
+module Network.AWS.ElasticSearch.DescribeElasticsearchInstanceTypeLimits
+    (
+    -- * Creating a Request
+      describeElasticsearchInstanceTypeLimits
+    , DescribeElasticsearchInstanceTypeLimits
+    -- * Request Lenses
+    , deitlDomainName
+    , deitlInstanceType
+    , deitlElasticsearchVersion
+
+    -- * Destructuring the Response
+    , describeElasticsearchInstanceTypeLimitsResponse
+    , DescribeElasticsearchInstanceTypeLimitsResponse
+    -- * Response Lenses
+    , deitlrsLimitsByRole
+    , deitlrsResponseStatus
+    ) where
+
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | Container for the parameters to @'DescribeElasticsearchInstanceTypeLimits' @ operation.
+--
+--
+--
+-- /See:/ 'describeElasticsearchInstanceTypeLimits' smart constructor.
+data DescribeElasticsearchInstanceTypeLimits = DescribeElasticsearchInstanceTypeLimits'
+  { _deitlDomainName           :: !(Maybe Text)
+  , _deitlInstanceType         :: !ESPartitionInstanceType
+  , _deitlElasticsearchVersion :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DescribeElasticsearchInstanceTypeLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'deitlDomainName' - DomainName represents the name of the Domain that we are trying to modify. This should be present only if we are querying for Elasticsearch @'Limits' @ for existing domain.
+--
+-- * 'deitlInstanceType' - The instance type for an Elasticsearch cluster for which Elasticsearch @'Limits' @ are needed.
+--
+-- * 'deitlElasticsearchVersion' - Version of Elasticsearch for which @'Limits' @ are needed.
+describeElasticsearchInstanceTypeLimits
+    :: ESPartitionInstanceType -- ^ 'deitlInstanceType'
+    -> Text -- ^ 'deitlElasticsearchVersion'
+    -> DescribeElasticsearchInstanceTypeLimits
+describeElasticsearchInstanceTypeLimits pInstanceType_ pElasticsearchVersion_ =
+  DescribeElasticsearchInstanceTypeLimits'
+  { _deitlDomainName = Nothing
+  , _deitlInstanceType = pInstanceType_
+  , _deitlElasticsearchVersion = pElasticsearchVersion_
+  }
+
+
+-- | DomainName represents the name of the Domain that we are trying to modify. This should be present only if we are querying for Elasticsearch @'Limits' @ for existing domain.
+deitlDomainName :: Lens' DescribeElasticsearchInstanceTypeLimits (Maybe Text)
+deitlDomainName = lens _deitlDomainName (\ s a -> s{_deitlDomainName = a});
+
+-- | The instance type for an Elasticsearch cluster for which Elasticsearch @'Limits' @ are needed.
+deitlInstanceType :: Lens' DescribeElasticsearchInstanceTypeLimits ESPartitionInstanceType
+deitlInstanceType = lens _deitlInstanceType (\ s a -> s{_deitlInstanceType = a});
+
+-- | Version of Elasticsearch for which @'Limits' @ are needed.
+deitlElasticsearchVersion :: Lens' DescribeElasticsearchInstanceTypeLimits Text
+deitlElasticsearchVersion = lens _deitlElasticsearchVersion (\ s a -> s{_deitlElasticsearchVersion = a});
+
+instance AWSRequest
+           DescribeElasticsearchInstanceTypeLimits
+         where
+        type Rs DescribeElasticsearchInstanceTypeLimits =
+             DescribeElasticsearchInstanceTypeLimitsResponse
+        request = get elasticSearch
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeElasticsearchInstanceTypeLimitsResponse' <$>
+                   (x .?> "LimitsByRole" .!@ mempty) <*>
+                     (pure (fromEnum s)))
+
+instance Hashable
+           DescribeElasticsearchInstanceTypeLimits
+         where
+
+instance NFData
+           DescribeElasticsearchInstanceTypeLimits
+         where
+
+instance ToHeaders
+           DescribeElasticsearchInstanceTypeLimits
+         where
+        toHeaders = const mempty
+
+instance ToPath
+           DescribeElasticsearchInstanceTypeLimits
+         where
+        toPath DescribeElasticsearchInstanceTypeLimits'{..}
+          = mconcat
+              ["/2015-01-01/es/instanceTypeLimits/",
+               toBS _deitlElasticsearchVersion, "/",
+               toBS _deitlInstanceType]
+
+instance ToQuery
+           DescribeElasticsearchInstanceTypeLimits
+         where
+        toQuery DescribeElasticsearchInstanceTypeLimits'{..}
+          = mconcat ["domainName" =: _deitlDomainName]
+
+-- | Container for the parameters received from @'DescribeElasticsearchInstanceTypeLimits' @ operation.
+--
+--
+--
+-- /See:/ 'describeElasticsearchInstanceTypeLimitsResponse' smart constructor.
+data DescribeElasticsearchInstanceTypeLimitsResponse = DescribeElasticsearchInstanceTypeLimitsResponse'
+  { _deitlrsLimitsByRole   :: !(Maybe (Map Text Limits))
+  , _deitlrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'DescribeElasticsearchInstanceTypeLimitsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'deitlrsLimitsByRole' - Undocumented member.
+--
+-- * 'deitlrsResponseStatus' - -- | The response status code.
+describeElasticsearchInstanceTypeLimitsResponse
+    :: Int -- ^ 'deitlrsResponseStatus'
+    -> DescribeElasticsearchInstanceTypeLimitsResponse
+describeElasticsearchInstanceTypeLimitsResponse pResponseStatus_ =
+  DescribeElasticsearchInstanceTypeLimitsResponse'
+  {_deitlrsLimitsByRole = Nothing, _deitlrsResponseStatus = pResponseStatus_}
+
+
+-- | Undocumented member.
+deitlrsLimitsByRole :: Lens' DescribeElasticsearchInstanceTypeLimitsResponse (HashMap Text Limits)
+deitlrsLimitsByRole = lens _deitlrsLimitsByRole (\ s a -> s{_deitlrsLimitsByRole = a}) . _Default . _Map;
+
+-- | -- | The response status code.
+deitlrsResponseStatus :: Lens' DescribeElasticsearchInstanceTypeLimitsResponse Int
+deitlrsResponseStatus = lens _deitlrsResponseStatus (\ s a -> s{_deitlrsResponseStatus = a});
+
+instance NFData
+           DescribeElasticsearchInstanceTypeLimitsResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/ListDomainNames.hs b/gen/Network/AWS/ElasticSearch/ListDomainNames.hs
--- a/gen/Network/AWS/ElasticSearch/ListDomainNames.hs
+++ b/gen/Network/AWS/ElasticSearch/ListDomainNames.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.ListDomainNames
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -35,24 +35,26 @@
     , ldnrsResponseStatus
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | /See:/ 'listDomainNames' smart constructor.
 data ListDomainNames =
-    ListDomainNames'
-    deriving (Eq,Read,Show,Data,Typeable,Generic)
+  ListDomainNames'
+  deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ListDomainNames' with the minimum fields required to make a request.
 --
 listDomainNames
     :: ListDomainNames
 listDomainNames = ListDomainNames'
 
+
 instance AWSRequest ListDomainNames where
         type Rs ListDomainNames = ListDomainNamesResponse
         request = get elasticSearch
@@ -63,9 +65,9 @@
                    (x .?> "DomainNames" .!@ mempty) <*>
                      (pure (fromEnum s)))
 
-instance Hashable ListDomainNames
+instance Hashable ListDomainNames where
 
-instance NFData ListDomainNames
+instance NFData ListDomainNames where
 
 instance ToHeaders ListDomainNames where
         toHeaders = const mempty
@@ -82,10 +84,11 @@
 --
 -- /See:/ 'listDomainNamesResponse' smart constructor.
 data ListDomainNamesResponse = ListDomainNamesResponse'
-    { _ldnrsDomainNames    :: !(Maybe [DomainInfo])
-    , _ldnrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _ldnrsDomainNames    :: !(Maybe [DomainInfo])
+  , _ldnrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ListDomainNamesResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -97,11 +100,10 @@
     :: Int -- ^ 'ldnrsResponseStatus'
     -> ListDomainNamesResponse
 listDomainNamesResponse pResponseStatus_ =
-    ListDomainNamesResponse'
-    { _ldnrsDomainNames = Nothing
-    , _ldnrsResponseStatus = pResponseStatus_
-    }
+  ListDomainNamesResponse'
+  {_ldnrsDomainNames = Nothing, _ldnrsResponseStatus = pResponseStatus_}
 
+
 -- | List of Elasticsearch domain names.
 ldnrsDomainNames :: Lens' ListDomainNamesResponse [DomainInfo]
 ldnrsDomainNames = lens _ldnrsDomainNames (\ s a -> s{_ldnrsDomainNames = a}) . _Default . _Coerce;
@@ -110,4 +112,4 @@
 ldnrsResponseStatus :: Lens' ListDomainNamesResponse Int
 ldnrsResponseStatus = lens _ldnrsResponseStatus (\ s a -> s{_ldnrsResponseStatus = a});
 
-instance NFData ListDomainNamesResponse
+instance NFData ListDomainNamesResponse where
diff --git a/gen/Network/AWS/ElasticSearch/ListElasticsearchInstanceTypes.hs b/gen/Network/AWS/ElasticSearch/ListElasticsearchInstanceTypes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElasticSearch/ListElasticsearchInstanceTypes.hs
@@ -0,0 +1,184 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElasticSearch.ListElasticsearchInstanceTypes
+-- Copyright   : (c) 2013-2017 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List all Elasticsearch instance types that are supported for given ElasticsearchVersion
+--
+--
+module Network.AWS.ElasticSearch.ListElasticsearchInstanceTypes
+    (
+    -- * Creating a Request
+      listElasticsearchInstanceTypes
+    , ListElasticsearchInstanceTypes
+    -- * Request Lenses
+    , leitNextToken
+    , leitDomainName
+    , leitMaxResults
+    , leitElasticsearchVersion
+
+    -- * Destructuring the Response
+    , listElasticsearchInstanceTypesResponse
+    , ListElasticsearchInstanceTypesResponse
+    -- * Response Lenses
+    , leitrsElasticsearchInstanceTypes
+    , leitrsNextToken
+    , leitrsResponseStatus
+    ) where
+
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | Container for the parameters to the @'ListElasticsearchInstanceTypes' @ operation.
+--
+--
+--
+-- /See:/ 'listElasticsearchInstanceTypes' smart constructor.
+data ListElasticsearchInstanceTypes = ListElasticsearchInstanceTypes'
+  { _leitNextToken            :: !(Maybe Text)
+  , _leitDomainName           :: !(Maybe Text)
+  , _leitMaxResults           :: !(Maybe Int)
+  , _leitElasticsearchVersion :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListElasticsearchInstanceTypes' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'leitNextToken' - NextToken should be sent in case if earlier API call produced result containing NextToken. It is used for pagination.
+--
+-- * 'leitDomainName' - DomainName represents the name of the Domain that we are trying to modify. This should be present only if we are querying for list of available Elasticsearch instance types when modifying existing domain.
+--
+-- * 'leitMaxResults' - Set this value to limit the number of results returned. Value provided must be greater than 30 else it wont be honored.
+--
+-- * 'leitElasticsearchVersion' - Version of Elasticsearch for which list of supported elasticsearch instance types are needed.
+listElasticsearchInstanceTypes
+    :: Text -- ^ 'leitElasticsearchVersion'
+    -> ListElasticsearchInstanceTypes
+listElasticsearchInstanceTypes pElasticsearchVersion_ =
+  ListElasticsearchInstanceTypes'
+  { _leitNextToken = Nothing
+  , _leitDomainName = Nothing
+  , _leitMaxResults = Nothing
+  , _leitElasticsearchVersion = pElasticsearchVersion_
+  }
+
+
+-- | NextToken should be sent in case if earlier API call produced result containing NextToken. It is used for pagination.
+leitNextToken :: Lens' ListElasticsearchInstanceTypes (Maybe Text)
+leitNextToken = lens _leitNextToken (\ s a -> s{_leitNextToken = a});
+
+-- | DomainName represents the name of the Domain that we are trying to modify. This should be present only if we are querying for list of available Elasticsearch instance types when modifying existing domain.
+leitDomainName :: Lens' ListElasticsearchInstanceTypes (Maybe Text)
+leitDomainName = lens _leitDomainName (\ s a -> s{_leitDomainName = a});
+
+-- | Set this value to limit the number of results returned. Value provided must be greater than 30 else it wont be honored.
+leitMaxResults :: Lens' ListElasticsearchInstanceTypes (Maybe Int)
+leitMaxResults = lens _leitMaxResults (\ s a -> s{_leitMaxResults = a});
+
+-- | Version of Elasticsearch for which list of supported elasticsearch instance types are needed.
+leitElasticsearchVersion :: Lens' ListElasticsearchInstanceTypes Text
+leitElasticsearchVersion = lens _leitElasticsearchVersion (\ s a -> s{_leitElasticsearchVersion = a});
+
+instance AWSRequest ListElasticsearchInstanceTypes
+         where
+        type Rs ListElasticsearchInstanceTypes =
+             ListElasticsearchInstanceTypesResponse
+        request = get elasticSearch
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListElasticsearchInstanceTypesResponse' <$>
+                   (x .?> "ElasticsearchInstanceTypes" .!@ mempty) <*>
+                     (x .?> "NextToken")
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListElasticsearchInstanceTypes
+         where
+
+instance NFData ListElasticsearchInstanceTypes where
+
+instance ToHeaders ListElasticsearchInstanceTypes
+         where
+        toHeaders = const mempty
+
+instance ToPath ListElasticsearchInstanceTypes where
+        toPath ListElasticsearchInstanceTypes'{..}
+          = mconcat
+              ["/2015-01-01/es/instanceTypes/",
+               toBS _leitElasticsearchVersion]
+
+instance ToQuery ListElasticsearchInstanceTypes where
+        toQuery ListElasticsearchInstanceTypes'{..}
+          = mconcat
+              ["nextToken" =: _leitNextToken,
+               "domainName" =: _leitDomainName,
+               "maxResults" =: _leitMaxResults]
+
+-- | Container for the parameters returned by @'ListElasticsearchInstanceTypes' @ operation.
+--
+--
+--
+-- /See:/ 'listElasticsearchInstanceTypesResponse' smart constructor.
+data ListElasticsearchInstanceTypesResponse = ListElasticsearchInstanceTypesResponse'
+  { _leitrsElasticsearchInstanceTypes :: !(Maybe [ESPartitionInstanceType])
+  , _leitrsNextToken                  :: !(Maybe Text)
+  , _leitrsResponseStatus             :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListElasticsearchInstanceTypesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'leitrsElasticsearchInstanceTypes' - List of instance types supported by Amazon Elasticsearch service for given @'ElasticsearchVersion' @
+--
+-- * 'leitrsNextToken' - In case if there are more results available NextToken would be present, make further request to the same API with received NextToken to paginate remaining results.
+--
+-- * 'leitrsResponseStatus' - -- | The response status code.
+listElasticsearchInstanceTypesResponse
+    :: Int -- ^ 'leitrsResponseStatus'
+    -> ListElasticsearchInstanceTypesResponse
+listElasticsearchInstanceTypesResponse pResponseStatus_ =
+  ListElasticsearchInstanceTypesResponse'
+  { _leitrsElasticsearchInstanceTypes = Nothing
+  , _leitrsNextToken = Nothing
+  , _leitrsResponseStatus = pResponseStatus_
+  }
+
+
+-- | List of instance types supported by Amazon Elasticsearch service for given @'ElasticsearchVersion' @
+leitrsElasticsearchInstanceTypes :: Lens' ListElasticsearchInstanceTypesResponse [ESPartitionInstanceType]
+leitrsElasticsearchInstanceTypes = lens _leitrsElasticsearchInstanceTypes (\ s a -> s{_leitrsElasticsearchInstanceTypes = a}) . _Default . _Coerce;
+
+-- | In case if there are more results available NextToken would be present, make further request to the same API with received NextToken to paginate remaining results.
+leitrsNextToken :: Lens' ListElasticsearchInstanceTypesResponse (Maybe Text)
+leitrsNextToken = lens _leitrsNextToken (\ s a -> s{_leitrsNextToken = a});
+
+-- | -- | The response status code.
+leitrsResponseStatus :: Lens' ListElasticsearchInstanceTypesResponse Int
+leitrsResponseStatus = lens _leitrsResponseStatus (\ s a -> s{_leitrsResponseStatus = a});
+
+instance NFData
+           ListElasticsearchInstanceTypesResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/ListElasticsearchVersions.hs b/gen/Network/AWS/ElasticSearch/ListElasticsearchVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ElasticSearch/ListElasticsearchVersions.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.ElasticSearch.ListElasticsearchVersions
+-- Copyright   : (c) 2013-2017 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List all supported Elasticsearch versions
+--
+--
+module Network.AWS.ElasticSearch.ListElasticsearchVersions
+    (
+    -- * Creating a Request
+      listElasticsearchVersions
+    , ListElasticsearchVersions
+    -- * Request Lenses
+    , levNextToken
+    , levMaxResults
+
+    -- * Destructuring the Response
+    , listElasticsearchVersionsResponse
+    , ListElasticsearchVersionsResponse
+    -- * Response Lenses
+    , levrsNextToken
+    , levrsElasticsearchVersions
+    , levrsResponseStatus
+    ) where
+
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
+
+-- | Container for the parameters to the @'ListElasticsearchVersions' @ operation. Use @'MaxResults' @ to control the maximum number of results to retrieve in a single call.
+--
+--
+-- Use @'NextToken' @ in response to retrieve more results. If the received response does not contain a NextToken, then there are no more results to retrieve.
+--
+--
+--
+--
+-- /See:/ 'listElasticsearchVersions' smart constructor.
+data ListElasticsearchVersions = ListElasticsearchVersions'
+  { _levNextToken  :: !(Maybe Text)
+  , _levMaxResults :: !(Maybe Int)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListElasticsearchVersions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'levNextToken' - Undocumented member.
+--
+-- * 'levMaxResults' - Set this value to limit the number of results returned. Value provided must be greater than 10 else it wont be honored.
+listElasticsearchVersions
+    :: ListElasticsearchVersions
+listElasticsearchVersions =
+  ListElasticsearchVersions' {_levNextToken = Nothing, _levMaxResults = Nothing}
+
+
+-- | Undocumented member.
+levNextToken :: Lens' ListElasticsearchVersions (Maybe Text)
+levNextToken = lens _levNextToken (\ s a -> s{_levNextToken = a});
+
+-- | Set this value to limit the number of results returned. Value provided must be greater than 10 else it wont be honored.
+levMaxResults :: Lens' ListElasticsearchVersions (Maybe Int)
+levMaxResults = lens _levMaxResults (\ s a -> s{_levMaxResults = a});
+
+instance AWSRequest ListElasticsearchVersions where
+        type Rs ListElasticsearchVersions =
+             ListElasticsearchVersionsResponse
+        request = get elasticSearch
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListElasticsearchVersionsResponse' <$>
+                   (x .?> "NextToken") <*>
+                     (x .?> "ElasticsearchVersions" .!@ mempty)
+                     <*> (pure (fromEnum s)))
+
+instance Hashable ListElasticsearchVersions where
+
+instance NFData ListElasticsearchVersions where
+
+instance ToHeaders ListElasticsearchVersions where
+        toHeaders = const mempty
+
+instance ToPath ListElasticsearchVersions where
+        toPath = const "/2015-01-01/es/versions"
+
+instance ToQuery ListElasticsearchVersions where
+        toQuery ListElasticsearchVersions'{..}
+          = mconcat
+              ["nextToken" =: _levNextToken,
+               "maxResults" =: _levMaxResults]
+
+-- | Container for the parameters for response received from @'ListElasticsearchVersions' @ operation.
+--
+--
+--
+-- /See:/ 'listElasticsearchVersionsResponse' smart constructor.
+data ListElasticsearchVersionsResponse = ListElasticsearchVersionsResponse'
+  { _levrsNextToken             :: !(Maybe Text)
+  , _levrsElasticsearchVersions :: !(Maybe [Text])
+  , _levrsResponseStatus        :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'ListElasticsearchVersionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'levrsNextToken' - Undocumented member.
+--
+-- * 'levrsElasticsearchVersions' - Undocumented member.
+--
+-- * 'levrsResponseStatus' - -- | The response status code.
+listElasticsearchVersionsResponse
+    :: Int -- ^ 'levrsResponseStatus'
+    -> ListElasticsearchVersionsResponse
+listElasticsearchVersionsResponse pResponseStatus_ =
+  ListElasticsearchVersionsResponse'
+  { _levrsNextToken = Nothing
+  , _levrsElasticsearchVersions = Nothing
+  , _levrsResponseStatus = pResponseStatus_
+  }
+
+
+-- | Undocumented member.
+levrsNextToken :: Lens' ListElasticsearchVersionsResponse (Maybe Text)
+levrsNextToken = lens _levrsNextToken (\ s a -> s{_levrsNextToken = a});
+
+-- | Undocumented member.
+levrsElasticsearchVersions :: Lens' ListElasticsearchVersionsResponse [Text]
+levrsElasticsearchVersions = lens _levrsElasticsearchVersions (\ s a -> s{_levrsElasticsearchVersions = a}) . _Default . _Coerce;
+
+-- | -- | The response status code.
+levrsResponseStatus :: Lens' ListElasticsearchVersionsResponse Int
+levrsResponseStatus = lens _levrsResponseStatus (\ s a -> s{_levrsResponseStatus = a});
+
+instance NFData ListElasticsearchVersionsResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/ListTags.hs b/gen/Network/AWS/ElasticSearch/ListTags.hs
--- a/gen/Network/AWS/ElasticSearch/ListTags.hs
+++ b/gen/Network/AWS/ElasticSearch/ListTags.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.ListTags
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,12 +37,12 @@
     , ltrsResponseStatus
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'ListTags' @ operation. Specify the @ARN@ for the Elasticsearch domain to which the tags are attached that you want to view are attached.
 --
@@ -50,9 +50,10 @@
 --
 -- /See:/ 'listTags' smart constructor.
 newtype ListTags = ListTags'
-    { _ltARN :: Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _ltARN :: Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ListTags' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -61,11 +62,9 @@
 listTags
     :: Text -- ^ 'ltARN'
     -> ListTags
-listTags pARN_ =
-    ListTags'
-    { _ltARN = pARN_
-    }
+listTags pARN_ = ListTags' {_ltARN = pARN_}
 
+
 -- | Specify the @ARN@ for the Elasticsearch domain to which the tags are attached that you want to view.
 ltARN :: Lens' ListTags Text
 ltARN = lens _ltARN (\ s a -> s{_ltARN = a});
@@ -79,9 +78,9 @@
                  ListTagsResponse' <$>
                    (x .?> "TagList" .!@ mempty) <*> (pure (fromEnum s)))
 
-instance Hashable ListTags
+instance Hashable ListTags where
 
-instance NFData ListTags
+instance NFData ListTags where
 
 instance ToHeaders ListTags where
         toHeaders = const mempty
@@ -98,10 +97,11 @@
 --
 -- /See:/ 'listTagsResponse' smart constructor.
 data ListTagsResponse = ListTagsResponse'
-    { _ltrsTagList        :: !(Maybe [Tag])
-    , _ltrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _ltrsTagList        :: !(Maybe [Tag])
+  , _ltrsResponseStatus :: !Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ListTagsResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -113,11 +113,10 @@
     :: Int -- ^ 'ltrsResponseStatus'
     -> ListTagsResponse
 listTagsResponse pResponseStatus_ =
-    ListTagsResponse'
-    { _ltrsTagList = Nothing
-    , _ltrsResponseStatus = pResponseStatus_
-    }
+  ListTagsResponse'
+  {_ltrsTagList = Nothing, _ltrsResponseStatus = pResponseStatus_}
 
+
 -- | List of @Tag@ for the requested Elasticsearch domain.
 ltrsTagList :: Lens' ListTagsResponse [Tag]
 ltrsTagList = lens _ltrsTagList (\ s a -> s{_ltrsTagList = a}) . _Default . _Coerce;
@@ -126,4 +125,4 @@
 ltrsResponseStatus :: Lens' ListTagsResponse Int
 ltrsResponseStatus = lens _ltrsResponseStatus (\ s a -> s{_ltrsResponseStatus = a});
 
-instance NFData ListTagsResponse
+instance NFData ListTagsResponse where
diff --git a/gen/Network/AWS/ElasticSearch/RemoveTags.hs b/gen/Network/AWS/ElasticSearch/RemoveTags.hs
--- a/gen/Network/AWS/ElasticSearch/RemoveTags.hs
+++ b/gen/Network/AWS/ElasticSearch/RemoveTags.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.RemoveTags
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -35,12 +35,12 @@
     , RemoveTagsResponse
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'RemoveTags' @ operation. Specify the @ARN@ for the Elasticsearch domain from which you want to remove the specified @TagKey@ .
 --
@@ -48,10 +48,11 @@
 --
 -- /See:/ 'removeTags' smart constructor.
 data RemoveTags = RemoveTags'
-    { _rtARN     :: !Text
-    , _rtTagKeys :: ![Text]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _rtARN     :: !Text
+  , _rtTagKeys :: ![Text]
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'RemoveTags' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -62,12 +63,9 @@
 removeTags
     :: Text -- ^ 'rtARN'
     -> RemoveTags
-removeTags pARN_ =
-    RemoveTags'
-    { _rtARN = pARN_
-    , _rtTagKeys = mempty
-    }
+removeTags pARN_ = RemoveTags' {_rtARN = pARN_, _rtTagKeys = mempty}
 
+
 -- | Specifies the @ARN@ for the Elasticsearch domain from which you want to delete the specified tags.
 rtARN :: Lens' RemoveTags Text
 rtARN = lens _rtARN (\ s a -> s{_rtARN = a});
@@ -81,9 +79,9 @@
         request = postJSON elasticSearch
         response = receiveNull RemoveTagsResponse'
 
-instance Hashable RemoveTags
+instance Hashable RemoveTags where
 
-instance NFData RemoveTags
+instance NFData RemoveTags where
 
 instance ToHeaders RemoveTags where
         toHeaders = const mempty
@@ -103,13 +101,15 @@
 
 -- | /See:/ 'removeTagsResponse' smart constructor.
 data RemoveTagsResponse =
-    RemoveTagsResponse'
-    deriving (Eq,Read,Show,Data,Typeable,Generic)
+  RemoveTagsResponse'
+  deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'RemoveTagsResponse' with the minimum fields required to make a request.
 --
 removeTagsResponse
     :: RemoveTagsResponse
 removeTagsResponse = RemoveTagsResponse'
 
-instance NFData RemoveTagsResponse
+
+instance NFData RemoveTagsResponse where
diff --git a/gen/Network/AWS/ElasticSearch/Types.hs b/gen/Network/AWS/ElasticSearch/Types.hs
--- a/gen/Network/AWS/ElasticSearch/Types.hs
+++ b/gen/Network/AWS/ElasticSearch/Types.hs
@@ -4,9 +4,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.Types
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -28,6 +28,9 @@
     -- * ESPartitionInstanceType
     , ESPartitionInstanceType (..)
 
+    -- * LogType
+    , LogType (..)
+
     -- * OptionState
     , OptionState (..)
 
@@ -40,6 +43,12 @@
     , apsOptions
     , apsStatus
 
+    -- * AdditionalLimit
+    , AdditionalLimit
+    , additionalLimit
+    , alLimitName
+    , alLimitValues
+
     -- * AdvancedOptionsStatus
     , AdvancedOptionsStatus
     , advancedOptionsStatus
@@ -86,8 +95,10 @@
     , elasticsearchDomainConfig
     , edcEBSOptions
     , edcAccessPolicies
+    , edcLogPublishingOptions
     , edcElasticsearchClusterConfig
     , edcSnapshotOptions
+    , edcVPCOptions
     , edcAdvancedOptions
     , edcElasticsearchVersion
 
@@ -96,9 +107,12 @@
     , elasticsearchDomainStatus
     , edsEBSOptions
     , edsAccessPolicies
+    , edsLogPublishingOptions
     , edsCreated
     , edsSnapshotOptions
     , edsDeleted
+    , edsVPCOptions
+    , edsEndpoints
     , edsProcessing
     , edsEndpoint
     , edsAdvancedOptions
@@ -114,6 +128,36 @@
     , evsOptions
     , evsStatus
 
+    -- * InstanceCountLimits
+    , InstanceCountLimits
+    , instanceCountLimits
+    , iclMaximumInstanceCount
+    , iclMinimumInstanceCount
+
+    -- * InstanceLimits
+    , InstanceLimits
+    , instanceLimits
+    , ilInstanceCountLimits
+
+    -- * Limits
+    , Limits
+    , limits
+    , lInstanceLimits
+    , lAdditionalLimits
+    , lStorageTypes
+
+    -- * LogPublishingOption
+    , LogPublishingOption
+    , logPublishingOption
+    , lpoEnabled
+    , lpoCloudWatchLogsLogGroupARN
+
+    -- * LogPublishingOptionsStatus
+    , LogPublishingOptionsStatus
+    , logPublishingOptionsStatus
+    , lposStatus
+    , lposOptions
+
     -- * OptionStatus
     , OptionStatus
     , optionStatus
@@ -134,45 +178,80 @@
     , sosOptions
     , sosStatus
 
+    -- * StorageType
+    , StorageType
+    , storageType
+    , stStorageTypeLimits
+    , stStorageSubTypeName
+    , stStorageTypeName
+
+    -- * StorageTypeLimit
+    , StorageTypeLimit
+    , storageTypeLimit
+    , stlLimitName
+    , stlLimitValues
+
     -- * Tag
     , Tag
     , tag
     , tagKey
     , tagValue
+
+    -- * VPCDerivedInfo
+    , VPCDerivedInfo
+    , vpcDerivedInfo
+    , vdiSecurityGroupIds
+    , vdiSubnetIds
+    , vdiVPCId
+    , vdiAvailabilityZones
+
+    -- * VPCDerivedInfoStatus
+    , VPCDerivedInfoStatus
+    , vpcDerivedInfoStatus
+    , vdisOptions
+    , vdisStatus
+
+    -- * VPCOptions
+    , VPCOptions
+    , vpcOptions
+    , voSecurityGroupIds
+    , voSubnetIds
     ) where
 
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.ElasticSearch.Types.Sum
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Sign.V4
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.ElasticSearch.Types.Sum
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Sign.V4
 
 -- | API version @2015-01-01@ of the Amazon Elasticsearch Service SDK configuration.
 elasticSearch :: Service
 elasticSearch =
-    Service
-    { _svcAbbrev = "ElasticSearch"
-    , _svcSigner = v4
-    , _svcPrefix = "es"
-    , _svcVersion = "2015-01-01"
-    , _svcEndpoint = defaultEndpoint elasticSearch
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "ElasticSearch"
-    , _svcRetry = retry
-    }
+  Service
+  { _svcAbbrev = "ElasticSearch"
+  , _svcSigner = v4
+  , _svcPrefix = "es"
+  , _svcVersion = "2015-01-01"
+  , _svcEndpoint = defaultEndpoint elasticSearch
+  , _svcTimeout = Just 70
+  , _svcCheck = statusSuccess
+  , _svcError = parseJSONError "ElasticSearch"
+  , _svcRetry = retry
+  }
   where
     retry =
-        Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
+      Exponential
+      { _retryBase = 5.0e-2
+      , _retryGrowth = 2
+      , _retryAttempts = 5
+      , _retryCheck = check
+      }
     check e
+      | has (hasCode "ThrottledException" . hasStatus 400) e =
+        Just "throttled_exception"
       | has (hasStatus 429) e = Just "too_many_requests"
       | has (hasCode "ThrottlingException" . hasStatus 400) e =
-          Just "throttling_exception"
+        Just "throttling_exception"
       | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
       | has (hasStatus 504) e = Just "gateway_timeout"
       | has (hasStatus 502) e = Just "bad_gateway"
@@ -181,57 +260,67 @@
       | has (hasStatus 509) e = Just "limit_exceeded"
       | otherwise = Nothing
 
+
 -- | An exception for missing / invalid input fields. Gives http status code of 400.
 --
 --
 _ValidationException :: AsError a => Getting (First ServiceError) a ServiceError
 _ValidationException =
-    _ServiceError . hasStatus 400 . hasCode "ValidationException"
+  _MatchServiceError elasticSearch "ValidationException" . hasStatus 400
 
+
 -- | An exception for creating a resource that already exists. Gives http status code of 400.
 --
 --
 _ResourceAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
 _ResourceAlreadyExistsException =
-    _ServiceError . hasStatus 409 . hasCode "ResourceAlreadyExistsException"
+  _MatchServiceError elasticSearch "ResourceAlreadyExistsException" .
+  hasStatus 409
 
+
 -- | An error occurred while processing the request.
 --
 --
 _BaseException :: AsError a => Getting (First ServiceError) a ServiceError
-_BaseException = _ServiceError . hasCode "BaseException"
+_BaseException = _MatchServiceError elasticSearch "BaseException"
 
+
 -- | An error occured because the client wanted to access a not supported operation. Gives http status code of 409.
 --
 --
 _DisabledOperationException :: AsError a => Getting (First ServiceError) a ServiceError
 _DisabledOperationException =
-    _ServiceError . hasStatus 409 . hasCode "DisabledOperationException"
+  _MatchServiceError elasticSearch "DisabledOperationException" . hasStatus 409
 
+
 -- | The request processing has failed because of an unknown error, exception or failure (the failure is internal to the service) . Gives http status code of 500.
 --
 --
 _InternalException :: AsError a => Getting (First ServiceError) a ServiceError
 _InternalException =
-    _ServiceError . hasStatus 500 . hasCode "InternalException"
+  _MatchServiceError elasticSearch "InternalException" . hasStatus 500
 
+
 -- | An exception for trying to create or access sub-resource that is either invalid or not supported. Gives http status code of 409.
 --
 --
 _InvalidTypeException :: AsError a => Getting (First ServiceError) a ServiceError
 _InvalidTypeException =
-    _ServiceError . hasStatus 409 . hasCode "InvalidTypeException"
+  _MatchServiceError elasticSearch "InvalidTypeException" . hasStatus 409
 
+
 -- | An exception for accessing or deleting a resource that does not exist. Gives http status code of 400.
 --
 --
 _ResourceNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
 _ResourceNotFoundException =
-    _ServiceError . hasStatus 409 . hasCode "ResourceNotFoundException"
+  _MatchServiceError elasticSearch "ResourceNotFoundException" . hasStatus 409
 
+
 -- | An exception for trying to create more than allowed resources or sub-resources. Gives http status code of 409.
 --
 --
 _LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
 _LimitExceededException =
-    _ServiceError . hasStatus 409 . hasCode "LimitExceededException"
+  _MatchServiceError elasticSearch "LimitExceededException" . hasStatus 409
+
diff --git a/gen/Network/AWS/ElasticSearch/Types/Product.hs b/gen/Network/AWS/ElasticSearch/Types/Product.hs
--- a/gen/Network/AWS/ElasticSearch/Types/Product.hs
+++ b/gen/Network/AWS/ElasticSearch/Types/Product.hs
@@ -9,17 +9,17 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.Types.Product
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 module Network.AWS.ElasticSearch.Types.Product where
 
-import           Network.AWS.ElasticSearch.Types.Sum
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
+import Network.AWS.ElasticSearch.Types.Sum
+import Network.AWS.Lens
+import Network.AWS.Prelude
 
 -- | The configured access rules for the domain's document and search endpoints, and the current status of those rules.
 --
@@ -27,10 +27,11 @@
 --
 -- /See:/ 'accessPoliciesStatus' smart constructor.
 data AccessPoliciesStatus = AccessPoliciesStatus'
-    { _apsOptions :: !Text
-    , _apsStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _apsOptions :: !Text
+  , _apsStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'AccessPoliciesStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -43,11 +44,9 @@
     -> OptionStatus -- ^ 'apsStatus'
     -> AccessPoliciesStatus
 accessPoliciesStatus pOptions_ pStatus_ =
-    AccessPoliciesStatus'
-    { _apsOptions = pOptions_
-    , _apsStatus = pStatus_
-    }
+  AccessPoliciesStatus' {_apsOptions = pOptions_, _apsStatus = pStatus_}
 
+
 -- | The access policy configured for the Elasticsearch domain. Access policies may be resource-based, IP-based, or IAM-based. See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies Configuring Access Policies> for more information.
 apsOptions :: Lens' AccessPoliciesStatus Text
 apsOptions = lens _apsOptions (\ s a -> s{_apsOptions = a});
@@ -63,10 +62,54 @@
                  AccessPoliciesStatus' <$>
                    (x .: "Options") <*> (x .: "Status"))
 
-instance Hashable AccessPoliciesStatus
+instance Hashable AccessPoliciesStatus where
 
-instance NFData AccessPoliciesStatus
+instance NFData AccessPoliciesStatus where
 
+-- | List of limits that are specific to a given InstanceType and for each of it's @'InstanceRole' @ .
+--
+--
+--
+-- /See:/ 'additionalLimit' smart constructor.
+data AdditionalLimit = AdditionalLimit'
+  { _alLimitName   :: !(Maybe Text)
+  , _alLimitValues :: !(Maybe [Text])
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'AdditionalLimit' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'alLimitName' - Name of Additional Limit is specific to a given InstanceType and for each of it's @'InstanceRole' @ etc.  Attributes and their details:      * MaximumNumberOfDataNodesSupportedThis attribute will be present in Master node only to specify how much data nodes upto which given @'ESPartitionInstanceType' @ can support as master node.     * MaximumNumberOfDataNodesWithoutMasterNodeThis attribute will be present in Data node only to specify how much data nodes of given @'ESPartitionInstanceType' @ upto which you don't need any master nodes to govern them.
+--
+-- * 'alLimitValues' - Value for given @'AdditionalLimit$LimitName' @ .
+additionalLimit
+    :: AdditionalLimit
+additionalLimit =
+  AdditionalLimit' {_alLimitName = Nothing, _alLimitValues = Nothing}
+
+
+-- | Name of Additional Limit is specific to a given InstanceType and for each of it's @'InstanceRole' @ etc.  Attributes and their details:      * MaximumNumberOfDataNodesSupportedThis attribute will be present in Master node only to specify how much data nodes upto which given @'ESPartitionInstanceType' @ can support as master node.     * MaximumNumberOfDataNodesWithoutMasterNodeThis attribute will be present in Data node only to specify how much data nodes of given @'ESPartitionInstanceType' @ upto which you don't need any master nodes to govern them.
+alLimitName :: Lens' AdditionalLimit (Maybe Text)
+alLimitName = lens _alLimitName (\ s a -> s{_alLimitName = a});
+
+-- | Value for given @'AdditionalLimit$LimitName' @ .
+alLimitValues :: Lens' AdditionalLimit [Text]
+alLimitValues = lens _alLimitValues (\ s a -> s{_alLimitValues = a}) . _Default . _Coerce;
+
+instance FromJSON AdditionalLimit where
+        parseJSON
+          = withObject "AdditionalLimit"
+              (\ x ->
+                 AdditionalLimit' <$>
+                   (x .:? "LimitName") <*>
+                     (x .:? "LimitValues" .!= mempty))
+
+instance Hashable AdditionalLimit where
+
+instance NFData AdditionalLimit where
+
 -- | Status of the advanced options for the specified Elasticsearch domain. Currently, the following advanced options are available:
 --
 --
@@ -77,10 +120,11 @@
 --
 -- /See:/ 'advancedOptionsStatus' smart constructor.
 data AdvancedOptionsStatus = AdvancedOptionsStatus'
-    { _aosOptions :: !(Map Text Text)
-    , _aosStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _aosOptions :: !(Map Text Text)
+  , _aosStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'AdvancedOptionsStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -92,11 +136,9 @@
     :: OptionStatus -- ^ 'aosStatus'
     -> AdvancedOptionsStatus
 advancedOptionsStatus pStatus_ =
-    AdvancedOptionsStatus'
-    { _aosOptions = mempty
-    , _aosStatus = pStatus_
-    }
+  AdvancedOptionsStatus' {_aosOptions = mempty, _aosStatus = pStatus_}
 
+
 -- | Specifies the status of advanced options for the specified Elasticsearch domain.
 aosOptions :: Lens' AdvancedOptionsStatus (HashMap Text Text)
 aosOptions = lens _aosOptions (\ s a -> s{_aosOptions = a}) . _Map;
@@ -112,15 +154,16 @@
                  AdvancedOptionsStatus' <$>
                    (x .:? "Options" .!= mempty) <*> (x .: "Status"))
 
-instance Hashable AdvancedOptionsStatus
+instance Hashable AdvancedOptionsStatus where
 
-instance NFData AdvancedOptionsStatus
+instance NFData AdvancedOptionsStatus where
 
 -- | /See:/ 'domainInfo' smart constructor.
 newtype DomainInfo = DomainInfo'
-    { _diDomainName :: Maybe Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _diDomainName :: Maybe Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'DomainInfo' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -128,11 +171,9 @@
 -- * 'diDomainName' - Specifies the @DomainName@ .
 domainInfo
     :: DomainInfo
-domainInfo =
-    DomainInfo'
-    { _diDomainName = Nothing
-    }
+domainInfo = DomainInfo' {_diDomainName = Nothing}
 
+
 -- | Specifies the @DomainName@ .
 diDomainName :: Lens' DomainInfo (Maybe Text)
 diDomainName = lens _diDomainName (\ s a -> s{_diDomainName = a});
@@ -142,9 +183,9 @@
           = withObject "DomainInfo"
               (\ x -> DomainInfo' <$> (x .:? "DomainName"))
 
-instance Hashable DomainInfo
+instance Hashable DomainInfo where
 
-instance NFData DomainInfo
+instance NFData DomainInfo where
 
 -- | Options to enable, disable, and specify the properties of EBS storage volumes. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-ebs Configuring EBS-based Storage> .
 --
@@ -152,12 +193,13 @@
 --
 -- /See:/ 'ebsOptions' smart constructor.
 data EBSOptions = EBSOptions'
-    { _eoVolumeSize :: !(Maybe Int)
-    , _eoIOPS       :: !(Maybe Int)
-    , _eoVolumeType :: !(Maybe VolumeType)
-    , _eoEBSEnabled :: !(Maybe Bool)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _eoVolumeSize :: !(Maybe Int)
+  , _eoIOPS       :: !(Maybe Int)
+  , _eoVolumeType :: !(Maybe VolumeType)
+  , _eoEBSEnabled :: !(Maybe Bool)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'EBSOptions' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -172,13 +214,14 @@
 ebsOptions
     :: EBSOptions
 ebsOptions =
-    EBSOptions'
-    { _eoVolumeSize = Nothing
-    , _eoIOPS = Nothing
-    , _eoVolumeType = Nothing
-    , _eoEBSEnabled = Nothing
-    }
+  EBSOptions'
+  { _eoVolumeSize = Nothing
+  , _eoIOPS = Nothing
+  , _eoVolumeType = Nothing
+  , _eoEBSEnabled = Nothing
+  }
 
+
 -- | Integer to specify the size of an EBS volume.
 eoVolumeSize :: Lens' EBSOptions (Maybe Int)
 eoVolumeSize = lens _eoVolumeSize (\ s a -> s{_eoVolumeSize = a});
@@ -204,9 +247,9 @@
                      (x .:? "VolumeType")
                      <*> (x .:? "EBSEnabled"))
 
-instance Hashable EBSOptions
+instance Hashable EBSOptions where
 
-instance NFData EBSOptions
+instance NFData EBSOptions where
 
 instance ToJSON EBSOptions where
         toJSON EBSOptions'{..}
@@ -223,10 +266,11 @@
 --
 -- /See:/ 'ebsOptionsStatus' smart constructor.
 data EBSOptionsStatus = EBSOptionsStatus'
-    { _eosOptions :: !EBSOptions
-    , _eosStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _eosOptions :: !EBSOptions
+  , _eosStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'EBSOptionsStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -239,11 +283,9 @@
     -> OptionStatus -- ^ 'eosStatus'
     -> EBSOptionsStatus
 ebsOptionsStatus pOptions_ pStatus_ =
-    EBSOptionsStatus'
-    { _eosOptions = pOptions_
-    , _eosStatus = pStatus_
-    }
+  EBSOptionsStatus' {_eosOptions = pOptions_, _eosStatus = pStatus_}
 
+
 -- | Specifies the EBS options for the specified Elasticsearch domain.
 eosOptions :: Lens' EBSOptionsStatus EBSOptions
 eosOptions = lens _eosOptions (\ s a -> s{_eosOptions = a});
@@ -259,9 +301,9 @@
                  EBSOptionsStatus' <$>
                    (x .: "Options") <*> (x .: "Status"))
 
-instance Hashable EBSOptionsStatus
+instance Hashable EBSOptionsStatus where
 
-instance NFData EBSOptionsStatus
+instance NFData EBSOptionsStatus where
 
 -- | Specifies the configuration for the domain cluster, such as the type and number of instances.
 --
@@ -269,14 +311,15 @@
 --
 -- /See:/ 'elasticsearchClusterConfig' smart constructor.
 data ElasticsearchClusterConfig = ElasticsearchClusterConfig'
-    { _eccDedicatedMasterCount   :: !(Maybe Int)
-    , _eccDedicatedMasterType    :: !(Maybe ESPartitionInstanceType)
-    , _eccDedicatedMasterEnabled :: !(Maybe Bool)
-    , _eccInstanceCount          :: !(Maybe Int)
-    , _eccZoneAwarenessEnabled   :: !(Maybe Bool)
-    , _eccInstanceType           :: !(Maybe ESPartitionInstanceType)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _eccDedicatedMasterCount   :: !(Maybe Int)
+  , _eccDedicatedMasterType    :: !(Maybe ESPartitionInstanceType)
+  , _eccDedicatedMasterEnabled :: !(Maybe Bool)
+  , _eccInstanceCount          :: !(Maybe Int)
+  , _eccZoneAwarenessEnabled   :: !(Maybe Bool)
+  , _eccInstanceType           :: !(Maybe ESPartitionInstanceType)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ElasticsearchClusterConfig' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -295,15 +338,16 @@
 elasticsearchClusterConfig
     :: ElasticsearchClusterConfig
 elasticsearchClusterConfig =
-    ElasticsearchClusterConfig'
-    { _eccDedicatedMasterCount = Nothing
-    , _eccDedicatedMasterType = Nothing
-    , _eccDedicatedMasterEnabled = Nothing
-    , _eccInstanceCount = Nothing
-    , _eccZoneAwarenessEnabled = Nothing
-    , _eccInstanceType = Nothing
-    }
+  ElasticsearchClusterConfig'
+  { _eccDedicatedMasterCount = Nothing
+  , _eccDedicatedMasterType = Nothing
+  , _eccDedicatedMasterEnabled = Nothing
+  , _eccInstanceCount = Nothing
+  , _eccZoneAwarenessEnabled = Nothing
+  , _eccInstanceType = Nothing
+  }
 
+
 -- | Total number of dedicated master nodes, active and on standby, for the cluster.
 eccDedicatedMasterCount :: Lens' ElasticsearchClusterConfig (Maybe Int)
 eccDedicatedMasterCount = lens _eccDedicatedMasterCount (\ s a -> s{_eccDedicatedMasterCount = a});
@@ -340,9 +384,9 @@
                      <*> (x .:? "ZoneAwarenessEnabled")
                      <*> (x .:? "InstanceType"))
 
-instance Hashable ElasticsearchClusterConfig
+instance Hashable ElasticsearchClusterConfig where
 
-instance NFData ElasticsearchClusterConfig
+instance NFData ElasticsearchClusterConfig where
 
 instance ToJSON ElasticsearchClusterConfig where
         toJSON ElasticsearchClusterConfig'{..}
@@ -365,10 +409,11 @@
 --
 -- /See:/ 'elasticsearchClusterConfigStatus' smart constructor.
 data ElasticsearchClusterConfigStatus = ElasticsearchClusterConfigStatus'
-    { _eccsOptions :: !ElasticsearchClusterConfig
-    , _eccsStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _eccsOptions :: !ElasticsearchClusterConfig
+  , _eccsStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ElasticsearchClusterConfigStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -381,11 +426,10 @@
     -> OptionStatus -- ^ 'eccsStatus'
     -> ElasticsearchClusterConfigStatus
 elasticsearchClusterConfigStatus pOptions_ pStatus_ =
-    ElasticsearchClusterConfigStatus'
-    { _eccsOptions = pOptions_
-    , _eccsStatus = pStatus_
-    }
+  ElasticsearchClusterConfigStatus'
+  {_eccsOptions = pOptions_, _eccsStatus = pStatus_}
 
+
 -- | Specifies the cluster configuration for the specified Elasticsearch domain.
 eccsOptions :: Lens' ElasticsearchClusterConfigStatus ElasticsearchClusterConfig
 eccsOptions = lens _eccsOptions (\ s a -> s{_eccsOptions = a});
@@ -403,8 +447,10 @@
                    (x .: "Options") <*> (x .: "Status"))
 
 instance Hashable ElasticsearchClusterConfigStatus
+         where
 
 instance NFData ElasticsearchClusterConfigStatus
+         where
 
 -- | The configuration of an Elasticsearch domain.
 --
@@ -412,14 +458,17 @@
 --
 -- /See:/ 'elasticsearchDomainConfig' smart constructor.
 data ElasticsearchDomainConfig = ElasticsearchDomainConfig'
-    { _edcEBSOptions                 :: !(Maybe EBSOptionsStatus)
-    , _edcAccessPolicies             :: !(Maybe AccessPoliciesStatus)
-    , _edcElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfigStatus)
-    , _edcSnapshotOptions            :: !(Maybe SnapshotOptionsStatus)
-    , _edcAdvancedOptions            :: !(Maybe AdvancedOptionsStatus)
-    , _edcElasticsearchVersion       :: !(Maybe ElasticsearchVersionStatus)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _edcEBSOptions                 :: !(Maybe EBSOptionsStatus)
+  , _edcAccessPolicies             :: !(Maybe AccessPoliciesStatus)
+  , _edcLogPublishingOptions       :: !(Maybe LogPublishingOptionsStatus)
+  , _edcElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfigStatus)
+  , _edcSnapshotOptions            :: !(Maybe SnapshotOptionsStatus)
+  , _edcVPCOptions                 :: !(Maybe VPCDerivedInfoStatus)
+  , _edcAdvancedOptions            :: !(Maybe AdvancedOptionsStatus)
+  , _edcElasticsearchVersion       :: !(Maybe ElasticsearchVersionStatus)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ElasticsearchDomainConfig' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -428,25 +477,32 @@
 --
 -- * 'edcAccessPolicies' - IAM access policy as a JSON-formatted string.
 --
+-- * 'edcLogPublishingOptions' - Log publishing options for the given domain.
+--
 -- * 'edcElasticsearchClusterConfig' - Specifies the @ElasticsearchClusterConfig@ for the Elasticsearch domain.
 --
 -- * 'edcSnapshotOptions' - Specifies the @SnapshotOptions@ for the Elasticsearch domain.
 --
+-- * 'edcVPCOptions' - The @VPCOptions@ for the specified domain. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+--
 -- * 'edcAdvancedOptions' - Specifies the @AdvancedOptions@ for the domain. See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuring Advanced Options> for more information.
 --
 -- * 'edcElasticsearchVersion' - String of format X.Y to specify version for the Elasticsearch domain.
 elasticsearchDomainConfig
     :: ElasticsearchDomainConfig
 elasticsearchDomainConfig =
-    ElasticsearchDomainConfig'
-    { _edcEBSOptions = Nothing
-    , _edcAccessPolicies = Nothing
-    , _edcElasticsearchClusterConfig = Nothing
-    , _edcSnapshotOptions = Nothing
-    , _edcAdvancedOptions = Nothing
-    , _edcElasticsearchVersion = Nothing
-    }
+  ElasticsearchDomainConfig'
+  { _edcEBSOptions = Nothing
+  , _edcAccessPolicies = Nothing
+  , _edcLogPublishingOptions = Nothing
+  , _edcElasticsearchClusterConfig = Nothing
+  , _edcSnapshotOptions = Nothing
+  , _edcVPCOptions = Nothing
+  , _edcAdvancedOptions = Nothing
+  , _edcElasticsearchVersion = Nothing
+  }
 
+
 -- | Specifies the @EBSOptions@ for the Elasticsearch domain.
 edcEBSOptions :: Lens' ElasticsearchDomainConfig (Maybe EBSOptionsStatus)
 edcEBSOptions = lens _edcEBSOptions (\ s a -> s{_edcEBSOptions = a});
@@ -455,6 +511,10 @@
 edcAccessPolicies :: Lens' ElasticsearchDomainConfig (Maybe AccessPoliciesStatus)
 edcAccessPolicies = lens _edcAccessPolicies (\ s a -> s{_edcAccessPolicies = a});
 
+-- | Log publishing options for the given domain.
+edcLogPublishingOptions :: Lens' ElasticsearchDomainConfig (Maybe LogPublishingOptionsStatus)
+edcLogPublishingOptions = lens _edcLogPublishingOptions (\ s a -> s{_edcLogPublishingOptions = a});
+
 -- | Specifies the @ElasticsearchClusterConfig@ for the Elasticsearch domain.
 edcElasticsearchClusterConfig :: Lens' ElasticsearchDomainConfig (Maybe ElasticsearchClusterConfigStatus)
 edcElasticsearchClusterConfig = lens _edcElasticsearchClusterConfig (\ s a -> s{_edcElasticsearchClusterConfig = a});
@@ -463,6 +523,10 @@
 edcSnapshotOptions :: Lens' ElasticsearchDomainConfig (Maybe SnapshotOptionsStatus)
 edcSnapshotOptions = lens _edcSnapshotOptions (\ s a -> s{_edcSnapshotOptions = a});
 
+-- | The @VPCOptions@ for the specified domain. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+edcVPCOptions :: Lens' ElasticsearchDomainConfig (Maybe VPCDerivedInfoStatus)
+edcVPCOptions = lens _edcVPCOptions (\ s a -> s{_edcVPCOptions = a});
+
 -- | Specifies the @AdvancedOptions@ for the domain. See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuring Advanced Options> for more information.
 edcAdvancedOptions :: Lens' ElasticsearchDomainConfig (Maybe AdvancedOptionsStatus)
 edcAdvancedOptions = lens _edcAdvancedOptions (\ s a -> s{_edcAdvancedOptions = a});
@@ -477,14 +541,16 @@
               (\ x ->
                  ElasticsearchDomainConfig' <$>
                    (x .:? "EBSOptions") <*> (x .:? "AccessPolicies") <*>
-                     (x .:? "ElasticsearchClusterConfig")
+                     (x .:? "LogPublishingOptions")
+                     <*> (x .:? "ElasticsearchClusterConfig")
                      <*> (x .:? "SnapshotOptions")
+                     <*> (x .:? "VPCOptions")
                      <*> (x .:? "AdvancedOptions")
                      <*> (x .:? "ElasticsearchVersion"))
 
-instance Hashable ElasticsearchDomainConfig
+instance Hashable ElasticsearchDomainConfig where
 
-instance NFData ElasticsearchDomainConfig
+instance NFData ElasticsearchDomainConfig where
 
 -- | The current status of an Elasticsearch domain.
 --
@@ -492,21 +558,25 @@
 --
 -- /See:/ 'elasticsearchDomainStatus' smart constructor.
 data ElasticsearchDomainStatus = ElasticsearchDomainStatus'
-    { _edsEBSOptions                 :: !(Maybe EBSOptions)
-    , _edsAccessPolicies             :: !(Maybe Text)
-    , _edsCreated                    :: !(Maybe Bool)
-    , _edsSnapshotOptions            :: !(Maybe SnapshotOptions)
-    , _edsDeleted                    :: !(Maybe Bool)
-    , _edsProcessing                 :: !(Maybe Bool)
-    , _edsEndpoint                   :: !(Maybe Text)
-    , _edsAdvancedOptions            :: !(Maybe (Map Text Text))
-    , _edsElasticsearchVersion       :: !(Maybe Text)
-    , _edsDomainId                   :: !Text
-    , _edsDomainName                 :: !Text
-    , _edsARN                        :: !Text
-    , _edsElasticsearchClusterConfig :: !ElasticsearchClusterConfig
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _edsEBSOptions                 :: !(Maybe EBSOptions)
+  , _edsAccessPolicies             :: !(Maybe Text)
+  , _edsLogPublishingOptions       :: !(Maybe (Map LogType LogPublishingOption))
+  , _edsCreated                    :: !(Maybe Bool)
+  , _edsSnapshotOptions            :: !(Maybe SnapshotOptions)
+  , _edsDeleted                    :: !(Maybe Bool)
+  , _edsVPCOptions                 :: !(Maybe VPCDerivedInfo)
+  , _edsEndpoints                  :: !(Maybe (Map Text Text))
+  , _edsProcessing                 :: !(Maybe Bool)
+  , _edsEndpoint                   :: !(Maybe Text)
+  , _edsAdvancedOptions            :: !(Maybe (Map Text Text))
+  , _edsElasticsearchVersion       :: !(Maybe Text)
+  , _edsDomainId                   :: !Text
+  , _edsDomainName                 :: !Text
+  , _edsARN                        :: !Text
+  , _edsElasticsearchClusterConfig :: !ElasticsearchClusterConfig
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ElasticsearchDomainStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -515,12 +585,18 @@
 --
 -- * 'edsAccessPolicies' - IAM access policy as a JSON-formatted string.
 --
+-- * 'edsLogPublishingOptions' - Log publishing options for the given domain.
+--
 -- * 'edsCreated' - The domain creation status. @True@ if the creation of an Elasticsearch domain is complete. @False@ if domain creation is still in progress.
 --
 -- * 'edsSnapshotOptions' - Specifies the status of the @SnapshotOptions@
 --
 -- * 'edsDeleted' - The domain deletion status. @True@ if a delete request has been received for the domain but resource cleanup is still in progress. @False@ if the domain has not been deleted. Once domain deletion is complete, the status of the domain is no longer returned.
 --
+-- * 'edsVPCOptions' - The @VPCOptions@ for the specified domain. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+--
+-- * 'edsEndpoints' - Map containing the Elasticsearch domain endpoints used to submit index and search requests. Example @key, value@ : @'vpc','vpc-endpoint-h2dsd34efgyghrtguk5gt6j2foh4.us-east-1.es.amazonaws.com'@ .
+--
 -- * 'edsProcessing' - The status of the Elasticsearch domain configuration. @True@ if Amazon Elasticsearch Service is processing configuration changes. @False@ if the configuration is active.
 --
 -- * 'edsEndpoint' - The Elasticsearch domain endpoint that you use to submit index and search requests.
@@ -543,22 +619,26 @@
     -> ElasticsearchClusterConfig -- ^ 'edsElasticsearchClusterConfig'
     -> ElasticsearchDomainStatus
 elasticsearchDomainStatus pDomainId_ pDomainName_ pARN_ pElasticsearchClusterConfig_ =
-    ElasticsearchDomainStatus'
-    { _edsEBSOptions = Nothing
-    , _edsAccessPolicies = Nothing
-    , _edsCreated = Nothing
-    , _edsSnapshotOptions = Nothing
-    , _edsDeleted = Nothing
-    , _edsProcessing = Nothing
-    , _edsEndpoint = Nothing
-    , _edsAdvancedOptions = Nothing
-    , _edsElasticsearchVersion = Nothing
-    , _edsDomainId = pDomainId_
-    , _edsDomainName = pDomainName_
-    , _edsARN = pARN_
-    , _edsElasticsearchClusterConfig = pElasticsearchClusterConfig_
-    }
+  ElasticsearchDomainStatus'
+  { _edsEBSOptions = Nothing
+  , _edsAccessPolicies = Nothing
+  , _edsLogPublishingOptions = Nothing
+  , _edsCreated = Nothing
+  , _edsSnapshotOptions = Nothing
+  , _edsDeleted = Nothing
+  , _edsVPCOptions = Nothing
+  , _edsEndpoints = Nothing
+  , _edsProcessing = Nothing
+  , _edsEndpoint = Nothing
+  , _edsAdvancedOptions = Nothing
+  , _edsElasticsearchVersion = Nothing
+  , _edsDomainId = pDomainId_
+  , _edsDomainName = pDomainName_
+  , _edsARN = pARN_
+  , _edsElasticsearchClusterConfig = pElasticsearchClusterConfig_
+  }
 
+
 -- | The @EBSOptions@ for the specified domain. See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-ebs Configuring EBS-based Storage> for more information.
 edsEBSOptions :: Lens' ElasticsearchDomainStatus (Maybe EBSOptions)
 edsEBSOptions = lens _edsEBSOptions (\ s a -> s{_edsEBSOptions = a});
@@ -567,6 +647,10 @@
 edsAccessPolicies :: Lens' ElasticsearchDomainStatus (Maybe Text)
 edsAccessPolicies = lens _edsAccessPolicies (\ s a -> s{_edsAccessPolicies = a});
 
+-- | Log publishing options for the given domain.
+edsLogPublishingOptions :: Lens' ElasticsearchDomainStatus (HashMap LogType LogPublishingOption)
+edsLogPublishingOptions = lens _edsLogPublishingOptions (\ s a -> s{_edsLogPublishingOptions = a}) . _Default . _Map;
+
 -- | The domain creation status. @True@ if the creation of an Elasticsearch domain is complete. @False@ if domain creation is still in progress.
 edsCreated :: Lens' ElasticsearchDomainStatus (Maybe Bool)
 edsCreated = lens _edsCreated (\ s a -> s{_edsCreated = a});
@@ -579,6 +663,14 @@
 edsDeleted :: Lens' ElasticsearchDomainStatus (Maybe Bool)
 edsDeleted = lens _edsDeleted (\ s a -> s{_edsDeleted = a});
 
+-- | The @VPCOptions@ for the specified domain. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+edsVPCOptions :: Lens' ElasticsearchDomainStatus (Maybe VPCDerivedInfo)
+edsVPCOptions = lens _edsVPCOptions (\ s a -> s{_edsVPCOptions = a});
+
+-- | Map containing the Elasticsearch domain endpoints used to submit index and search requests. Example @key, value@ : @'vpc','vpc-endpoint-h2dsd34efgyghrtguk5gt6j2foh4.us-east-1.es.amazonaws.com'@ .
+edsEndpoints :: Lens' ElasticsearchDomainStatus (HashMap Text Text)
+edsEndpoints = lens _edsEndpoints (\ s a -> s{_edsEndpoints = a}) . _Default . _Map;
+
 -- | The status of the Elasticsearch domain configuration. @True@ if Amazon Elasticsearch Service is processing configuration changes. @False@ if the configuration is active.
 edsProcessing :: Lens' ElasticsearchDomainStatus (Maybe Bool)
 edsProcessing = lens _edsProcessing (\ s a -> s{_edsProcessing = a});
@@ -617,9 +709,12 @@
               (\ x ->
                  ElasticsearchDomainStatus' <$>
                    (x .:? "EBSOptions") <*> (x .:? "AccessPolicies") <*>
-                     (x .:? "Created")
+                     (x .:? "LogPublishingOptions" .!= mempty)
+                     <*> (x .:? "Created")
                      <*> (x .:? "SnapshotOptions")
                      <*> (x .:? "Deleted")
+                     <*> (x .:? "VPCOptions")
+                     <*> (x .:? "Endpoints" .!= mempty)
                      <*> (x .:? "Processing")
                      <*> (x .:? "Endpoint")
                      <*> (x .:? "AdvancedOptions" .!= mempty)
@@ -629,9 +724,9 @@
                      <*> (x .: "ARN")
                      <*> (x .: "ElasticsearchClusterConfig"))
 
-instance Hashable ElasticsearchDomainStatus
+instance Hashable ElasticsearchDomainStatus where
 
-instance NFData ElasticsearchDomainStatus
+instance NFData ElasticsearchDomainStatus where
 
 -- | Status of the Elasticsearch version options for the specified Elasticsearch domain.
 --
@@ -639,10 +734,11 @@
 --
 -- /See:/ 'elasticsearchVersionStatus' smart constructor.
 data ElasticsearchVersionStatus = ElasticsearchVersionStatus'
-    { _evsOptions :: !Text
-    , _evsStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _evsOptions :: !Text
+  , _evsStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'ElasticsearchVersionStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -655,11 +751,9 @@
     -> OptionStatus -- ^ 'evsStatus'
     -> ElasticsearchVersionStatus
 elasticsearchVersionStatus pOptions_ pStatus_ =
-    ElasticsearchVersionStatus'
-    { _evsOptions = pOptions_
-    , _evsStatus = pStatus_
-    }
+  ElasticsearchVersionStatus' {_evsOptions = pOptions_, _evsStatus = pStatus_}
 
+
 -- | Specifies the Elasticsearch version for the specified Elasticsearch domain.
 evsOptions :: Lens' ElasticsearchVersionStatus Text
 evsOptions = lens _evsOptions (\ s a -> s{_evsOptions = a});
@@ -675,23 +769,259 @@
                  ElasticsearchVersionStatus' <$>
                    (x .: "Options") <*> (x .: "Status"))
 
-instance Hashable ElasticsearchVersionStatus
+instance Hashable ElasticsearchVersionStatus where
 
-instance NFData ElasticsearchVersionStatus
+instance NFData ElasticsearchVersionStatus where
 
+-- | InstanceCountLimits represents the limits on number of instances that be created in Amazon Elasticsearch for given InstanceType.
+--
+--
+--
+-- /See:/ 'instanceCountLimits' smart constructor.
+data InstanceCountLimits = InstanceCountLimits'
+  { _iclMaximumInstanceCount :: !(Maybe Int)
+  , _iclMinimumInstanceCount :: !(Maybe Int)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'InstanceCountLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iclMaximumInstanceCount' - Undocumented member.
+--
+-- * 'iclMinimumInstanceCount' - Undocumented member.
+instanceCountLimits
+    :: InstanceCountLimits
+instanceCountLimits =
+  InstanceCountLimits'
+  {_iclMaximumInstanceCount = Nothing, _iclMinimumInstanceCount = Nothing}
+
+
+-- | Undocumented member.
+iclMaximumInstanceCount :: Lens' InstanceCountLimits (Maybe Int)
+iclMaximumInstanceCount = lens _iclMaximumInstanceCount (\ s a -> s{_iclMaximumInstanceCount = a});
+
+-- | Undocumented member.
+iclMinimumInstanceCount :: Lens' InstanceCountLimits (Maybe Int)
+iclMinimumInstanceCount = lens _iclMinimumInstanceCount (\ s a -> s{_iclMinimumInstanceCount = a});
+
+instance FromJSON InstanceCountLimits where
+        parseJSON
+          = withObject "InstanceCountLimits"
+              (\ x ->
+                 InstanceCountLimits' <$>
+                   (x .:? "MaximumInstanceCount") <*>
+                     (x .:? "MinimumInstanceCount"))
+
+instance Hashable InstanceCountLimits where
+
+instance NFData InstanceCountLimits where
+
+-- | InstanceLimits represents the list of instance related attributes that are available for given InstanceType.
+--
+--
+--
+-- /See:/ 'instanceLimits' smart constructor.
+newtype InstanceLimits = InstanceLimits'
+  { _ilInstanceCountLimits :: Maybe InstanceCountLimits
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'InstanceLimits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ilInstanceCountLimits' - Undocumented member.
+instanceLimits
+    :: InstanceLimits
+instanceLimits = InstanceLimits' {_ilInstanceCountLimits = Nothing}
+
+
+-- | Undocumented member.
+ilInstanceCountLimits :: Lens' InstanceLimits (Maybe InstanceCountLimits)
+ilInstanceCountLimits = lens _ilInstanceCountLimits (\ s a -> s{_ilInstanceCountLimits = a});
+
+instance FromJSON InstanceLimits where
+        parseJSON
+          = withObject "InstanceLimits"
+              (\ x ->
+                 InstanceLimits' <$> (x .:? "InstanceCountLimits"))
+
+instance Hashable InstanceLimits where
+
+instance NFData InstanceLimits where
+
+-- | Limits for given InstanceType and for each of it's role.
+--
+-- Limits contains following @'StorageTypes,' @ @'InstanceLimits' @ and @'AdditionalLimits' @
+--
+--
+-- /See:/ 'limits' smart constructor.
+data Limits = Limits'
+  { _lInstanceLimits   :: !(Maybe InstanceLimits)
+  , _lAdditionalLimits :: !(Maybe [AdditionalLimit])
+  , _lStorageTypes     :: !(Maybe [StorageType])
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'Limits' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lInstanceLimits' - Undocumented member.
+--
+-- * 'lAdditionalLimits' - List of additional limits that are specific to a given InstanceType and for each of it's @'InstanceRole' @ .
+--
+-- * 'lStorageTypes' - StorageType represents the list of storage related types and attributes that are available for given InstanceType.
+limits
+    :: Limits
+limits =
+  Limits'
+  { _lInstanceLimits = Nothing
+  , _lAdditionalLimits = Nothing
+  , _lStorageTypes = Nothing
+  }
+
+
+-- | Undocumented member.
+lInstanceLimits :: Lens' Limits (Maybe InstanceLimits)
+lInstanceLimits = lens _lInstanceLimits (\ s a -> s{_lInstanceLimits = a});
+
+-- | List of additional limits that are specific to a given InstanceType and for each of it's @'InstanceRole' @ .
+lAdditionalLimits :: Lens' Limits [AdditionalLimit]
+lAdditionalLimits = lens _lAdditionalLimits (\ s a -> s{_lAdditionalLimits = a}) . _Default . _Coerce;
+
+-- | StorageType represents the list of storage related types and attributes that are available for given InstanceType.
+lStorageTypes :: Lens' Limits [StorageType]
+lStorageTypes = lens _lStorageTypes (\ s a -> s{_lStorageTypes = a}) . _Default . _Coerce;
+
+instance FromJSON Limits where
+        parseJSON
+          = withObject "Limits"
+              (\ x ->
+                 Limits' <$>
+                   (x .:? "InstanceLimits") <*>
+                     (x .:? "AdditionalLimits" .!= mempty)
+                     <*> (x .:? "StorageTypes" .!= mempty))
+
+instance Hashable Limits where
+
+instance NFData Limits where
+
+-- | Log Publishing option that is set for given domain.
+--
+-- Attributes and their details:     * CloudWatchLogsLogGroupArn: ARN of the Cloudwatch log group to which log needs to be published.    * Enabled: Whether the log publishing for given log type is enabled or not
+--
+--
+--
+--
+-- /See:/ 'logPublishingOption' smart constructor.
+data LogPublishingOption = LogPublishingOption'
+  { _lpoEnabled                   :: !(Maybe Bool)
+  , _lpoCloudWatchLogsLogGroupARN :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'LogPublishingOption' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lpoEnabled' - Specifies whether given log publishing option is enabled or not.
+--
+-- * 'lpoCloudWatchLogsLogGroupARN' - Undocumented member.
+logPublishingOption
+    :: LogPublishingOption
+logPublishingOption =
+  LogPublishingOption'
+  {_lpoEnabled = Nothing, _lpoCloudWatchLogsLogGroupARN = Nothing}
+
+
+-- | Specifies whether given log publishing option is enabled or not.
+lpoEnabled :: Lens' LogPublishingOption (Maybe Bool)
+lpoEnabled = lens _lpoEnabled (\ s a -> s{_lpoEnabled = a});
+
+-- | Undocumented member.
+lpoCloudWatchLogsLogGroupARN :: Lens' LogPublishingOption (Maybe Text)
+lpoCloudWatchLogsLogGroupARN = lens _lpoCloudWatchLogsLogGroupARN (\ s a -> s{_lpoCloudWatchLogsLogGroupARN = a});
+
+instance FromJSON LogPublishingOption where
+        parseJSON
+          = withObject "LogPublishingOption"
+              (\ x ->
+                 LogPublishingOption' <$>
+                   (x .:? "Enabled") <*>
+                     (x .:? "CloudWatchLogsLogGroupArn"))
+
+instance Hashable LogPublishingOption where
+
+instance NFData LogPublishingOption where
+
+instance ToJSON LogPublishingOption where
+        toJSON LogPublishingOption'{..}
+          = object
+              (catMaybes
+                 [("Enabled" .=) <$> _lpoEnabled,
+                  ("CloudWatchLogsLogGroupArn" .=) <$>
+                    _lpoCloudWatchLogsLogGroupARN])
+
+-- | The configured log publishing options for the domain and their current status.
+--
+--
+--
+-- /See:/ 'logPublishingOptionsStatus' smart constructor.
+data LogPublishingOptionsStatus = LogPublishingOptionsStatus'
+  { _lposStatus  :: !(Maybe OptionStatus)
+  , _lposOptions :: !(Maybe (Map LogType LogPublishingOption))
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'LogPublishingOptionsStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lposStatus' - The status of the log publishing options for the Elasticsearch domain. See @OptionStatus@ for the status information that's included.
+--
+-- * 'lposOptions' - The log publishing options configured for the Elasticsearch domain.
+logPublishingOptionsStatus
+    :: LogPublishingOptionsStatus
+logPublishingOptionsStatus =
+  LogPublishingOptionsStatus' {_lposStatus = Nothing, _lposOptions = Nothing}
+
+
+-- | The status of the log publishing options for the Elasticsearch domain. See @OptionStatus@ for the status information that's included.
+lposStatus :: Lens' LogPublishingOptionsStatus (Maybe OptionStatus)
+lposStatus = lens _lposStatus (\ s a -> s{_lposStatus = a});
+
+-- | The log publishing options configured for the Elasticsearch domain.
+lposOptions :: Lens' LogPublishingOptionsStatus (HashMap LogType LogPublishingOption)
+lposOptions = lens _lposOptions (\ s a -> s{_lposOptions = a}) . _Default . _Map;
+
+instance FromJSON LogPublishingOptionsStatus where
+        parseJSON
+          = withObject "LogPublishingOptionsStatus"
+              (\ x ->
+                 LogPublishingOptionsStatus' <$>
+                   (x .:? "Status") <*> (x .:? "Options" .!= mempty))
+
+instance Hashable LogPublishingOptionsStatus where
+
+instance NFData LogPublishingOptionsStatus where
+
 -- | Provides the current status of the entity.
 --
 --
 --
 -- /See:/ 'optionStatus' smart constructor.
 data OptionStatus = OptionStatus'
-    { _osPendingDeletion :: !(Maybe Bool)
-    , _osUpdateVersion   :: !(Maybe Nat)
-    , _osCreationDate    :: !POSIX
-    , _osUpdateDate      :: !POSIX
-    , _osState           :: !OptionState
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _osPendingDeletion :: !(Maybe Bool)
+  , _osUpdateVersion   :: !(Maybe Nat)
+  , _osCreationDate    :: !POSIX
+  , _osUpdateDate      :: !POSIX
+  , _osState           :: !OptionState
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'OptionStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -711,14 +1041,15 @@
     -> OptionState -- ^ 'osState'
     -> OptionStatus
 optionStatus pCreationDate_ pUpdateDate_ pState_ =
-    OptionStatus'
-    { _osPendingDeletion = Nothing
-    , _osUpdateVersion = Nothing
-    , _osCreationDate = _Time # pCreationDate_
-    , _osUpdateDate = _Time # pUpdateDate_
-    , _osState = pState_
-    }
+  OptionStatus'
+  { _osPendingDeletion = Nothing
+  , _osUpdateVersion = Nothing
+  , _osCreationDate = _Time # pCreationDate_
+  , _osUpdateDate = _Time # pUpdateDate_
+  , _osState = pState_
+  }
 
+
 -- | Indicates whether the Elasticsearch domain is being deleted.
 osPendingDeletion :: Lens' OptionStatus (Maybe Bool)
 osPendingDeletion = lens _osPendingDeletion (\ s a -> s{_osPendingDeletion = a});
@@ -749,9 +1080,9 @@
                      <*> (x .: "UpdateDate")
                      <*> (x .: "State"))
 
-instance Hashable OptionStatus
+instance Hashable OptionStatus where
 
-instance NFData OptionStatus
+instance NFData OptionStatus where
 
 -- | Specifies the time, in UTC format, when the service takes a daily automated snapshot of the specified Elasticsearch domain. Default value is @0@ hours.
 --
@@ -759,9 +1090,10 @@
 --
 -- /See:/ 'snapshotOptions' smart constructor.
 newtype SnapshotOptions = SnapshotOptions'
-    { _soAutomatedSnapshotStartHour :: Maybe Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _soAutomatedSnapshotStartHour :: Maybe Int
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'SnapshotOptions' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -769,11 +1101,9 @@
 -- * 'soAutomatedSnapshotStartHour' - Specifies the time, in UTC format, when the service takes a daily automated snapshot of the specified Elasticsearch domain. Default value is @0@ hours.
 snapshotOptions
     :: SnapshotOptions
-snapshotOptions =
-    SnapshotOptions'
-    { _soAutomatedSnapshotStartHour = Nothing
-    }
+snapshotOptions = SnapshotOptions' {_soAutomatedSnapshotStartHour = Nothing}
 
+
 -- | Specifies the time, in UTC format, when the service takes a daily automated snapshot of the specified Elasticsearch domain. Default value is @0@ hours.
 soAutomatedSnapshotStartHour :: Lens' SnapshotOptions (Maybe Int)
 soAutomatedSnapshotStartHour = lens _soAutomatedSnapshotStartHour (\ s a -> s{_soAutomatedSnapshotStartHour = a});
@@ -785,9 +1115,9 @@
                  SnapshotOptions' <$>
                    (x .:? "AutomatedSnapshotStartHour"))
 
-instance Hashable SnapshotOptions
+instance Hashable SnapshotOptions where
 
-instance NFData SnapshotOptions
+instance NFData SnapshotOptions where
 
 instance ToJSON SnapshotOptions where
         toJSON SnapshotOptions'{..}
@@ -802,10 +1132,11 @@
 --
 -- /See:/ 'snapshotOptionsStatus' smart constructor.
 data SnapshotOptionsStatus = SnapshotOptionsStatus'
-    { _sosOptions :: !SnapshotOptions
-    , _sosStatus  :: !OptionStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _sosOptions :: !SnapshotOptions
+  , _sosStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'SnapshotOptionsStatus' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -818,11 +1149,9 @@
     -> OptionStatus -- ^ 'sosStatus'
     -> SnapshotOptionsStatus
 snapshotOptionsStatus pOptions_ pStatus_ =
-    SnapshotOptionsStatus'
-    { _sosOptions = pOptions_
-    , _sosStatus = pStatus_
-    }
+  SnapshotOptionsStatus' {_sosOptions = pOptions_, _sosStatus = pStatus_}
 
+
 -- | Specifies the daily snapshot options specified for the Elasticsearch domain.
 sosOptions :: Lens' SnapshotOptionsStatus SnapshotOptions
 sosOptions = lens _sosOptions (\ s a -> s{_sosOptions = a});
@@ -838,20 +1167,121 @@
                  SnapshotOptionsStatus' <$>
                    (x .: "Options") <*> (x .: "Status"))
 
-instance Hashable SnapshotOptionsStatus
+instance Hashable SnapshotOptionsStatus where
 
-instance NFData SnapshotOptionsStatus
+instance NFData SnapshotOptionsStatus where
 
+-- | StorageTypes represents the list of storage related types and their attributes that are available for given InstanceType.
+--
+--
+--
+-- /See:/ 'storageType' smart constructor.
+data StorageType = StorageType'
+  { _stStorageTypeLimits  :: !(Maybe [StorageTypeLimit])
+  , _stStorageSubTypeName :: !(Maybe Text)
+  , _stStorageTypeName    :: !(Maybe Text)
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'StorageType' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'stStorageTypeLimits' - List of limits that are applicable for given storage type.
+--
+-- * 'stStorageSubTypeName' - Undocumented member.
+--
+-- * 'stStorageTypeName' - Undocumented member.
+storageType
+    :: StorageType
+storageType =
+  StorageType'
+  { _stStorageTypeLimits = Nothing
+  , _stStorageSubTypeName = Nothing
+  , _stStorageTypeName = Nothing
+  }
+
+
+-- | List of limits that are applicable for given storage type.
+stStorageTypeLimits :: Lens' StorageType [StorageTypeLimit]
+stStorageTypeLimits = lens _stStorageTypeLimits (\ s a -> s{_stStorageTypeLimits = a}) . _Default . _Coerce;
+
+-- | Undocumented member.
+stStorageSubTypeName :: Lens' StorageType (Maybe Text)
+stStorageSubTypeName = lens _stStorageSubTypeName (\ s a -> s{_stStorageSubTypeName = a});
+
+-- | Undocumented member.
+stStorageTypeName :: Lens' StorageType (Maybe Text)
+stStorageTypeName = lens _stStorageTypeName (\ s a -> s{_stStorageTypeName = a});
+
+instance FromJSON StorageType where
+        parseJSON
+          = withObject "StorageType"
+              (\ x ->
+                 StorageType' <$>
+                   (x .:? "StorageTypeLimits" .!= mempty) <*>
+                     (x .:? "StorageSubTypeName")
+                     <*> (x .:? "StorageTypeName"))
+
+instance Hashable StorageType where
+
+instance NFData StorageType where
+
+-- | Limits that are applicable for given storage type.
+--
+--
+--
+-- /See:/ 'storageTypeLimit' smart constructor.
+data StorageTypeLimit = StorageTypeLimit'
+  { _stlLimitName   :: !(Maybe Text)
+  , _stlLimitValues :: !(Maybe [Text])
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'StorageTypeLimit' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'stlLimitName' - Name of storage limits that are applicable for given storage type. If @'StorageType' @ is ebs, following storage options are applicable     * MinimumVolumeSizeMinimum amount of volume size that is applicable for given storage type.It can be empty if it is not applicable.     * MaximumVolumeSizeMaximum amount of volume size that is applicable for given storage type.It can be empty if it is not applicable.     * MaximumIopsMaximum amount of Iops that is applicable for given storage type.It can be empty if it is not applicable.     * MinimumIopsMinimum amount of Iops that is applicable for given storage type.It can be empty if it is not applicable.
+--
+-- * 'stlLimitValues' - Values for the @'StorageTypeLimit$LimitName' @ .
+storageTypeLimit
+    :: StorageTypeLimit
+storageTypeLimit =
+  StorageTypeLimit' {_stlLimitName = Nothing, _stlLimitValues = Nothing}
+
+
+-- | Name of storage limits that are applicable for given storage type. If @'StorageType' @ is ebs, following storage options are applicable     * MinimumVolumeSizeMinimum amount of volume size that is applicable for given storage type.It can be empty if it is not applicable.     * MaximumVolumeSizeMaximum amount of volume size that is applicable for given storage type.It can be empty if it is not applicable.     * MaximumIopsMaximum amount of Iops that is applicable for given storage type.It can be empty if it is not applicable.     * MinimumIopsMinimum amount of Iops that is applicable for given storage type.It can be empty if it is not applicable.
+stlLimitName :: Lens' StorageTypeLimit (Maybe Text)
+stlLimitName = lens _stlLimitName (\ s a -> s{_stlLimitName = a});
+
+-- | Values for the @'StorageTypeLimit$LimitName' @ .
+stlLimitValues :: Lens' StorageTypeLimit [Text]
+stlLimitValues = lens _stlLimitValues (\ s a -> s{_stlLimitValues = a}) . _Default . _Coerce;
+
+instance FromJSON StorageTypeLimit where
+        parseJSON
+          = withObject "StorageTypeLimit"
+              (\ x ->
+                 StorageTypeLimit' <$>
+                   (x .:? "LimitName") <*>
+                     (x .:? "LimitValues" .!= mempty))
+
+instance Hashable StorageTypeLimit where
+
+instance NFData StorageTypeLimit where
+
 -- | Specifies a key value pair for a resource tag.
 --
 --
 --
 -- /See:/ 'tag' smart constructor.
 data Tag = Tag'
-    { _tagKey   :: !Text
-    , _tagValue :: !Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _tagKey   :: !Text
+  , _tagValue :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'Tag' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -863,12 +1293,9 @@
     :: Text -- ^ 'tagKey'
     -> Text -- ^ 'tagValue'
     -> Tag
-tag pKey_ pValue_ =
-    Tag'
-    { _tagKey = pKey_
-    , _tagValue = pValue_
-    }
+tag pKey_ pValue_ = Tag' {_tagKey = pKey_, _tagValue = pValue_}
 
+
 -- | Specifies the @TagKey@ , the name of the tag. Tag keys must be unique for the Elasticsearch domain to which they are attached.
 tagKey :: Lens' Tag Text
 tagKey = lens _tagKey (\ s a -> s{_tagKey = a});
@@ -882,9 +1309,9 @@
           = withObject "Tag"
               (\ x -> Tag' <$> (x .: "Key") <*> (x .: "Value"))
 
-instance Hashable Tag
+instance Hashable Tag where
 
-instance NFData Tag
+instance NFData Tag where
 
 instance ToJSON Tag where
         toJSON Tag'{..}
@@ -892,3 +1319,155 @@
               (catMaybes
                  [Just ("Key" .= _tagKey),
                   Just ("Value" .= _tagValue)])
+
+-- | Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+--
+--
+--
+-- /See:/ 'vpcDerivedInfo' smart constructor.
+data VPCDerivedInfo = VPCDerivedInfo'
+  { _vdiSecurityGroupIds  :: !(Maybe [Text])
+  , _vdiSubnetIds         :: !(Maybe [Text])
+  , _vdiVPCId             :: !(Maybe Text)
+  , _vdiAvailabilityZones :: !(Maybe [Text])
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'VPCDerivedInfo' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vdiSecurityGroupIds' - Specifies the security groups for VPC endpoint.
+--
+-- * 'vdiSubnetIds' - Specifies the subnets for VPC endpoint.
+--
+-- * 'vdiVPCId' - The VPC Id for the Elasticsearch domain. Exists only if the domain was created with VPCOptions.
+--
+-- * 'vdiAvailabilityZones' - The availability zones for the Elasticsearch domain. Exists only if the domain was created with VPCOptions.
+vpcDerivedInfo
+    :: VPCDerivedInfo
+vpcDerivedInfo =
+  VPCDerivedInfo'
+  { _vdiSecurityGroupIds = Nothing
+  , _vdiSubnetIds = Nothing
+  , _vdiVPCId = Nothing
+  , _vdiAvailabilityZones = Nothing
+  }
+
+
+-- | Specifies the security groups for VPC endpoint.
+vdiSecurityGroupIds :: Lens' VPCDerivedInfo [Text]
+vdiSecurityGroupIds = lens _vdiSecurityGroupIds (\ s a -> s{_vdiSecurityGroupIds = a}) . _Default . _Coerce;
+
+-- | Specifies the subnets for VPC endpoint.
+vdiSubnetIds :: Lens' VPCDerivedInfo [Text]
+vdiSubnetIds = lens _vdiSubnetIds (\ s a -> s{_vdiSubnetIds = a}) . _Default . _Coerce;
+
+-- | The VPC Id for the Elasticsearch domain. Exists only if the domain was created with VPCOptions.
+vdiVPCId :: Lens' VPCDerivedInfo (Maybe Text)
+vdiVPCId = lens _vdiVPCId (\ s a -> s{_vdiVPCId = a});
+
+-- | The availability zones for the Elasticsearch domain. Exists only if the domain was created with VPCOptions.
+vdiAvailabilityZones :: Lens' VPCDerivedInfo [Text]
+vdiAvailabilityZones = lens _vdiAvailabilityZones (\ s a -> s{_vdiAvailabilityZones = a}) . _Default . _Coerce;
+
+instance FromJSON VPCDerivedInfo where
+        parseJSON
+          = withObject "VPCDerivedInfo"
+              (\ x ->
+                 VPCDerivedInfo' <$>
+                   (x .:? "SecurityGroupIds" .!= mempty) <*>
+                     (x .:? "SubnetIds" .!= mempty)
+                     <*> (x .:? "VPCId")
+                     <*> (x .:? "AvailabilityZones" .!= mempty))
+
+instance Hashable VPCDerivedInfo where
+
+instance NFData VPCDerivedInfo where
+
+-- | Status of the VPC options for the specified Elasticsearch domain.
+--
+--
+--
+-- /See:/ 'vpcDerivedInfoStatus' smart constructor.
+data VPCDerivedInfoStatus = VPCDerivedInfoStatus'
+  { _vdisOptions :: !VPCDerivedInfo
+  , _vdisStatus  :: !OptionStatus
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'VPCDerivedInfoStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vdisOptions' - Specifies the VPC options for the specified Elasticsearch domain.
+--
+-- * 'vdisStatus' - Specifies the status of the VPC options for the specified Elasticsearch domain.
+vpcDerivedInfoStatus
+    :: VPCDerivedInfo -- ^ 'vdisOptions'
+    -> OptionStatus -- ^ 'vdisStatus'
+    -> VPCDerivedInfoStatus
+vpcDerivedInfoStatus pOptions_ pStatus_ =
+  VPCDerivedInfoStatus' {_vdisOptions = pOptions_, _vdisStatus = pStatus_}
+
+
+-- | Specifies the VPC options for the specified Elasticsearch domain.
+vdisOptions :: Lens' VPCDerivedInfoStatus VPCDerivedInfo
+vdisOptions = lens _vdisOptions (\ s a -> s{_vdisOptions = a});
+
+-- | Specifies the status of the VPC options for the specified Elasticsearch domain.
+vdisStatus :: Lens' VPCDerivedInfoStatus OptionStatus
+vdisStatus = lens _vdisStatus (\ s a -> s{_vdisStatus = a});
+
+instance FromJSON VPCDerivedInfoStatus where
+        parseJSON
+          = withObject "VPCDerivedInfoStatus"
+              (\ x ->
+                 VPCDerivedInfoStatus' <$>
+                   (x .: "Options") <*> (x .: "Status"))
+
+instance Hashable VPCDerivedInfoStatus where
+
+instance NFData VPCDerivedInfoStatus where
+
+-- | Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html VPC Endpoints for Amazon Elasticsearch Service Domains> .
+--
+--
+--
+-- /See:/ 'vpcOptions' smart constructor.
+data VPCOptions = VPCOptions'
+  { _voSecurityGroupIds :: !(Maybe [Text])
+  , _voSubnetIds        :: !(Maybe [Text])
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
+
+
+-- | Creates a value of 'VPCOptions' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'voSecurityGroupIds' - Specifies the security groups for VPC endpoint.
+--
+-- * 'voSubnetIds' - Specifies the subnets for VPC endpoint.
+vpcOptions
+    :: VPCOptions
+vpcOptions = VPCOptions' {_voSecurityGroupIds = Nothing, _voSubnetIds = Nothing}
+
+
+-- | Specifies the security groups for VPC endpoint.
+voSecurityGroupIds :: Lens' VPCOptions [Text]
+voSecurityGroupIds = lens _voSecurityGroupIds (\ s a -> s{_voSecurityGroupIds = a}) . _Default . _Coerce;
+
+-- | Specifies the subnets for VPC endpoint.
+voSubnetIds :: Lens' VPCOptions [Text]
+voSubnetIds = lens _voSubnetIds (\ s a -> s{_voSubnetIds = a}) . _Default . _Coerce;
+
+instance Hashable VPCOptions where
+
+instance NFData VPCOptions where
+
+instance ToJSON VPCOptions where
+        toJSON VPCOptions'{..}
+          = object
+              (catMaybes
+                 [("SecurityGroupIds" .=) <$> _voSecurityGroupIds,
+                  ("SubnetIds" .=) <$> _voSubnetIds])
diff --git a/gen/Network/AWS/ElasticSearch/Types/Sum.hs b/gen/Network/AWS/ElasticSearch/Types/Sum.hs
--- a/gen/Network/AWS/ElasticSearch/Types/Sum.hs
+++ b/gen/Network/AWS/ElasticSearch/Types/Sum.hs
@@ -9,42 +9,79 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.Types.Sum
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 module Network.AWS.ElasticSearch.Types.Sum where
 
-import           Network.AWS.Prelude
+import Network.AWS.Prelude
 
 data ESPartitionInstanceType
-    = I2_2XLarge_Elasticsearch
-    | I2_XLarge_Elasticsearch
-    | M3_2XLarge_Elasticsearch
-    | M3_Large_Elasticsearch
-    | M3_Medium_Elasticsearch
-    | M3_XLarge_Elasticsearch
-    | M4_10XLarge_Elasticsearch
-    | M4_2XLarge_Elasticsearch
-    | M4_4XLarge_Elasticsearch
-    | M4_Large_Elasticsearch
-    | M4_XLarge_Elasticsearch
-    | R3_2XLarge_Elasticsearch
-    | R3_4XLarge_Elasticsearch
-    | R3_8XLarge_Elasticsearch
-    | R3_Large_Elasticsearch
-    | R3_XLarge_Elasticsearch
-    | T2_Medium_Elasticsearch
-    | T2_Micro_Elasticsearch
-    | T2_Small_Elasticsearch
-    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+  = C4_2XLarge_Elasticsearch
+  | C4_4XLarge_Elasticsearch
+  | C4_8XLarge_Elasticsearch
+  | C4_Large_Elasticsearch
+  | C4_XLarge_Elasticsearch
+  | D2_2XLarge_Elasticsearch
+  | D2_4XLarge_Elasticsearch
+  | D2_8XLarge_Elasticsearch
+  | D2_XLarge_Elasticsearch
+  | I2_2XLarge_Elasticsearch
+  | I2_XLarge_Elasticsearch
+  | I3_16XLarge_Elasticsearch
+  | I3_2XLarge_Elasticsearch
+  | I3_4XLarge_Elasticsearch
+  | I3_8XLarge_Elasticsearch
+  | I3_Large_Elasticsearch
+  | I3_XLarge_Elasticsearch
+  | M3_2XLarge_Elasticsearch
+  | M3_Large_Elasticsearch
+  | M3_Medium_Elasticsearch
+  | M3_XLarge_Elasticsearch
+  | M4_10XLarge_Elasticsearch
+  | M4_2XLarge_Elasticsearch
+  | M4_4XLarge_Elasticsearch
+  | M4_Large_Elasticsearch
+  | M4_XLarge_Elasticsearch
+  | R3_2XLarge_Elasticsearch
+  | R3_4XLarge_Elasticsearch
+  | R3_8XLarge_Elasticsearch
+  | R3_Large_Elasticsearch
+  | R3_XLarge_Elasticsearch
+  | R4_16XLarge_Elasticsearch
+  | R4_2XLarge_Elasticsearch
+  | R4_4XLarge_Elasticsearch
+  | R4_8XLarge_Elasticsearch
+  | R4_Large_Elasticsearch
+  | R4_XLarge_Elasticsearch
+  | T2_Medium_Elasticsearch
+  | T2_Micro_Elasticsearch
+  | T2_Small_Elasticsearch
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
 
+
 instance FromText ESPartitionInstanceType where
     parser = takeLowerText >>= \case
+        "c4.2xlarge.elasticsearch" -> pure C4_2XLarge_Elasticsearch
+        "c4.4xlarge.elasticsearch" -> pure C4_4XLarge_Elasticsearch
+        "c4.8xlarge.elasticsearch" -> pure C4_8XLarge_Elasticsearch
+        "c4.large.elasticsearch" -> pure C4_Large_Elasticsearch
+        "c4.xlarge.elasticsearch" -> pure C4_XLarge_Elasticsearch
+        "d2.2xlarge.elasticsearch" -> pure D2_2XLarge_Elasticsearch
+        "d2.4xlarge.elasticsearch" -> pure D2_4XLarge_Elasticsearch
+        "d2.8xlarge.elasticsearch" -> pure D2_8XLarge_Elasticsearch
+        "d2.xlarge.elasticsearch" -> pure D2_XLarge_Elasticsearch
         "i2.2xlarge.elasticsearch" -> pure I2_2XLarge_Elasticsearch
         "i2.xlarge.elasticsearch" -> pure I2_XLarge_Elasticsearch
+        "i3.16xlarge.elasticsearch" -> pure I3_16XLarge_Elasticsearch
+        "i3.2xlarge.elasticsearch" -> pure I3_2XLarge_Elasticsearch
+        "i3.4xlarge.elasticsearch" -> pure I3_4XLarge_Elasticsearch
+        "i3.8xlarge.elasticsearch" -> pure I3_8XLarge_Elasticsearch
+        "i3.large.elasticsearch" -> pure I3_Large_Elasticsearch
+        "i3.xlarge.elasticsearch" -> pure I3_XLarge_Elasticsearch
         "m3.2xlarge.elasticsearch" -> pure M3_2XLarge_Elasticsearch
         "m3.large.elasticsearch" -> pure M3_Large_Elasticsearch
         "m3.medium.elasticsearch" -> pure M3_Medium_Elasticsearch
@@ -59,16 +96,37 @@
         "r3.8xlarge.elasticsearch" -> pure R3_8XLarge_Elasticsearch
         "r3.large.elasticsearch" -> pure R3_Large_Elasticsearch
         "r3.xlarge.elasticsearch" -> pure R3_XLarge_Elasticsearch
+        "r4.16xlarge.elasticsearch" -> pure R4_16XLarge_Elasticsearch
+        "r4.2xlarge.elasticsearch" -> pure R4_2XLarge_Elasticsearch
+        "r4.4xlarge.elasticsearch" -> pure R4_4XLarge_Elasticsearch
+        "r4.8xlarge.elasticsearch" -> pure R4_8XLarge_Elasticsearch
+        "r4.large.elasticsearch" -> pure R4_Large_Elasticsearch
+        "r4.xlarge.elasticsearch" -> pure R4_XLarge_Elasticsearch
         "t2.medium.elasticsearch" -> pure T2_Medium_Elasticsearch
         "t2.micro.elasticsearch" -> pure T2_Micro_Elasticsearch
         "t2.small.elasticsearch" -> pure T2_Small_Elasticsearch
         e -> fromTextError $ "Failure parsing ESPartitionInstanceType from value: '" <> e
-           <> "'. Accepted values: i2.2xlarge.elasticsearch, i2.xlarge.elasticsearch, m3.2xlarge.elasticsearch, m3.large.elasticsearch, m3.medium.elasticsearch, m3.xlarge.elasticsearch, m4.10xlarge.elasticsearch, m4.2xlarge.elasticsearch, m4.4xlarge.elasticsearch, m4.large.elasticsearch, m4.xlarge.elasticsearch, r3.2xlarge.elasticsearch, r3.4xlarge.elasticsearch, r3.8xlarge.elasticsearch, r3.large.elasticsearch, r3.xlarge.elasticsearch, t2.medium.elasticsearch, t2.micro.elasticsearch, t2.small.elasticsearch"
+           <> "'. Accepted values: c4.2xlarge.elasticsearch, c4.4xlarge.elasticsearch, c4.8xlarge.elasticsearch, c4.large.elasticsearch, c4.xlarge.elasticsearch, d2.2xlarge.elasticsearch, d2.4xlarge.elasticsearch, d2.8xlarge.elasticsearch, d2.xlarge.elasticsearch, i2.2xlarge.elasticsearch, i2.xlarge.elasticsearch, i3.16xlarge.elasticsearch, i3.2xlarge.elasticsearch, i3.4xlarge.elasticsearch, i3.8xlarge.elasticsearch, i3.large.elasticsearch, i3.xlarge.elasticsearch, m3.2xlarge.elasticsearch, m3.large.elasticsearch, m3.medium.elasticsearch, m3.xlarge.elasticsearch, m4.10xlarge.elasticsearch, m4.2xlarge.elasticsearch, m4.4xlarge.elasticsearch, m4.large.elasticsearch, m4.xlarge.elasticsearch, r3.2xlarge.elasticsearch, r3.4xlarge.elasticsearch, r3.8xlarge.elasticsearch, r3.large.elasticsearch, r3.xlarge.elasticsearch, r4.16xlarge.elasticsearch, r4.2xlarge.elasticsearch, r4.4xlarge.elasticsearch, r4.8xlarge.elasticsearch, r4.large.elasticsearch, r4.xlarge.elasticsearch, t2.medium.elasticsearch, t2.micro.elasticsearch, t2.small.elasticsearch"
 
 instance ToText ESPartitionInstanceType where
     toText = \case
+        C4_2XLarge_Elasticsearch -> "c4.2xlarge.elasticsearch"
+        C4_4XLarge_Elasticsearch -> "c4.4xlarge.elasticsearch"
+        C4_8XLarge_Elasticsearch -> "c4.8xlarge.elasticsearch"
+        C4_Large_Elasticsearch -> "c4.large.elasticsearch"
+        C4_XLarge_Elasticsearch -> "c4.xlarge.elasticsearch"
+        D2_2XLarge_Elasticsearch -> "d2.2xlarge.elasticsearch"
+        D2_4XLarge_Elasticsearch -> "d2.4xlarge.elasticsearch"
+        D2_8XLarge_Elasticsearch -> "d2.8xlarge.elasticsearch"
+        D2_XLarge_Elasticsearch -> "d2.xlarge.elasticsearch"
         I2_2XLarge_Elasticsearch -> "i2.2xlarge.elasticsearch"
         I2_XLarge_Elasticsearch -> "i2.xlarge.elasticsearch"
+        I3_16XLarge_Elasticsearch -> "i3.16xlarge.elasticsearch"
+        I3_2XLarge_Elasticsearch -> "i3.2xlarge.elasticsearch"
+        I3_4XLarge_Elasticsearch -> "i3.4xlarge.elasticsearch"
+        I3_8XLarge_Elasticsearch -> "i3.8xlarge.elasticsearch"
+        I3_Large_Elasticsearch -> "i3.large.elasticsearch"
+        I3_XLarge_Elasticsearch -> "i3.xlarge.elasticsearch"
         M3_2XLarge_Elasticsearch -> "m3.2xlarge.elasticsearch"
         M3_Large_Elasticsearch -> "m3.large.elasticsearch"
         M3_Medium_Elasticsearch -> "m3.medium.elasticsearch"
@@ -83,6 +141,12 @@
         R3_8XLarge_Elasticsearch -> "r3.8xlarge.elasticsearch"
         R3_Large_Elasticsearch -> "r3.large.elasticsearch"
         R3_XLarge_Elasticsearch -> "r3.xlarge.elasticsearch"
+        R4_16XLarge_Elasticsearch -> "r4.16xlarge.elasticsearch"
+        R4_2XLarge_Elasticsearch -> "r4.2xlarge.elasticsearch"
+        R4_4XLarge_Elasticsearch -> "r4.4xlarge.elasticsearch"
+        R4_8XLarge_Elasticsearch -> "r4.8xlarge.elasticsearch"
+        R4_Large_Elasticsearch -> "r4.large.elasticsearch"
+        R4_XLarge_Elasticsearch -> "r4.xlarge.elasticsearch"
         T2_Medium_Elasticsearch -> "t2.medium.elasticsearch"
         T2_Micro_Elasticsearch -> "t2.micro.elasticsearch"
         T2_Small_Elasticsearch -> "t2.small.elasticsearch"
@@ -99,17 +163,53 @@
 instance FromJSON ESPartitionInstanceType where
     parseJSON = parseJSONText "ESPartitionInstanceType"
 
+-- | Type of Log File, it can be one of the following:     * INDEX_SLOW_LOGS: Index slow logs contains insert requests that took more time than configured index query log threshold to execute.    * SEARCH_SLOW_LOGS: Search slow logs contains search queries that took more time than configured search query log threshold to execute.
+--
+--
+--
+--
+data LogType
+  = IndexSlowLogs
+  | SearchSlowLogs
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
+
+instance FromText LogType where
+    parser = takeLowerText >>= \case
+        "index_slow_logs" -> pure IndexSlowLogs
+        "search_slow_logs" -> pure SearchSlowLogs
+        e -> fromTextError $ "Failure parsing LogType from value: '" <> e
+           <> "'. Accepted values: index_slow_logs, search_slow_logs"
+
+instance ToText LogType where
+    toText = \case
+        IndexSlowLogs -> "INDEX_SLOW_LOGS"
+        SearchSlowLogs -> "SEARCH_SLOW_LOGS"
+
+instance Hashable     LogType
+instance NFData       LogType
+instance ToByteString LogType
+instance ToQuery      LogType
+instance ToHeader     LogType
+
+instance ToJSON LogType where
+    toJSON = toJSONText
+
+instance FromJSON LogType where
+    parseJSON = parseJSONText "LogType"
+
 -- | The state of a requested change. One of the following:
 --
 --
 --     * Processing: The request change is still in-process.    * Active: The request change is processed and deployed to the Elasticsearch domain.
 --
 data OptionState
-    = Active
-    | Processing
-    | RequiresIndexDocuments
-    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+  = Active
+  | Processing
+  | RequiresIndexDocuments
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
 
+
 instance FromText OptionState where
     parser = takeLowerText >>= \case
         "active" -> pure Active
@@ -137,10 +237,11 @@
 --
 --
 data VolumeType
-    = GP2
-    | IO1
-    | Standard
-    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+  = GP2
+  | IO1
+  | Standard
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
 
 instance FromText VolumeType where
     parser = takeLowerText >>= \case
diff --git a/gen/Network/AWS/ElasticSearch/UpdateElasticsearchDomainConfig.hs b/gen/Network/AWS/ElasticSearch/UpdateElasticsearchDomainConfig.hs
--- a/gen/Network/AWS/ElasticSearch/UpdateElasticsearchDomainConfig.hs
+++ b/gen/Network/AWS/ElasticSearch/UpdateElasticsearchDomainConfig.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.UpdateElasticsearchDomainConfig
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -29,8 +29,10 @@
     -- * Request Lenses
     , uedcEBSOptions
     , uedcAccessPolicies
+    , uedcLogPublishingOptions
     , uedcElasticsearchClusterConfig
     , uedcSnapshotOptions
+    , uedcVPCOptions
     , uedcAdvancedOptions
     , uedcDomainName
 
@@ -42,12 +44,12 @@
     , uedcrsDomainConfig
     ) where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.ElasticSearch.Types.Product
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Request
-import           Network.AWS.Response
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.ElasticSearch.Types.Product
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Request
+import Network.AWS.Response
 
 -- | Container for the parameters to the @'UpdateElasticsearchDomain' @ operation. Specifies the type and number of instances in the domain cluster.
 --
@@ -55,14 +57,17 @@
 --
 -- /See:/ 'updateElasticsearchDomainConfig' smart constructor.
 data UpdateElasticsearchDomainConfig = UpdateElasticsearchDomainConfig'
-    { _uedcEBSOptions                 :: !(Maybe EBSOptions)
-    , _uedcAccessPolicies             :: !(Maybe Text)
-    , _uedcElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfig)
-    , _uedcSnapshotOptions            :: !(Maybe SnapshotOptions)
-    , _uedcAdvancedOptions            :: !(Maybe (Map Text Text))
-    , _uedcDomainName                 :: !Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _uedcEBSOptions :: !(Maybe EBSOptions)
+  , _uedcAccessPolicies :: !(Maybe Text)
+  , _uedcLogPublishingOptions :: !(Maybe (Map LogType LogPublishingOption))
+  , _uedcElasticsearchClusterConfig :: !(Maybe ElasticsearchClusterConfig)
+  , _uedcSnapshotOptions :: !(Maybe SnapshotOptions)
+  , _uedcVPCOptions :: !(Maybe VPCOptions)
+  , _uedcAdvancedOptions :: !(Maybe (Map Text Text))
+  , _uedcDomainName :: !Text
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'UpdateElasticsearchDomainConfig' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -71,10 +76,14 @@
 --
 -- * 'uedcAccessPolicies' - IAM access policy as a JSON-formatted string.
 --
+-- * 'uedcLogPublishingOptions' - Map of @LogType@ and @LogPublishingOption@ , each containing options to publish a given type of Elasticsearch log.
+--
 -- * 'uedcElasticsearchClusterConfig' - The type and number of instances to instantiate for the domain cluster.
 --
 -- * 'uedcSnapshotOptions' - Option to set the time, in UTC format, for the daily automated snapshot. Default value is @0@ hours.
 --
+-- * 'uedcVPCOptions' - Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html#es-creating-vpc Creating a VPC> in /VPC Endpoints for Amazon Elasticsearch Service Domains/
+--
 -- * 'uedcAdvancedOptions' - Modifies the advanced option to allow references to indices in an HTTP request body. Must be @false@ when configuring access to individual sub-resources. By default, the value is @true@ . See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuration Advanced Options> for more information.
 --
 -- * 'uedcDomainName' - The name of the Elasticsearch domain that you are updating.
@@ -82,15 +91,18 @@
     :: Text -- ^ 'uedcDomainName'
     -> UpdateElasticsearchDomainConfig
 updateElasticsearchDomainConfig pDomainName_ =
-    UpdateElasticsearchDomainConfig'
-    { _uedcEBSOptions = Nothing
-    , _uedcAccessPolicies = Nothing
-    , _uedcElasticsearchClusterConfig = Nothing
-    , _uedcSnapshotOptions = Nothing
-    , _uedcAdvancedOptions = Nothing
-    , _uedcDomainName = pDomainName_
-    }
+  UpdateElasticsearchDomainConfig'
+  { _uedcEBSOptions = Nothing
+  , _uedcAccessPolicies = Nothing
+  , _uedcLogPublishingOptions = Nothing
+  , _uedcElasticsearchClusterConfig = Nothing
+  , _uedcSnapshotOptions = Nothing
+  , _uedcVPCOptions = Nothing
+  , _uedcAdvancedOptions = Nothing
+  , _uedcDomainName = pDomainName_
+  }
 
+
 -- | Specify the type and size of the EBS volume that you want to use.
 uedcEBSOptions :: Lens' UpdateElasticsearchDomainConfig (Maybe EBSOptions)
 uedcEBSOptions = lens _uedcEBSOptions (\ s a -> s{_uedcEBSOptions = a});
@@ -99,6 +111,10 @@
 uedcAccessPolicies :: Lens' UpdateElasticsearchDomainConfig (Maybe Text)
 uedcAccessPolicies = lens _uedcAccessPolicies (\ s a -> s{_uedcAccessPolicies = a});
 
+-- | Map of @LogType@ and @LogPublishingOption@ , each containing options to publish a given type of Elasticsearch log.
+uedcLogPublishingOptions :: Lens' UpdateElasticsearchDomainConfig (HashMap LogType LogPublishingOption)
+uedcLogPublishingOptions = lens _uedcLogPublishingOptions (\ s a -> s{_uedcLogPublishingOptions = a}) . _Default . _Map;
+
 -- | The type and number of instances to instantiate for the domain cluster.
 uedcElasticsearchClusterConfig :: Lens' UpdateElasticsearchDomainConfig (Maybe ElasticsearchClusterConfig)
 uedcElasticsearchClusterConfig = lens _uedcElasticsearchClusterConfig (\ s a -> s{_uedcElasticsearchClusterConfig = a});
@@ -107,6 +123,10 @@
 uedcSnapshotOptions :: Lens' UpdateElasticsearchDomainConfig (Maybe SnapshotOptions)
 uedcSnapshotOptions = lens _uedcSnapshotOptions (\ s a -> s{_uedcSnapshotOptions = a});
 
+-- | Options to specify the subnets and security groups for VPC endpoint. For more information, see <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html#es-creating-vpc Creating a VPC> in /VPC Endpoints for Amazon Elasticsearch Service Domains/
+uedcVPCOptions :: Lens' UpdateElasticsearchDomainConfig (Maybe VPCOptions)
+uedcVPCOptions = lens _uedcVPCOptions (\ s a -> s{_uedcVPCOptions = a});
+
 -- | Modifies the advanced option to allow references to indices in an HTTP request body. Must be @false@ when configuring access to individual sub-resources. By default, the value is @true@ . See <http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-advanced-options Configuration Advanced Options> for more information.
 uedcAdvancedOptions :: Lens' UpdateElasticsearchDomainConfig (HashMap Text Text)
 uedcAdvancedOptions = lens _uedcAdvancedOptions (\ s a -> s{_uedcAdvancedOptions = a}) . _Default . _Map;
@@ -127,8 +147,9 @@
                    (pure (fromEnum s)) <*> (x .:> "DomainConfig"))
 
 instance Hashable UpdateElasticsearchDomainConfig
+         where
 
-instance NFData UpdateElasticsearchDomainConfig
+instance NFData UpdateElasticsearchDomainConfig where
 
 instance ToHeaders UpdateElasticsearchDomainConfig
          where
@@ -140,9 +161,12 @@
               (catMaybes
                  [("EBSOptions" .=) <$> _uedcEBSOptions,
                   ("AccessPolicies" .=) <$> _uedcAccessPolicies,
+                  ("LogPublishingOptions" .=) <$>
+                    _uedcLogPublishingOptions,
                   ("ElasticsearchClusterConfig" .=) <$>
                     _uedcElasticsearchClusterConfig,
                   ("SnapshotOptions" .=) <$> _uedcSnapshotOptions,
+                  ("VPCOptions" .=) <$> _uedcVPCOptions,
                   ("AdvancedOptions" .=) <$> _uedcAdvancedOptions])
 
 instance ToPath UpdateElasticsearchDomainConfig where
@@ -161,10 +185,11 @@
 --
 -- /See:/ 'updateElasticsearchDomainConfigResponse' smart constructor.
 data UpdateElasticsearchDomainConfigResponse = UpdateElasticsearchDomainConfigResponse'
-    { _uedcrsResponseStatus :: !Int
-    , _uedcrsDomainConfig   :: !ElasticsearchDomainConfig
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _uedcrsResponseStatus :: !Int
+  , _uedcrsDomainConfig   :: !ElasticsearchDomainConfig
+  } deriving (Eq, Read, Show, Data, Typeable, Generic)
 
+
 -- | Creates a value of 'UpdateElasticsearchDomainConfigResponse' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
@@ -177,11 +202,12 @@
     -> ElasticsearchDomainConfig -- ^ 'uedcrsDomainConfig'
     -> UpdateElasticsearchDomainConfigResponse
 updateElasticsearchDomainConfigResponse pResponseStatus_ pDomainConfig_ =
-    UpdateElasticsearchDomainConfigResponse'
-    { _uedcrsResponseStatus = pResponseStatus_
-    , _uedcrsDomainConfig = pDomainConfig_
-    }
+  UpdateElasticsearchDomainConfigResponse'
+  { _uedcrsResponseStatus = pResponseStatus_
+  , _uedcrsDomainConfig = pDomainConfig_
+  }
 
+
 -- | -- | The response status code.
 uedcrsResponseStatus :: Lens' UpdateElasticsearchDomainConfigResponse Int
 uedcrsResponseStatus = lens _uedcrsResponseStatus (\ s a -> s{_uedcrsResponseStatus = a});
@@ -191,4 +217,5 @@
 uedcrsDomainConfig = lens _uedcrsDomainConfig (\ s a -> s{_uedcrsDomainConfig = a});
 
 instance NFData
-         UpdateElasticsearchDomainConfigResponse
+           UpdateElasticsearchDomainConfigResponse
+         where
diff --git a/gen/Network/AWS/ElasticSearch/Waiters.hs b/gen/Network/AWS/ElasticSearch/Waiters.hs
--- a/gen/Network/AWS/ElasticSearch/Waiters.hs
+++ b/gen/Network/AWS/ElasticSearch/Waiters.hs
@@ -7,15 +7,15 @@
 
 -- |
 -- Module      : Network.AWS.ElasticSearch.Waiters
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 module Network.AWS.ElasticSearch.Waiters where
 
-import           Network.AWS.ElasticSearch.Types
-import           Network.AWS.Lens
-import           Network.AWS.Prelude
-import           Network.AWS.Waiter
+import Network.AWS.ElasticSearch.Types
+import Network.AWS.Lens
+import Network.AWS.Prelude
+import Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,9 +2,9 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
diff --git a/test/Test/AWS/Gen/ElasticSearch.hs b/test/Test/AWS/Gen/ElasticSearch.hs
--- a/test/Test/AWS/Gen/ElasticSearch.hs
+++ b/test/Test/AWS/Gen/ElasticSearch.hs
@@ -5,20 +5,20 @@
 
 -- |
 -- Module      : Test.AWS.Gen.ElasticSearch
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 module Test.AWS.Gen.ElasticSearch where
 
 import Data.Proxy
+import Network.AWS.ElasticSearch
+import Test.AWS.ElasticSearch.Internal
 import Test.AWS.Fixture
 import Test.AWS.Prelude
 import Test.Tasty
-import Network.AWS.ElasticSearch
-import Test.AWS.ElasticSearch.Internal
 
 -- Auto-generated: the actual test selection needs to be manually placed into
 -- the top-level so that real test data can be incrementally added.
@@ -37,12 +37,21 @@
 --         , requestDescribeElasticsearchDomains $
 --             describeElasticsearchDomains
 --
+--         , requestListElasticsearchInstanceTypes $
+--             listElasticsearchInstanceTypes
+--
+--         , requestDeleteElasticsearchServiceRole $
+--             deleteElasticsearchServiceRole
+--
 --         , requestDescribeElasticsearchDomain $
 --             describeElasticsearchDomain
 --
 --         , requestListDomainNames $
 --             listDomainNames
 --
+--         , requestDescribeElasticsearchInstanceTypeLimits $
+--             describeElasticsearchInstanceTypeLimits
+--
 --         , requestDescribeElasticsearchDomainConfig $
 --             describeElasticsearchDomainConfig
 --
@@ -52,6 +61,9 @@
 --         , requestUpdateElasticsearchDomainConfig $
 --             updateElasticsearchDomainConfig
 --
+--         , requestListElasticsearchVersions $
+--             listElasticsearchVersions
+--
 --         , requestAddTags $
 --             addTags
 --
@@ -70,12 +82,21 @@
 --         , responseDescribeElasticsearchDomains $
 --             describeElasticsearchDomainsResponse
 --
+--         , responseListElasticsearchInstanceTypes $
+--             listElasticsearchInstanceTypesResponse
+--
+--         , responseDeleteElasticsearchServiceRole $
+--             deleteElasticsearchServiceRoleResponse
+--
 --         , responseDescribeElasticsearchDomain $
 --             describeElasticsearchDomainResponse
 --
 --         , responseListDomainNames $
 --             listDomainNamesResponse
 --
+--         , responseDescribeElasticsearchInstanceTypeLimits $
+--             describeElasticsearchInstanceTypeLimitsResponse
+--
 --         , responseDescribeElasticsearchDomainConfig $
 --             describeElasticsearchDomainConfigResponse
 --
@@ -85,6 +106,9 @@
 --         , responseUpdateElasticsearchDomainConfig $
 --             updateElasticsearchDomainConfigResponse
 --
+--         , responseListElasticsearchVersions $
+--             listElasticsearchVersionsResponse
+--
 --         , responseAddTags $
 --             addTagsResponse
 --
@@ -111,6 +135,16 @@
     "DescribeElasticsearchDomains"
     "fixture/DescribeElasticsearchDomains.yaml"
 
+requestListElasticsearchInstanceTypes :: ListElasticsearchInstanceTypes -> TestTree
+requestListElasticsearchInstanceTypes = req
+    "ListElasticsearchInstanceTypes"
+    "fixture/ListElasticsearchInstanceTypes.yaml"
+
+requestDeleteElasticsearchServiceRole :: DeleteElasticsearchServiceRole -> TestTree
+requestDeleteElasticsearchServiceRole = req
+    "DeleteElasticsearchServiceRole"
+    "fixture/DeleteElasticsearchServiceRole.yaml"
+
 requestDescribeElasticsearchDomain :: DescribeElasticsearchDomain -> TestTree
 requestDescribeElasticsearchDomain = req
     "DescribeElasticsearchDomain"
@@ -121,6 +155,11 @@
     "ListDomainNames"
     "fixture/ListDomainNames.yaml"
 
+requestDescribeElasticsearchInstanceTypeLimits :: DescribeElasticsearchInstanceTypeLimits -> TestTree
+requestDescribeElasticsearchInstanceTypeLimits = req
+    "DescribeElasticsearchInstanceTypeLimits"
+    "fixture/DescribeElasticsearchInstanceTypeLimits.yaml"
+
 requestDescribeElasticsearchDomainConfig :: DescribeElasticsearchDomainConfig -> TestTree
 requestDescribeElasticsearchDomainConfig = req
     "DescribeElasticsearchDomainConfig"
@@ -136,6 +175,11 @@
     "UpdateElasticsearchDomainConfig"
     "fixture/UpdateElasticsearchDomainConfig.yaml"
 
+requestListElasticsearchVersions :: ListElasticsearchVersions -> TestTree
+requestListElasticsearchVersions = req
+    "ListElasticsearchVersions"
+    "fixture/ListElasticsearchVersions.yaml"
+
 requestAddTags :: AddTags -> TestTree
 requestAddTags = req
     "AddTags"
@@ -169,6 +213,20 @@
     elasticSearch
     (Proxy :: Proxy DescribeElasticsearchDomains)
 
+responseListElasticsearchInstanceTypes :: ListElasticsearchInstanceTypesResponse -> TestTree
+responseListElasticsearchInstanceTypes = res
+    "ListElasticsearchInstanceTypesResponse"
+    "fixture/ListElasticsearchInstanceTypesResponse.proto"
+    elasticSearch
+    (Proxy :: Proxy ListElasticsearchInstanceTypes)
+
+responseDeleteElasticsearchServiceRole :: DeleteElasticsearchServiceRoleResponse -> TestTree
+responseDeleteElasticsearchServiceRole = res
+    "DeleteElasticsearchServiceRoleResponse"
+    "fixture/DeleteElasticsearchServiceRoleResponse.proto"
+    elasticSearch
+    (Proxy :: Proxy DeleteElasticsearchServiceRole)
+
 responseDescribeElasticsearchDomain :: DescribeElasticsearchDomainResponse -> TestTree
 responseDescribeElasticsearchDomain = res
     "DescribeElasticsearchDomainResponse"
@@ -183,6 +241,13 @@
     elasticSearch
     (Proxy :: Proxy ListDomainNames)
 
+responseDescribeElasticsearchInstanceTypeLimits :: DescribeElasticsearchInstanceTypeLimitsResponse -> TestTree
+responseDescribeElasticsearchInstanceTypeLimits = res
+    "DescribeElasticsearchInstanceTypeLimitsResponse"
+    "fixture/DescribeElasticsearchInstanceTypeLimitsResponse.proto"
+    elasticSearch
+    (Proxy :: Proxy DescribeElasticsearchInstanceTypeLimits)
+
 responseDescribeElasticsearchDomainConfig :: DescribeElasticsearchDomainConfigResponse -> TestTree
 responseDescribeElasticsearchDomainConfig = res
     "DescribeElasticsearchDomainConfigResponse"
@@ -203,6 +268,13 @@
     "fixture/UpdateElasticsearchDomainConfigResponse.proto"
     elasticSearch
     (Proxy :: Proxy UpdateElasticsearchDomainConfig)
+
+responseListElasticsearchVersions :: ListElasticsearchVersionsResponse -> TestTree
+responseListElasticsearchVersions = res
+    "ListElasticsearchVersionsResponse"
+    "fixture/ListElasticsearchVersionsResponse.proto"
+    elasticSearch
+    (Proxy :: Proxy ListElasticsearchVersions)
 
 responseAddTags :: AddTagsResponse -> TestTree
 responseAddTags = res
