diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.3.7`
+`1.4.0`
 
 
 ## Description
@@ -20,7 +20,7 @@
 scientific simulation, and data warehousing.
 
 Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-emr)
-and the [AWS API Reference](http://docs.aws.amazon.com/ElasticMapReduce/latest/API/Welcome.html).
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
 
 The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
 which provides mechanisms for specifying AuthN/AuthZ information and sending requests.
diff --git a/amazonka-emr.cabal b/amazonka-emr.cabal
--- a/amazonka-emr.cabal
+++ b/amazonka-emr.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-emr
-version:               1.3.7
+version:               1.4.0
 synopsis:              Amazon Elastic MapReduce SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
@@ -7,7 +7,7 @@
 license-file:          LICENSE
 author:                Brendan Hay
 maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
-copyright:             Copyright (c) 2013-2015 Brendan Hay
+copyright:             Copyright (c) 2013-2016 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
@@ -30,7 +30,7 @@
     such as <http://hackage.haskell.org/package/lens lens> or
     <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
     .
-    See "Network.AWS.EMR" and the <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/Welcome.html AWS API Reference>
+    See "Network.AWS.EMR" or <https://aws.amazon.com/documentation/ the AWS Documentation>
     to get started.
 
 source-repository head
@@ -69,7 +69,7 @@
         , Network.AWS.EMR.Types.Sum
 
     build-depends:
-          amazonka-core == 1.3.7.*
+          amazonka-core == 1.4.0.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-emr-test
@@ -89,9 +89,9 @@
         , Test.AWS.EMR.Internal
 
     build-depends:
-          amazonka-core == 1.3.7.*
-        , amazonka-test == 1.3.7.*
-        , amazonka-emr == 1.3.7.*
+          amazonka-core == 1.4.0.*
+        , amazonka-test == 1.4.0.*
+        , amazonka-emr == 1.4.0.*
         , base
         , bytestring
         , tasty
diff --git a/gen/Network/AWS/EMR.hs b/gen/Network/AWS/EMR.hs
--- a/gen/Network/AWS/EMR.hs
+++ b/gen/Network/AWS/EMR.hs
@@ -5,7 +5,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -16,12 +16,10 @@
 -- Hadoop processing combined with several AWS products to do tasks such as
 -- web indexing, data mining, log file analysis, machine learning,
 -- scientific simulation, and data warehousing.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/Welcome.html AWS API Reference>
 module Network.AWS.EMR
     (
     -- * Service Configuration
-      eMR
+      emr
 
     -- * Errors
     -- $errors
@@ -207,6 +205,30 @@
     , cClassification
     , cProperties
 
+    -- ** EBSBlockDevice
+    , EBSBlockDevice
+    , ebsBlockDevice
+    , ebdDevice
+    , ebdVolumeSpecification
+
+    -- ** EBSBlockDeviceConfig
+    , EBSBlockDeviceConfig
+    , ebsBlockDeviceConfig
+    , ebdcVolumesPerInstance
+    , ebdcVolumeSpecification
+
+    -- ** EBSConfiguration
+    , EBSConfiguration
+    , ebsConfiguration
+    , ecEBSOptimized
+    , ecEBSBlockDeviceConfigs
+
+    -- ** EBSVolume
+    , EBSVolume
+    , ebsVolume
+    , evDevice
+    , evVolumeId
+
     -- ** EC2InstanceAttributes
     , EC2InstanceAttributes
     , ec2InstanceAttributes
@@ -217,6 +239,7 @@
     , eiaIAMInstanceProfile
     , eiaEmrManagedMasterSecurityGroup
     , eiaEC2SubnetId
+    , eiaServiceAccessSecurityGroup
     , eiaEC2AvailabilityZone
 
     -- ** HadoopJARStepConfig
@@ -240,9 +263,11 @@
     , instance'
     , iStatus
     , iPublicDNSName
+    , iEBSVolumes
     , iEC2InstanceId
     , iPrivateIPAddress
     , iId
+    , iInstanceGroupId
     , iPrivateDNSName
     , iPublicIPAddress
 
@@ -255,7 +280,9 @@
     , igRunningInstanceCount
     , igConfigurations
     , igInstanceGroupType
+    , igEBSBlockDevices
     , igInstanceType
+    , igEBSOptimized
     , igMarket
     , igName
     , igId
@@ -263,6 +290,7 @@
     -- ** InstanceGroupConfig
     , InstanceGroupConfig
     , instanceGroupConfig
+    , igcEBSConfiguration
     , igcBidPrice
     , igcConfigurations
     , igcMarket
@@ -333,6 +361,7 @@
     , jficMasterInstanceType
     , jficInstanceGroups
     , jficKeepJobFlowAliveWhenNoSteps
+    , jficServiceAccessSecurityGroup
     , jficTerminationProtected
     , jficPlacement
 
@@ -409,6 +438,13 @@
     , tag
     , tagValue
     , tagKey
+
+    -- ** VolumeSpecification
+    , VolumeSpecification
+    , volumeSpecification
+    , vsIOPS
+    , vsVolumeType
+    , vsSizeInGB
     ) where
 
 import           Network.AWS.EMR.AddInstanceGroups
diff --git a/gen/Network/AWS/EMR/AddInstanceGroups.hs b/gen/Network/AWS/EMR/AddInstanceGroups.hs
--- a/gen/Network/AWS/EMR/AddInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/AddInstanceGroups.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.EMR.AddInstanceGroups
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- AddInstanceGroups adds an instance group to a running cluster.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddInstanceGroups.html AWS API Reference> for AddInstanceGroups.
 module Network.AWS.EMR.AddInstanceGroups
     (
     -- * Creating a Request
@@ -80,7 +78,7 @@
 
 instance AWSRequest AddInstanceGroups where
         type Rs AddInstanceGroups = AddInstanceGroupsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
@@ -88,6 +86,8 @@
                    (x .?> "JobFlowId") <*>
                      (x .?> "InstanceGroupIds" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable AddInstanceGroups
 
 instance ToHeaders AddInstanceGroups where
         toHeaders
diff --git a/gen/Network/AWS/EMR/AddJobFlowSteps.hs b/gen/Network/AWS/EMR/AddJobFlowSteps.hs
--- a/gen/Network/AWS/EMR/AddJobFlowSteps.hs
+++ b/gen/Network/AWS/EMR/AddJobFlowSteps.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.AddJobFlowSteps
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -43,8 +43,6 @@
 --
 -- You can only add steps to a job flow that is in one of the following
 -- states: STARTING, BOOTSTRAPPING, RUNNING, or WAITING.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddJobFlowSteps.html AWS API Reference> for AddJobFlowSteps.
 module Network.AWS.EMR.AddJobFlowSteps
     (
     -- * Creating a Request
@@ -69,7 +67,7 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | The input argument to the AddJobFlowSteps operation.
+-- | The input argument to the < AddJobFlowSteps> operation.
 --
 -- /See:/ 'addJobFlowSteps' smart constructor.
 data AddJobFlowSteps = AddJobFlowSteps'
@@ -94,23 +92,25 @@
     }
 
 -- | A string that uniquely identifies the job flow. This identifier is
--- returned by RunJobFlow and can also be obtained from ListClusters.
+-- returned by < RunJobFlow> and can also be obtained from < ListClusters>.
 ajfsJobFlowId :: Lens' AddJobFlowSteps Text
 ajfsJobFlowId = lens _ajfsJobFlowId (\ s a -> s{_ajfsJobFlowId = a});
 
--- | A list of StepConfig to be executed by the job flow.
+-- | A list of < StepConfig> to be executed by the job flow.
 ajfsSteps :: Lens' AddJobFlowSteps [StepConfig]
 ajfsSteps = lens _ajfsSteps (\ s a -> s{_ajfsSteps = a}) . _Coerce;
 
 instance AWSRequest AddJobFlowSteps where
         type Rs AddJobFlowSteps = AddJobFlowStepsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  AddJobFlowStepsResponse' <$>
                    (x .?> "StepIds" .!@ mempty) <*> (pure (fromEnum s)))
 
+instance Hashable AddJobFlowSteps
+
 instance ToHeaders AddJobFlowSteps where
         toHeaders
           = const
@@ -133,7 +133,7 @@
 instance ToQuery AddJobFlowSteps where
         toQuery = const mempty
 
--- | The output for the AddJobFlowSteps operation.
+-- | The output for the < AddJobFlowSteps> operation.
 --
 -- /See:/ 'addJobFlowStepsResponse' smart constructor.
 data AddJobFlowStepsResponse = AddJobFlowStepsResponse'
diff --git a/gen/Network/AWS/EMR/AddTags.hs b/gen/Network/AWS/EMR/AddTags.hs
--- a/gen/Network/AWS/EMR/AddTags.hs
+++ b/gen/Network/AWS/EMR/AddTags.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.AddTags
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -22,8 +22,6 @@
 -- clusters in various ways, such as grouping clusters to track your Amazon
 -- EMR resource allocation costs. For more information, see
 -- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-tags.html Tagging Amazon EMR Resources>.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddTags.html AWS API Reference> for AddTags.
 module Network.AWS.EMR.AddTags
     (
     -- * Creating a Request
@@ -85,10 +83,12 @@
 
 instance AWSRequest AddTags where
         type Rs AddTags = AddTagsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveEmpty
               (\ s h x -> AddTagsResponse' <$> (pure (fromEnum s)))
+
+instance Hashable AddTags
 
 instance ToHeaders AddTags where
         toHeaders
diff --git a/gen/Network/AWS/EMR/DescribeCluster.hs b/gen/Network/AWS/EMR/DescribeCluster.hs
--- a/gen/Network/AWS/EMR/DescribeCluster.hs
+++ b/gen/Network/AWS/EMR/DescribeCluster.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.DescribeCluster
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,9 +20,7 @@
 --
 -- Provides cluster-level details including status, hardware and software
 -- configuration, VPC settings, and so on. For information about the
--- cluster steps, see ListSteps.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeCluster.html AWS API Reference> for DescribeCluster.
+-- cluster steps, see < ListSteps>.
 module Network.AWS.EMR.DescribeCluster
     (
     -- * Creating a Request
@@ -72,12 +70,14 @@
 
 instance AWSRequest DescribeCluster where
         type Rs DescribeCluster = DescribeClusterResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  DescribeClusterResponse' <$>
                    (pure (fromEnum s)) <*> (x .:> "Cluster"))
+
+instance Hashable DescribeCluster
 
 instance ToHeaders DescribeCluster where
         toHeaders
diff --git a/gen/Network/AWS/EMR/DescribeStep.hs b/gen/Network/AWS/EMR/DescribeStep.hs
--- a/gen/Network/AWS/EMR/DescribeStep.hs
+++ b/gen/Network/AWS/EMR/DescribeStep.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.EMR.DescribeStep
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Provides more detail about the cluster step.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeStep.html AWS API Reference> for DescribeStep.
 module Network.AWS.EMR.DescribeStep
     (
     -- * Creating a Request
@@ -80,12 +78,14 @@
 
 instance AWSRequest DescribeStep where
         type Rs DescribeStep = DescribeStepResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  DescribeStepResponse' <$>
                    (x .?> "Step") <*> (pure (fromEnum s)))
+
+instance Hashable DescribeStep
 
 instance ToHeaders DescribeStep where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ListBootstrapActions.hs b/gen/Network/AWS/EMR/ListBootstrapActions.hs
--- a/gen/Network/AWS/EMR/ListBootstrapActions.hs
+++ b/gen/Network/AWS/EMR/ListBootstrapActions.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ListBootstrapActions
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,8 +21,6 @@
 -- Provides information about the bootstrap actions associated with a
 -- cluster.
 --
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListBootstrapActions.html AWS API Reference> for ListBootstrapActions.
---
 -- This operation returns paginated results.
 module Network.AWS.EMR.ListBootstrapActions
     (
@@ -93,7 +91,7 @@
 instance AWSRequest ListBootstrapActions where
         type Rs ListBootstrapActions =
              ListBootstrapActionsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
@@ -101,6 +99,8 @@
                    (x .?> "BootstrapActions" .!@ mempty) <*>
                      (x .?> "Marker")
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListBootstrapActions
 
 instance ToHeaders ListBootstrapActions where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ListClusters.hs b/gen/Network/AWS/EMR/ListClusters.hs
--- a/gen/Network/AWS/EMR/ListClusters.hs
+++ b/gen/Network/AWS/EMR/ListClusters.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ListClusters
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -24,8 +24,6 @@
 -- call returns a maximum of 50 clusters per call, but returns a marker to
 -- track the paging of the cluster list across multiple ListClusters calls.
 --
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListClusters.html AWS API Reference> for ListClusters.
---
 -- This operation returns paginated results.
 module Network.AWS.EMR.ListClusters
     (
@@ -112,13 +110,15 @@
 
 instance AWSRequest ListClusters where
         type Rs ListClusters = ListClustersResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  ListClustersResponse' <$>
                    (x .?> "Marker") <*> (x .?> "Clusters" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListClusters
 
 instance ToHeaders ListClusters where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ListInstanceGroups.hs b/gen/Network/AWS/EMR/ListInstanceGroups.hs
--- a/gen/Network/AWS/EMR/ListInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/ListInstanceGroups.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ListInstanceGroups
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,8 +20,6 @@
 --
 -- Provides all available details about the instance groups in a cluster.
 --
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListInstanceGroups.html AWS API Reference> for ListInstanceGroups.
---
 -- This operation returns paginated results.
 module Network.AWS.EMR.ListInstanceGroups
     (
@@ -91,7 +89,7 @@
 instance AWSRequest ListInstanceGroups where
         type Rs ListInstanceGroups =
              ListInstanceGroupsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
@@ -99,6 +97,8 @@
                    (x .?> "Marker") <*>
                      (x .?> "InstanceGroups" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListInstanceGroups
 
 instance ToHeaders ListInstanceGroups where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ListInstances.hs b/gen/Network/AWS/EMR/ListInstances.hs
--- a/gen/Network/AWS/EMR/ListInstances.hs
+++ b/gen/Network/AWS/EMR/ListInstances.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ListInstances
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -24,8 +24,6 @@
 -- when instances become available to Amazon EMR to use for jobs, and the
 -- IP addresses for cluster instances, etc.
 --
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListInstances.html AWS API Reference> for ListInstances.
---
 -- This operation returns paginated results.
 module Network.AWS.EMR.ListInstances
     (
@@ -112,13 +110,15 @@
 
 instance AWSRequest ListInstances where
         type Rs ListInstances = ListInstancesResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  ListInstancesResponse' <$>
                    (x .?> "Marker") <*> (x .?> "Instances" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListInstances
 
 instance ToHeaders ListInstances where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ListSteps.hs b/gen/Network/AWS/EMR/ListSteps.hs
--- a/gen/Network/AWS/EMR/ListSteps.hs
+++ b/gen/Network/AWS/EMR/ListSteps.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ListSteps
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,8 +20,6 @@
 --
 -- Provides a list of steps for the cluster.
 --
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListSteps.html AWS API Reference> for ListSteps.
---
 -- This operation returns paginated results.
 module Network.AWS.EMR.ListSteps
     (
@@ -108,13 +106,15 @@
 
 instance AWSRequest ListSteps where
         type Rs ListSteps = ListStepsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  ListStepsResponse' <$>
                    (x .?> "Steps" .!@ mempty) <*> (x .?> "Marker") <*>
                      (pure (fromEnum s)))
+
+instance Hashable ListSteps
 
 instance ToHeaders ListSteps where
         toHeaders
diff --git a/gen/Network/AWS/EMR/ModifyInstanceGroups.hs b/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
--- a/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.ModifyInstanceGroups
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -22,8 +22,6 @@
 -- settings of an instance group. The input parameters include the new
 -- target instance count for the group and the instance group ID. The call
 -- will either succeed or fail atomically.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ModifyInstanceGroups.html AWS API Reference> for ModifyInstanceGroups.
 module Network.AWS.EMR.ModifyInstanceGroups
     (
     -- * Creating a Request
@@ -70,8 +68,10 @@
 instance AWSRequest ModifyInstanceGroups where
         type Rs ModifyInstanceGroups =
              ModifyInstanceGroupsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response = receiveNull ModifyInstanceGroupsResponse'
+
+instance Hashable ModifyInstanceGroups
 
 instance ToHeaders ModifyInstanceGroups where
         toHeaders
diff --git a/gen/Network/AWS/EMR/RemoveTags.hs b/gen/Network/AWS/EMR/RemoveTags.hs
--- a/gen/Network/AWS/EMR/RemoveTags.hs
+++ b/gen/Network/AWS/EMR/RemoveTags.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.RemoveTags
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -25,8 +25,6 @@
 --
 -- The following example removes the stack tag with value Prod from a
 -- cluster:
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RemoveTags.html AWS API Reference> for RemoveTags.
 module Network.AWS.EMR.RemoveTags
     (
     -- * Creating a Request
@@ -85,11 +83,13 @@
 
 instance AWSRequest RemoveTags where
         type Rs RemoveTags = RemoveTagsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveEmpty
               (\ s h x ->
                  RemoveTagsResponse' <$> (pure (fromEnum s)))
+
+instance Hashable RemoveTags
 
 instance ToHeaders RemoveTags where
         toHeaders
diff --git a/gen/Network/AWS/EMR/RunJobFlow.hs b/gen/Network/AWS/EMR/RunJobFlow.hs
--- a/gen/Network/AWS/EMR/RunJobFlow.hs
+++ b/gen/Network/AWS/EMR/RunJobFlow.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.RunJobFlow
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -22,11 +22,11 @@
 -- run the steps specified. Once the job flow completes, the cluster is
 -- stopped and the HDFS partition is lost. To prevent loss of data,
 -- configure the last step of the job flow to store results in Amazon S3.
--- If the JobFlowInstancesConfig 'KeepJobFlowAliveWhenNoSteps' parameter is
--- set to 'TRUE', the job flow will transition to the WAITING state rather
--- than shutting down once the steps have completed.
+-- If the < JobFlowInstancesConfig> 'KeepJobFlowAliveWhenNoSteps' parameter
+-- is set to 'TRUE', the job flow will transition to the WAITING state
+-- rather than shutting down once the steps have completed.
 --
--- For additional protection, you can set the JobFlowInstancesConfig
+-- For additional protection, you can set the < JobFlowInstancesConfig>
 -- 'TerminationProtected' parameter to 'TRUE' to lock the job flow and
 -- prevent it from being terminated by API call, user intervention, or in
 -- the event of a job flow error.
@@ -44,8 +44,6 @@
 --
 -- For long running job flows, we recommend that you periodically store
 -- your results.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RunJobFlow.html AWS API Reference> for RunJobFlow.
 module Network.AWS.EMR.RunJobFlow
     (
     -- * Creating a Request
@@ -84,7 +82,7 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | Input to the RunJobFlow operation.
+-- | Input to the < RunJobFlow> operation.
 --
 -- /See:/ 'runJobFlow' smart constructor.
 data RunJobFlow = RunJobFlow'
@@ -175,8 +173,8 @@
 --
 -- If the AMI supports multiple versions of Hadoop (for example, AMI 1.0
 -- supports both Hadoop 0.18 and 0.20) you can use the
--- JobFlowInstancesConfig 'HadoopVersion' parameter to modify the version
--- of Hadoop from the defaults shown above.
+-- < JobFlowInstancesConfig> 'HadoopVersion' parameter to modify the
+-- version of Hadoop from the defaults shown above.
 --
 -- For details about the AMI versions currently supported by Amazon Elastic
 -- MapReduce, go to
@@ -200,9 +198,10 @@
 rjfSteps :: Lens' RunJobFlow [StepConfig]
 rjfSteps = lens _rjfSteps (\ s a -> s{_rjfSteps = a}) . _Default . _Coerce;
 
--- | An IAM role for the job flow. The EC2 instances of the job flow assume
--- this role. The default role is 'EMRJobflowDefault'. In order to use the
--- default role, you must have already created it using the CLI.
+-- | Also called instance profile and EC2 role. An IAM role for an EMR
+-- cluster. The EC2 instances of the cluster assume this role. The default
+-- role is 'EMR_EC2_DefaultRole'. In order to use the default role, you
+-- must have already created it using the CLI or console.
 rjfJobFlowRole :: Lens' RunJobFlow (Maybe Text)
 rjfJobFlowRole = lens _rjfJobFlowRole (\ s a -> s{_rjfJobFlowRole = a});
 
@@ -297,13 +296,15 @@
 
 instance AWSRequest RunJobFlow where
         type Rs RunJobFlow = RunJobFlowResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveJSON
               (\ s h x ->
                  RunJobFlowResponse' <$>
                    (x .?> "JobFlowId") <*> (pure (fromEnum s)))
 
+instance Hashable RunJobFlow
+
 instance ToHeaders RunJobFlow where
         toHeaders
           = const
@@ -341,7 +342,7 @@
 instance ToQuery RunJobFlow where
         toQuery = const mempty
 
--- | The result of the RunJobFlow operation.
+-- | The result of the < RunJobFlow> operation.
 --
 -- /See:/ 'runJobFlowResponse' smart constructor.
 data RunJobFlowResponse = RunJobFlowResponse'
diff --git a/gen/Network/AWS/EMR/SetTerminationProtection.hs b/gen/Network/AWS/EMR/SetTerminationProtection.hs
--- a/gen/Network/AWS/EMR/SetTerminationProtection.hs
+++ b/gen/Network/AWS/EMR/SetTerminationProtection.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.SetTerminationProtection
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -38,8 +38,6 @@
 -- For more information, go to
 -- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_TerminationProtection.html Protecting a Job Flow from Termination>
 -- in the /Amazon Elastic MapReduce Developer\'s Guide./
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetTerminationProtection.html AWS API Reference> for SetTerminationProtection.
 module Network.AWS.EMR.SetTerminationProtection
     (
     -- * Creating a Request
@@ -61,7 +59,7 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | The input argument to the TerminationProtection operation.
+-- | The input argument to the < TerminationProtection> operation.
 --
 -- /See:/ 'setTerminationProtection' smart constructor.
 data SetTerminationProtection = SetTerminationProtection'
@@ -86,8 +84,8 @@
     }
 
 -- | A list of strings that uniquely identify the job flows to protect. This
--- identifier is returned by RunJobFlow and can also be obtained from
--- DescribeJobFlows .
+-- identifier is returned by < RunJobFlow> and can also be obtained from
+-- < DescribeJobFlows> .
 stpJobFlowIds :: Lens' SetTerminationProtection [Text]
 stpJobFlowIds = lens _stpJobFlowIds (\ s a -> s{_stpJobFlowIds = a}) . _Coerce;
 
@@ -100,9 +98,11 @@
 instance AWSRequest SetTerminationProtection where
         type Rs SetTerminationProtection =
              SetTerminationProtectionResponse
-        request = postJSON eMR
+        request = postJSON emr
         response
           = receiveNull SetTerminationProtectionResponse'
+
+instance Hashable SetTerminationProtection
 
 instance ToHeaders SetTerminationProtection where
         toHeaders
diff --git a/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs b/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
--- a/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
+++ b/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.SetVisibleToAllUsers
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,11 +21,9 @@
 -- Sets whether all AWS Identity and Access Management (IAM) users under
 -- your account can access the specified job flows. This action works on
 -- running job flows. You can also set the visibility of a job flow when
--- you launch it using the 'VisibleToAllUsers' parameter of RunJobFlow. The
--- SetVisibleToAllUsers action can be called only by an IAM user who
+-- you launch it using the 'VisibleToAllUsers' parameter of < RunJobFlow>.
+-- The SetVisibleToAllUsers action can be called only by an IAM user who
 -- created the job flow or the AWS account that owns the job flow.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetVisibleToAllUsers.html AWS API Reference> for SetVisibleToAllUsers.
 module Network.AWS.EMR.SetVisibleToAllUsers
     (
     -- * Creating a Request
@@ -86,8 +84,10 @@
 instance AWSRequest SetVisibleToAllUsers where
         type Rs SetVisibleToAllUsers =
              SetVisibleToAllUsersResponse
-        request = postJSON eMR
+        request = postJSON emr
         response = receiveNull SetVisibleToAllUsersResponse'
+
+instance Hashable SetVisibleToAllUsers
 
 instance ToHeaders SetVisibleToAllUsers where
         toHeaders
diff --git a/gen/Network/AWS/EMR/TerminateJobFlows.hs b/gen/Network/AWS/EMR/TerminateJobFlows.hs
--- a/gen/Network/AWS/EMR/TerminateJobFlows.hs
+++ b/gen/Network/AWS/EMR/TerminateJobFlows.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.TerminateJobFlows
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -28,8 +28,6 @@
 -- TerminateJobFlows is asynchronous. Depending on the configuration of the
 -- job flow, it may take up to 5-20 minutes for the job flow to completely
 -- terminate and release allocated resources, such as Amazon EC2 instances.
---
--- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_TerminateJobFlows.html AWS API Reference> for TerminateJobFlows.
 module Network.AWS.EMR.TerminateJobFlows
     (
     -- * Creating a Request
@@ -50,7 +48,7 @@
 import           Network.AWS.Request
 import           Network.AWS.Response
 
--- | Input to the TerminateJobFlows operation.
+-- | Input to the < TerminateJobFlows> operation.
 --
 -- /See:/ 'terminateJobFlows' smart constructor.
 newtype TerminateJobFlows = TerminateJobFlows'
@@ -75,8 +73,10 @@
 
 instance AWSRequest TerminateJobFlows where
         type Rs TerminateJobFlows = TerminateJobFlowsResponse
-        request = postJSON eMR
+        request = postJSON emr
         response = receiveNull TerminateJobFlowsResponse'
+
+instance Hashable TerminateJobFlows
 
 instance ToHeaders TerminateJobFlows where
         toHeaders
diff --git a/gen/Network/AWS/EMR/Types.hs b/gen/Network/AWS/EMR/Types.hs
--- a/gen/Network/AWS/EMR/Types.hs
+++ b/gen/Network/AWS/EMR/Types.hs
@@ -4,7 +4,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.Types
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -13,7 +13,7 @@
 module Network.AWS.EMR.Types
     (
     -- * Service Configuration
-      eMR
+      emr
 
     -- * Errors
     , _InvalidRequestException
@@ -133,6 +133,30 @@
     , cClassification
     , cProperties
 
+    -- * EBSBlockDevice
+    , EBSBlockDevice
+    , ebsBlockDevice
+    , ebdDevice
+    , ebdVolumeSpecification
+
+    -- * EBSBlockDeviceConfig
+    , EBSBlockDeviceConfig
+    , ebsBlockDeviceConfig
+    , ebdcVolumesPerInstance
+    , ebdcVolumeSpecification
+
+    -- * EBSConfiguration
+    , EBSConfiguration
+    , ebsConfiguration
+    , ecEBSOptimized
+    , ecEBSBlockDeviceConfigs
+
+    -- * EBSVolume
+    , EBSVolume
+    , ebsVolume
+    , evDevice
+    , evVolumeId
+
     -- * EC2InstanceAttributes
     , EC2InstanceAttributes
     , ec2InstanceAttributes
@@ -143,6 +167,7 @@
     , eiaIAMInstanceProfile
     , eiaEmrManagedMasterSecurityGroup
     , eiaEC2SubnetId
+    , eiaServiceAccessSecurityGroup
     , eiaEC2AvailabilityZone
 
     -- * HadoopJARStepConfig
@@ -166,9 +191,11 @@
     , instance'
     , iStatus
     , iPublicDNSName
+    , iEBSVolumes
     , iEC2InstanceId
     , iPrivateIPAddress
     , iId
+    , iInstanceGroupId
     , iPrivateDNSName
     , iPublicIPAddress
 
@@ -181,7 +208,9 @@
     , igRunningInstanceCount
     , igConfigurations
     , igInstanceGroupType
+    , igEBSBlockDevices
     , igInstanceType
+    , igEBSOptimized
     , igMarket
     , igName
     , igId
@@ -189,6 +218,7 @@
     -- * InstanceGroupConfig
     , InstanceGroupConfig
     , instanceGroupConfig
+    , igcEBSConfiguration
     , igcBidPrice
     , igcConfigurations
     , igcMarket
@@ -259,6 +289,7 @@
     , jficMasterInstanceType
     , jficInstanceGroups
     , jficKeepJobFlowAliveWhenNoSteps
+    , jficServiceAccessSecurityGroup
     , jficTerminationProtected
     , jficPlacement
 
@@ -335,6 +366,13 @@
     , tag
     , tagValue
     , tagKey
+
+    -- * VolumeSpecification
+    , VolumeSpecification
+    , volumeSpecification
+    , vsIOPS
+    , vsVolumeType
+    , vsSizeInGB
     ) where
 
 import           Network.AWS.EMR.Types.Product
@@ -344,14 +382,14 @@
 import           Network.AWS.Sign.V4
 
 -- | API version '2009-03-31' of the Amazon Elastic MapReduce SDK configuration.
-eMR :: Service
-eMR =
+emr :: Service
+emr =
     Service
     { _svcAbbrev = "EMR"
     , _svcSigner = v4
     , _svcPrefix = "elasticmapreduce"
     , _svcVersion = "2009-03-31"
-    , _svcEndpoint = defaultEndpoint eMR
+    , _svcEndpoint = defaultEndpoint emr
     , _svcTimeout = Just 70
     , _svcCheck = statusSuccess
     , _svcError = parseJSONError
@@ -366,6 +404,7 @@
         , _retryCheck = check
         }
     check e
+      | has (hasStatus 429) e = Just "too_many_requests"
       | has (hasCode "ThrottlingException" . hasStatus 400) e =
           Just "throttling_exception"
       | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
@@ -381,8 +420,7 @@
 -- | Indicates that an error occurred while processing the request and that
 -- the request was not completed.
 _InternalServerError :: AsError a => Getting (First ServiceError) a ServiceError
-_InternalServerError =
-    _ServiceError . hasStatus 500 . hasCode "InternalFailure"
+_InternalServerError = _ServiceError . hasCode "InternalServerError"
 
 -- | This exception occurs when there is an internal failure in the EMR
 -- service.
diff --git a/gen/Network/AWS/EMR/Types/Product.hs b/gen/Network/AWS/EMR/Types/Product.hs
--- a/gen/Network/AWS/EMR/Types/Product.hs
+++ b/gen/Network/AWS/EMR/Types/Product.hs
@@ -9,7 +9,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.Types.Product
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -97,6 +97,8 @@
                      <*> (x .:? "Name")
                      <*> (x .:? "Version"))
 
+instance Hashable Application
+
 instance ToJSON Application where
         toJSON Application'{..}
           = object
@@ -139,6 +141,8 @@
 bacScriptBootstrapAction :: Lens' BootstrapActionConfig ScriptBootstrapActionConfig
 bacScriptBootstrapAction = lens _bacScriptBootstrapAction (\ s a -> s{_bacScriptBootstrapAction = a});
 
+instance Hashable BootstrapActionConfig
+
 instance ToJSON BootstrapActionConfig where
         toJSON BootstrapActionConfig'{..}
           = object
@@ -286,7 +290,7 @@
 -- all IAM users of that AWS account can view and manage the job flow if
 -- they have the proper policy permissions set. If this value is 'false',
 -- only the IAM user that created the cluster can view and manage it. This
--- value can be changed using the SetVisibleToAllUsers action.
+-- value can be changed using the < SetVisibleToAllUsers> action.
 cluVisibleToAllUsers :: Lens' Cluster (Maybe Bool)
 cluVisibleToAllUsers = lens _cluVisibleToAllUsers (\ s a -> s{_cluVisibleToAllUsers = a});
 
@@ -343,6 +347,8 @@
                      <*> (x .: "Name")
                      <*> (x .: "Status"))
 
+instance Hashable Cluster
+
 -- | The reason that the cluster changed to its current state.
 --
 -- /See:/ 'clusterStateChangeReason' smart constructor.
@@ -381,6 +387,8 @@
                  ClusterStateChangeReason' <$>
                    (x .:? "Code") <*> (x .:? "Message"))
 
+instance Hashable ClusterStateChangeReason
+
 -- | The detailed status of the cluster.
 --
 -- /See:/ 'clusterStatus' smart constructor.
@@ -429,6 +437,8 @@
                    (x .:? "State") <*> (x .:? "StateChangeReason") <*>
                      (x .:? "Timeline"))
 
+instance Hashable ClusterStatus
+
 -- | The summary description of the cluster.
 --
 -- /See:/ 'clusterSummary' smart constructor.
@@ -491,6 +501,8 @@
                      <*> (x .:? "Name")
                      <*> (x .:? "Id"))
 
+instance Hashable ClusterSummary
+
 -- | Represents the timeline of the cluster\'s lifecycle.
 --
 -- /See:/ 'clusterTimeline' smart constructor.
@@ -539,6 +551,8 @@
                      (x .:? "CreationDateTime")
                      <*> (x .:? "EndDateTime"))
 
+instance Hashable ClusterTimeline
+
 -- | An entity describing an executable that runs on a cluster.
 --
 -- /See:/ 'command' smart constructor.
@@ -586,6 +600,8 @@
                    (x .:? "Args" .!= mempty) <*> (x .:? "ScriptPath")
                      <*> (x .:? "Name"))
 
+instance Hashable Command
+
 -- | Amazon EMR releases 4.x or later.
 --
 -- Specifies a hardware and software configuration of the EMR cluster. This
@@ -642,6 +658,8 @@
                      (x .:? "Classification")
                      <*> (x .:? "Properties" .!= mempty))
 
+instance Hashable Configuration
+
 instance ToJSON Configuration where
         toJSON Configuration'{..}
           = object
@@ -650,6 +668,175 @@
                   ("Classification" .=) <$> _cClassification,
                   ("Properties" .=) <$> _cProperties])
 
+-- | Configuration of requested EBS block device associated with the instance
+-- group.
+--
+-- /See:/ 'ebsBlockDevice' smart constructor.
+data EBSBlockDevice = EBSBlockDevice'
+    { _ebdDevice              :: !(Maybe Text)
+    , _ebdVolumeSpecification :: !(Maybe VolumeSpecification)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EBSBlockDevice' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ebdDevice'
+--
+-- * 'ebdVolumeSpecification'
+ebsBlockDevice
+    :: EBSBlockDevice
+ebsBlockDevice =
+    EBSBlockDevice'
+    { _ebdDevice = Nothing
+    , _ebdVolumeSpecification = Nothing
+    }
+
+-- | The device name that is exposed to the instance, such as \/dev\/sdh.
+ebdDevice :: Lens' EBSBlockDevice (Maybe Text)
+ebdDevice = lens _ebdDevice (\ s a -> s{_ebdDevice = a});
+
+-- | EBS volume specifications such as volume type, IOPS, and size(GiB) that
+-- will be requested for the EBS volume attached to an EC2 instance in the
+-- cluster.
+ebdVolumeSpecification :: Lens' EBSBlockDevice (Maybe VolumeSpecification)
+ebdVolumeSpecification = lens _ebdVolumeSpecification (\ s a -> s{_ebdVolumeSpecification = a});
+
+instance FromJSON EBSBlockDevice where
+        parseJSON
+          = withObject "EBSBlockDevice"
+              (\ x ->
+                 EBSBlockDevice' <$>
+                   (x .:? "Device") <*> (x .:? "VolumeSpecification"))
+
+instance Hashable EBSBlockDevice
+
+-- | Configuration of requested EBS block device associated with the instance
+-- group with count of volumes that will be associated to every instance.
+--
+-- /See:/ 'ebsBlockDeviceConfig' smart constructor.
+data EBSBlockDeviceConfig = EBSBlockDeviceConfig'
+    { _ebdcVolumesPerInstance  :: !(Maybe Int)
+    , _ebdcVolumeSpecification :: !VolumeSpecification
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EBSBlockDeviceConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ebdcVolumesPerInstance'
+--
+-- * 'ebdcVolumeSpecification'
+ebsBlockDeviceConfig
+    :: VolumeSpecification -- ^ 'ebdcVolumeSpecification'
+    -> EBSBlockDeviceConfig
+ebsBlockDeviceConfig pVolumeSpecification_ =
+    EBSBlockDeviceConfig'
+    { _ebdcVolumesPerInstance = Nothing
+    , _ebdcVolumeSpecification = pVolumeSpecification_
+    }
+
+-- | Number of EBS volumes with specific volume configuration, that will be
+-- associated with every instance in the instance group
+ebdcVolumesPerInstance :: Lens' EBSBlockDeviceConfig (Maybe Int)
+ebdcVolumesPerInstance = lens _ebdcVolumesPerInstance (\ s a -> s{_ebdcVolumesPerInstance = a});
+
+-- | EBS volume specifications such as volume type, IOPS, and size(GiB) that
+-- will be requested for the EBS volume attached to an EC2 instance in the
+-- cluster.
+ebdcVolumeSpecification :: Lens' EBSBlockDeviceConfig VolumeSpecification
+ebdcVolumeSpecification = lens _ebdcVolumeSpecification (\ s a -> s{_ebdcVolumeSpecification = a});
+
+instance Hashable EBSBlockDeviceConfig
+
+instance ToJSON EBSBlockDeviceConfig where
+        toJSON EBSBlockDeviceConfig'{..}
+          = object
+              (catMaybes
+                 [("VolumesPerInstance" .=) <$>
+                    _ebdcVolumesPerInstance,
+                  Just
+                    ("VolumeSpecification" .= _ebdcVolumeSpecification)])
+
+-- | /See:/ 'ebsConfiguration' smart constructor.
+data EBSConfiguration = EBSConfiguration'
+    { _ecEBSOptimized          :: !(Maybe Bool)
+    , _ecEBSBlockDeviceConfigs :: !(Maybe [EBSBlockDeviceConfig])
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EBSConfiguration' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ecEBSOptimized'
+--
+-- * 'ecEBSBlockDeviceConfigs'
+ebsConfiguration
+    :: EBSConfiguration
+ebsConfiguration =
+    EBSConfiguration'
+    { _ecEBSOptimized = Nothing
+    , _ecEBSBlockDeviceConfigs = Nothing
+    }
+
+-- | Undocumented member.
+ecEBSOptimized :: Lens' EBSConfiguration (Maybe Bool)
+ecEBSOptimized = lens _ecEBSOptimized (\ s a -> s{_ecEBSOptimized = a});
+
+-- | Undocumented member.
+ecEBSBlockDeviceConfigs :: Lens' EBSConfiguration [EBSBlockDeviceConfig]
+ecEBSBlockDeviceConfigs = lens _ecEBSBlockDeviceConfigs (\ s a -> s{_ecEBSBlockDeviceConfigs = a}) . _Default . _Coerce;
+
+instance Hashable EBSConfiguration
+
+instance ToJSON EBSConfiguration where
+        toJSON EBSConfiguration'{..}
+          = object
+              (catMaybes
+                 [("EbsOptimized" .=) <$> _ecEBSOptimized,
+                  ("EbsBlockDeviceConfigs" .=) <$>
+                    _ecEBSBlockDeviceConfigs])
+
+-- | EBS block device that\'s attached to an EC2 instance.
+--
+-- /See:/ 'ebsVolume' smart constructor.
+data EBSVolume = EBSVolume'
+    { _evDevice   :: !(Maybe Text)
+    , _evVolumeId :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EBSVolume' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'evDevice'
+--
+-- * 'evVolumeId'
+ebsVolume
+    :: EBSVolume
+ebsVolume =
+    EBSVolume'
+    { _evDevice = Nothing
+    , _evVolumeId = Nothing
+    }
+
+-- | The device name that is exposed to the instance, such as \/dev\/sdh.
+evDevice :: Lens' EBSVolume (Maybe Text)
+evDevice = lens _evDevice (\ s a -> s{_evDevice = a});
+
+-- | The volume identifier of the EBS volume.
+evVolumeId :: Lens' EBSVolume (Maybe Text)
+evVolumeId = lens _evVolumeId (\ s a -> s{_evVolumeId = a});
+
+instance FromJSON EBSVolume where
+        parseJSON
+          = withObject "EBSVolume"
+              (\ x ->
+                 EBSVolume' <$>
+                   (x .:? "Device") <*> (x .:? "VolumeId"))
+
+instance Hashable EBSVolume
+
 -- | Provides information about the EC2 instances in a cluster grouped by
 -- category. For example, key name, subnet ID, IAM instance profile, and so
 -- on.
@@ -663,6 +850,7 @@
     , _eiaIAMInstanceProfile             :: !(Maybe Text)
     , _eiaEmrManagedMasterSecurityGroup  :: !(Maybe Text)
     , _eiaEC2SubnetId                    :: !(Maybe Text)
+    , _eiaServiceAccessSecurityGroup     :: !(Maybe Text)
     , _eiaEC2AvailabilityZone            :: !(Maybe Text)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
@@ -684,6 +872,8 @@
 --
 -- * 'eiaEC2SubnetId'
 --
+-- * 'eiaServiceAccessSecurityGroup'
+--
 -- * 'eiaEC2AvailabilityZone'
 ec2InstanceAttributes
     :: EC2InstanceAttributes
@@ -696,6 +886,7 @@
     , _eiaIAMInstanceProfile = Nothing
     , _eiaEmrManagedMasterSecurityGroup = Nothing
     , _eiaEC2SubnetId = Nothing
+    , _eiaServiceAccessSecurityGroup = Nothing
     , _eiaEC2AvailabilityZone = Nothing
     }
 
@@ -704,8 +895,7 @@
 eiaEC2KeyName :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaEC2KeyName = lens _eiaEC2KeyName (\ s a -> s{_eiaEC2KeyName = a});
 
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- Elastic MapReduce) for the slave nodes.
+-- | The identifier of the Amazon EC2 security group for the slave nodes.
 eiaEmrManagedSlaveSecurityGroup :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaEmrManagedSlaveSecurityGroup = lens _eiaEmrManagedSlaveSecurityGroup (\ s a -> s{_eiaEmrManagedSlaveSecurityGroup = a});
 
@@ -722,8 +912,7 @@
 eiaIAMInstanceProfile :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaIAMInstanceProfile = lens _eiaIAMInstanceProfile (\ s a -> s{_eiaIAMInstanceProfile = a});
 
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- Elastic MapReduce) for the master node.
+-- | The identifier of the Amazon EC2 security group for the master node.
 eiaEmrManagedMasterSecurityGroup :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaEmrManagedMasterSecurityGroup = lens _eiaEmrManagedMasterSecurityGroup (\ s a -> s{_eiaEmrManagedMasterSecurityGroup = a});
 
@@ -738,6 +927,11 @@
 eiaEC2SubnetId :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaEC2SubnetId = lens _eiaEC2SubnetId (\ s a -> s{_eiaEC2SubnetId = a});
 
+-- | The identifier of the Amazon EC2 security group for the Amazon EMR
+-- service to access clusters in VPC private subnets.
+eiaServiceAccessSecurityGroup :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaServiceAccessSecurityGroup = lens _eiaServiceAccessSecurityGroup (\ s a -> s{_eiaServiceAccessSecurityGroup = a});
+
 -- | The Availability Zone in which the cluster will run.
 eiaEC2AvailabilityZone :: Lens' EC2InstanceAttributes (Maybe Text)
 eiaEC2AvailabilityZone = lens _eiaEC2AvailabilityZone (\ s a -> s{_eiaEC2AvailabilityZone = a});
@@ -756,8 +950,11 @@
                      <*> (x .:? "IamInstanceProfile")
                      <*> (x .:? "EmrManagedMasterSecurityGroup")
                      <*> (x .:? "Ec2SubnetId")
+                     <*> (x .:? "ServiceAccessSecurityGroup")
                      <*> (x .:? "Ec2AvailabilityZone"))
 
+instance Hashable EC2InstanceAttributes
+
 -- | A job flow step consisting of a JAR file whose main function will be
 -- executed. The main function submits a job for Hadoop to execute and
 -- waits for the job to finish or fail.
@@ -811,6 +1008,8 @@
 hjscJAR :: Lens' HadoopJARStepConfig Text
 hjscJAR = lens _hjscJAR (\ s a -> s{_hjscJAR = a});
 
+instance Hashable HadoopJARStepConfig
+
 instance ToJSON HadoopJARStepConfig where
         toJSON HadoopJARStepConfig'{..}
           = object
@@ -881,15 +1080,19 @@
                      (x .:? "MainClass")
                      <*> (x .:? "Properties" .!= mempty))
 
+instance Hashable HadoopStepConfig
+
 -- | Represents an EC2 instance provisioned as part of cluster.
 --
 -- /See:/ 'instance'' smart constructor.
 data Instance = Instance'
     { _iStatus           :: !(Maybe InstanceStatus)
     , _iPublicDNSName    :: !(Maybe Text)
+    , _iEBSVolumes       :: !(Maybe [EBSVolume])
     , _iEC2InstanceId    :: !(Maybe Text)
     , _iPrivateIPAddress :: !(Maybe Text)
     , _iId               :: !(Maybe Text)
+    , _iInstanceGroupId  :: !(Maybe Text)
     , _iPrivateDNSName   :: !(Maybe Text)
     , _iPublicIPAddress  :: !(Maybe Text)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
@@ -902,12 +1105,16 @@
 --
 -- * 'iPublicDNSName'
 --
+-- * 'iEBSVolumes'
+--
 -- * 'iEC2InstanceId'
 --
 -- * 'iPrivateIPAddress'
 --
 -- * 'iId'
 --
+-- * 'iInstanceGroupId'
+--
 -- * 'iPrivateDNSName'
 --
 -- * 'iPublicIPAddress'
@@ -917,9 +1124,11 @@
     Instance'
     { _iStatus = Nothing
     , _iPublicDNSName = Nothing
+    , _iEBSVolumes = Nothing
     , _iEC2InstanceId = Nothing
     , _iPrivateIPAddress = Nothing
     , _iId = Nothing
+    , _iInstanceGroupId = Nothing
     , _iPrivateDNSName = Nothing
     , _iPublicIPAddress = Nothing
     }
@@ -932,6 +1141,10 @@
 iPublicDNSName :: Lens' Instance (Maybe Text)
 iPublicDNSName = lens _iPublicDNSName (\ s a -> s{_iPublicDNSName = a});
 
+-- | The list of EBS volumes that are attached to this instance.
+iEBSVolumes :: Lens' Instance [EBSVolume]
+iEBSVolumes = lens _iEBSVolumes (\ s a -> s{_iEBSVolumes = a}) . _Default . _Coerce;
+
 -- | The unique identifier of the instance in Amazon EC2.
 iEC2InstanceId :: Lens' Instance (Maybe Text)
 iEC2InstanceId = lens _iEC2InstanceId (\ s a -> s{_iEC2InstanceId = a});
@@ -944,6 +1157,10 @@
 iId :: Lens' Instance (Maybe Text)
 iId = lens _iId (\ s a -> s{_iId = a});
 
+-- | The identifier of the instance group to which this instance belongs.
+iInstanceGroupId :: Lens' Instance (Maybe Text)
+iInstanceGroupId = lens _iInstanceGroupId (\ s a -> s{_iInstanceGroupId = a});
+
 -- | The private DNS name of the instance.
 iPrivateDNSName :: Lens' Instance (Maybe Text)
 iPrivateDNSName = lens _iPrivateDNSName (\ s a -> s{_iPrivateDNSName = a});
@@ -958,12 +1175,16 @@
               (\ x ->
                  Instance' <$>
                    (x .:? "Status") <*> (x .:? "PublicDnsName") <*>
-                     (x .:? "Ec2InstanceId")
+                     (x .:? "EbsVolumes" .!= mempty)
+                     <*> (x .:? "Ec2InstanceId")
                      <*> (x .:? "PrivateIpAddress")
                      <*> (x .:? "Id")
+                     <*> (x .:? "InstanceGroupId")
                      <*> (x .:? "PrivateDnsName")
                      <*> (x .:? "PublicIpAddress"))
 
+instance Hashable Instance
+
 -- | This entity represents an instance group, which is a group of instances
 -- that have common purpose. For example, CORE instance group is used for
 -- HDFS.
@@ -976,7 +1197,9 @@
     , _igRunningInstanceCount   :: !(Maybe Int)
     , _igConfigurations         :: !(Maybe [Configuration])
     , _igInstanceGroupType      :: !(Maybe InstanceGroupType)
+    , _igEBSBlockDevices        :: !(Maybe [EBSBlockDevice])
     , _igInstanceType           :: !(Maybe Text)
+    , _igEBSOptimized           :: !(Maybe Bool)
     , _igMarket                 :: !(Maybe MarketType)
     , _igName                   :: !(Maybe Text)
     , _igId                     :: !(Maybe Text)
@@ -998,8 +1221,12 @@
 --
 -- * 'igInstanceGroupType'
 --
+-- * 'igEBSBlockDevices'
+--
 -- * 'igInstanceType'
 --
+-- * 'igEBSOptimized'
+--
 -- * 'igMarket'
 --
 -- * 'igName'
@@ -1015,7 +1242,9 @@
     , _igRunningInstanceCount = Nothing
     , _igConfigurations = Nothing
     , _igInstanceGroupType = Nothing
+    , _igEBSBlockDevices = Nothing
     , _igInstanceType = Nothing
+    , _igEBSOptimized = Nothing
     , _igMarket = Nothing
     , _igName = Nothing
     , _igId = Nothing
@@ -1050,10 +1279,20 @@
 igInstanceGroupType :: Lens' InstanceGroup (Maybe InstanceGroupType)
 igInstanceGroupType = lens _igInstanceGroupType (\ s a -> s{_igInstanceGroupType = a});
 
+-- | The EBS block devices that are mapped to this instance group.
+igEBSBlockDevices :: Lens' InstanceGroup [EBSBlockDevice]
+igEBSBlockDevices = lens _igEBSBlockDevices (\ s a -> s{_igEBSBlockDevices = a}) . _Default . _Coerce;
+
 -- | The EC2 instance type for all instances in the instance group.
 igInstanceType :: Lens' InstanceGroup (Maybe Text)
 igInstanceType = lens _igInstanceType (\ s a -> s{_igInstanceType = a});
 
+-- | If the instance group is EBS-optimized. An Amazon EBS–optimized instance
+-- uses an optimized configuration stack and provides additional, dedicated
+-- capacity for Amazon EBS I\/O.
+igEBSOptimized :: Lens' InstanceGroup (Maybe Bool)
+igEBSOptimized = lens _igEBSOptimized (\ s a -> s{_igEBSOptimized = a});
+
 -- | The marketplace to provision instances for this group. Valid values are
 -- ON_DEMAND or SPOT.
 igMarket :: Lens' InstanceGroup (Maybe MarketType)
@@ -1077,28 +1316,35 @@
                      <*> (x .:? "RunningInstanceCount")
                      <*> (x .:? "Configurations" .!= mempty)
                      <*> (x .:? "InstanceGroupType")
+                     <*> (x .:? "EbsBlockDevices" .!= mempty)
                      <*> (x .:? "InstanceType")
+                     <*> (x .:? "EbsOptimized")
                      <*> (x .:? "Market")
                      <*> (x .:? "Name")
                      <*> (x .:? "Id"))
 
+instance Hashable InstanceGroup
+
 -- | Configuration defining a new instance group.
 --
 -- /See:/ 'instanceGroupConfig' smart constructor.
 data InstanceGroupConfig = InstanceGroupConfig'
-    { _igcBidPrice       :: !(Maybe Text)
-    , _igcConfigurations :: !(Maybe [Configuration])
-    , _igcMarket         :: !(Maybe MarketType)
-    , _igcName           :: !(Maybe Text)
-    , _igcInstanceRole   :: !InstanceRoleType
-    , _igcInstanceType   :: !Text
-    , _igcInstanceCount  :: !Int
+    { _igcEBSConfiguration :: !(Maybe EBSConfiguration)
+    , _igcBidPrice         :: !(Maybe Text)
+    , _igcConfigurations   :: !(Maybe [Configuration])
+    , _igcMarket           :: !(Maybe MarketType)
+    , _igcName             :: !(Maybe Text)
+    , _igcInstanceRole     :: !InstanceRoleType
+    , _igcInstanceType     :: !Text
+    , _igcInstanceCount    :: !Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
 -- | Creates a value of 'InstanceGroupConfig' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
 --
+-- * 'igcEBSConfiguration'
+--
 -- * 'igcBidPrice'
 --
 -- * 'igcConfigurations'
@@ -1119,7 +1365,8 @@
     -> InstanceGroupConfig
 instanceGroupConfig pInstanceRole_ pInstanceType_ pInstanceCount_ =
     InstanceGroupConfig'
-    { _igcBidPrice = Nothing
+    { _igcEBSConfiguration = Nothing
+    , _igcBidPrice = Nothing
     , _igcConfigurations = Nothing
     , _igcMarket = Nothing
     , _igcName = Nothing
@@ -1128,6 +1375,11 @@
     , _igcInstanceCount = pInstanceCount_
     }
 
+-- | EBS configurations that will be attached to each Amazon EC2 instance in
+-- the instance group.
+igcEBSConfiguration :: Lens' InstanceGroupConfig (Maybe EBSConfiguration)
+igcEBSConfiguration = lens _igcEBSConfiguration (\ s a -> s{_igcEBSConfiguration = a});
+
 -- | Bid price for each Amazon EC2 instance in the instance group when
 -- launching nodes as Spot Instances, expressed in USD.
 igcBidPrice :: Lens' InstanceGroupConfig (Maybe Text)
@@ -1161,11 +1413,14 @@
 igcInstanceCount :: Lens' InstanceGroupConfig Int
 igcInstanceCount = lens _igcInstanceCount (\ s a -> s{_igcInstanceCount = a});
 
+instance Hashable InstanceGroupConfig
+
 instance ToJSON InstanceGroupConfig where
         toJSON InstanceGroupConfig'{..}
           = object
               (catMaybes
-                 [("BidPrice" .=) <$> _igcBidPrice,
+                 [("EbsConfiguration" .=) <$> _igcEBSConfiguration,
+                  ("BidPrice" .=) <$> _igcBidPrice,
                   ("Configurations" .=) <$> _igcConfigurations,
                   ("Market" .=) <$> _igcMarket,
                   ("Name" .=) <$> _igcName,
@@ -1215,6 +1470,8 @@
 igmcInstanceGroupId :: Lens' InstanceGroupModifyConfig Text
 igmcInstanceGroupId = lens _igmcInstanceGroupId (\ s a -> s{_igmcInstanceGroupId = a});
 
+instance Hashable InstanceGroupModifyConfig
+
 instance ToJSON InstanceGroupModifyConfig where
         toJSON InstanceGroupModifyConfig'{..}
           = object
@@ -1263,6 +1520,8 @@
                  InstanceGroupStateChangeReason' <$>
                    (x .:? "Code") <*> (x .:? "Message"))
 
+instance Hashable InstanceGroupStateChangeReason
+
 -- | The details of the instance group status.
 --
 -- /See:/ 'instanceGroupStatus' smart constructor.
@@ -1310,6 +1569,8 @@
                    (x .:? "State") <*> (x .:? "StateChangeReason") <*>
                      (x .:? "Timeline"))
 
+instance Hashable InstanceGroupStatus
+
 -- | The timeline of the instance group lifecycle.
 --
 -- /See:/ 'instanceGroupTimeline' smart constructor.
@@ -1358,6 +1619,8 @@
                      (x .:? "CreationDateTime")
                      <*> (x .:? "EndDateTime"))
 
+instance Hashable InstanceGroupTimeline
+
 -- | The details of the status change reason for the instance.
 --
 -- /See:/ 'instanceStateChangeReason' smart constructor.
@@ -1396,6 +1659,8 @@
                  InstanceStateChangeReason' <$>
                    (x .:? "Code") <*> (x .:? "Message"))
 
+instance Hashable InstanceStateChangeReason
+
 -- | The instance status details.
 --
 -- /See:/ 'instanceStatus' smart constructor.
@@ -1443,6 +1708,8 @@
                    (x .:? "State") <*> (x .:? "StateChangeReason") <*>
                      (x .:? "Timeline"))
 
+instance Hashable InstanceStatus
+
 -- | The timeline of the instance lifecycle.
 --
 -- /See:/ 'instanceTimeline' smart constructor.
@@ -1491,6 +1758,8 @@
                      (x .:? "CreationDateTime")
                      <*> (x .:? "EndDateTime"))
 
+instance Hashable InstanceTimeline
+
 -- | A description of the Amazon EC2 instance running the job flow. A valid
 -- JobFlowInstancesConfig must contain at least InstanceGroups, which is
 -- the recommended configuration. However, a valid alternative is to have
@@ -1511,6 +1780,7 @@
     , _jficMasterInstanceType             :: !(Maybe Text)
     , _jficInstanceGroups                 :: !(Maybe [InstanceGroupConfig])
     , _jficKeepJobFlowAliveWhenNoSteps    :: !(Maybe Bool)
+    , _jficServiceAccessSecurityGroup     :: !(Maybe Text)
     , _jficTerminationProtected           :: !(Maybe Bool)
     , _jficPlacement                      :: !(Maybe PlacementType)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
@@ -1543,6 +1813,8 @@
 --
 -- * 'jficKeepJobFlowAliveWhenNoSteps'
 --
+-- * 'jficServiceAccessSecurityGroup'
+--
 -- * 'jficTerminationProtected'
 --
 -- * 'jficPlacement'
@@ -1562,6 +1834,7 @@
     , _jficMasterInstanceType = Nothing
     , _jficInstanceGroups = Nothing
     , _jficKeepJobFlowAliveWhenNoSteps = Nothing
+    , _jficServiceAccessSecurityGroup = Nothing
     , _jficTerminationProtected = Nothing
     , _jficPlacement = Nothing
     }
@@ -1579,8 +1852,7 @@
 jficInstanceCount :: Lens' JobFlowInstancesConfig (Maybe Int)
 jficInstanceCount = lens _jficInstanceCount (\ s a -> s{_jficInstanceCount = a});
 
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- ElasticMapReduce) for the slave nodes.
+-- | The identifier of the Amazon EC2 security group for the slave nodes.
 jficEmrManagedSlaveSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
 jficEmrManagedSlaveSecurityGroup = lens _jficEmrManagedSlaveSecurityGroup (\ s a -> s{_jficEmrManagedSlaveSecurityGroup = a});
 
@@ -1601,8 +1873,7 @@
 jficAdditionalMasterSecurityGroups :: Lens' JobFlowInstancesConfig [Text]
 jficAdditionalMasterSecurityGroups = lens _jficAdditionalMasterSecurityGroups (\ s a -> s{_jficAdditionalMasterSecurityGroups = a}) . _Default . _Coerce;
 
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- ElasticMapReduce) for the master node.
+-- | The identifier of the Amazon EC2 security group for the master node.
 jficEmrManagedMasterSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
 jficEmrManagedMasterSecurityGroup = lens _jficEmrManagedMasterSecurityGroup (\ s a -> s{_jficEmrManagedMasterSecurityGroup = a});
 
@@ -1631,6 +1902,11 @@
 jficKeepJobFlowAliveWhenNoSteps :: Lens' JobFlowInstancesConfig (Maybe Bool)
 jficKeepJobFlowAliveWhenNoSteps = lens _jficKeepJobFlowAliveWhenNoSteps (\ s a -> s{_jficKeepJobFlowAliveWhenNoSteps = a});
 
+-- | The identifier of the Amazon EC2 security group for the Amazon EMR
+-- service to access clusters in VPC private subnets.
+jficServiceAccessSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficServiceAccessSecurityGroup = lens _jficServiceAccessSecurityGroup (\ s a -> s{_jficServiceAccessSecurityGroup = a});
+
 -- | Specifies whether to lock the job flow to prevent the Amazon EC2
 -- instances from being terminated by API call, user intervention, or in
 -- the event of a job flow error.
@@ -1641,6 +1917,8 @@
 jficPlacement :: Lens' JobFlowInstancesConfig (Maybe PlacementType)
 jficPlacement = lens _jficPlacement (\ s a -> s{_jficPlacement = a});
 
+instance Hashable JobFlowInstancesConfig
+
 instance ToJSON JobFlowInstancesConfig where
         toJSON JobFlowInstancesConfig'{..}
           = object
@@ -1663,6 +1941,8 @@
                   ("InstanceGroups" .=) <$> _jficInstanceGroups,
                   ("KeepJobFlowAliveWhenNoSteps" .=) <$>
                     _jficKeepJobFlowAliveWhenNoSteps,
+                  ("ServiceAccessSecurityGroup" .=) <$>
+                    _jficServiceAccessSecurityGroup,
                   ("TerminationProtected" .=) <$>
                     _jficTerminationProtected,
                   ("Placement" .=) <$> _jficPlacement])
@@ -1698,6 +1978,8 @@
 kvKey :: Lens' KeyValue (Maybe Text)
 kvKey = lens _kvKey (\ s a -> s{_kvKey = a});
 
+instance Hashable KeyValue
+
 instance ToJSON KeyValue where
         toJSON KeyValue'{..}
           = object
@@ -1728,6 +2010,8 @@
 ptAvailabilityZone :: Lens' PlacementType Text
 ptAvailabilityZone = lens _ptAvailabilityZone (\ s a -> s{_ptAvailabilityZone = a});
 
+instance Hashable PlacementType
+
 instance ToJSON PlacementType where
         toJSON PlacementType'{..}
           = object
@@ -1767,6 +2051,8 @@
 sbacPath :: Lens' ScriptBootstrapActionConfig Text
 sbacPath = lens _sbacPath (\ s a -> s{_sbacPath = a});
 
+instance Hashable ScriptBootstrapActionConfig
+
 instance ToJSON ScriptBootstrapActionConfig where
         toJSON ScriptBootstrapActionConfig'{..}
           = object
@@ -1840,6 +2126,8 @@
                      <*> (x .:? "Name")
                      <*> (x .:? "Id"))
 
+instance Hashable Step
+
 -- | Specification of a job flow step.
 --
 -- /See:/ 'stepConfig' smart constructor.
@@ -1881,6 +2169,8 @@
 scHadoopJARStep :: Lens' StepConfig HadoopJARStepConfig
 scHadoopJARStep = lens _scHadoopJARStep (\ s a -> s{_scHadoopJARStep = a});
 
+instance Hashable StepConfig
+
 instance ToJSON StepConfig where
         toJSON StepConfig'{..}
           = object
@@ -1928,6 +2218,8 @@
                  StepStateChangeReason' <$>
                    (x .:? "Code") <*> (x .:? "Message"))
 
+instance Hashable StepStateChangeReason
+
 -- | The execution status details of the cluster step.
 --
 -- /See:/ 'stepStatus' smart constructor.
@@ -1975,6 +2267,8 @@
                    (x .:? "State") <*> (x .:? "StateChangeReason") <*>
                      (x .:? "Timeline"))
 
+instance Hashable StepStatus
+
 -- | The summary of the cluster step.
 --
 -- /See:/ 'stepSummary' smart constructor.
@@ -2041,6 +2335,8 @@
                      <*> (x .:? "Name")
                      <*> (x .:? "Id"))
 
+instance Hashable StepSummary
+
 -- | The timeline of the cluster step lifecycle.
 --
 -- /See:/ 'stepTimeline' smart constructor.
@@ -2088,6 +2384,8 @@
                    (x .:? "CreationDateTime") <*> (x .:? "EndDateTime")
                      <*> (x .:? "StartDateTime"))
 
+instance Hashable StepTimeline
+
 -- | The list of supported product configurations which allow user-supplied
 -- arguments. EMR accepts these arguments and forwards them to the
 -- corresponding installation script as bootstrap action arguments.
@@ -2121,6 +2419,8 @@
 spcName :: Lens' SupportedProductConfig (Maybe Text)
 spcName = lens _spcName (\ s a -> s{_spcName = a});
 
+instance Hashable SupportedProductConfig
+
 instance ToJSON SupportedProductConfig where
         toJSON SupportedProductConfig'{..}
           = object
@@ -2171,8 +2471,73 @@
           = withObject "Tag"
               (\ x -> Tag' <$> (x .:? "Value") <*> (x .:? "Key"))
 
+instance Hashable Tag
+
 instance ToJSON Tag where
         toJSON Tag'{..}
           = object
               (catMaybes
                  [("Value" .=) <$> _tagValue, ("Key" .=) <$> _tagKey])
+
+-- | EBS volume specifications such as volume type, IOPS, and size(GiB) that
+-- will be requested for the EBS volume attached to an EC2 instance in the
+-- cluster.
+--
+-- /See:/ 'volumeSpecification' smart constructor.
+data VolumeSpecification = VolumeSpecification'
+    { _vsIOPS       :: !(Maybe Int)
+    , _vsVolumeType :: !Text
+    , _vsSizeInGB   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'VolumeSpecification' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'vsIOPS'
+--
+-- * 'vsVolumeType'
+--
+-- * 'vsSizeInGB'
+volumeSpecification
+    :: Text -- ^ 'vsVolumeType'
+    -> Int -- ^ 'vsSizeInGB'
+    -> VolumeSpecification
+volumeSpecification pVolumeType_ pSizeInGB_ =
+    VolumeSpecification'
+    { _vsIOPS = Nothing
+    , _vsVolumeType = pVolumeType_
+    , _vsSizeInGB = pSizeInGB_
+    }
+
+-- | The number of I\/O operations per second (IOPS) that the volume
+-- supports.
+vsIOPS :: Lens' VolumeSpecification (Maybe Int)
+vsIOPS = lens _vsIOPS (\ s a -> s{_vsIOPS = a});
+
+-- | The volume type. Volume types supported are gp2, io1, standard.
+vsVolumeType :: Lens' VolumeSpecification Text
+vsVolumeType = lens _vsVolumeType (\ s a -> s{_vsVolumeType = a});
+
+-- | The volume size, in gibibytes (GiB). This can be a number from 1 – 1024.
+-- If the volume type is EBS-optimized, the minimum value is 10.
+vsSizeInGB :: Lens' VolumeSpecification Int
+vsSizeInGB = lens _vsSizeInGB (\ s a -> s{_vsSizeInGB = a});
+
+instance FromJSON VolumeSpecification where
+        parseJSON
+          = withObject "VolumeSpecification"
+              (\ x ->
+                 VolumeSpecification' <$>
+                   (x .:? "Iops") <*> (x .: "VolumeType") <*>
+                     (x .: "SizeInGB"))
+
+instance Hashable VolumeSpecification
+
+instance ToJSON VolumeSpecification where
+        toJSON VolumeSpecification'{..}
+          = object
+              (catMaybes
+                 [("Iops" .=) <$> _vsIOPS,
+                  Just ("VolumeType" .= _vsVolumeType),
+                  Just ("SizeInGB" .= _vsSizeInGB)])
diff --git a/gen/Network/AWS/EMR/Types/Sum.hs b/gen/Network/AWS/EMR/Types/Sum.hs
--- a/gen/Network/AWS/EMR/Types/Sum.hs
+++ b/gen/Network/AWS/EMR/Types/Sum.hs
@@ -9,7 +9,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.Types.Sum
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
diff --git a/gen/Network/AWS/EMR/Waiters.hs b/gen/Network/AWS/EMR/Waiters.hs
--- a/gen/Network/AWS/EMR/Waiters.hs
+++ b/gen/Network/AWS/EMR/Waiters.hs
@@ -7,7 +7,7 @@
 
 -- |
 -- Module      : Network.AWS.EMR.Waiters
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,7 +2,7 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
diff --git a/test/Test/AWS/EMR.hs b/test/Test/AWS/EMR.hs
--- a/test/Test/AWS/EMR.hs
+++ b/test/Test/AWS/EMR.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 -- Module      : Test.AWS.EMR
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : This Source Code Form is subject to the terms of
 --               the Mozilla Public License, v. 2.0.
 --               A copy of the MPL can be found in the LICENSE file or
diff --git a/test/Test/AWS/EMR/Internal.hs b/test/Test/AWS/EMR/Internal.hs
--- a/test/Test/AWS/EMR/Internal.hs
+++ b/test/Test/AWS/EMR/Internal.hs
@@ -2,7 +2,7 @@
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
 -- Module      : Test.AWS.EMR.Internal
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : This Source Code Form is subject to the terms of
 --               the Mozilla Public License, v. 2.0.
 --               A copy of the MPL can be found in the LICENSE file or
diff --git a/test/Test/AWS/Gen/EMR.hs b/test/Test/AWS/Gen/EMR.hs
--- a/test/Test/AWS/Gen/EMR.hs
+++ b/test/Test/AWS/Gen/EMR.hs
@@ -5,7 +5,7 @@
 
 -- |
 -- Module      : Test.AWS.Gen.EMR
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -218,110 +218,110 @@
 testRunJobFlowResponse = res
     "RunJobFlowResponse"
     "fixture/RunJobFlowResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy RunJobFlow)
 
 testSetVisibleToAllUsersResponse :: SetVisibleToAllUsersResponse -> TestTree
 testSetVisibleToAllUsersResponse = res
     "SetVisibleToAllUsersResponse"
     "fixture/SetVisibleToAllUsersResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy SetVisibleToAllUsers)
 
 testTerminateJobFlowsResponse :: TerminateJobFlowsResponse -> TestTree
 testTerminateJobFlowsResponse = res
     "TerminateJobFlowsResponse"
     "fixture/TerminateJobFlowsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy TerminateJobFlows)
 
 testDescribeStepResponse :: DescribeStepResponse -> TestTree
 testDescribeStepResponse = res
     "DescribeStepResponse"
     "fixture/DescribeStepResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy DescribeStep)
 
 testRemoveTagsResponse :: RemoveTagsResponse -> TestTree
 testRemoveTagsResponse = res
     "RemoveTagsResponse"
     "fixture/RemoveTagsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy RemoveTags)
 
 testDescribeClusterResponse :: DescribeClusterResponse -> TestTree
 testDescribeClusterResponse = res
     "DescribeClusterResponse"
     "fixture/DescribeClusterResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy DescribeCluster)
 
 testSetTerminationProtectionResponse :: SetTerminationProtectionResponse -> TestTree
 testSetTerminationProtectionResponse = res
     "SetTerminationProtectionResponse"
     "fixture/SetTerminationProtectionResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy SetTerminationProtection)
 
 testAddJobFlowStepsResponse :: AddJobFlowStepsResponse -> TestTree
 testAddJobFlowStepsResponse = res
     "AddJobFlowStepsResponse"
     "fixture/AddJobFlowStepsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy AddJobFlowSteps)
 
 testModifyInstanceGroupsResponse :: ModifyInstanceGroupsResponse -> TestTree
 testModifyInstanceGroupsResponse = res
     "ModifyInstanceGroupsResponse"
     "fixture/ModifyInstanceGroupsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ModifyInstanceGroups)
 
 testListStepsResponse :: ListStepsResponse -> TestTree
 testListStepsResponse = res
     "ListStepsResponse"
     "fixture/ListStepsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ListSteps)
 
 testAddInstanceGroupsResponse :: AddInstanceGroupsResponse -> TestTree
 testAddInstanceGroupsResponse = res
     "AddInstanceGroupsResponse"
     "fixture/AddInstanceGroupsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy AddInstanceGroups)
 
 testListInstanceGroupsResponse :: ListInstanceGroupsResponse -> TestTree
 testListInstanceGroupsResponse = res
     "ListInstanceGroupsResponse"
     "fixture/ListInstanceGroupsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ListInstanceGroups)
 
 testListBootstrapActionsResponse :: ListBootstrapActionsResponse -> TestTree
 testListBootstrapActionsResponse = res
     "ListBootstrapActionsResponse"
     "fixture/ListBootstrapActionsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ListBootstrapActions)
 
 testAddTagsResponse :: AddTagsResponse -> TestTree
 testAddTagsResponse = res
     "AddTagsResponse"
     "fixture/AddTagsResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy AddTags)
 
 testListInstancesResponse :: ListInstancesResponse -> TestTree
 testListInstancesResponse = res
     "ListInstancesResponse"
     "fixture/ListInstancesResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ListInstances)
 
 testListClustersResponse :: ListClustersResponse -> TestTree
 testListClustersResponse = res
     "ListClustersResponse"
     "fixture/ListClustersResponse.proto"
-    eMR
+    emr
     (Proxy :: Proxy ListClusters)
