diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,22 +1,35 @@
 # Amazon Elastic MapReduce SDK
 
-> _Warning:_ This is an experimental preview release which is still under heavy development and not intended for public consumption, _caveat emptor_!
-
+* [Version](#version)
 * [Description](#description)
 * [Contribute](#contribute)
 * [Licence](#licence)
 
+
+## Version
+
+`1.0.0`
+
+
 ## Description
 
-Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it easy to
-process large amounts of data efficiently. Amazon EMR uses Hadoop processing
-combined with several AWS products to do such tasks as web indexing, data
-mining, log file analysis, machine learning, scientific simulation, and data
-warehousing.
+Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it
+easy to process large amounts of data efficiently. Amazon EMR uses
+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.
 
 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).
 
+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.
+
+Use of lenses is required for constructing and manipulating types.
+This is due to the amount of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
 
 ## Contribute
 
diff --git a/amazonka-emr.cabal b/amazonka-emr.cabal
--- a/amazonka-emr.cabal
+++ b/amazonka-emr.cabal
@@ -1,29 +1,37 @@
 name:                  amazonka-emr
-version:               0.3.6
+version:               1.0.0
 synopsis:              Amazon Elastic MapReduce SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
 license-file:          LICENSE
 author:                Brendan Hay
 maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
-copyright:             Copyright (c) 2013-2014 Brendan Hay
+copyright:             Copyright (c) 2013-2015 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 extra-source-files:    README.md
 cabal-version:         >= 1.10
 
 description:
-    Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it easy to
-    process large amounts of data efficiently. Amazon EMR uses Hadoop processing
-    combined with several AWS products to do such tasks as web indexing, data
-    mining, log file analysis, machine learning, scientific simulation, and data
-    warehousing.
-
+    Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it
+    easy to process large amounts of data efficiently. Amazon EMR uses
+    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>
+    The types from this library are intended to be used with
+    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
+    mechanisms for specifying AuthN/AuthZ information and sending requests.
     .
-    /Warning:/ This is an experimental preview release which is still under
-    heavy development and not intended for public consumption, caveat emptor!
+    Use of lenses is required for constructing and manipulating types.
+    This is due to the amount of nesting of AWS types and transparency regarding
+    de/serialisation into more palatable Haskell values.
+    The provided lenses should be compatible with any of the major lens libraries
+    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>
+    to get started.
 
 source-repository head
     type:     git
@@ -41,7 +49,6 @@
         , Network.AWS.EMR.AddJobFlowSteps
         , Network.AWS.EMR.AddTags
         , Network.AWS.EMR.DescribeCluster
-        , Network.AWS.EMR.DescribeJobFlows
         , Network.AWS.EMR.DescribeStep
         , Network.AWS.EMR.ListBootstrapActions
         , Network.AWS.EMR.ListClusters
@@ -58,7 +65,37 @@
         , Network.AWS.EMR.Waiters
 
     other-modules:
+          Network.AWS.EMR.Types.Product
+        , Network.AWS.EMR.Types.Sum
 
     build-depends:
-          amazonka-core == 0.3.6.*
+          amazonka-core == 1.0.0.*
         , base          >= 4.7     && < 5
+
+test-suite amazonka-emr-test
+    type:              exitcode-stdio-1.0
+    default-language:  Haskell2010
+    hs-source-dirs:    test
+    main-is:           Main.hs
+
+    ghc-options:       -Wall -threaded
+
+    -- This is not comprehensive if modules have manually been added.
+    -- It exists to ensure cabal 'somewhat' detects test module changes.
+    other-modules:
+          Test.AWS.EMR
+        , Test.AWS.Gen.EMR
+        , Test.AWS.EMR.Internal
+
+    build-depends:
+          amazonka-core == 1.0.0
+        , amazonka-test == 1.0.0
+        , amazonka-emr == 1.0.0
+        , base
+        , bytestring
+        , lens
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
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
@@ -1,58 +1,461 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.EMR
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it easy to
--- process large amounts of data efficiently. Amazon EMR uses Hadoop processing
--- combined with several AWS products to do such tasks as web indexing, data
--- mining, log file analysis, machine learning, scientific simulation, and data
--- warehousing.
+-- Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it
+-- easy to process large amounts of data efficiently. Amazon EMR uses
+-- 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
-    ( module Network.AWS.EMR.AddInstanceGroups
-    , module Network.AWS.EMR.AddJobFlowSteps
-    , module Network.AWS.EMR.AddTags
-    , module Network.AWS.EMR.DescribeCluster
-    , module Network.AWS.EMR.DescribeJobFlows
-    , module Network.AWS.EMR.DescribeStep
-    , module Network.AWS.EMR.ListBootstrapActions
-    , module Network.AWS.EMR.ListClusters
-    , module Network.AWS.EMR.ListInstanceGroups
-    , module Network.AWS.EMR.ListInstances
-    , module Network.AWS.EMR.ListSteps
-    , module Network.AWS.EMR.ModifyInstanceGroups
-    , module Network.AWS.EMR.RemoveTags
+    (
+    -- * Service
+      EMR
+
+    -- * Errors
+    -- $errors
+
+    -- ** InvalidRequestException
+    , _InvalidRequestException
+
+    -- ** InternalServerError
+    , _InternalServerError
+
+    -- ** InternalServerException
+    , _InternalServerException
+
+    -- * Waiters
+    -- $waiters
+
+    -- ** ClusterRunning
+    , clusterRunning
+
+    -- * Operations
+    -- $operations
+
+    -- ** RunJobFlow
     , module Network.AWS.EMR.RunJobFlow
-    , module Network.AWS.EMR.SetTerminationProtection
+
+    -- ** SetVisibleToAllUsers
     , module Network.AWS.EMR.SetVisibleToAllUsers
+
+    -- ** TerminateJobFlows
     , module Network.AWS.EMR.TerminateJobFlows
-    , module Network.AWS.EMR.Types
-    , module Network.AWS.EMR.Waiters
+
+    -- ** RemoveTags
+    , module Network.AWS.EMR.RemoveTags
+
+    -- ** DescribeStep
+    , module Network.AWS.EMR.DescribeStep
+
+    -- ** DescribeCluster
+    , module Network.AWS.EMR.DescribeCluster
+
+    -- ** ModifyInstanceGroups
+    , module Network.AWS.EMR.ModifyInstanceGroups
+
+    -- ** AddJobFlowSteps
+    , module Network.AWS.EMR.AddJobFlowSteps
+
+    -- ** SetTerminationProtection
+    , module Network.AWS.EMR.SetTerminationProtection
+
+    -- ** ListSteps (Paginated)
+    , module Network.AWS.EMR.ListSteps
+
+    -- ** AddInstanceGroups
+    , module Network.AWS.EMR.AddInstanceGroups
+
+    -- ** ListInstanceGroups (Paginated)
+    , module Network.AWS.EMR.ListInstanceGroups
+
+    -- ** ListBootstrapActions (Paginated)
+    , module Network.AWS.EMR.ListBootstrapActions
+
+    -- ** AddTags
+    , module Network.AWS.EMR.AddTags
+
+    -- ** ListInstances (Paginated)
+    , module Network.AWS.EMR.ListInstances
+
+    -- ** ListClusters (Paginated)
+    , module Network.AWS.EMR.ListClusters
+
+    -- * Types
+
+    -- ** ActionOnFailure
+    , ActionOnFailure (..)
+
+    -- ** ClusterState
+    , ClusterState (..)
+
+    -- ** ClusterStateChangeReasonCode
+    , ClusterStateChangeReasonCode (..)
+
+    -- ** InstanceGroupState
+    , InstanceGroupState (..)
+
+    -- ** InstanceGroupStateChangeReasonCode
+    , InstanceGroupStateChangeReasonCode (..)
+
+    -- ** InstanceGroupType
+    , InstanceGroupType (..)
+
+    -- ** InstanceRoleType
+    , InstanceRoleType (..)
+
+    -- ** InstanceState
+    , InstanceState (..)
+
+    -- ** InstanceStateChangeReasonCode
+    , InstanceStateChangeReasonCode (..)
+
+    -- ** MarketType
+    , MarketType (..)
+
+    -- ** StepState
+    , StepState (..)
+
+    -- ** StepStateChangeReasonCode
+    , StepStateChangeReasonCode (..)
+
+    -- ** Application
+    , Application
+    , application
+    , aAdditionalInfo
+    , aArgs
+    , aName
+    , aVersion
+
+    -- ** BootstrapActionConfig
+    , BootstrapActionConfig
+    , bootstrapActionConfig
+    , bacName
+    , bacScriptBootstrapAction
+
+    -- ** Cluster
+    , Cluster
+    , cluster
+    , cluRequestedAMIVersion
+    , cluEC2InstanceAttributes
+    , cluNormalizedInstanceHours
+    , cluConfigurations
+    , cluReleaseLabel
+    , cluLogURI
+    , cluRunningAMIVersion
+    , cluMasterPublicDNSName
+    , cluAutoTerminate
+    , cluTerminationProtected
+    , cluVisibleToAllUsers
+    , cluApplications
+    , cluTags
+    , cluServiceRole
+    , cluId
+    , cluName
+    , cluStatus
+
+    -- ** ClusterStateChangeReason
+    , ClusterStateChangeReason
+    , clusterStateChangeReason
+    , cscrCode
+    , cscrMessage
+
+    -- ** ClusterStatus
+    , ClusterStatus
+    , clusterStatus
+    , csState
+    , csStateChangeReason
+    , csTimeline
+
+    -- ** ClusterSummary
+    , ClusterSummary
+    , clusterSummary
+    , csStatus
+    , csNormalizedInstanceHours
+    , csName
+    , csId
+
+    -- ** ClusterTimeline
+    , ClusterTimeline
+    , clusterTimeline
+    , ctReadyDateTime
+    , ctCreationDateTime
+    , ctEndDateTime
+
+    -- ** Command
+    , Command
+    , command
+    , cArgs
+    , cScriptPath
+    , cName
+
+    -- ** Configuration
+    , Configuration
+    , configuration
+    , cConfigurations
+    , cClassification
+    , cProperties
+
+    -- ** EC2InstanceAttributes
+    , EC2InstanceAttributes
+    , ec2InstanceAttributes
+    , eiaEC2KeyName
+    , eiaEmrManagedSlaveSecurityGroup
+    , eiaAdditionalSlaveSecurityGroups
+    , eiaIAMInstanceProfile
+    , eiaAdditionalMasterSecurityGroups
+    , eiaEmrManagedMasterSecurityGroup
+    , eiaEC2SubnetId
+    , eiaEC2AvailabilityZone
+
+    -- ** HadoopJARStepConfig
+    , HadoopJARStepConfig
+    , hadoopJARStepConfig
+    , hjscArgs
+    , hjscMainClass
+    , hjscProperties
+    , hjscJAR
+
+    -- ** HadoopStepConfig
+    , HadoopStepConfig
+    , hadoopStepConfig
+    , hscArgs
+    , hscJAR
+    , hscMainClass
+    , hscProperties
+
+    -- ** Instance
+    , Instance
+    , instance'
+    , iStatus
+    , iPublicDNSName
+    , iEC2InstanceId
+    , iPrivateIPAddress
+    , iId
+    , iPrivateDNSName
+    , iPublicIPAddress
+
+    -- ** InstanceGroup
+    , InstanceGroup
+    , instanceGroup
+    , igStatus
+    , igBidPrice
+    , igRequestedInstanceCount
+    , igRunningInstanceCount
+    , igConfigurations
+    , igInstanceGroupType
+    , igInstanceType
+    , igMarket
+    , igName
+    , igId
+
+    -- ** InstanceGroupConfig
+    , InstanceGroupConfig
+    , instanceGroupConfig
+    , igcBidPrice
+    , igcConfigurations
+    , igcMarket
+    , igcName
+    , igcInstanceRole
+    , igcInstanceType
+    , igcInstanceCount
+
+    -- ** InstanceGroupModifyConfig
+    , InstanceGroupModifyConfig
+    , instanceGroupModifyConfig
+    , igmcInstanceCount
+    , igmcEC2InstanceIdsToTerminate
+    , igmcInstanceGroupId
+
+    -- ** InstanceGroupStateChangeReason
+    , InstanceGroupStateChangeReason
+    , instanceGroupStateChangeReason
+    , igscrCode
+    , igscrMessage
+
+    -- ** InstanceGroupStatus
+    , InstanceGroupStatus
+    , instanceGroupStatus
+    , igsState
+    , igsStateChangeReason
+    , igsTimeline
+
+    -- ** InstanceGroupTimeline
+    , InstanceGroupTimeline
+    , instanceGroupTimeline
+    , igtReadyDateTime
+    , igtCreationDateTime
+    , igtEndDateTime
+
+    -- ** InstanceStateChangeReason
+    , InstanceStateChangeReason
+    , instanceStateChangeReason
+    , iscrCode
+    , iscrMessage
+
+    -- ** InstanceStatus
+    , InstanceStatus
+    , instanceStatus
+    , isState
+    , isStateChangeReason
+    , isTimeline
+
+    -- ** InstanceTimeline
+    , InstanceTimeline
+    , instanceTimeline
+    , itReadyDateTime
+    , itCreationDateTime
+    , itEndDateTime
+
+    -- ** JobFlowInstancesConfig
+    , JobFlowInstancesConfig
+    , jobFlowInstancesConfig
+    , jficSlaveInstanceType
+    , jficEC2KeyName
+    , jficInstanceCount
+    , jficEmrManagedSlaveSecurityGroup
+    , jficAdditionalSlaveSecurityGroups
+    , jficHadoopVersion
+    , jficAdditionalMasterSecurityGroups
+    , jficEmrManagedMasterSecurityGroup
+    , jficEC2SubnetId
+    , jficMasterInstanceType
+    , jficInstanceGroups
+    , jficKeepJobFlowAliveWhenNoSteps
+    , jficTerminationProtected
+    , jficPlacement
+
+    -- ** KeyValue
+    , KeyValue
+    , keyValue
+    , kvValue
+    , kvKey
+
+    -- ** PlacementType
+    , PlacementType
+    , placementType
+    , ptAvailabilityZone
+
+    -- ** ScriptBootstrapActionConfig
+    , ScriptBootstrapActionConfig
+    , scriptBootstrapActionConfig
+    , sbacArgs
+    , sbacPath
+
+    -- ** Step
+    , Step
+    , step
+    , sStatus
+    , sActionOnFailure
+    , sConfig
+    , sName
+    , sId
+
+    -- ** StepConfig
+    , StepConfig
+    , stepConfig
+    , scActionOnFailure
+    , scName
+    , scHadoopJARStep
+
+    -- ** StepStateChangeReason
+    , StepStateChangeReason
+    , stepStateChangeReason
+    , sscrCode
+    , sscrMessage
+
+    -- ** StepStatus
+    , StepStatus
+    , stepStatus
+    , ssState
+    , ssStateChangeReason
+    , ssTimeline
+
+    -- ** StepSummary
+    , StepSummary
+    , stepSummary
+    , ssStatus
+    , ssActionOnFailure
+    , ssConfig
+    , ssName
+    , ssId
+
+    -- ** StepTimeline
+    , StepTimeline
+    , stepTimeline
+    , stCreationDateTime
+    , stEndDateTime
+    , stStartDateTime
+
+    -- ** SupportedProductConfig
+    , SupportedProductConfig
+    , supportedProductConfig
+    , spcArgs
+    , spcName
+
+    -- ** Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
     ) where
 
-import Network.AWS.EMR.AddInstanceGroups
-import Network.AWS.EMR.AddJobFlowSteps
-import Network.AWS.EMR.AddTags
-import Network.AWS.EMR.DescribeCluster
-import Network.AWS.EMR.DescribeJobFlows
-import Network.AWS.EMR.DescribeStep
-import Network.AWS.EMR.ListBootstrapActions
-import Network.AWS.EMR.ListClusters
-import Network.AWS.EMR.ListInstanceGroups
-import Network.AWS.EMR.ListInstances
-import Network.AWS.EMR.ListSteps
-import Network.AWS.EMR.ModifyInstanceGroups
-import Network.AWS.EMR.RemoveTags
-import Network.AWS.EMR.RunJobFlow
-import Network.AWS.EMR.SetTerminationProtection
-import Network.AWS.EMR.SetVisibleToAllUsers
-import Network.AWS.EMR.TerminateJobFlows
-import Network.AWS.EMR.Types
-import Network.AWS.EMR.Waiters
+import           Network.AWS.EMR.AddInstanceGroups
+import           Network.AWS.EMR.AddJobFlowSteps
+import           Network.AWS.EMR.AddTags
+import           Network.AWS.EMR.DescribeCluster
+import           Network.AWS.EMR.DescribeStep
+import           Network.AWS.EMR.ListBootstrapActions
+import           Network.AWS.EMR.ListClusters
+import           Network.AWS.EMR.ListInstanceGroups
+import           Network.AWS.EMR.ListInstances
+import           Network.AWS.EMR.ListSteps
+import           Network.AWS.EMR.ModifyInstanceGroups
+import           Network.AWS.EMR.RemoveTags
+import           Network.AWS.EMR.RunJobFlow
+import           Network.AWS.EMR.SetTerminationProtection
+import           Network.AWS.EMR.SetVisibleToAllUsers
+import           Network.AWS.EMR.TerminateJobFlows
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Waiters
+
+{- $errors
+Error matchers are designed for use with the functions provided by
+<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+This allows catching (and rethrowing) service specific errors returned
+by 'EMR'.
+-}
+
+{- $operations
+Some AWS operations return results that are incomplete and require subsequent
+requests in order to obtain the entire result set. The process of sending
+subsequent requests to continue where a previous request left off is called
+pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+1000 objects at a time, and you must send subsequent requests with the
+appropriate Marker in order to retrieve the next page of results.
+
+Operations that have an 'AWSPager' instance can transparently perform subsequent
+requests, correctly setting Markers and other request facets to iterate through
+the entire result set of a truncated API operation. Operations which support
+this have an additional note in the documentation.
+
+Many operations have the ability to filter results on the server side. See the
+individual operation parameters for details.
+-}
+
+{- $waiters
+Waiters poll by repeatedly sending a request until some remote success condition
+configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+determines how many attempts should be made, in addition to delay and retry strategies.
+-}
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
@@ -1,136 +1,151 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.AddInstanceGroups
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | AddInstanceGroups adds an instance group to a running cluster.
+-- AddInstanceGroups adds an instance group to a running cluster.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddInstanceGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddInstanceGroups.html AWS API Reference> for AddInstanceGroups.
 module Network.AWS.EMR.AddInstanceGroups
     (
-    -- * Request
-      AddInstanceGroups
-    -- ** Request constructor
-    , addInstanceGroups
-    -- ** Request lenses
+    -- * Creating a Request
+      addInstanceGroups
+    , AddInstanceGroups
+    -- * Request Lenses
     , aigInstanceGroups
     , aigJobFlowId
 
-    -- * Response
-    , AddInstanceGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , addInstanceGroupsResponse
-    -- ** Response lenses
-    , aigrInstanceGroupIds
-    , aigrJobFlowId
+    , AddInstanceGroupsResponse
+    -- * Response Lenses
+    , aigrsJobFlowId
+    , aigrsInstanceGroupIds
+    , aigrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data AddInstanceGroups = AddInstanceGroups
-    { _aigInstanceGroups :: List "InstanceGroups" InstanceGroupConfig
-    , _aigJobFlowId      :: Text
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'AddInstanceGroups' constructor.
+-- | Input to an AddInstanceGroups call.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'addInstanceGroups' smart constructor.
+data AddInstanceGroups = AddInstanceGroups'
+    { _aigInstanceGroups :: ![InstanceGroupConfig]
+    , _aigJobFlowId      :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddInstanceGroups' with the minimum fields required to make a request.
 --
--- * 'aigInstanceGroups' @::@ ['InstanceGroupConfig']
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'aigJobFlowId' @::@ 'Text'
+-- * 'aigInstanceGroups'
 --
-addInstanceGroups :: Text -- ^ 'aigJobFlowId'
-                  -> AddInstanceGroups
-addInstanceGroups p1 = AddInstanceGroups
-    { _aigJobFlowId      = p1
-    , _aigInstanceGroups = mempty
+-- * 'aigJobFlowId'
+addInstanceGroups
+    :: Text -- ^ 'aigJobFlowId'
+    -> AddInstanceGroups
+addInstanceGroups pJobFlowId_ =
+    AddInstanceGroups'
+    { _aigInstanceGroups = mempty
+    , _aigJobFlowId = pJobFlowId_
     }
 
 -- | Instance Groups to add.
 aigInstanceGroups :: Lens' AddInstanceGroups [InstanceGroupConfig]
-aigInstanceGroups =
-    lens _aigInstanceGroups (\s a -> s { _aigInstanceGroups = a })
-        . _List
+aigInstanceGroups = lens _aigInstanceGroups (\ s a -> s{_aigInstanceGroups = a}) . _Coerce;
 
 -- | Job flow in which to add the instance groups.
 aigJobFlowId :: Lens' AddInstanceGroups Text
-aigJobFlowId = lens _aigJobFlowId (\s a -> s { _aigJobFlowId = a })
-
-data AddInstanceGroupsResponse = AddInstanceGroupsResponse
-    { _aigrInstanceGroupIds :: List "InstanceGroupIds" Text
-    , _aigrJobFlowId        :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+aigJobFlowId = lens _aigJobFlowId (\ s a -> s{_aigJobFlowId = a});
 
--- | 'AddInstanceGroupsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'aigrInstanceGroupIds' @::@ ['Text']
---
--- * 'aigrJobFlowId' @::@ 'Maybe' 'Text'
---
-addInstanceGroupsResponse :: AddInstanceGroupsResponse
-addInstanceGroupsResponse = AddInstanceGroupsResponse
-    { _aigrJobFlowId        = Nothing
-    , _aigrInstanceGroupIds = mempty
-    }
+instance AWSRequest AddInstanceGroups where
+        type Sv AddInstanceGroups = EMR
+        type Rs AddInstanceGroups = AddInstanceGroupsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 AddInstanceGroupsResponse' <$>
+                   (x .?> "JobFlowId") <*>
+                     (x .?> "InstanceGroupIds" .!@ mempty)
+                     <*> (pure (fromEnum s)))
 
--- | Instance group IDs of the newly created instance groups.
-aigrInstanceGroupIds :: Lens' AddInstanceGroupsResponse [Text]
-aigrInstanceGroupIds =
-    lens _aigrInstanceGroupIds (\s a -> s { _aigrInstanceGroupIds = a })
-        . _List
+instance ToHeaders AddInstanceGroups where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.AddInstanceGroups" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
--- | The job flow ID in which the instance groups are added.
-aigrJobFlowId :: Lens' AddInstanceGroupsResponse (Maybe Text)
-aigrJobFlowId = lens _aigrJobFlowId (\s a -> s { _aigrJobFlowId = a })
+instance ToJSON AddInstanceGroups where
+        toJSON AddInstanceGroups'{..}
+          = object
+              ["InstanceGroups" .= _aigInstanceGroups,
+               "JobFlowId" .= _aigJobFlowId]
 
 instance ToPath AddInstanceGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery AddInstanceGroups where
-    toQuery = const mempty
+        toQuery = const mempty
 
-instance ToHeaders AddInstanceGroups
+-- | Output from an AddInstanceGroups call.
+--
+-- /See:/ 'addInstanceGroupsResponse' smart constructor.
+data AddInstanceGroupsResponse = AddInstanceGroupsResponse'
+    { _aigrsJobFlowId        :: !(Maybe Text)
+    , _aigrsInstanceGroupIds :: !(Maybe [Text])
+    , _aigrsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance ToJSON AddInstanceGroups where
-    toJSON AddInstanceGroups{..} = object
-        [ "InstanceGroups" .= _aigInstanceGroups
-        , "JobFlowId"      .= _aigJobFlowId
-        ]
+-- | Creates a value of 'AddInstanceGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aigrsJobFlowId'
+--
+-- * 'aigrsInstanceGroupIds'
+--
+-- * 'aigrsStatus'
+addInstanceGroupsResponse
+    :: Int -- ^ 'aigrsStatus'
+    -> AddInstanceGroupsResponse
+addInstanceGroupsResponse pStatus_ =
+    AddInstanceGroupsResponse'
+    { _aigrsJobFlowId = Nothing
+    , _aigrsInstanceGroupIds = Nothing
+    , _aigrsStatus = pStatus_
+    }
 
-instance AWSRequest AddInstanceGroups where
-    type Sv AddInstanceGroups = EMR
-    type Rs AddInstanceGroups = AddInstanceGroupsResponse
+-- | The job flow ID in which the instance groups are added.
+aigrsJobFlowId :: Lens' AddInstanceGroupsResponse (Maybe Text)
+aigrsJobFlowId = lens _aigrsJobFlowId (\ s a -> s{_aigrsJobFlowId = a});
 
-    request  = post "AddInstanceGroups"
-    response = jsonResponse
+-- | Instance group IDs of the newly created instance groups.
+aigrsInstanceGroupIds :: Lens' AddInstanceGroupsResponse [Text]
+aigrsInstanceGroupIds = lens _aigrsInstanceGroupIds (\ s a -> s{_aigrsInstanceGroupIds = a}) . _Default . _Coerce;
 
-instance FromJSON AddInstanceGroupsResponse where
-    parseJSON = withObject "AddInstanceGroupsResponse" $ \o -> AddInstanceGroupsResponse
-        <$> o .:? "InstanceGroupIds" .!= mempty
-        <*> o .:? "JobFlowId"
+-- | The response status code.
+aigrsStatus :: Lens' AddInstanceGroupsResponse Int
+aigrsStatus = lens _aigrsStatus (\ s a -> s{_aigrsStatus = a});
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
@@ -1,151 +1,165 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.AddJobFlowSteps
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | AddJobFlowSteps adds new steps to a running job flow. A maximum of 256 steps
--- are allowed in each job flow.
+-- AddJobFlowSteps adds new steps to a running job flow. A maximum of 256
+-- steps are allowed in each job flow.
 --
--- If your job flow is long-running (such as a Hive data warehouse) or complex,
--- you may require more than 256 steps to process your data. You can bypass the
--- 256-step limitation in various ways, including using the SSH shell to connect
--- to the master node and submitting queries directly to the software running on
--- the master node, such as Hive and Hadoop. For more information on how to do
--- this, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow> in the /Amazon ElasticMapReduce Developer's Guide/.
+-- If your job flow is long-running (such as a Hive data warehouse) or
+-- complex, you may require more than 256 steps to process your data. You
+-- can bypass the 256-step limitation in various ways, including using the
+-- SSH shell to connect to the master node and submitting queries directly
+-- to the software running on the master node, such as Hive and Hadoop. For
+-- more information on how to do this, go to
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow>
+-- in the /Amazon Elastic MapReduce Developer\'s Guide/.
 --
 -- A step specifies the location of a JAR file stored either on the master
 -- node of the job flow or in Amazon S3. Each step is performed by the main
--- function of the main class of the JAR file. The main class can be specified
--- either in the manifest of the JAR or by using the MainFunction parameter of
--- the step.
+-- function of the main class of the JAR file. The main class can be
+-- specified either in the manifest of the JAR or by using the MainFunction
+-- parameter of the step.
 --
--- Elastic MapReduce executes each step in the order listed. For a step to be
--- considered complete, the main function must exit with a zero exit code and
--- all Hadoop jobs started while the step was running must have completed and
--- run successfully.
+-- Elastic MapReduce executes each step in the order listed. For a step to
+-- be considered complete, the main function must exit with a zero exit
+-- code and all Hadoop jobs started while the step was running must have
+-- completed and run successfully.
 --
 -- You can only add steps to a job flow that is in one of the following
 -- states: STARTING, BOOTSTRAPPING, RUNNING, or WAITING.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddJobFlowSteps.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddJobFlowSteps.html AWS API Reference> for AddJobFlowSteps.
 module Network.AWS.EMR.AddJobFlowSteps
     (
-    -- * Request
-      AddJobFlowSteps
-    -- ** Request constructor
-    , addJobFlowSteps
-    -- ** Request lenses
+    -- * Creating a Request
+      addJobFlowSteps
+    , AddJobFlowSteps
+    -- * Request Lenses
     , ajfsJobFlowId
     , ajfsSteps
 
-    -- * Response
-    , AddJobFlowStepsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , addJobFlowStepsResponse
-    -- ** Response lenses
-    , ajfsrStepIds
+    , AddJobFlowStepsResponse
+    -- * Response Lenses
+    , ajfsrsStepIds
+    , ajfsrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data AddJobFlowSteps = AddJobFlowSteps
-    { _ajfsJobFlowId :: Text
-    , _ajfsSteps     :: List "Steps" StepConfig
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'AddJobFlowSteps' constructor.
+-- | The input argument to the AddJobFlowSteps operation.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'addJobFlowSteps' smart constructor.
+data AddJobFlowSteps = AddJobFlowSteps'
+    { _ajfsJobFlowId :: !Text
+    , _ajfsSteps     :: ![StepConfig]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddJobFlowSteps' with the minimum fields required to make a request.
 --
--- * 'ajfsJobFlowId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'ajfsSteps' @::@ ['StepConfig']
+-- * 'ajfsJobFlowId'
 --
-addJobFlowSteps :: Text -- ^ 'ajfsJobFlowId'
-                -> AddJobFlowSteps
-addJobFlowSteps p1 = AddJobFlowSteps
-    { _ajfsJobFlowId = p1
-    , _ajfsSteps     = mempty
+-- * 'ajfsSteps'
+addJobFlowSteps
+    :: Text -- ^ 'ajfsJobFlowId'
+    -> AddJobFlowSteps
+addJobFlowSteps pJobFlowId_ =
+    AddJobFlowSteps'
+    { _ajfsJobFlowId = pJobFlowId_
+    , _ajfsSteps = mempty
     }
 
--- | A string that uniquely identifies the job flow. This identifier is returned
--- by 'RunJobFlow' and can also be obtained from 'ListClusters'.
+-- | A string that uniquely identifies the job flow. This identifier is
+-- returned by RunJobFlow and can also be obtained from ListClusters.
 ajfsJobFlowId :: Lens' AddJobFlowSteps Text
-ajfsJobFlowId = lens _ajfsJobFlowId (\s a -> s { _ajfsJobFlowId = a })
+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 }) . _List
-
-newtype AddJobFlowStepsResponse = AddJobFlowStepsResponse
-    { _ajfsrStepIds :: List "StepIds" Text
-    } deriving (Eq, Ord, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList AddJobFlowStepsResponse where
-    type Item AddJobFlowStepsResponse = Text
+ajfsSteps = lens _ajfsSteps (\ s a -> s{_ajfsSteps = a}) . _Coerce;
 
-    fromList = AddJobFlowStepsResponse . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _ajfsrStepIds
+instance AWSRequest AddJobFlowSteps where
+        type Sv AddJobFlowSteps = EMR
+        type Rs AddJobFlowSteps = AddJobFlowStepsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 AddJobFlowStepsResponse' <$>
+                   (x .?> "StepIds" .!@ mempty) <*> (pure (fromEnum s)))
 
--- | 'AddJobFlowStepsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ajfsrStepIds' @::@ ['Text']
---
-addJobFlowStepsResponse :: AddJobFlowStepsResponse
-addJobFlowStepsResponse = AddJobFlowStepsResponse
-    { _ajfsrStepIds = mempty
-    }
+instance ToHeaders AddJobFlowSteps where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.AddJobFlowSteps" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
--- | The identifiers of the list of steps added to the job flow.
-ajfsrStepIds :: Lens' AddJobFlowStepsResponse [Text]
-ajfsrStepIds = lens _ajfsrStepIds (\s a -> s { _ajfsrStepIds = a }) . _List
+instance ToJSON AddJobFlowSteps where
+        toJSON AddJobFlowSteps'{..}
+          = object
+              ["JobFlowId" .= _ajfsJobFlowId,
+               "Steps" .= _ajfsSteps]
 
 instance ToPath AddJobFlowSteps where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery AddJobFlowSteps where
-    toQuery = const mempty
-
-instance ToHeaders AddJobFlowSteps
+        toQuery = const mempty
 
-instance ToJSON AddJobFlowSteps where
-    toJSON AddJobFlowSteps{..} = object
-        [ "JobFlowId" .= _ajfsJobFlowId
-        , "Steps"     .= _ajfsSteps
-        ]
+-- | The output for the AddJobFlowSteps operation.
+--
+-- /See:/ 'addJobFlowStepsResponse' smart constructor.
+data AddJobFlowStepsResponse = AddJobFlowStepsResponse'
+    { _ajfsrsStepIds :: !(Maybe [Text])
+    , _ajfsrsStatus  :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest AddJobFlowSteps where
-    type Sv AddJobFlowSteps = EMR
-    type Rs AddJobFlowSteps = AddJobFlowStepsResponse
+-- | Creates a value of 'AddJobFlowStepsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ajfsrsStepIds'
+--
+-- * 'ajfsrsStatus'
+addJobFlowStepsResponse
+    :: Int -- ^ 'ajfsrsStatus'
+    -> AddJobFlowStepsResponse
+addJobFlowStepsResponse pStatus_ =
+    AddJobFlowStepsResponse'
+    { _ajfsrsStepIds = Nothing
+    , _ajfsrsStatus = pStatus_
+    }
 
-    request  = post "AddJobFlowSteps"
-    response = jsonResponse
+-- | The identifiers of the list of steps added to the job flow.
+ajfsrsStepIds :: Lens' AddJobFlowStepsResponse [Text]
+ajfsrsStepIds = lens _ajfsrsStepIds (\ s a -> s{_ajfsrsStepIds = a}) . _Default . _Coerce;
 
-instance FromJSON AddJobFlowStepsResponse where
-    parseJSON = withObject "AddJobFlowStepsResponse" $ \o -> AddJobFlowStepsResponse
-        <$> o .:? "StepIds" .!= mempty
+-- | The response status code.
+ajfsrsStatus :: Lens' AddJobFlowStepsResponse Int
+ajfsrsStatus = lens _ajfsrsStatus (\ s a -> s{_ajfsrsStatus = a});
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
@@ -1,110 +1,135 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.AddTags
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Adds tags to an Amazon EMR resource. Tags make it easier to associate
--- 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 EMRResources>.
+-- Adds tags to an Amazon EMR resource. Tags make it easier to associate
+-- 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>.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddTags.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddTags.html AWS API Reference> for AddTags.
 module Network.AWS.EMR.AddTags
     (
-    -- * Request
-      AddTags
-    -- ** Request constructor
-    , addTags
-    -- ** Request lenses
+    -- * Creating a Request
+      addTags
+    , AddTags
+    -- * Request Lenses
     , atResourceId
     , atTags
 
-    -- * Response
-    , AddTagsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , addTagsResponse
+    , AddTagsResponse
+    -- * Response Lenses
+    , atrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data AddTags = AddTags
-    { _atResourceId :: Text
-    , _atTags       :: List "Tags" Tag
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'AddTags' constructor.
+-- | This input identifies a cluster and a list of tags to attach.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'addTags' smart constructor.
+data AddTags = AddTags'
+    { _atResourceId :: !Text
+    , _atTags       :: ![Tag]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'AddTags' with the minimum fields required to make a request.
 --
--- * 'atResourceId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'atTags' @::@ ['Tag']
+-- * 'atResourceId'
 --
-addTags :: Text -- ^ 'atResourceId'
-        -> AddTags
-addTags p1 = AddTags
-    { _atResourceId = p1
-    , _atTags       = mempty
+-- * 'atTags'
+addTags
+    :: Text -- ^ 'atResourceId'
+    -> AddTags
+addTags pResourceId_ =
+    AddTags'
+    { _atResourceId = pResourceId_
+    , _atTags = mempty
     }
 
--- | The Amazon EMR resource identifier to which tags will be added. This value
--- must be a cluster identifier.
+-- | The Amazon EMR resource identifier to which tags will be added. This
+-- value must be a cluster identifier.
 atResourceId :: Lens' AddTags Text
-atResourceId = lens _atResourceId (\s a -> s { _atResourceId = a })
+atResourceId = lens _atResourceId (\ s a -> s{_atResourceId = a});
 
 -- | A list of tags to associate with a cluster and propagate to Amazon EC2
--- instances. Tags are user-defined key/value pairs that consist of a required
--- key string with a maximum of 128 characters, and an optional value string
--- with a maximum of 256 characters.
+-- instances. Tags are user-defined key\/value pairs that consist of a
+-- required key string with a maximum of 128 characters, and an optional
+-- value string with a maximum of 256 characters.
 atTags :: Lens' AddTags [Tag]
-atTags = lens _atTags (\s a -> s { _atTags = a }) . _List
+atTags = lens _atTags (\ s a -> s{_atTags = a}) . _Coerce;
 
-data AddTagsResponse = AddTagsResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest AddTags where
+        type Sv AddTags = EMR
+        type Rs AddTags = AddTagsResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x -> AddTagsResponse' <$> (pure (fromEnum s)))
 
--- | 'AddTagsResponse' constructor.
-addTagsResponse :: AddTagsResponse
-addTagsResponse = AddTagsResponse
+instance ToHeaders AddTags where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.AddTags" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON AddTags where
+        toJSON AddTags'{..}
+          = object
+              ["ResourceId" .= _atResourceId, "Tags" .= _atTags]
+
 instance ToPath AddTags where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery AddTags where
-    toQuery = const mempty
-
-instance ToHeaders AddTags
+        toQuery = const mempty
 
-instance ToJSON AddTags where
-    toJSON AddTags{..} = object
-        [ "ResourceId" .= _atResourceId
-        , "Tags"       .= _atTags
-        ]
+-- | This output indicates the result of adding tags to a resource.
+--
+-- /See:/ 'addTagsResponse' smart constructor.
+newtype AddTagsResponse = AddTagsResponse'
+    { _atrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest AddTags where
-    type Sv AddTags = EMR
-    type Rs AddTags = AddTagsResponse
+-- | Creates a value of 'AddTagsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'atrsStatus'
+addTagsResponse
+    :: Int -- ^ 'atrsStatus'
+    -> AddTagsResponse
+addTagsResponse pStatus_ =
+    AddTagsResponse'
+    { _atrsStatus = pStatus_
+    }
 
-    request  = post "AddTags"
-    response = nullResponse AddTagsResponse
+-- | The response status code.
+atrsStatus :: Lens' AddTagsResponse Int
+atrsStatus = lens _atrsStatus (\ s a -> s{_atrsStatus = a});
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
@@ -1,115 +1,132 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.DescribeCluster
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides cluster-level details including status, hardware and software
--- configuration, VPC settings, and so on. For information about the cluster
--- steps, see 'ListSteps'.
+-- Provides cluster-level details including status, hardware and software
+-- configuration, VPC settings, and so on. For information about the
+-- cluster steps, see ListSteps.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeCluster.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeCluster.html AWS API Reference> for DescribeCluster.
 module Network.AWS.EMR.DescribeCluster
     (
-    -- * Request
-      DescribeCluster
-    -- ** Request constructor
-    , describeCluster
-    -- ** Request lenses
+    -- * Creating a Request
+      describeCluster
+    , DescribeCluster
+    -- * Request Lenses
     , dcClusterId
 
-    -- * Response
-    , DescribeClusterResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeClusterResponse
-    -- ** Response lenses
-    , dcrCluster
+    , DescribeClusterResponse
+    -- * Response Lenses
+    , dcrsStatus
+    , dcrsCluster
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
-newtype DescribeCluster = DescribeCluster
+-- | This input determines which cluster to describe.
+--
+-- /See:/ 'describeCluster' smart constructor.
+newtype DescribeCluster = DescribeCluster'
     { _dcClusterId :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
--- | 'DescribeCluster' constructor.
---
--- The fields accessible through corresponding lenses are:
+-- | Creates a value of 'DescribeCluster' with the minimum fields required to make a request.
 --
--- * 'dcClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
-describeCluster :: Text -- ^ 'dcClusterId'
-                -> DescribeCluster
-describeCluster p1 = DescribeCluster
-    { _dcClusterId = p1
+-- * 'dcClusterId'
+describeCluster
+    :: Text -- ^ 'dcClusterId'
+    -> DescribeCluster
+describeCluster pClusterId_ =
+    DescribeCluster'
+    { _dcClusterId = pClusterId_
     }
 
 -- | The identifier of the cluster to describe.
 dcClusterId :: Lens' DescribeCluster Text
-dcClusterId = lens _dcClusterId (\s a -> s { _dcClusterId = a })
+dcClusterId = lens _dcClusterId (\ s a -> s{_dcClusterId = a});
 
-newtype DescribeClusterResponse = DescribeClusterResponse
-    { _dcrCluster :: Cluster
-    } deriving (Eq, Read, Show)
+instance AWSRequest DescribeCluster where
+        type Sv DescribeCluster = EMR
+        type Rs DescribeCluster = DescribeClusterResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeClusterResponse' <$>
+                   (pure (fromEnum s)) <*> (x .:> "Cluster"))
 
--- | 'DescribeClusterResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dcrCluster' @::@ 'Cluster'
---
-describeClusterResponse :: Cluster -- ^ 'dcrCluster'
-                        -> DescribeClusterResponse
-describeClusterResponse p1 = DescribeClusterResponse
-    { _dcrCluster = p1
-    }
+instance ToHeaders DescribeCluster where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.DescribeCluster" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
--- | This output contains the details for the requested cluster.
-dcrCluster :: Lens' DescribeClusterResponse Cluster
-dcrCluster = lens _dcrCluster (\s a -> s { _dcrCluster = a })
+instance ToJSON DescribeCluster where
+        toJSON DescribeCluster'{..}
+          = object ["ClusterId" .= _dcClusterId]
 
 instance ToPath DescribeCluster where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeCluster where
-    toQuery = const mempty
-
-instance ToHeaders DescribeCluster
+        toQuery = const mempty
 
-instance ToJSON DescribeCluster where
-    toJSON DescribeCluster{..} = object
-        [ "ClusterId" .= _dcClusterId
-        ]
+-- | This output contains the description of the cluster.
+--
+-- /See:/ 'describeClusterResponse' smart constructor.
+data DescribeClusterResponse = DescribeClusterResponse'
+    { _dcrsStatus  :: !Int
+    , _dcrsCluster :: !Cluster
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeCluster where
-    type Sv DescribeCluster = EMR
-    type Rs DescribeCluster = DescribeClusterResponse
+-- | Creates a value of 'DescribeClusterResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dcrsStatus'
+--
+-- * 'dcrsCluster'
+describeClusterResponse
+    :: Int -- ^ 'dcrsStatus'
+    -> Cluster -- ^ 'dcrsCluster'
+    -> DescribeClusterResponse
+describeClusterResponse pStatus_ pCluster_ =
+    DescribeClusterResponse'
+    { _dcrsStatus = pStatus_
+    , _dcrsCluster = pCluster_
+    }
 
-    request  = post "DescribeCluster"
-    response = jsonResponse
+-- | The response status code.
+dcrsStatus :: Lens' DescribeClusterResponse Int
+dcrsStatus = lens _dcrsStatus (\ s a -> s{_dcrsStatus = a});
 
-instance FromJSON DescribeClusterResponse where
-    parseJSON = withObject "DescribeClusterResponse" $ \o -> DescribeClusterResponse
-        <$> o .:  "Cluster"
+-- | This output contains the details for the requested cluster.
+dcrsCluster :: Lens' DescribeClusterResponse Cluster
+dcrsCluster = lens _dcrsCluster (\ s a -> s{_dcrsCluster = a});
diff --git a/gen/Network/AWS/EMR/DescribeJobFlows.hs b/gen/Network/AWS/EMR/DescribeJobFlows.hs
deleted file mode 100644
--- a/gen/Network/AWS/EMR/DescribeJobFlows.hs
+++ /dev/null
@@ -1,162 +0,0 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Module      : Network.AWS.EMR.DescribeJobFlows
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
---
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | This API is deprecated and will eventually be removed. We recommend you use 'ListClusters', 'DescribeCluster', 'ListSteps', 'ListInstanceGroups' and 'ListBootstrapActions'
--- instead.
---
--- DescribeJobFlows returns a list of job flows that match all of the supplied
--- parameters. The parameters can include a list of job flow IDs, job flow
--- states, and restrictions on job flow creation date and time.
---
--- Regardless of supplied parameters, only job flows created within the last
--- two months are returned.
---
--- If no parameters are supplied, then job flows matching either of the
--- following criteria are returned:
---
--- Job flows created and completed in the last two weeks  Job flows created
--- within the last two months that are in one of the following states: 'RUNNING', 'WAITING', 'SHUTTING_DOWN', 'STARTING'    Amazon Elastic MapReduce can return a maximum of
--- 512 job flow descriptions.
---
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeJobFlows.html>
-module Network.AWS.EMR.DescribeJobFlows
-    (
-    -- * Request
-      DescribeJobFlows
-    -- ** Request constructor
-    , describeJobFlows
-    -- ** Request lenses
-    , djfCreatedAfter
-    , djfCreatedBefore
-    , djfJobFlowIds
-    , djfJobFlowStates
-
-    -- * Response
-    , DescribeJobFlowsResponse
-    -- ** Response constructor
-    , describeJobFlowsResponse
-    -- ** Response lenses
-    , djfrJobFlows
-    ) where
-
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data DescribeJobFlows = DescribeJobFlows
-    { _djfCreatedAfter  :: Maybe POSIX
-    , _djfCreatedBefore :: Maybe POSIX
-    , _djfJobFlowIds    :: List "JobFlowIds" Text
-    , _djfJobFlowStates :: List "JobFlowStates" JobFlowExecutionState
-    } deriving (Eq, Read, Show)
-
--- | 'DescribeJobFlows' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'djfCreatedAfter' @::@ 'Maybe' 'UTCTime'
---
--- * 'djfCreatedBefore' @::@ 'Maybe' 'UTCTime'
---
--- * 'djfJobFlowIds' @::@ ['Text']
---
--- * 'djfJobFlowStates' @::@ ['JobFlowExecutionState']
---
-describeJobFlows :: DescribeJobFlows
-describeJobFlows = DescribeJobFlows
-    { _djfCreatedAfter  = Nothing
-    , _djfCreatedBefore = Nothing
-    , _djfJobFlowIds    = mempty
-    , _djfJobFlowStates = mempty
-    }
-
--- | Return only job flows created after this date and time.
-djfCreatedAfter :: Lens' DescribeJobFlows (Maybe UTCTime)
-djfCreatedAfter = lens _djfCreatedAfter (\s a -> s { _djfCreatedAfter = a }) . mapping _Time
-
--- | Return only job flows created before this date and time.
-djfCreatedBefore :: Lens' DescribeJobFlows (Maybe UTCTime)
-djfCreatedBefore = lens _djfCreatedBefore (\s a -> s { _djfCreatedBefore = a }) . mapping _Time
-
--- | Return only job flows whose job flow ID is contained in this list.
-djfJobFlowIds :: Lens' DescribeJobFlows [Text]
-djfJobFlowIds = lens _djfJobFlowIds (\s a -> s { _djfJobFlowIds = a }) . _List
-
--- | Return only job flows whose state is contained in this list.
-djfJobFlowStates :: Lens' DescribeJobFlows [JobFlowExecutionState]
-djfJobFlowStates = lens _djfJobFlowStates (\s a -> s { _djfJobFlowStates = a }) . _List
-
-newtype DescribeJobFlowsResponse = DescribeJobFlowsResponse
-    { _djfrJobFlows :: List "JobFlows" JobFlowDetail
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList DescribeJobFlowsResponse where
-    type Item DescribeJobFlowsResponse = JobFlowDetail
-
-    fromList = DescribeJobFlowsResponse . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _djfrJobFlows
-
--- | 'DescribeJobFlowsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'djfrJobFlows' @::@ ['JobFlowDetail']
---
-describeJobFlowsResponse :: DescribeJobFlowsResponse
-describeJobFlowsResponse = DescribeJobFlowsResponse
-    { _djfrJobFlows = mempty
-    }
-
--- | A list of job flows matching the parameters supplied.
-djfrJobFlows :: Lens' DescribeJobFlowsResponse [JobFlowDetail]
-djfrJobFlows = lens _djfrJobFlows (\s a -> s { _djfrJobFlows = a }) . _List
-
-instance ToPath DescribeJobFlows where
-    toPath = const "/"
-
-instance ToQuery DescribeJobFlows where
-    toQuery = const mempty
-
-instance ToHeaders DescribeJobFlows
-
-instance ToJSON DescribeJobFlows where
-    toJSON DescribeJobFlows{..} = object
-        [ "CreatedAfter"  .= _djfCreatedAfter
-        , "CreatedBefore" .= _djfCreatedBefore
-        , "JobFlowIds"    .= _djfJobFlowIds
-        , "JobFlowStates" .= _djfJobFlowStates
-        ]
-
-instance AWSRequest DescribeJobFlows where
-    type Sv DescribeJobFlows = EMR
-    type Rs DescribeJobFlows = DescribeJobFlowsResponse
-
-    request  = post "DescribeJobFlows"
-    response = jsonResponse
-
-instance FromJSON DescribeJobFlowsResponse where
-    parseJSON = withObject "DescribeJobFlowsResponse" $ \o -> DescribeJobFlowsResponse
-        <$> o .:? "JobFlows" .!= mempty
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
@@ -1,123 +1,140 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.DescribeStep
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides more detail about the cluster step.
+-- Provides more detail about the cluster step.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeStep.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_DescribeStep.html AWS API Reference> for DescribeStep.
 module Network.AWS.EMR.DescribeStep
     (
-    -- * Request
-      DescribeStep
-    -- ** Request constructor
-    , describeStep
-    -- ** Request lenses
+    -- * Creating a Request
+      describeStep
+    , DescribeStep
+    -- * Request Lenses
     , dsClusterId
     , dsStepId
 
-    -- * Response
-    , DescribeStepResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , describeStepResponse
-    -- ** Response lenses
-    , dsrStep
+    , DescribeStepResponse
+    -- * Response Lenses
+    , dsrsStep
+    , dsrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data DescribeStep = DescribeStep
-    { _dsClusterId :: Text
-    , _dsStepId    :: Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'DescribeStep' constructor.
+-- | This input determines which step to describe.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'describeStep' smart constructor.
+data DescribeStep = DescribeStep'
+    { _dsClusterId :: !Text
+    , _dsStepId    :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DescribeStep' with the minimum fields required to make a request.
 --
--- * 'dsClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dsStepId' @::@ 'Text'
+-- * 'dsClusterId'
 --
-describeStep :: Text -- ^ 'dsClusterId'
-             -> Text -- ^ 'dsStepId'
-             -> DescribeStep
-describeStep p1 p2 = DescribeStep
-    { _dsClusterId = p1
-    , _dsStepId    = p2
+-- * 'dsStepId'
+describeStep
+    :: Text -- ^ 'dsClusterId'
+    -> Text -- ^ 'dsStepId'
+    -> DescribeStep
+describeStep pClusterId_ pStepId_ =
+    DescribeStep'
+    { _dsClusterId = pClusterId_
+    , _dsStepId = pStepId_
     }
 
 -- | The identifier of the cluster with steps to describe.
 dsClusterId :: Lens' DescribeStep Text
-dsClusterId = lens _dsClusterId (\s a -> s { _dsClusterId = a })
+dsClusterId = lens _dsClusterId (\ s a -> s{_dsClusterId = a});
 
 -- | The identifier of the step to describe.
 dsStepId :: Lens' DescribeStep Text
-dsStepId = lens _dsStepId (\s a -> s { _dsStepId = a })
+dsStepId = lens _dsStepId (\ s a -> s{_dsStepId = a});
 
-newtype DescribeStepResponse = DescribeStepResponse
-    { _dsrStep :: Maybe Step
-    } deriving (Eq, Read, Show)
+instance AWSRequest DescribeStep where
+        type Sv DescribeStep = EMR
+        type Rs DescribeStep = DescribeStepResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 DescribeStepResponse' <$>
+                   (x .?> "Step") <*> (pure (fromEnum s)))
 
--- | 'DescribeStepResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'dsrStep' @::@ 'Maybe' 'Step'
---
-describeStepResponse :: DescribeStepResponse
-describeStepResponse = DescribeStepResponse
-    { _dsrStep = Nothing
-    }
+instance ToHeaders DescribeStep where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.DescribeStep" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
--- | The step details for the requested step identifier.
-dsrStep :: Lens' DescribeStepResponse (Maybe Step)
-dsrStep = lens _dsrStep (\s a -> s { _dsrStep = a })
+instance ToJSON DescribeStep where
+        toJSON DescribeStep'{..}
+          = object
+              ["ClusterId" .= _dsClusterId, "StepId" .= _dsStepId]
 
 instance ToPath DescribeStep where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery DescribeStep where
-    toQuery = const mempty
-
-instance ToHeaders DescribeStep
+        toQuery = const mempty
 
-instance ToJSON DescribeStep where
-    toJSON DescribeStep{..} = object
-        [ "ClusterId" .= _dsClusterId
-        , "StepId"    .= _dsStepId
-        ]
+-- | This output contains the description of the cluster step.
+--
+-- /See:/ 'describeStepResponse' smart constructor.
+data DescribeStepResponse = DescribeStepResponse'
+    { _dsrsStep   :: !(Maybe Step)
+    , _dsrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest DescribeStep where
-    type Sv DescribeStep = EMR
-    type Rs DescribeStep = DescribeStepResponse
+-- | Creates a value of 'DescribeStepResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dsrsStep'
+--
+-- * 'dsrsStatus'
+describeStepResponse
+    :: Int -- ^ 'dsrsStatus'
+    -> DescribeStepResponse
+describeStepResponse pStatus_ =
+    DescribeStepResponse'
+    { _dsrsStep = Nothing
+    , _dsrsStatus = pStatus_
+    }
 
-    request  = post "DescribeStep"
-    response = jsonResponse
+-- | The step details for the requested step identifier.
+dsrsStep :: Lens' DescribeStepResponse (Maybe Step)
+dsrsStep = lens _dsrsStep (\ s a -> s{_dsrsStep = a});
 
-instance FromJSON DescribeStepResponse where
-    parseJSON = withObject "DescribeStepResponse" $ \o -> DescribeStepResponse
-        <$> o .:? "Step"
+-- | The response status code.
+dsrsStatus :: Lens' DescribeStepResponse Int
+dsrsStatus = lens _dsrsStatus (\ s a -> s{_dsrsStatus = a});
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
@@ -1,140 +1,166 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ListBootstrapActions
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides information about the bootstrap actions associated with a cluster.
+-- Provides information about the bootstrap actions associated with a
+-- cluster.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListBootstrapActions.html>
+-- /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
     (
-    -- * Request
-      ListBootstrapActions
-    -- ** Request constructor
-    , listBootstrapActions
-    -- ** Request lenses
-    , lbaClusterId
+    -- * Creating a Request
+      listBootstrapActions
+    , ListBootstrapActions
+    -- * Request Lenses
     , lbaMarker
+    , lbaClusterId
 
-    -- * Response
-    , ListBootstrapActionsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , listBootstrapActionsResponse
-    -- ** Response lenses
-    , lbarBootstrapActions
-    , lbarMarker
+    , ListBootstrapActionsResponse
+    -- * Response Lenses
+    , lbarsBootstrapActions
+    , lbarsMarker
+    , lbarsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data ListBootstrapActions = ListBootstrapActions
-    { _lbaClusterId :: Text
-    , _lbaMarker    :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ListBootstrapActions' constructor.
+-- | This input determines which bootstrap actions to retrieve.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'listBootstrapActions' smart constructor.
+data ListBootstrapActions = ListBootstrapActions'
+    { _lbaMarker    :: !(Maybe Text)
+    , _lbaClusterId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListBootstrapActions' with the minimum fields required to make a request.
 --
--- * 'lbaClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'lbaMarker' @::@ 'Maybe' 'Text'
+-- * 'lbaMarker'
 --
-listBootstrapActions :: Text -- ^ 'lbaClusterId'
-                     -> ListBootstrapActions
-listBootstrapActions p1 = ListBootstrapActions
-    { _lbaClusterId = p1
-    , _lbaMarker    = Nothing
+-- * 'lbaClusterId'
+listBootstrapActions
+    :: Text -- ^ 'lbaClusterId'
+    -> ListBootstrapActions
+listBootstrapActions pClusterId_ =
+    ListBootstrapActions'
+    { _lbaMarker = Nothing
+    , _lbaClusterId = pClusterId_
     }
 
+-- | The pagination token that indicates the next set of results to retrieve
+-- .
+lbaMarker :: Lens' ListBootstrapActions (Maybe Text)
+lbaMarker = lens _lbaMarker (\ s a -> s{_lbaMarker = a});
+
 -- | The cluster identifier for the bootstrap actions to list .
 lbaClusterId :: Lens' ListBootstrapActions Text
-lbaClusterId = lens _lbaClusterId (\s a -> s { _lbaClusterId = a })
-
--- | The pagination token that indicates the next set of results to retrieve .
-lbaMarker :: Lens' ListBootstrapActions (Maybe Text)
-lbaMarker = lens _lbaMarker (\s a -> s { _lbaMarker = a })
+lbaClusterId = lens _lbaClusterId (\ s a -> s{_lbaClusterId = a});
 
-data ListBootstrapActionsResponse = ListBootstrapActionsResponse
-    { _lbarBootstrapActions :: List "BootstrapActions" Command
-    , _lbarMarker           :: Maybe Text
-    } deriving (Eq, Read, Show)
+instance AWSPager ListBootstrapActions where
+        page rq rs
+          | stop (rs ^. lbarsMarker) = Nothing
+          | stop (rs ^. lbarsBootstrapActions) = Nothing
+          | otherwise =
+            Just $ rq & lbaMarker .~ rs ^. lbarsMarker
 
--- | 'ListBootstrapActionsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'lbarBootstrapActions' @::@ ['Command']
---
--- * 'lbarMarker' @::@ 'Maybe' 'Text'
---
-listBootstrapActionsResponse :: ListBootstrapActionsResponse
-listBootstrapActionsResponse = ListBootstrapActionsResponse
-    { _lbarBootstrapActions = mempty
-    , _lbarMarker           = Nothing
-    }
+instance AWSRequest ListBootstrapActions where
+        type Sv ListBootstrapActions = EMR
+        type Rs ListBootstrapActions =
+             ListBootstrapActionsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListBootstrapActionsResponse' <$>
+                   (x .?> "BootstrapActions" .!@ mempty) <*>
+                     (x .?> "Marker")
+                     <*> (pure (fromEnum s)))
 
--- | The bootstrap actions associated with the cluster .
-lbarBootstrapActions :: Lens' ListBootstrapActionsResponse [Command]
-lbarBootstrapActions =
-    lens _lbarBootstrapActions (\s a -> s { _lbarBootstrapActions = a })
-        . _List
+instance ToHeaders ListBootstrapActions where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ListBootstrapActions" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
--- | The pagination token that indicates the next set of results to retrieve .
-lbarMarker :: Lens' ListBootstrapActionsResponse (Maybe Text)
-lbarMarker = lens _lbarMarker (\s a -> s { _lbarMarker = a })
+instance ToJSON ListBootstrapActions where
+        toJSON ListBootstrapActions'{..}
+          = object
+              ["Marker" .= _lbaMarker,
+               "ClusterId" .= _lbaClusterId]
 
 instance ToPath ListBootstrapActions where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListBootstrapActions where
-    toQuery = const mempty
-
-instance ToHeaders ListBootstrapActions
+        toQuery = const mempty
 
-instance ToJSON ListBootstrapActions where
-    toJSON ListBootstrapActions{..} = object
-        [ "ClusterId" .= _lbaClusterId
-        , "Marker"    .= _lbaMarker
-        ]
+-- | This output contains the boostrap actions detail .
+--
+-- /See:/ 'listBootstrapActionsResponse' smart constructor.
+data ListBootstrapActionsResponse = ListBootstrapActionsResponse'
+    { _lbarsBootstrapActions :: !(Maybe [Command])
+    , _lbarsMarker           :: !(Maybe Text)
+    , _lbarsStatus           :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ListBootstrapActions where
-    type Sv ListBootstrapActions = EMR
-    type Rs ListBootstrapActions = ListBootstrapActionsResponse
+-- | Creates a value of 'ListBootstrapActionsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lbarsBootstrapActions'
+--
+-- * 'lbarsMarker'
+--
+-- * 'lbarsStatus'
+listBootstrapActionsResponse
+    :: Int -- ^ 'lbarsStatus'
+    -> ListBootstrapActionsResponse
+listBootstrapActionsResponse pStatus_ =
+    ListBootstrapActionsResponse'
+    { _lbarsBootstrapActions = Nothing
+    , _lbarsMarker = Nothing
+    , _lbarsStatus = pStatus_
+    }
 
-    request  = post "ListBootstrapActions"
-    response = jsonResponse
+-- | The bootstrap actions associated with the cluster .
+lbarsBootstrapActions :: Lens' ListBootstrapActionsResponse [Command]
+lbarsBootstrapActions = lens _lbarsBootstrapActions (\ s a -> s{_lbarsBootstrapActions = a}) . _Default . _Coerce;
 
-instance FromJSON ListBootstrapActionsResponse where
-    parseJSON = withObject "ListBootstrapActionsResponse" $ \o -> ListBootstrapActionsResponse
-        <$> o .:? "BootstrapActions" .!= mempty
-        <*> o .:? "Marker"
+-- | The pagination token that indicates the next set of results to retrieve
+-- .
+lbarsMarker :: Lens' ListBootstrapActionsResponse (Maybe Text)
+lbarsMarker = lens _lbarsMarker (\ s a -> s{_lbarsMarker = a});
 
-instance AWSPager ListBootstrapActions where
-    page rq rs
-        | stop (rs ^. lbarMarker) = Nothing
-        | otherwise = (\x -> rq & lbaMarker ?~ x)
-            <$> (rs ^. lbarMarker)
+-- | The response status code.
+lbarsStatus :: Lens' ListBootstrapActionsResponse Int
+lbarsStatus = lens _lbarsStatus (\ s a -> s{_lbarsStatus = a});
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
@@ -1,161 +1,185 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ListClusters
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides the status of all clusters visible to this AWS account. Allows you
--- to filter the list of clusters based on certain criteria; for example,
--- filtering by cluster creation date and time or by status. This 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.
+-- Provides the status of all clusters visible to this AWS account. Allows
+-- you to filter the list of clusters based on certain criteria; for
+-- example, filtering by cluster creation date and time or by status. This
+-- 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.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListClusters.html>
+-- /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
     (
-    -- * Request
-      ListClusters
-    -- ** Request constructor
-    , listClusters
-    -- ** Request lenses
-    , lcClusterStates
+    -- * Creating a Request
+      listClusters
+    , ListClusters
+    -- * Request Lenses
     , lcCreatedAfter
-    , lcCreatedBefore
     , lcMarker
+    , lcClusterStates
+    , lcCreatedBefore
 
-    -- * Response
-    , ListClustersResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , listClustersResponse
-    -- ** Response lenses
-    , lcrClusters
-    , lcrMarker
+    , ListClustersResponse
+    -- * Response Lenses
+    , lcrsMarker
+    , lcrsClusters
+    , lcrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data ListClusters = ListClusters
-    { _lcClusterStates :: List "ClusterStates" ClusterState
-    , _lcCreatedAfter  :: Maybe POSIX
-    , _lcCreatedBefore :: Maybe POSIX
-    , _lcMarker        :: Maybe Text
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ListClusters' constructor.
+-- | This input determines how the ListClusters action filters the list of
+-- clusters that it returns.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'listClusters' smart constructor.
+data ListClusters = ListClusters'
+    { _lcCreatedAfter  :: !(Maybe POSIX)
+    , _lcMarker        :: !(Maybe Text)
+    , _lcClusterStates :: !(Maybe [ClusterState])
+    , _lcCreatedBefore :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListClusters' with the minimum fields required to make a request.
 --
--- * 'lcClusterStates' @::@ ['ClusterState']
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'lcCreatedAfter' @::@ 'Maybe' 'UTCTime'
+-- * 'lcCreatedAfter'
 --
--- * 'lcCreatedBefore' @::@ 'Maybe' 'UTCTime'
+-- * 'lcMarker'
 --
--- * 'lcMarker' @::@ 'Maybe' 'Text'
+-- * 'lcClusterStates'
 --
-listClusters :: ListClusters
-listClusters = ListClusters
-    { _lcCreatedAfter  = Nothing
+-- * 'lcCreatedBefore'
+listClusters
+    :: ListClusters
+listClusters =
+    ListClusters'
+    { _lcCreatedAfter = Nothing
+    , _lcMarker = Nothing
+    , _lcClusterStates = Nothing
     , _lcCreatedBefore = Nothing
-    , _lcClusterStates = mempty
-    , _lcMarker        = Nothing
     }
 
--- | The cluster state filters to apply when listing clusters.
-lcClusterStates :: Lens' ListClusters [ClusterState]
-lcClusterStates = lens _lcClusterStates (\s a -> s { _lcClusterStates = a }) . _List
-
 -- | The creation date and time beginning value filter for listing clusters .
 lcCreatedAfter :: Lens' ListClusters (Maybe UTCTime)
-lcCreatedAfter = lens _lcCreatedAfter (\s a -> s { _lcCreatedAfter = a }) . mapping _Time
-
--- | The creation date and time end value filter for listing clusters .
-lcCreatedBefore :: Lens' ListClusters (Maybe UTCTime)
-lcCreatedBefore = lens _lcCreatedBefore (\s a -> s { _lcCreatedBefore = a }) . mapping _Time
+lcCreatedAfter = lens _lcCreatedAfter (\ s a -> s{_lcCreatedAfter = a}) . mapping _Time;
 
 -- | The pagination token that indicates the next set of results to retrieve.
 lcMarker :: Lens' ListClusters (Maybe Text)
-lcMarker = lens _lcMarker (\s a -> s { _lcMarker = a })
+lcMarker = lens _lcMarker (\ s a -> s{_lcMarker = a});
 
-data ListClustersResponse = ListClustersResponse
-    { _lcrClusters :: List "Clusters" ClusterSummary
-    , _lcrMarker   :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | The cluster state filters to apply when listing clusters.
+lcClusterStates :: Lens' ListClusters [ClusterState]
+lcClusterStates = lens _lcClusterStates (\ s a -> s{_lcClusterStates = a}) . _Default . _Coerce;
 
--- | 'ListClustersResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'lcrClusters' @::@ ['ClusterSummary']
---
--- * 'lcrMarker' @::@ 'Maybe' 'Text'
---
-listClustersResponse :: ListClustersResponse
-listClustersResponse = ListClustersResponse
-    { _lcrClusters = mempty
-    , _lcrMarker   = Nothing
-    }
+-- | The creation date and time end value filter for listing clusters .
+lcCreatedBefore :: Lens' ListClusters (Maybe UTCTime)
+lcCreatedBefore = lens _lcCreatedBefore (\ s a -> s{_lcCreatedBefore = a}) . mapping _Time;
 
--- | The list of clusters for the account based on the given filters.
-lcrClusters :: Lens' ListClustersResponse [ClusterSummary]
-lcrClusters = lens _lcrClusters (\s a -> s { _lcrClusters = a }) . _List
+instance AWSPager ListClusters where
+        page rq rs
+          | stop (rs ^. lcrsMarker) = Nothing
+          | stop (rs ^. lcrsClusters) = Nothing
+          | otherwise =
+            Just $ rq & lcMarker .~ rs ^. lcrsMarker
 
--- | The pagination token that indicates the next set of results to retrieve.
-lcrMarker :: Lens' ListClustersResponse (Maybe Text)
-lcrMarker = lens _lcrMarker (\s a -> s { _lcrMarker = a })
+instance AWSRequest ListClusters where
+        type Sv ListClusters = EMR
+        type Rs ListClusters = ListClustersResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListClustersResponse' <$>
+                   (x .?> "Marker") <*> (x .?> "Clusters" .!@ mempty)
+                     <*> (pure (fromEnum s)))
 
+instance ToHeaders ListClusters where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ListClusters" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListClusters where
+        toJSON ListClusters'{..}
+          = object
+              ["CreatedAfter" .= _lcCreatedAfter,
+               "Marker" .= _lcMarker,
+               "ClusterStates" .= _lcClusterStates,
+               "CreatedBefore" .= _lcCreatedBefore]
+
 instance ToPath ListClusters where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListClusters where
-    toQuery = const mempty
-
-instance ToHeaders ListClusters
+        toQuery = const mempty
 
-instance ToJSON ListClusters where
-    toJSON ListClusters{..} = object
-        [ "CreatedAfter"  .= _lcCreatedAfter
-        , "CreatedBefore" .= _lcCreatedBefore
-        , "ClusterStates" .= _lcClusterStates
-        , "Marker"        .= _lcMarker
-        ]
+-- | This contains a ClusterSummaryList with the cluster details; for
+-- example, the cluster IDs, names, and status.
+--
+-- /See:/ 'listClustersResponse' smart constructor.
+data ListClustersResponse = ListClustersResponse'
+    { _lcrsMarker   :: !(Maybe Text)
+    , _lcrsClusters :: !(Maybe [ClusterSummary])
+    , _lcrsStatus   :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ListClusters where
-    type Sv ListClusters = EMR
-    type Rs ListClusters = ListClustersResponse
+-- | Creates a value of 'ListClustersResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lcrsMarker'
+--
+-- * 'lcrsClusters'
+--
+-- * 'lcrsStatus'
+listClustersResponse
+    :: Int -- ^ 'lcrsStatus'
+    -> ListClustersResponse
+listClustersResponse pStatus_ =
+    ListClustersResponse'
+    { _lcrsMarker = Nothing
+    , _lcrsClusters = Nothing
+    , _lcrsStatus = pStatus_
+    }
 
-    request  = post "ListClusters"
-    response = jsonResponse
+-- | The pagination token that indicates the next set of results to retrieve.
+lcrsMarker :: Lens' ListClustersResponse (Maybe Text)
+lcrsMarker = lens _lcrsMarker (\ s a -> s{_lcrsMarker = a});
 
-instance FromJSON ListClustersResponse where
-    parseJSON = withObject "ListClustersResponse" $ \o -> ListClustersResponse
-        <$> o .:? "Clusters" .!= mempty
-        <*> o .:? "Marker"
+-- | The list of clusters for the account based on the given filters.
+lcrsClusters :: Lens' ListClustersResponse [ClusterSummary]
+lcrsClusters = lens _lcrsClusters (\ s a -> s{_lcrsClusters = a}) . _Default . _Coerce;
 
-instance AWSPager ListClusters where
-    page rq rs
-        | stop (rs ^. lcrMarker) = Nothing
-        | otherwise = (\x -> rq & lcMarker ?~ x)
-            <$> (rs ^. lcrMarker)
+-- | The response status code.
+lcrsStatus :: Lens' ListClustersResponse Int
+lcrsStatus = lens _lcrsStatus (\ s a -> s{_lcrsStatus = a});
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
@@ -1,140 +1,163 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ListInstanceGroups
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides all available details about the instance groups in a cluster.
+-- Provides all available details about the instance groups in a cluster.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListInstanceGroups.html>
+-- /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
     (
-    -- * Request
-      ListInstanceGroups
-    -- ** Request constructor
-    , listInstanceGroups
-    -- ** Request lenses
-    , ligClusterId
+    -- * Creating a Request
+      listInstanceGroups
+    , ListInstanceGroups
+    -- * Request Lenses
     , ligMarker
+    , ligClusterId
 
-    -- * Response
-    , ListInstanceGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , listInstanceGroupsResponse
-    -- ** Response lenses
-    , ligrInstanceGroups
-    , ligrMarker
+    , ListInstanceGroupsResponse
+    -- * Response Lenses
+    , ligrsMarker
+    , ligrsInstanceGroups
+    , ligrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data ListInstanceGroups = ListInstanceGroups
-    { _ligClusterId :: Text
-    , _ligMarker    :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ListInstanceGroups' constructor.
+-- | This input determines which instance groups to retrieve.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'listInstanceGroups' smart constructor.
+data ListInstanceGroups = ListInstanceGroups'
+    { _ligMarker    :: !(Maybe Text)
+    , _ligClusterId :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListInstanceGroups' with the minimum fields required to make a request.
 --
--- * 'ligClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'ligMarker' @::@ 'Maybe' 'Text'
+-- * 'ligMarker'
 --
-listInstanceGroups :: Text -- ^ 'ligClusterId'
-                   -> ListInstanceGroups
-listInstanceGroups p1 = ListInstanceGroups
-    { _ligClusterId = p1
-    , _ligMarker    = Nothing
+-- * 'ligClusterId'
+listInstanceGroups
+    :: Text -- ^ 'ligClusterId'
+    -> ListInstanceGroups
+listInstanceGroups pClusterId_ =
+    ListInstanceGroups'
+    { _ligMarker = Nothing
+    , _ligClusterId = pClusterId_
     }
 
--- | The identifier of the cluster for which to list the instance groups.
-ligClusterId :: Lens' ListInstanceGroups Text
-ligClusterId = lens _ligClusterId (\s a -> s { _ligClusterId = a })
-
 -- | The pagination token that indicates the next set of results to retrieve.
 ligMarker :: Lens' ListInstanceGroups (Maybe Text)
-ligMarker = lens _ligMarker (\s a -> s { _ligMarker = a })
+ligMarker = lens _ligMarker (\ s a -> s{_ligMarker = a});
 
-data ListInstanceGroupsResponse = ListInstanceGroupsResponse
-    { _ligrInstanceGroups :: List "InstanceGroups" InstanceGroup
-    , _ligrMarker         :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | The identifier of the cluster for which to list the instance groups.
+ligClusterId :: Lens' ListInstanceGroups Text
+ligClusterId = lens _ligClusterId (\ s a -> s{_ligClusterId = a});
 
--- | 'ListInstanceGroupsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ligrInstanceGroups' @::@ ['InstanceGroup']
---
--- * 'ligrMarker' @::@ 'Maybe' 'Text'
---
-listInstanceGroupsResponse :: ListInstanceGroupsResponse
-listInstanceGroupsResponse = ListInstanceGroupsResponse
-    { _ligrInstanceGroups = mempty
-    , _ligrMarker         = Nothing
-    }
+instance AWSPager ListInstanceGroups where
+        page rq rs
+          | stop (rs ^. ligrsMarker) = Nothing
+          | stop (rs ^. ligrsInstanceGroups) = Nothing
+          | otherwise =
+            Just $ rq & ligMarker .~ rs ^. ligrsMarker
 
--- | The list of instance groups for the cluster and given filters.
-ligrInstanceGroups :: Lens' ListInstanceGroupsResponse [InstanceGroup]
-ligrInstanceGroups =
-    lens _ligrInstanceGroups (\s a -> s { _ligrInstanceGroups = a })
-        . _List
+instance AWSRequest ListInstanceGroups where
+        type Sv ListInstanceGroups = EMR
+        type Rs ListInstanceGroups =
+             ListInstanceGroupsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListInstanceGroupsResponse' <$>
+                   (x .?> "Marker") <*>
+                     (x .?> "InstanceGroups" .!@ mempty)
+                     <*> (pure (fromEnum s)))
 
--- | The pagination token that indicates the next set of results to retrieve.
-ligrMarker :: Lens' ListInstanceGroupsResponse (Maybe Text)
-ligrMarker = lens _ligrMarker (\s a -> s { _ligrMarker = a })
+instance ToHeaders ListInstanceGroups where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ListInstanceGroups" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON ListInstanceGroups where
+        toJSON ListInstanceGroups'{..}
+          = object
+              ["Marker" .= _ligMarker,
+               "ClusterId" .= _ligClusterId]
+
 instance ToPath ListInstanceGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListInstanceGroups where
-    toQuery = const mempty
-
-instance ToHeaders ListInstanceGroups
+        toQuery = const mempty
 
-instance ToJSON ListInstanceGroups where
-    toJSON ListInstanceGroups{..} = object
-        [ "ClusterId" .= _ligClusterId
-        , "Marker"    .= _ligMarker
-        ]
+-- | This input determines which instance groups to retrieve.
+--
+-- /See:/ 'listInstanceGroupsResponse' smart constructor.
+data ListInstanceGroupsResponse = ListInstanceGroupsResponse'
+    { _ligrsMarker         :: !(Maybe Text)
+    , _ligrsInstanceGroups :: !(Maybe [InstanceGroup])
+    , _ligrsStatus         :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ListInstanceGroups where
-    type Sv ListInstanceGroups = EMR
-    type Rs ListInstanceGroups = ListInstanceGroupsResponse
+-- | Creates a value of 'ListInstanceGroupsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ligrsMarker'
+--
+-- * 'ligrsInstanceGroups'
+--
+-- * 'ligrsStatus'
+listInstanceGroupsResponse
+    :: Int -- ^ 'ligrsStatus'
+    -> ListInstanceGroupsResponse
+listInstanceGroupsResponse pStatus_ =
+    ListInstanceGroupsResponse'
+    { _ligrsMarker = Nothing
+    , _ligrsInstanceGroups = Nothing
+    , _ligrsStatus = pStatus_
+    }
 
-    request  = post "ListInstanceGroups"
-    response = jsonResponse
+-- | The pagination token that indicates the next set of results to retrieve.
+ligrsMarker :: Lens' ListInstanceGroupsResponse (Maybe Text)
+ligrsMarker = lens _ligrsMarker (\ s a -> s{_ligrsMarker = a});
 
-instance FromJSON ListInstanceGroupsResponse where
-    parseJSON = withObject "ListInstanceGroupsResponse" $ \o -> ListInstanceGroupsResponse
-        <$> o .:? "InstanceGroups" .!= mempty
-        <*> o .:? "Marker"
+-- | The list of instance groups for the cluster and given filters.
+ligrsInstanceGroups :: Lens' ListInstanceGroupsResponse [InstanceGroup]
+ligrsInstanceGroups = lens _ligrsInstanceGroups (\ s a -> s{_ligrsInstanceGroups = a}) . _Default . _Coerce;
 
-instance AWSPager ListInstanceGroups where
-    page rq rs
-        | stop (rs ^. ligrMarker) = Nothing
-        | otherwise = (\x -> rq & ligMarker ?~ x)
-            <$> (rs ^. ligrMarker)
+-- | The response status code.
+ligrsStatus :: Lens' ListInstanceGroupsResponse Int
+ligrsStatus = lens _ligrsStatus (\ s a -> s{_ligrsStatus = a});
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
@@ -1,165 +1,184 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ListInstances
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides information about the cluster instances that Amazon EMR provisions
--- on behalf of a user when it creates the cluster. For example, this operation
--- indicates when the EC2 instances reach the Ready state, when instances become
--- available to Amazon EMR to use for jobs, and the IP addresses for cluster
--- instances, etc.
+-- Provides information about the cluster instances that Amazon EMR
+-- provisions on behalf of a user when it creates the cluster. For example,
+-- this operation indicates when the EC2 instances reach the Ready state,
+-- when instances become available to Amazon EMR to use for jobs, and the
+-- IP addresses for cluster instances, etc.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListInstances.html>
+-- /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
     (
-    -- * Request
-      ListInstances
-    -- ** Request constructor
-    , listInstances
-    -- ** Request lenses
-    , liClusterId
-    , liInstanceGroupId
+    -- * Creating a Request
+      listInstances
+    , ListInstances
+    -- * Request Lenses
     , liInstanceGroupTypes
     , liMarker
+    , liInstanceGroupId
+    , liClusterId
 
-    -- * Response
-    , ListInstancesResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , listInstancesResponse
-    -- ** Response lenses
-    , lirInstances
-    , lirMarker
+    , ListInstancesResponse
+    -- * Response Lenses
+    , lirsInstances
+    , lirsMarker
+    , lirsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data ListInstances = ListInstances
-    { _liClusterId          :: Text
-    , _liInstanceGroupId    :: Maybe Text
-    , _liInstanceGroupTypes :: List "InstanceGroupTypes" InstanceGroupType
-    , _liMarker             :: Maybe Text
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ListInstances' constructor.
+-- | This input determines which instances to list.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'listInstances' smart constructor.
+data ListInstances = ListInstances'
+    { _liInstanceGroupTypes :: !(Maybe [InstanceGroupType])
+    , _liMarker             :: !(Maybe Text)
+    , _liInstanceGroupId    :: !(Maybe Text)
+    , _liClusterId          :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListInstances' with the minimum fields required to make a request.
 --
--- * 'liClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'liInstanceGroupId' @::@ 'Maybe' 'Text'
+-- * 'liInstanceGroupTypes'
 --
--- * 'liInstanceGroupTypes' @::@ ['InstanceGroupType']
+-- * 'liMarker'
 --
--- * 'liMarker' @::@ 'Maybe' 'Text'
+-- * 'liInstanceGroupId'
 --
-listInstances :: Text -- ^ 'liClusterId'
-              -> ListInstances
-listInstances p1 = ListInstances
-    { _liClusterId          = p1
-    , _liInstanceGroupId    = Nothing
-    , _liInstanceGroupTypes = mempty
-    , _liMarker             = Nothing
+-- * 'liClusterId'
+listInstances
+    :: Text -- ^ 'liClusterId'
+    -> ListInstances
+listInstances pClusterId_ =
+    ListInstances'
+    { _liInstanceGroupTypes = Nothing
+    , _liMarker = Nothing
+    , _liInstanceGroupId = Nothing
+    , _liClusterId = pClusterId_
     }
 
--- | The identifier of the cluster for which to list the instances.
-liClusterId :: Lens' ListInstances Text
-liClusterId = lens _liClusterId (\s a -> s { _liClusterId = a })
-
--- | The identifier of the instance group for which to list the instances.
-liInstanceGroupId :: Lens' ListInstances (Maybe Text)
-liInstanceGroupId =
-    lens _liInstanceGroupId (\s a -> s { _liInstanceGroupId = a })
-
 -- | The type of instance group for which to list the instances.
 liInstanceGroupTypes :: Lens' ListInstances [InstanceGroupType]
-liInstanceGroupTypes =
-    lens _liInstanceGroupTypes (\s a -> s { _liInstanceGroupTypes = a })
-        . _List
+liInstanceGroupTypes = lens _liInstanceGroupTypes (\ s a -> s{_liInstanceGroupTypes = a}) . _Default . _Coerce;
 
 -- | The pagination token that indicates the next set of results to retrieve.
 liMarker :: Lens' ListInstances (Maybe Text)
-liMarker = lens _liMarker (\s a -> s { _liMarker = a })
+liMarker = lens _liMarker (\ s a -> s{_liMarker = a});
 
-data ListInstancesResponse = ListInstancesResponse
-    { _lirInstances :: List "Instances" Instance
-    , _lirMarker    :: Maybe Text
-    } deriving (Eq, Read, Show)
+-- | The identifier of the instance group for which to list the instances.
+liInstanceGroupId :: Lens' ListInstances (Maybe Text)
+liInstanceGroupId = lens _liInstanceGroupId (\ s a -> s{_liInstanceGroupId = a});
 
--- | 'ListInstancesResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'lirInstances' @::@ ['Instance']
---
--- * 'lirMarker' @::@ 'Maybe' 'Text'
---
-listInstancesResponse :: ListInstancesResponse
-listInstancesResponse = ListInstancesResponse
-    { _lirInstances = mempty
-    , _lirMarker    = Nothing
-    }
+-- | The identifier of the cluster for which to list the instances.
+liClusterId :: Lens' ListInstances Text
+liClusterId = lens _liClusterId (\ s a -> s{_liClusterId = a});
 
--- | The list of instances for the cluster and given filters.
-lirInstances :: Lens' ListInstancesResponse [Instance]
-lirInstances = lens _lirInstances (\s a -> s { _lirInstances = a }) . _List
+instance AWSPager ListInstances where
+        page rq rs
+          | stop (rs ^. lirsMarker) = Nothing
+          | stop (rs ^. lirsInstances) = Nothing
+          | otherwise =
+            Just $ rq & liMarker .~ rs ^. lirsMarker
 
--- | The pagination token that indicates the next set of results to retrieve.
-lirMarker :: Lens' ListInstancesResponse (Maybe Text)
-lirMarker = lens _lirMarker (\s a -> s { _lirMarker = a })
+instance AWSRequest ListInstances where
+        type Sv ListInstances = EMR
+        type Rs ListInstances = ListInstancesResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListInstancesResponse' <$>
+                   (x .?> "Instances" .!@ mempty) <*> (x .?> "Marker")
+                     <*> (pure (fromEnum s)))
 
+instance ToHeaders ListInstances where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ListInstances" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListInstances where
+        toJSON ListInstances'{..}
+          = object
+              ["InstanceGroupTypes" .= _liInstanceGroupTypes,
+               "Marker" .= _liMarker,
+               "InstanceGroupId" .= _liInstanceGroupId,
+               "ClusterId" .= _liClusterId]
+
 instance ToPath ListInstances where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListInstances where
-    toQuery = const mempty
-
-instance ToHeaders ListInstances
+        toQuery = const mempty
 
-instance ToJSON ListInstances where
-    toJSON ListInstances{..} = object
-        [ "ClusterId"          .= _liClusterId
-        , "InstanceGroupId"    .= _liInstanceGroupId
-        , "InstanceGroupTypes" .= _liInstanceGroupTypes
-        , "Marker"             .= _liMarker
-        ]
+-- | This output contains the list of instances.
+--
+-- /See:/ 'listInstancesResponse' smart constructor.
+data ListInstancesResponse = ListInstancesResponse'
+    { _lirsInstances :: !(Maybe [Instance])
+    , _lirsMarker    :: !(Maybe Text)
+    , _lirsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ListInstances where
-    type Sv ListInstances = EMR
-    type Rs ListInstances = ListInstancesResponse
+-- | Creates a value of 'ListInstancesResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lirsInstances'
+--
+-- * 'lirsMarker'
+--
+-- * 'lirsStatus'
+listInstancesResponse
+    :: Int -- ^ 'lirsStatus'
+    -> ListInstancesResponse
+listInstancesResponse pStatus_ =
+    ListInstancesResponse'
+    { _lirsInstances = Nothing
+    , _lirsMarker = Nothing
+    , _lirsStatus = pStatus_
+    }
 
-    request  = post "ListInstances"
-    response = jsonResponse
+-- | The list of instances for the cluster and given filters.
+lirsInstances :: Lens' ListInstancesResponse [Instance]
+lirsInstances = lens _lirsInstances (\ s a -> s{_lirsInstances = a}) . _Default . _Coerce;
 
-instance FromJSON ListInstancesResponse where
-    parseJSON = withObject "ListInstancesResponse" $ \o -> ListInstancesResponse
-        <$> o .:? "Instances" .!= mempty
-        <*> o .:? "Marker"
+-- | The pagination token that indicates the next set of results to retrieve.
+lirsMarker :: Lens' ListInstancesResponse (Maybe Text)
+lirsMarker = lens _lirsMarker (\ s a -> s{_lirsMarker = a});
 
-instance AWSPager ListInstances where
-    page rq rs
-        | stop (rs ^. lirMarker) = Nothing
-        | otherwise = (\x -> rq & liMarker ?~ x)
-            <$> (rs ^. lirMarker)
+-- | The response status code.
+lirsStatus :: Lens' ListInstancesResponse Int
+lirsStatus = lens _lirsStatus (\ s a -> s{_lirsStatus = a});
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
@@ -1,158 +1,179 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ListSteps
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Provides a list of steps for the cluster.
+-- Provides a list of steps for the cluster.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListSteps.html>
+-- /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
     (
-    -- * Request
-      ListSteps
-    -- ** Request constructor
-    , listSteps
-    -- ** Request lenses
-    , lsClusterId
-    , lsMarker
+    -- * Creating a Request
+      listSteps
+    , ListSteps
+    -- * Request Lenses
     , lsStepIds
     , lsStepStates
+    , lsMarker
+    , lsClusterId
 
-    -- * Response
-    , ListStepsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , listStepsResponse
-    -- ** Response lenses
-    , lsrMarker
-    , lsrSteps
+    , ListStepsResponse
+    -- * Response Lenses
+    , lsrsSteps
+    , lsrsMarker
+    , lsrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data ListSteps = ListSteps
-    { _lsClusterId  :: Text
-    , _lsMarker     :: Maybe Text
-    , _lsStepIds    :: List "StepIds" Text
-    , _lsStepStates :: List "StepStates" StepState
-    } deriving (Eq, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Pager
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ListSteps' constructor.
+-- | This input determines which steps to list.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'listSteps' smart constructor.
+data ListSteps = ListSteps'
+    { _lsStepIds    :: !(Maybe [Text])
+    , _lsStepStates :: !(Maybe [StepState])
+    , _lsMarker     :: !(Maybe Text)
+    , _lsClusterId  :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ListSteps' with the minimum fields required to make a request.
 --
--- * 'lsClusterId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'lsMarker' @::@ 'Maybe' 'Text'
+-- * 'lsStepIds'
 --
--- * 'lsStepIds' @::@ ['Text']
+-- * 'lsStepStates'
 --
--- * 'lsStepStates' @::@ ['StepState']
+-- * 'lsMarker'
 --
-listSteps :: Text -- ^ 'lsClusterId'
-          -> ListSteps
-listSteps p1 = ListSteps
-    { _lsClusterId  = p1
-    , _lsStepStates = mempty
-    , _lsStepIds    = mempty
-    , _lsMarker     = Nothing
+-- * 'lsClusterId'
+listSteps
+    :: Text -- ^ 'lsClusterId'
+    -> ListSteps
+listSteps pClusterId_ =
+    ListSteps'
+    { _lsStepIds = Nothing
+    , _lsStepStates = Nothing
+    , _lsMarker = Nothing
+    , _lsClusterId = pClusterId_
     }
 
--- | The identifier of the cluster for which to list the steps.
-lsClusterId :: Lens' ListSteps Text
-lsClusterId = lens _lsClusterId (\s a -> s { _lsClusterId = a })
-
--- | The pagination token that indicates the next set of results to retrieve.
-lsMarker :: Lens' ListSteps (Maybe Text)
-lsMarker = lens _lsMarker (\s a -> s { _lsMarker = a })
-
 -- | The filter to limit the step list based on the identifier of the steps.
 lsStepIds :: Lens' ListSteps [Text]
-lsStepIds = lens _lsStepIds (\s a -> s { _lsStepIds = a }) . _List
+lsStepIds = lens _lsStepIds (\ s a -> s{_lsStepIds = a}) . _Default . _Coerce;
 
 -- | The filter to limit the step list based on certain states.
 lsStepStates :: Lens' ListSteps [StepState]
-lsStepStates = lens _lsStepStates (\s a -> s { _lsStepStates = a }) . _List
+lsStepStates = lens _lsStepStates (\ s a -> s{_lsStepStates = a}) . _Default . _Coerce;
 
-data ListStepsResponse = ListStepsResponse
-    { _lsrMarker :: Maybe Text
-    , _lsrSteps  :: List "Steps" StepSummary
-    } deriving (Eq, Read, Show)
+-- | The pagination token that indicates the next set of results to retrieve.
+lsMarker :: Lens' ListSteps (Maybe Text)
+lsMarker = lens _lsMarker (\ s a -> s{_lsMarker = a});
 
--- | 'ListStepsResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'lsrMarker' @::@ 'Maybe' 'Text'
---
--- * 'lsrSteps' @::@ ['StepSummary']
---
-listStepsResponse :: ListStepsResponse
-listStepsResponse = ListStepsResponse
-    { _lsrSteps  = mempty
-    , _lsrMarker = Nothing
-    }
+-- | The identifier of the cluster for which to list the steps.
+lsClusterId :: Lens' ListSteps Text
+lsClusterId = lens _lsClusterId (\ s a -> s{_lsClusterId = a});
 
--- | The pagination token that indicates the next set of results to retrieve.
-lsrMarker :: Lens' ListStepsResponse (Maybe Text)
-lsrMarker = lens _lsrMarker (\s a -> s { _lsrMarker = a })
+instance AWSPager ListSteps where
+        page rq rs
+          | stop (rs ^. lsrsMarker) = Nothing
+          | stop (rs ^. lsrsSteps) = Nothing
+          | otherwise =
+            Just $ rq & lsMarker .~ rs ^. lsrsMarker
 
--- | The filtered list of steps for the cluster.
-lsrSteps :: Lens' ListStepsResponse [StepSummary]
-lsrSteps = lens _lsrSteps (\s a -> s { _lsrSteps = a }) . _List
+instance AWSRequest ListSteps where
+        type Sv ListSteps = EMR
+        type Rs ListSteps = ListStepsResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 ListStepsResponse' <$>
+                   (x .?> "Steps" .!@ mempty) <*> (x .?> "Marker") <*>
+                     (pure (fromEnum s)))
 
+instance ToHeaders ListSteps where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ListSteps" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON ListSteps where
+        toJSON ListSteps'{..}
+          = object
+              ["StepIds" .= _lsStepIds,
+               "StepStates" .= _lsStepStates, "Marker" .= _lsMarker,
+               "ClusterId" .= _lsClusterId]
+
 instance ToPath ListSteps where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ListSteps where
-    toQuery = const mempty
-
-instance ToHeaders ListSteps
+        toQuery = const mempty
 
-instance ToJSON ListSteps where
-    toJSON ListSteps{..} = object
-        [ "ClusterId"  .= _lsClusterId
-        , "StepStates" .= _lsStepStates
-        , "StepIds"    .= _lsStepIds
-        , "Marker"     .= _lsMarker
-        ]
+-- | This output contains the list of steps.
+--
+-- /See:/ 'listStepsResponse' smart constructor.
+data ListStepsResponse = ListStepsResponse'
+    { _lsrsSteps  :: !(Maybe [StepSummary])
+    , _lsrsMarker :: !(Maybe Text)
+    , _lsrsStatus :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest ListSteps where
-    type Sv ListSteps = EMR
-    type Rs ListSteps = ListStepsResponse
+-- | Creates a value of 'ListStepsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'lsrsSteps'
+--
+-- * 'lsrsMarker'
+--
+-- * 'lsrsStatus'
+listStepsResponse
+    :: Int -- ^ 'lsrsStatus'
+    -> ListStepsResponse
+listStepsResponse pStatus_ =
+    ListStepsResponse'
+    { _lsrsSteps = Nothing
+    , _lsrsMarker = Nothing
+    , _lsrsStatus = pStatus_
+    }
 
-    request  = post "ListSteps"
-    response = jsonResponse
+-- | The filtered list of steps for the cluster.
+lsrsSteps :: Lens' ListStepsResponse [StepSummary]
+lsrsSteps = lens _lsrsSteps (\ s a -> s{_lsrsSteps = a}) . _Default . _Coerce;
 
-instance FromJSON ListStepsResponse where
-    parseJSON = withObject "ListStepsResponse" $ \o -> ListStepsResponse
-        <$> o .:? "Marker"
-        <*> o .:? "Steps" .!= mempty
+-- | The pagination token that indicates the next set of results to retrieve.
+lsrsMarker :: Lens' ListStepsResponse (Maybe Text)
+lsrsMarker = lens _lsrsMarker (\ s a -> s{_lsrsMarker = a});
 
-instance AWSPager ListSteps where
-    page rq rs
-        | stop (rs ^. lsrMarker) = Nothing
-        | otherwise = (\x -> rq & lsMarker ?~ x)
-            <$> (rs ^. lsrMarker)
+-- | The response status code.
+lsrsStatus :: Lens' ListStepsResponse Int
+lsrsStatus = lens _lsrsStatus (\ s a -> s{_lsrsStatus = a});
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
@@ -1,104 +1,105 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.ModifyInstanceGroups
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | ModifyInstanceGroups modifies the number of nodes and configuration 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.
+-- ModifyInstanceGroups modifies the number of nodes and configuration
+-- 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.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ModifyInstanceGroups.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ModifyInstanceGroups.html AWS API Reference> for ModifyInstanceGroups.
 module Network.AWS.EMR.ModifyInstanceGroups
     (
-    -- * Request
-      ModifyInstanceGroups
-    -- ** Request constructor
-    , modifyInstanceGroups
-    -- ** Request lenses
+    -- * Creating a Request
+      modifyInstanceGroups
+    , ModifyInstanceGroups
+    -- * Request Lenses
     , migInstanceGroups
 
-    -- * Response
-    , ModifyInstanceGroupsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , modifyInstanceGroupsResponse
+    , ModifyInstanceGroupsResponse
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-newtype ModifyInstanceGroups = ModifyInstanceGroups
-    { _migInstanceGroups :: List "InstanceGroups" InstanceGroupModifyConfig
-    } deriving (Eq, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList ModifyInstanceGroups where
-    type Item ModifyInstanceGroups = InstanceGroupModifyConfig
-
-    fromList = ModifyInstanceGroups . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _migInstanceGroups
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'ModifyInstanceGroups' constructor.
+-- | Change the size of some instance groups.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'modifyInstanceGroups' smart constructor.
+newtype ModifyInstanceGroups = ModifyInstanceGroups'
+    { _migInstanceGroups :: Maybe [InstanceGroupModifyConfig]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ModifyInstanceGroups' with the minimum fields required to make a request.
 --
--- * 'migInstanceGroups' @::@ ['InstanceGroupModifyConfig']
+-- Use one of the following lenses to modify other fields as desired:
 --
-modifyInstanceGroups :: ModifyInstanceGroups
-modifyInstanceGroups = ModifyInstanceGroups
-    { _migInstanceGroups = mempty
+-- * 'migInstanceGroups'
+modifyInstanceGroups
+    :: ModifyInstanceGroups
+modifyInstanceGroups =
+    ModifyInstanceGroups'
+    { _migInstanceGroups = Nothing
     }
 
 -- | Instance groups to change.
 migInstanceGroups :: Lens' ModifyInstanceGroups [InstanceGroupModifyConfig]
-migInstanceGroups =
-    lens _migInstanceGroups (\s a -> s { _migInstanceGroups = a })
-        . _List
+migInstanceGroups = lens _migInstanceGroups (\ s a -> s{_migInstanceGroups = a}) . _Default . _Coerce;
 
-data ModifyInstanceGroupsResponse = ModifyInstanceGroupsResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest ModifyInstanceGroups where
+        type Sv ModifyInstanceGroups = EMR
+        type Rs ModifyInstanceGroups =
+             ModifyInstanceGroupsResponse
+        request = postJSON
+        response = receiveNull ModifyInstanceGroupsResponse'
 
--- | 'ModifyInstanceGroupsResponse' constructor.
-modifyInstanceGroupsResponse :: ModifyInstanceGroupsResponse
-modifyInstanceGroupsResponse = ModifyInstanceGroupsResponse
+instance ToHeaders ModifyInstanceGroups where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.ModifyInstanceGroups" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON ModifyInstanceGroups where
+        toJSON ModifyInstanceGroups'{..}
+          = object ["InstanceGroups" .= _migInstanceGroups]
+
 instance ToPath ModifyInstanceGroups where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery ModifyInstanceGroups where
-    toQuery = const mempty
-
-instance ToHeaders ModifyInstanceGroups
-
-instance ToJSON ModifyInstanceGroups where
-    toJSON ModifyInstanceGroups{..} = object
-        [ "InstanceGroups" .= _migInstanceGroups
-        ]
+        toQuery = const mempty
 
-instance AWSRequest ModifyInstanceGroups where
-    type Sv ModifyInstanceGroups = EMR
-    type Rs ModifyInstanceGroups = ModifyInstanceGroupsResponse
+-- | /See:/ 'modifyInstanceGroupsResponse' smart constructor.
+data ModifyInstanceGroupsResponse =
+    ModifyInstanceGroupsResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "ModifyInstanceGroups"
-    response = nullResponse ModifyInstanceGroupsResponse
+-- | Creates a value of 'ModifyInstanceGroupsResponse' with the minimum fields required to make a request.
+--
+modifyInstanceGroupsResponse
+    :: ModifyInstanceGroupsResponse
+modifyInstanceGroupsResponse = ModifyInstanceGroupsResponse'
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
@@ -1,109 +1,137 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.RemoveTags
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | Removes tags from an Amazon EMR resource. Tags make it easier to associate
--- 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 EMRResources>.
+-- Removes tags from an Amazon EMR resource. Tags make it easier to
+-- associate 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>.
 --
--- The following example removes the stack tag with value Prod from a cluster:
+-- The following example removes the stack tag with value Prod from a
+-- cluster:
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RemoveTags.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RemoveTags.html AWS API Reference> for RemoveTags.
 module Network.AWS.EMR.RemoveTags
     (
-    -- * Request
-      RemoveTags
-    -- ** Request constructor
-    , removeTags
-    -- ** Request lenses
+    -- * Creating a Request
+      removeTags
+    , RemoveTags
+    -- * Request Lenses
     , rtResourceId
     , rtTagKeys
 
-    -- * Response
-    , RemoveTagsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , removeTagsResponse
+    , RemoveTagsResponse
+    -- * Response Lenses
+    , rtrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data RemoveTags = RemoveTags
-    { _rtResourceId :: Text
-    , _rtTagKeys    :: List "TagKeys" Text
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'RemoveTags' constructor.
+-- | This input identifies a cluster and a list of tags to remove.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'removeTags' smart constructor.
+data RemoveTags = RemoveTags'
+    { _rtResourceId :: !Text
+    , _rtTagKeys    :: ![Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'RemoveTags' with the minimum fields required to make a request.
 --
--- * 'rtResourceId' @::@ 'Text'
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rtTagKeys' @::@ ['Text']
+-- * 'rtResourceId'
 --
-removeTags :: Text -- ^ 'rtResourceId'
-           -> RemoveTags
-removeTags p1 = RemoveTags
-    { _rtResourceId = p1
-    , _rtTagKeys    = mempty
+-- * 'rtTagKeys'
+removeTags
+    :: Text -- ^ 'rtResourceId'
+    -> RemoveTags
+removeTags pResourceId_ =
+    RemoveTags'
+    { _rtResourceId = pResourceId_
+    , _rtTagKeys = mempty
     }
 
 -- | The Amazon EMR resource identifier from which tags will be removed. This
 -- value must be a cluster identifier.
 rtResourceId :: Lens' RemoveTags Text
-rtResourceId = lens _rtResourceId (\s a -> s { _rtResourceId = a })
+rtResourceId = lens _rtResourceId (\ s a -> s{_rtResourceId = a});
 
 -- | A list of tag keys to remove from a resource.
 rtTagKeys :: Lens' RemoveTags [Text]
-rtTagKeys = lens _rtTagKeys (\s a -> s { _rtTagKeys = a }) . _List
+rtTagKeys = lens _rtTagKeys (\ s a -> s{_rtTagKeys = a}) . _Coerce;
 
-data RemoveTagsResponse = RemoveTagsResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest RemoveTags where
+        type Sv RemoveTags = EMR
+        type Rs RemoveTags = RemoveTagsResponse
+        request = postJSON
+        response
+          = receiveEmpty
+              (\ s h x ->
+                 RemoveTagsResponse' <$> (pure (fromEnum s)))
 
--- | 'RemoveTagsResponse' constructor.
-removeTagsResponse :: RemoveTagsResponse
-removeTagsResponse = RemoveTagsResponse
+instance ToHeaders RemoveTags where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.RemoveTags" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON RemoveTags where
+        toJSON RemoveTags'{..}
+          = object
+              ["ResourceId" .= _rtResourceId,
+               "TagKeys" .= _rtTagKeys]
+
 instance ToPath RemoveTags where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery RemoveTags where
-    toQuery = const mempty
-
-instance ToHeaders RemoveTags
+        toQuery = const mempty
 
-instance ToJSON RemoveTags where
-    toJSON RemoveTags{..} = object
-        [ "ResourceId" .= _rtResourceId
-        , "TagKeys"    .= _rtTagKeys
-        ]
+-- | This output indicates the result of removing tags from a resource.
+--
+-- /See:/ 'removeTagsResponse' smart constructor.
+newtype RemoveTagsResponse = RemoveTagsResponse'
+    { _rtrsStatus :: Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest RemoveTags where
-    type Sv RemoveTags = EMR
-    type Rs RemoveTags = RemoveTagsResponse
+-- | Creates a value of 'RemoveTagsResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rtrsStatus'
+removeTagsResponse
+    :: Int -- ^ 'rtrsStatus'
+    -> RemoveTagsResponse
+removeTagsResponse pStatus_ =
+    RemoveTagsResponse'
+    { _rtrsStatus = pStatus_
+    }
 
-    request  = post "RemoveTags"
-    response = nullResponse RemoveTagsResponse
+-- | The response status code.
+rtrsStatus :: Lens' RemoveTagsResponse Int
+rtrsStatus = lens _rtrsStatus (\ s a -> s{_rtrsStatus = a});
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
@@ -1,293 +1,370 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.RunJobFlow
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | RunJobFlow creates and starts running a new job flow. The job flow will 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.
+-- RunJobFlow creates and starts running a new job flow. The job flow will
+-- 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.
 --
--- 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.
+-- 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.
 --
 -- A maximum of 256 steps are allowed in each job flow.
 --
--- If your job flow is long-running (such as a Hive data warehouse) or complex,
--- you may require more than 256 steps to process your data. You can bypass the
--- 256-step limitation in various ways, including using the SSH shell to connect
--- to the master node and submitting queries directly to the software running on
--- the master node, such as Hive and Hadoop. For more information on how to do
--- this, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow> in the /Amazon ElasticMapReduce Developer's Guide/.
+-- If your job flow is long-running (such as a Hive data warehouse) or
+-- complex, you may require more than 256 steps to process your data. You
+-- can bypass the 256-step limitation in various ways, including using the
+-- SSH shell to connect to the master node and submitting queries directly
+-- to the software running on the master node, such as Hive and Hadoop. For
+-- more information on how to do this, go to
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow>
+-- in the /Amazon Elastic MapReduce Developer\'s Guide/.
 --
--- For long running job flows, we recommend that you periodically store your
--- results.
+-- For long running job flows, we recommend that you periodically store
+-- your results.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RunJobFlow.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_RunJobFlow.html AWS API Reference> for RunJobFlow.
 module Network.AWS.EMR.RunJobFlow
     (
-    -- * Request
-      RunJobFlow
-    -- ** Request constructor
-    , runJobFlow
-    -- ** Request lenses
+    -- * Creating a Request
+      runJobFlow
+    , RunJobFlow
+    -- * Request Lenses
+    , rjfAMIVersion
     , rjfAdditionalInfo
-    , rjfAmiVersion
-    , rjfBootstrapActions
-    , rjfInstances
+    , rjfConfigurations
     , rjfJobFlowRole
-    , rjfLogUri
-    , rjfName
-    , rjfNewSupportedProducts
-    , rjfServiceRole
     , rjfSteps
+    , rjfBootstrapActions
+    , rjfReleaseLabel
+    , rjfNewSupportedProducts
+    , rjfLogURI
     , rjfSupportedProducts
-    , rjfTags
     , rjfVisibleToAllUsers
+    , rjfApplications
+    , rjfTags
+    , rjfServiceRole
+    , rjfName
+    , rjfInstances
 
-    -- * Response
-    , RunJobFlowResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , runJobFlowResponse
-    -- ** Response lenses
-    , rjfrJobFlowId
+    , RunJobFlowResponse
+    -- * Response Lenses
+    , rjfrsJobFlowId
+    , rjfrsStatus
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
-data RunJobFlow = RunJobFlow
-    { _rjfAdditionalInfo       :: Maybe Text
-    , _rjfAmiVersion           :: Maybe Text
-    , _rjfBootstrapActions     :: List "BootstrapActions" BootstrapActionConfig
-    , _rjfInstances            :: JobFlowInstancesConfig
-    , _rjfJobFlowRole          :: Maybe Text
-    , _rjfLogUri               :: Maybe Text
-    , _rjfName                 :: Text
-    , _rjfNewSupportedProducts :: List "NewSupportedProducts" SupportedProductConfig
-    , _rjfServiceRole          :: Maybe Text
-    , _rjfSteps                :: List "Steps" StepConfig
-    , _rjfSupportedProducts    :: List "SupportedProducts" Text
-    , _rjfTags                 :: List "Tags" Tag
-    , _rjfVisibleToAllUsers    :: Maybe Bool
-    } deriving (Eq, Read, Show)
+-- | Input to the RunJobFlow operation.
+--
+-- /See:/ 'runJobFlow' smart constructor.
+data RunJobFlow = RunJobFlow'
+    { _rjfAMIVersion           :: !(Maybe Text)
+    , _rjfAdditionalInfo       :: !(Maybe Text)
+    , _rjfConfigurations       :: !(Maybe [Configuration])
+    , _rjfJobFlowRole          :: !(Maybe Text)
+    , _rjfSteps                :: !(Maybe [StepConfig])
+    , _rjfBootstrapActions     :: !(Maybe [BootstrapActionConfig])
+    , _rjfReleaseLabel         :: !(Maybe Text)
+    , _rjfNewSupportedProducts :: !(Maybe [SupportedProductConfig])
+    , _rjfLogURI               :: !(Maybe Text)
+    , _rjfSupportedProducts    :: !(Maybe [Text])
+    , _rjfVisibleToAllUsers    :: !(Maybe Bool)
+    , _rjfApplications         :: !(Maybe [Application])
+    , _rjfTags                 :: !(Maybe [Tag])
+    , _rjfServiceRole          :: !(Maybe Text)
+    , _rjfName                 :: !Text
+    , _rjfInstances            :: !JobFlowInstancesConfig
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
--- | 'RunJobFlow' constructor.
+-- | Creates a value of 'RunJobFlow' with the minimum fields required to make a request.
 --
--- The fields accessible through corresponding lenses are:
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'rjfAdditionalInfo' @::@ 'Maybe' 'Text'
+-- * 'rjfAMIVersion'
 --
--- * 'rjfAmiVersion' @::@ 'Maybe' 'Text'
+-- * 'rjfAdditionalInfo'
 --
--- * 'rjfBootstrapActions' @::@ ['BootstrapActionConfig']
+-- * 'rjfConfigurations'
 --
--- * 'rjfInstances' @::@ 'JobFlowInstancesConfig'
+-- * 'rjfJobFlowRole'
 --
--- * 'rjfJobFlowRole' @::@ 'Maybe' 'Text'
+-- * 'rjfSteps'
 --
--- * 'rjfLogUri' @::@ 'Maybe' 'Text'
+-- * 'rjfBootstrapActions'
 --
--- * 'rjfName' @::@ 'Text'
+-- * 'rjfReleaseLabel'
 --
--- * 'rjfNewSupportedProducts' @::@ ['SupportedProductConfig']
+-- * 'rjfNewSupportedProducts'
 --
--- * 'rjfServiceRole' @::@ 'Maybe' 'Text'
+-- * 'rjfLogURI'
 --
--- * 'rjfSteps' @::@ ['StepConfig']
+-- * 'rjfSupportedProducts'
 --
--- * 'rjfSupportedProducts' @::@ ['Text']
+-- * 'rjfVisibleToAllUsers'
 --
--- * 'rjfTags' @::@ ['Tag']
+-- * 'rjfApplications'
 --
--- * 'rjfVisibleToAllUsers' @::@ 'Maybe' 'Bool'
+-- * 'rjfTags'
 --
-runJobFlow :: Text -- ^ 'rjfName'
-           -> JobFlowInstancesConfig -- ^ 'rjfInstances'
-           -> RunJobFlow
-runJobFlow p1 p2 = RunJobFlow
-    { _rjfName                 = p1
-    , _rjfInstances            = p2
-    , _rjfLogUri               = Nothing
-    , _rjfAdditionalInfo       = Nothing
-    , _rjfAmiVersion           = Nothing
-    , _rjfSteps                = mempty
-    , _rjfBootstrapActions     = mempty
-    , _rjfSupportedProducts    = mempty
-    , _rjfNewSupportedProducts = mempty
-    , _rjfVisibleToAllUsers    = Nothing
-    , _rjfJobFlowRole          = Nothing
-    , _rjfServiceRole          = Nothing
-    , _rjfTags                 = mempty
+-- * 'rjfServiceRole'
+--
+-- * 'rjfName'
+--
+-- * 'rjfInstances'
+runJobFlow
+    :: Text -- ^ 'rjfName'
+    -> JobFlowInstancesConfig -- ^ 'rjfInstances'
+    -> RunJobFlow
+runJobFlow pName_ pInstances_ =
+    RunJobFlow'
+    { _rjfAMIVersion = Nothing
+    , _rjfAdditionalInfo = Nothing
+    , _rjfConfigurations = Nothing
+    , _rjfJobFlowRole = Nothing
+    , _rjfSteps = Nothing
+    , _rjfBootstrapActions = Nothing
+    , _rjfReleaseLabel = Nothing
+    , _rjfNewSupportedProducts = Nothing
+    , _rjfLogURI = Nothing
+    , _rjfSupportedProducts = Nothing
+    , _rjfVisibleToAllUsers = Nothing
+    , _rjfApplications = Nothing
+    , _rjfTags = Nothing
+    , _rjfServiceRole = Nothing
+    , _rjfName = pName_
+    , _rjfInstances = pInstances_
     }
 
--- | A JSON string for selecting additional features.
-rjfAdditionalInfo :: Lens' RunJobFlow (Maybe Text)
-rjfAdditionalInfo =
-    lens _rjfAdditionalInfo (\s a -> s { _rjfAdditionalInfo = a })
-
--- | The version of the Amazon Machine Image (AMI) to use when launching Amazon
--- EC2 instances in the job flow. The following values are valid:
+-- | For Amazon EMR releases 3.x and 2.x. For Amazon EMR releases 4.x and
+-- greater, use ReleaseLabel.
 --
--- "latest" (uses the latest AMI) The version number of the AMI to use, for
--- example, "2.0"  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.
+-- The version of the Amazon Machine Image (AMI) to use when launching
+-- Amazon EC2 instances in the job flow. The following values are valid:
 --
+-- -   The version number of the AMI to use, for example, \"2.0.\"
+--
+-- 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.
+--
 -- For details about the AMI versions currently supported by Amazon Elastic
--- MapReduce, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EnvironmentConfig_AMIVersion.html#ami-versions-supported AMI Versions Supported in Elastic MapReduce> in the /AmazonElastic MapReduce Developer's Guide./
-rjfAmiVersion :: Lens' RunJobFlow (Maybe Text)
-rjfAmiVersion = lens _rjfAmiVersion (\s a -> s { _rjfAmiVersion = a })
+-- MapReduce, go to
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EnvironmentConfig_AMIVersion.html#ami-versions-supported AMI Versions Supported in Elastic MapReduce>
+-- in the /Amazon Elastic MapReduce Developer\'s Guide./
+rjfAMIVersion :: Lens' RunJobFlow (Maybe Text)
+rjfAMIVersion = lens _rjfAMIVersion (\ s a -> s{_rjfAMIVersion = a});
 
--- | A list of bootstrap actions that will be run before Hadoop is started on the
--- cluster nodes.
-rjfBootstrapActions :: Lens' RunJobFlow [BootstrapActionConfig]
-rjfBootstrapActions =
-    lens _rjfBootstrapActions (\s a -> s { _rjfBootstrapActions = a })
-        . _List
+-- | A JSON string for selecting additional features.
+rjfAdditionalInfo :: Lens' RunJobFlow (Maybe Text)
+rjfAdditionalInfo = lens _rjfAdditionalInfo (\ s a -> s{_rjfAdditionalInfo = a});
 
--- | A specification of the number and type of Amazon EC2 instances on which to
--- run the job flow.
-rjfInstances :: Lens' RunJobFlow JobFlowInstancesConfig
-rjfInstances = lens _rjfInstances (\s a -> s { _rjfInstances = a })
+-- | Amazon EMR releases 4.x or later.
+--
+-- The list of configurations supplied for the EMR cluster you are
+-- creating.
+rjfConfigurations :: Lens' RunJobFlow [Configuration]
+rjfConfigurations = lens _rjfConfigurations (\ s a -> s{_rjfConfigurations = 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.
+-- | 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.
 rjfJobFlowRole :: Lens' RunJobFlow (Maybe Text)
-rjfJobFlowRole = lens _rjfJobFlowRole (\s a -> s { _rjfJobFlowRole = a })
+rjfJobFlowRole = lens _rjfJobFlowRole (\ s a -> s{_rjfJobFlowRole = a});
 
--- | The location in Amazon S3 to write the log files of the job flow. If a value
--- is not provided, logs are not created.
-rjfLogUri :: Lens' RunJobFlow (Maybe Text)
-rjfLogUri = lens _rjfLogUri (\s a -> s { _rjfLogUri = a })
+-- | A list of steps to be executed by the job flow.
+rjfSteps :: Lens' RunJobFlow [StepConfig]
+rjfSteps = lens _rjfSteps (\ s a -> s{_rjfSteps = a}) . _Default . _Coerce;
 
--- | The name of the job flow.
-rjfName :: Lens' RunJobFlow Text
-rjfName = lens _rjfName (\s a -> s { _rjfName = a })
+-- | A list of bootstrap actions that will be run before Hadoop is started on
+-- the cluster nodes.
+rjfBootstrapActions :: Lens' RunJobFlow [BootstrapActionConfig]
+rjfBootstrapActions = lens _rjfBootstrapActions (\ s a -> s{_rjfBootstrapActions = a}) . _Default . _Coerce;
 
--- | A list of strings that indicates third-party software to use with the job
--- flow that accepts a user argument list. EMR accepts and forwards the argument
--- list to the corresponding installation script as bootstrap action arguments.
--- For more information, see <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-mapr.html Launch a Job Flow on the MapR Distribution forHadoop>. Currently supported values are:
+-- | Amazon EMR releases 4.x or later.
 --
--- "mapr-m3" - launch the job flow using MapR M3 Edition. "mapr-m5" - launch
--- the job flow using MapR M5 Edition. "mapr" with the user arguments specifying
--- "--edition,m3" or "--edition,m5" - launch the job flow using MapR M3 or M5
--- Edition respectively.
-rjfNewSupportedProducts :: Lens' RunJobFlow [SupportedProductConfig]
-rjfNewSupportedProducts =
-    lens _rjfNewSupportedProducts (\s a -> s { _rjfNewSupportedProducts = a })
-        . _List
+-- The release label for the Amazon EMR release. For Amazon EMR 3.x and 2.x
+-- AMIs, use amiVersion instead instead of ReleaseLabel.
+rjfReleaseLabel :: Lens' RunJobFlow (Maybe Text)
+rjfReleaseLabel = lens _rjfReleaseLabel (\ s a -> s{_rjfReleaseLabel = a});
 
--- | The IAM role that will be assumed by the Amazon EMR service to access AWS
--- resources on your behalf.
-rjfServiceRole :: Lens' RunJobFlow (Maybe Text)
-rjfServiceRole = lens _rjfServiceRole (\s a -> s { _rjfServiceRole = a })
+-- | For Amazon EMR releases 3.x and 2.x. For Amazon EMR releases 4.x and
+-- greater, use Applications.
+--
+-- A list of strings that indicates third-party software to use with the
+-- job flow that accepts a user argument list. EMR accepts and forwards the
+-- argument list to the corresponding installation script as bootstrap
+-- action arguments. For more information, see
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-mapr.html Launch a Job Flow on the MapR Distribution for Hadoop>.
+-- Currently supported values are:
+--
+-- -   \"mapr-m3\" - launch the cluster using MapR M3 Edition.
+-- -   \"mapr-m5\" - launch the cluster using MapR M5 Edition.
+-- -   \"mapr\" with the user arguments specifying \"--edition,m3\" or
+--     \"--edition,m5\" - launch the job flow using MapR M3 or M5 Edition
+--     respectively.
+-- -   \"mapr-m7\" - launch the cluster using MapR M7 Edition.
+-- -   \"hunk\" - launch the cluster with the Hunk Big Data Analtics
+--     Platform.
+-- -   \"hue\"- launch the cluster with Hue installed.
+-- -   \"spark\" - launch the cluster with Apache Spark installed.
+-- -   \"ganglia\" - launch the cluster with the Ganglia Monitoring System
+--     installed.
+rjfNewSupportedProducts :: Lens' RunJobFlow [SupportedProductConfig]
+rjfNewSupportedProducts = lens _rjfNewSupportedProducts (\ s a -> s{_rjfNewSupportedProducts = a}) . _Default . _Coerce;
 
--- | A list of steps to be executed by the job flow.
-rjfSteps :: Lens' RunJobFlow [StepConfig]
-rjfSteps = lens _rjfSteps (\s a -> s { _rjfSteps = a }) . _List
+-- | The location in Amazon S3 to write the log files of the job flow. If a
+-- value is not provided, logs are not created.
+rjfLogURI :: Lens' RunJobFlow (Maybe Text)
+rjfLogURI = lens _rjfLogURI (\ s a -> s{_rjfLogURI = a});
 
--- | A list of strings that indicates third-party software to use with the job
--- flow. For more information, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-supported-products.html Use Third Party Applications with Amazon EMR>
--- . Currently supported values are:
+-- | For Amazon EMR releases 3.x and 2.x. For Amazon EMR releases 4.x and
+-- greater, use Applications.
 --
--- "mapr-m3" - launch the job flow using MapR M3 Edition. "mapr-m5" - launch
--- the job flow using MapR M5 Edition.
+-- A list of strings that indicates third-party software to use with the
+-- job flow. For more information, go to
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-supported-products.html Use Third Party Applications with Amazon EMR>.
+-- Currently supported values are:
+--
+-- -   \"mapr-m3\" - launch the job flow using MapR M3 Edition.
+-- -   \"mapr-m5\" - launch the job flow using MapR M5 Edition.
 rjfSupportedProducts :: Lens' RunJobFlow [Text]
-rjfSupportedProducts =
-    lens _rjfSupportedProducts (\s a -> s { _rjfSupportedProducts = a })
-        . _List
+rjfSupportedProducts = lens _rjfSupportedProducts (\ s a -> s{_rjfSupportedProducts = a}) . _Default . _Coerce;
 
+-- | Whether the job flow is visible to all IAM users of the AWS account
+-- associated with the job flow. If this value is set to 'true', all IAM
+-- users of that AWS account can view and (if they have the proper policy
+-- permissions set) manage the job flow. If it is set to 'false', only the
+-- IAM user that created the job flow can view and manage it.
+rjfVisibleToAllUsers :: Lens' RunJobFlow (Maybe Bool)
+rjfVisibleToAllUsers = lens _rjfVisibleToAllUsers (\ s a -> s{_rjfVisibleToAllUsers = a});
+
+-- | Amazon EMR releases 4.x or later.
+--
+-- A list of applications for the cluster. Valid values are: \"Hadoop\",
+-- \"Hive\", \"Mahout\", \"Pig\", and \"Spark.\" They are case insensitive.
+rjfApplications :: Lens' RunJobFlow [Application]
+rjfApplications = lens _rjfApplications (\ s a -> s{_rjfApplications = a}) . _Default . _Coerce;
+
 -- | A list of tags to associate with a cluster and propagate to Amazon EC2
 -- instances.
 rjfTags :: Lens' RunJobFlow [Tag]
-rjfTags = lens _rjfTags (\s a -> s { _rjfTags = a }) . _List
+rjfTags = lens _rjfTags (\ s a -> s{_rjfTags = a}) . _Default . _Coerce;
 
--- | Whether the job flow is visible to all IAM users of the AWS account
--- associated with the job flow. If this value is set to 'true', all IAM users of
--- that AWS account can view and (if they have the proper policy permissions
--- set) manage the job flow. If it is set to 'false', only the IAM user that
--- created the job flow can view and manage it.
-rjfVisibleToAllUsers :: Lens' RunJobFlow (Maybe Bool)
-rjfVisibleToAllUsers =
-    lens _rjfVisibleToAllUsers (\s a -> s { _rjfVisibleToAllUsers = a })
+-- | The IAM role that will be assumed by the Amazon EMR service to access
+-- AWS resources on your behalf.
+rjfServiceRole :: Lens' RunJobFlow (Maybe Text)
+rjfServiceRole = lens _rjfServiceRole (\ s a -> s{_rjfServiceRole = a});
 
-newtype RunJobFlowResponse = RunJobFlowResponse
-    { _rjfrJobFlowId :: Maybe Text
-    } deriving (Eq, Ord, Read, Show, Monoid)
+-- | The name of the job flow.
+rjfName :: Lens' RunJobFlow Text
+rjfName = lens _rjfName (\ s a -> s{_rjfName = a});
 
--- | 'RunJobFlowResponse' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'rjfrJobFlowId' @::@ 'Maybe' 'Text'
---
-runJobFlowResponse :: RunJobFlowResponse
-runJobFlowResponse = RunJobFlowResponse
-    { _rjfrJobFlowId = Nothing
-    }
+-- | A specification of the number and type of Amazon EC2 instances on which
+-- to run the job flow.
+rjfInstances :: Lens' RunJobFlow JobFlowInstancesConfig
+rjfInstances = lens _rjfInstances (\ s a -> s{_rjfInstances = a});
 
--- | An unique identifier for the job flow.
-rjfrJobFlowId :: Lens' RunJobFlowResponse (Maybe Text)
-rjfrJobFlowId = lens _rjfrJobFlowId (\s a -> s { _rjfrJobFlowId = a })
+instance AWSRequest RunJobFlow where
+        type Sv RunJobFlow = EMR
+        type Rs RunJobFlow = RunJobFlowResponse
+        request = postJSON
+        response
+          = receiveJSON
+              (\ s h x ->
+                 RunJobFlowResponse' <$>
+                   (x .?> "JobFlowId") <*> (pure (fromEnum s)))
 
+instance ToHeaders RunJobFlow where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.RunJobFlow" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
+
+instance ToJSON RunJobFlow where
+        toJSON RunJobFlow'{..}
+          = object
+              ["AmiVersion" .= _rjfAMIVersion,
+               "AdditionalInfo" .= _rjfAdditionalInfo,
+               "Configurations" .= _rjfConfigurations,
+               "JobFlowRole" .= _rjfJobFlowRole,
+               "Steps" .= _rjfSteps,
+               "BootstrapActions" .= _rjfBootstrapActions,
+               "ReleaseLabel" .= _rjfReleaseLabel,
+               "NewSupportedProducts" .= _rjfNewSupportedProducts,
+               "LogUri" .= _rjfLogURI,
+               "SupportedProducts" .= _rjfSupportedProducts,
+               "VisibleToAllUsers" .= _rjfVisibleToAllUsers,
+               "Applications" .= _rjfApplications,
+               "Tags" .= _rjfTags, "ServiceRole" .= _rjfServiceRole,
+               "Name" .= _rjfName, "Instances" .= _rjfInstances]
+
 instance ToPath RunJobFlow where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery RunJobFlow where
-    toQuery = const mempty
-
-instance ToHeaders RunJobFlow
+        toQuery = const mempty
 
-instance ToJSON RunJobFlow where
-    toJSON RunJobFlow{..} = object
-        [ "Name"                 .= _rjfName
-        , "LogUri"               .= _rjfLogUri
-        , "AdditionalInfo"       .= _rjfAdditionalInfo
-        , "AmiVersion"           .= _rjfAmiVersion
-        , "Instances"            .= _rjfInstances
-        , "Steps"                .= _rjfSteps
-        , "BootstrapActions"     .= _rjfBootstrapActions
-        , "SupportedProducts"    .= _rjfSupportedProducts
-        , "NewSupportedProducts" .= _rjfNewSupportedProducts
-        , "VisibleToAllUsers"    .= _rjfVisibleToAllUsers
-        , "JobFlowRole"          .= _rjfJobFlowRole
-        , "ServiceRole"          .= _rjfServiceRole
-        , "Tags"                 .= _rjfTags
-        ]
+-- | The result of the RunJobFlow operation.
+--
+-- /See:/ 'runJobFlowResponse' smart constructor.
+data RunJobFlowResponse = RunJobFlowResponse'
+    { _rjfrsJobFlowId :: !(Maybe Text)
+    , _rjfrsStatus    :: !Int
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-instance AWSRequest RunJobFlow where
-    type Sv RunJobFlow = EMR
-    type Rs RunJobFlow = RunJobFlowResponse
+-- | Creates a value of 'RunJobFlowResponse' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'rjfrsJobFlowId'
+--
+-- * 'rjfrsStatus'
+runJobFlowResponse
+    :: Int -- ^ 'rjfrsStatus'
+    -> RunJobFlowResponse
+runJobFlowResponse pStatus_ =
+    RunJobFlowResponse'
+    { _rjfrsJobFlowId = Nothing
+    , _rjfrsStatus = pStatus_
+    }
 
-    request  = post "RunJobFlow"
-    response = jsonResponse
+-- | An unique identifier for the job flow.
+rjfrsJobFlowId :: Lens' RunJobFlowResponse (Maybe Text)
+rjfrsJobFlowId = lens _rjfrsJobFlowId (\ s a -> s{_rjfrsJobFlowId = a});
 
-instance FromJSON RunJobFlowResponse where
-    parseJSON = withObject "RunJobFlowResponse" $ \o -> RunJobFlowResponse
-        <$> o .:? "JobFlowId"
+-- | The response status code.
+rjfrsStatus :: Lens' RunJobFlowResponse Int
+rjfrsStatus = lens _rjfrsStatus (\ s a -> s{_rjfrsStatus = a});
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
@@ -1,123 +1,138 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.SetTerminationProtection
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | SetTerminationProtection locks a job flow so the Amazon EC2 instances in the
--- cluster cannot be terminated by user intervention, an API call, or in the
--- event of a job-flow error. The cluster still terminates upon successful
--- completion of the job flow. Calling SetTerminationProtection on a job flow is
--- analogous to calling the Amazon EC2 DisableAPITermination API on all of the
--- EC2 instances in a cluster.
+-- SetTerminationProtection locks a job flow so the Amazon EC2 instances in
+-- the cluster cannot be terminated by user intervention, an API call, or
+-- in the event of a job-flow error. The cluster still terminates upon
+-- successful completion of the job flow. Calling SetTerminationProtection
+-- on a job flow is analogous to calling the Amazon EC2
+-- DisableAPITermination API on all of the EC2 instances in a cluster.
 --
--- SetTerminationProtection is used to prevent accidental termination of a job
--- flow and to ensure that in the event of an error, the instances will persist
--- so you can recover any data stored in their ephemeral instance storage.
+-- SetTerminationProtection is used to prevent accidental termination of a
+-- job flow and to ensure that in the event of an error, the instances will
+-- persist so you can recover any data stored in their ephemeral instance
+-- storage.
 --
 -- To terminate a job flow that has been locked by setting
--- SetTerminationProtection to 'true', you must first unlock the job flow by a
--- subsequent call to SetTerminationProtection in which you set the value to 'false'.
+-- SetTerminationProtection to 'true', you must first unlock the job flow
+-- by a subsequent call to SetTerminationProtection in which you set the
+-- value to 'false'.
 --
--- 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./
+-- 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./
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetTerminationProtection.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetTerminationProtection.html AWS API Reference> for SetTerminationProtection.
 module Network.AWS.EMR.SetTerminationProtection
     (
-    -- * Request
-      SetTerminationProtection
-    -- ** Request constructor
-    , setTerminationProtection
-    -- ** Request lenses
+    -- * Creating a Request
+      setTerminationProtection
+    , SetTerminationProtection
+    -- * Request Lenses
     , stpJobFlowIds
     , stpTerminationProtected
 
-    -- * Response
-    , SetTerminationProtectionResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , setTerminationProtectionResponse
+    , SetTerminationProtectionResponse
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data SetTerminationProtection = SetTerminationProtection
-    { _stpJobFlowIds           :: List "JobFlowIds" Text
-    , _stpTerminationProtected :: Bool
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'SetTerminationProtection' constructor.
+-- | The input argument to the TerminationProtection operation.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'setTerminationProtection' smart constructor.
+data SetTerminationProtection = SetTerminationProtection'
+    { _stpJobFlowIds           :: ![Text]
+    , _stpTerminationProtected :: !Bool
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetTerminationProtection' with the minimum fields required to make a request.
 --
--- * 'stpJobFlowIds' @::@ ['Text']
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'stpTerminationProtected' @::@ 'Bool'
+-- * 'stpJobFlowIds'
 --
-setTerminationProtection :: Bool -- ^ 'stpTerminationProtected'
-                         -> SetTerminationProtection
-setTerminationProtection p1 = SetTerminationProtection
-    { _stpTerminationProtected = p1
-    , _stpJobFlowIds           = mempty
+-- * 'stpTerminationProtected'
+setTerminationProtection
+    :: Bool -- ^ 'stpTerminationProtected'
+    -> SetTerminationProtection
+setTerminationProtection pTerminationProtected_ =
+    SetTerminationProtection'
+    { _stpJobFlowIds = mempty
+    , _stpTerminationProtected = pTerminationProtected_
     }
 
 -- | 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 }) . _List
+stpJobFlowIds = lens _stpJobFlowIds (\ s a -> s{_stpJobFlowIds = a}) . _Coerce;
 
 -- | A Boolean that indicates whether to protect the job flow and prevent the
--- Amazon EC2 instances in the cluster from shutting down due to API calls, user
--- intervention, or job-flow error.
+-- Amazon EC2 instances in the cluster from shutting down due to API calls,
+-- user intervention, or job-flow error.
 stpTerminationProtected :: Lens' SetTerminationProtection Bool
-stpTerminationProtected =
-    lens _stpTerminationProtected (\s a -> s { _stpTerminationProtected = a })
+stpTerminationProtected = lens _stpTerminationProtected (\ s a -> s{_stpTerminationProtected = a});
 
-data SetTerminationProtectionResponse = SetTerminationProtectionResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest SetTerminationProtection where
+        type Sv SetTerminationProtection = EMR
+        type Rs SetTerminationProtection =
+             SetTerminationProtectionResponse
+        request = postJSON
+        response
+          = receiveNull SetTerminationProtectionResponse'
 
--- | 'SetTerminationProtectionResponse' constructor.
-setTerminationProtectionResponse :: SetTerminationProtectionResponse
-setTerminationProtectionResponse = SetTerminationProtectionResponse
+instance ToHeaders SetTerminationProtection where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.SetTerminationProtection" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON SetTerminationProtection where
+        toJSON SetTerminationProtection'{..}
+          = object
+              ["JobFlowIds" .= _stpJobFlowIds,
+               "TerminationProtected" .= _stpTerminationProtected]
+
 instance ToPath SetTerminationProtection where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery SetTerminationProtection where
-    toQuery = const mempty
-
-instance ToHeaders SetTerminationProtection
-
-instance ToJSON SetTerminationProtection where
-    toJSON SetTerminationProtection{..} = object
-        [ "JobFlowIds"           .= _stpJobFlowIds
-        , "TerminationProtected" .= _stpTerminationProtected
-        ]
+        toQuery = const mempty
 
-instance AWSRequest SetTerminationProtection where
-    type Sv SetTerminationProtection = EMR
-    type Rs SetTerminationProtection = SetTerminationProtectionResponse
+-- | /See:/ 'setTerminationProtectionResponse' smart constructor.
+data SetTerminationProtectionResponse =
+    SetTerminationProtectionResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "SetTerminationProtection"
-    response = nullResponse SetTerminationProtectionResponse
+-- | Creates a value of 'SetTerminationProtectionResponse' with the minimum fields required to make a request.
+--
+setTerminationProtectionResponse
+    :: SetTerminationProtectionResponse
+setTerminationProtectionResponse = SetTerminationProtectionResponse'
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
@@ -1,114 +1,123 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.SetVisibleToAllUsers
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | 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 created the job flow or the AWS
--- account that owns the job flow.
+-- 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
+-- created the job flow or the AWS account that owns the job flow.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetVisibleToAllUsers.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_SetVisibleToAllUsers.html AWS API Reference> for SetVisibleToAllUsers.
 module Network.AWS.EMR.SetVisibleToAllUsers
     (
-    -- * Request
-      SetVisibleToAllUsers
-    -- ** Request constructor
-    , setVisibleToAllUsers
-    -- ** Request lenses
+    -- * Creating a Request
+      setVisibleToAllUsers
+    , SetVisibleToAllUsers
+    -- * Request Lenses
     , svtauJobFlowIds
     , svtauVisibleToAllUsers
 
-    -- * Response
-    , SetVisibleToAllUsersResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , setVisibleToAllUsersResponse
+    , SetVisibleToAllUsersResponse
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-data SetVisibleToAllUsers = SetVisibleToAllUsers
-    { _svtauJobFlowIds        :: List "JobFlowIds" Text
-    , _svtauVisibleToAllUsers :: Bool
-    } deriving (Eq, Ord, Read, Show)
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'SetVisibleToAllUsers' constructor.
+-- | The input to the SetVisibleToAllUsers action.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'setVisibleToAllUsers' smart constructor.
+data SetVisibleToAllUsers = SetVisibleToAllUsers'
+    { _svtauJobFlowIds        :: ![Text]
+    , _svtauVisibleToAllUsers :: !Bool
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SetVisibleToAllUsers' with the minimum fields required to make a request.
 --
--- * 'svtauJobFlowIds' @::@ ['Text']
+-- Use one of the following lenses to modify other fields as desired:
 --
--- * 'svtauVisibleToAllUsers' @::@ 'Bool'
+-- * 'svtauJobFlowIds'
 --
-setVisibleToAllUsers :: Bool -- ^ 'svtauVisibleToAllUsers'
-                     -> SetVisibleToAllUsers
-setVisibleToAllUsers p1 = SetVisibleToAllUsers
-    { _svtauVisibleToAllUsers = p1
-    , _svtauJobFlowIds        = mempty
+-- * 'svtauVisibleToAllUsers'
+setVisibleToAllUsers
+    :: Bool -- ^ 'svtauVisibleToAllUsers'
+    -> SetVisibleToAllUsers
+setVisibleToAllUsers pVisibleToAllUsers_ =
+    SetVisibleToAllUsers'
+    { _svtauJobFlowIds = mempty
+    , _svtauVisibleToAllUsers = pVisibleToAllUsers_
     }
 
 -- | Identifiers of the job flows to receive the new visibility setting.
 svtauJobFlowIds :: Lens' SetVisibleToAllUsers [Text]
-svtauJobFlowIds = lens _svtauJobFlowIds (\s a -> s { _svtauJobFlowIds = a }) . _List
+svtauJobFlowIds = lens _svtauJobFlowIds (\ s a -> s{_svtauJobFlowIds = a}) . _Coerce;
 
 -- | Whether the specified job flows are visible to all IAM users of the AWS
--- account associated with the job flow. If this value is set to True, all IAM
--- users of that AWS account can view and, if they have the proper IAM policy
--- permissions set, manage the job flows. If it is set to False, only the IAM
--- user that created a job flow can view and manage it.
+-- account associated with the job flow. If this value is set to True, all
+-- IAM users of that AWS account can view and, if they have the proper IAM
+-- policy permissions set, manage the job flows. If it is set to False,
+-- only the IAM user that created a job flow can view and manage it.
 svtauVisibleToAllUsers :: Lens' SetVisibleToAllUsers Bool
-svtauVisibleToAllUsers =
-    lens _svtauVisibleToAllUsers (\s a -> s { _svtauVisibleToAllUsers = a })
+svtauVisibleToAllUsers = lens _svtauVisibleToAllUsers (\ s a -> s{_svtauVisibleToAllUsers = a});
 
-data SetVisibleToAllUsersResponse = SetVisibleToAllUsersResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest SetVisibleToAllUsers where
+        type Sv SetVisibleToAllUsers = EMR
+        type Rs SetVisibleToAllUsers =
+             SetVisibleToAllUsersResponse
+        request = postJSON
+        response = receiveNull SetVisibleToAllUsersResponse'
 
--- | 'SetVisibleToAllUsersResponse' constructor.
-setVisibleToAllUsersResponse :: SetVisibleToAllUsersResponse
-setVisibleToAllUsersResponse = SetVisibleToAllUsersResponse
+instance ToHeaders SetVisibleToAllUsers where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.SetVisibleToAllUsers" ::
+                       ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON SetVisibleToAllUsers where
+        toJSON SetVisibleToAllUsers'{..}
+          = object
+              ["JobFlowIds" .= _svtauJobFlowIds,
+               "VisibleToAllUsers" .= _svtauVisibleToAllUsers]
+
 instance ToPath SetVisibleToAllUsers where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery SetVisibleToAllUsers where
-    toQuery = const mempty
-
-instance ToHeaders SetVisibleToAllUsers
-
-instance ToJSON SetVisibleToAllUsers where
-    toJSON SetVisibleToAllUsers{..} = object
-        [ "JobFlowIds"        .= _svtauJobFlowIds
-        , "VisibleToAllUsers" .= _svtauVisibleToAllUsers
-        ]
+        toQuery = const mempty
 
-instance AWSRequest SetVisibleToAllUsers where
-    type Sv SetVisibleToAllUsers = EMR
-    type Rs SetVisibleToAllUsers = SetVisibleToAllUsersResponse
+-- | /See:/ 'setVisibleToAllUsersResponse' smart constructor.
+data SetVisibleToAllUsersResponse =
+    SetVisibleToAllUsersResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "SetVisibleToAllUsers"
-    response = nullResponse SetVisibleToAllUsersResponse
+-- | Creates a value of 'SetVisibleToAllUsersResponse' with the minimum fields required to make a request.
+--
+setVisibleToAllUsersResponse
+    :: SetVisibleToAllUsersResponse
+setVisibleToAllUsersResponse = SetVisibleToAllUsersResponse'
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
@@ -1,108 +1,109 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
+{-# 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.EMR.TerminateJobFlows
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- | TerminateJobFlows shuts a list of job flows down. When a job flow is shut
--- down, any step not yet completed is canceled and the EC2 instances on which
--- the job flow is running are stopped. Any log files not already saved are
--- uploaded to Amazon S3 if a LogUri was specified when the job flow was
--- created.
+-- TerminateJobFlows shuts a list of job flows down. When a job flow is
+-- shut down, any step not yet completed is canceled and the EC2 instances
+-- on which the job flow is running are stopped. Any log files not already
+-- saved are uploaded to Amazon S3 if a LogUri was specified when the job
+-- flow was created.
 --
--- The maximum number of JobFlows allowed is 10. The call to 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.
+-- The maximum number of JobFlows allowed is 10. The call to
+-- 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.
 --
--- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_TerminateJobFlows.html>
+-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_TerminateJobFlows.html AWS API Reference> for TerminateJobFlows.
 module Network.AWS.EMR.TerminateJobFlows
     (
-    -- * Request
-      TerminateJobFlows
-    -- ** Request constructor
-    , terminateJobFlows
-    -- ** Request lenses
+    -- * Creating a Request
+      terminateJobFlows
+    , TerminateJobFlows
+    -- * Request Lenses
     , tjfJobFlowIds
 
-    -- * Response
-    , TerminateJobFlowsResponse
-    -- ** Response constructor
+    -- * Destructuring the Response
     , terminateJobFlowsResponse
+    , TerminateJobFlowsResponse
     ) where
 
-import Network.AWS.Data (Object)
-import Network.AWS.Prelude
-import Network.AWS.Request.JSON
-import Network.AWS.EMR.Types
-import qualified GHC.Exts
-
-newtype TerminateJobFlows = TerminateJobFlows
-    { _tjfJobFlowIds :: List "JobFlowIds" Text
-    } deriving (Eq, Ord, Read, Show, Monoid, Semigroup)
-
-instance GHC.Exts.IsList TerminateJobFlows where
-    type Item TerminateJobFlows = Text
-
-    fromList = TerminateJobFlows . GHC.Exts.fromList
-    toList   = GHC.Exts.toList . _tjfJobFlowIds
+import           Network.AWS.EMR.Types
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
 
--- | 'TerminateJobFlows' constructor.
+-- | Input to the TerminateJobFlows operation.
 --
--- The fields accessible through corresponding lenses are:
+-- /See:/ 'terminateJobFlows' smart constructor.
+newtype TerminateJobFlows = TerminateJobFlows'
+    { _tjfJobFlowIds :: [Text]
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'TerminateJobFlows' with the minimum fields required to make a request.
 --
--- * 'tjfJobFlowIds' @::@ ['Text']
+-- Use one of the following lenses to modify other fields as desired:
 --
-terminateJobFlows :: TerminateJobFlows
-terminateJobFlows = TerminateJobFlows
+-- * 'tjfJobFlowIds'
+terminateJobFlows
+    :: TerminateJobFlows
+terminateJobFlows =
+    TerminateJobFlows'
     { _tjfJobFlowIds = mempty
     }
 
 -- | A list of job flows to be shutdown.
 tjfJobFlowIds :: Lens' TerminateJobFlows [Text]
-tjfJobFlowIds = lens _tjfJobFlowIds (\s a -> s { _tjfJobFlowIds = a }) . _List
+tjfJobFlowIds = lens _tjfJobFlowIds (\ s a -> s{_tjfJobFlowIds = a}) . _Coerce;
 
-data TerminateJobFlowsResponse = TerminateJobFlowsResponse
-    deriving (Eq, Ord, Read, Show, Generic)
+instance AWSRequest TerminateJobFlows where
+        type Sv TerminateJobFlows = EMR
+        type Rs TerminateJobFlows = TerminateJobFlowsResponse
+        request = postJSON
+        response = receiveNull TerminateJobFlowsResponse'
 
--- | 'TerminateJobFlowsResponse' constructor.
-terminateJobFlowsResponse :: TerminateJobFlowsResponse
-terminateJobFlowsResponse = TerminateJobFlowsResponse
+instance ToHeaders TerminateJobFlows where
+        toHeaders
+          = const
+              (mconcat
+                 ["X-Amz-Target" =#
+                    ("ElasticMapReduce.TerminateJobFlows" :: ByteString),
+                  "Content-Type" =#
+                    ("application/x-amz-json-1.1" :: ByteString)])
 
+instance ToJSON TerminateJobFlows where
+        toJSON TerminateJobFlows'{..}
+          = object ["JobFlowIds" .= _tjfJobFlowIds]
+
 instance ToPath TerminateJobFlows where
-    toPath = const "/"
+        toPath = const "/"
 
 instance ToQuery TerminateJobFlows where
-    toQuery = const mempty
-
-instance ToHeaders TerminateJobFlows
-
-instance ToJSON TerminateJobFlows where
-    toJSON TerminateJobFlows{..} = object
-        [ "JobFlowIds" .= _tjfJobFlowIds
-        ]
+        toQuery = const mempty
 
-instance AWSRequest TerminateJobFlows where
-    type Sv TerminateJobFlows = EMR
-    type Rs TerminateJobFlows = TerminateJobFlowsResponse
+-- | /See:/ 'terminateJobFlowsResponse' smart constructor.
+data TerminateJobFlowsResponse =
+    TerminateJobFlowsResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
 
-    request  = post "TerminateJobFlows"
-    response = nullResponse TerminateJobFlowsResponse
+-- | Creates a value of 'TerminateJobFlowsResponse' with the minimum fields required to make a request.
+--
+terminateJobFlowsResponse
+    :: TerminateJobFlowsResponse
+terminateJobFlowsResponse = TerminateJobFlowsResponse'
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
@@ -1,3863 +1,393 @@
-{-# LANGUAGE DataKinds                   #-}
-{-# LANGUAGE DeriveGeneric               #-}
-{-# LANGUAGE FlexibleInstances           #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
-{-# LANGUAGE LambdaCase                  #-}
-{-# LANGUAGE NoImplicitPrelude           #-}
-{-# LANGUAGE OverloadedStrings           #-}
-{-# LANGUAGE RecordWildCards             #-}
-{-# LANGUAGE TypeFamilies                #-}
-{-# LANGUAGE ViewPatterns                #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Module      : Network.AWS.EMR.Types
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
---
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
-module Network.AWS.EMR.Types
-    (
-    -- * Service
-      EMR
-    -- ** Error
-    , JSONError
-
-    -- * MarketType
-    , MarketType (..)
-
-    -- * InstanceGroupConfig
-    , InstanceGroupConfig
-    , instanceGroupConfig
-    , igcBidPrice
-    , igcInstanceCount
-    , igcInstanceRole
-    , igcInstanceType
-    , igcMarket
-    , igcName
-
-    -- * InstanceStateChangeReason
-    , InstanceStateChangeReason
-    , instanceStateChangeReason
-    , iscrCode
-    , iscrMessage
-
-    -- * JobFlowDetail
-    , JobFlowDetail
-    , jobFlowDetail
-    , jfdAmiVersion
-    , jfdBootstrapActions
-    , jfdExecutionStatusDetail
-    , jfdInstances
-    , jfdJobFlowId
-    , jfdJobFlowRole
-    , jfdLogUri
-    , jfdName
-    , jfdServiceRole
-    , jfdSteps
-    , jfdSupportedProducts
-    , jfdVisibleToAllUsers
-
-    -- * KeyValue
-    , KeyValue
-    , keyValue
-    , kvKey
-    , kvValue
-
-    -- * SupportedProductConfig
-    , SupportedProductConfig
-    , supportedProductConfig
-    , spcArgs
-    , spcName
-
-    -- * Command
-    , Command
-    , command
-    , cArgs
-    , cName
-    , cScriptPath
-
-    -- * StepExecutionState
-    , StepExecutionState (..)
-
-    -- * ActionOnFailure
-    , ActionOnFailure (..)
-
-    -- * ClusterStateChangeReason
-    , ClusterStateChangeReason
-    , clusterStateChangeReason
-    , cscrCode
-    , cscrMessage
-
-    -- * Tag
-    , Tag
-    , tag
-    , tagKey
-    , tagValue
-
-    -- * Application
-    , Application
-    , application
-    , aAdditionalInfo
-    , aArgs
-    , aName
-    , aVersion
-
-    -- * JobFlowExecutionStatusDetail
-    , JobFlowExecutionStatusDetail
-    , jobFlowExecutionStatusDetail
-    , jfesdCreationDateTime
-    , jfesdEndDateTime
-    , jfesdLastStateChangeReason
-    , jfesdReadyDateTime
-    , jfesdStartDateTime
-    , jfesdState
-
-    -- * InstanceGroupStatus
-    , InstanceGroupStatus
-    , instanceGroupStatus
-    , igsState
-    , igsStateChangeReason
-    , igsTimeline
-
-    -- * Cluster
-    , Cluster
-    , cluster
-    , c1Applications
-    , c1AutoTerminate
-    , c1Ec2InstanceAttributes
-    , c1Id
-    , c1LogUri
-    , c1MasterPublicDnsName
-    , c1Name
-    , c1NormalizedInstanceHours
-    , c1RequestedAmiVersion
-    , c1RunningAmiVersion
-    , c1ServiceRole
-    , c1Status
-    , c1Tags
-    , c1TerminationProtected
-    , c1VisibleToAllUsers
-
-    -- * InstanceTimeline
-    , InstanceTimeline
-    , instanceTimeline
-    , itCreationDateTime
-    , itEndDateTime
-    , itReadyDateTime
-
-    -- * Ec2InstanceAttributes
-    , Ec2InstanceAttributes
-    , ec2InstanceAttributes
-    , eiaAdditionalMasterSecurityGroups
-    , eiaAdditionalSlaveSecurityGroups
-    , eiaEc2AvailabilityZone
-    , eiaEc2KeyName
-    , eiaEc2SubnetId
-    , eiaEmrManagedMasterSecurityGroup
-    , eiaEmrManagedSlaveSecurityGroup
-    , eiaIamInstanceProfile
-
-    -- * StepStateChangeReasonCode
-    , StepStateChangeReasonCode (..)
-
-    -- * ClusterState
-    , ClusterState (..)
-
-    -- * HadoopStepConfig
-    , HadoopStepConfig
-    , hadoopStepConfig
-    , hscArgs
-    , hscJar
-    , hscMainClass
-    , hscProperties
-
-    -- * JobFlowExecutionState
-    , JobFlowExecutionState (..)
-
-    -- * StepDetail
-    , StepDetail
-    , stepDetail
-    , sdExecutionStatusDetail
-    , sdStepConfig
-
-    -- * InstanceGroupStateChangeReason
-    , InstanceGroupStateChangeReason
-    , instanceGroupStateChangeReason
-    , igscrCode
-    , igscrMessage
-
-    -- * InstanceGroupType
-    , InstanceGroupType (..)
-
-    -- * InstanceGroupStateChangeReasonCode
-    , InstanceGroupStateChangeReasonCode (..)
-
-    -- * StepStatus
-    , StepStatus
-    , stepStatus
-    , ssState
-    , ssStateChangeReason
-    , ssTimeline
-
-    -- * StepSummary
-    , StepSummary
-    , stepSummary
-    , ssActionOnFailure
-    , ssConfig
-    , ssId
-    , ssName
-    , ssStatus
-
-    -- * InstanceGroupState
-    , InstanceGroupState (..)
-
-    -- * StepTimeline
-    , StepTimeline
-    , stepTimeline
-    , stCreationDateTime
-    , stEndDateTime
-    , stStartDateTime
-
-    -- * PlacementType
-    , PlacementType
-    , placementType
-    , ptAvailabilityZone
-
-    -- * HadoopJarStepConfig
-    , HadoopJarStepConfig
-    , hadoopJarStepConfig
-    , hjscArgs
-    , hjscJar
-    , hjscMainClass
-    , hjscProperties
-
-    -- * InstanceGroupModifyConfig
-    , InstanceGroupModifyConfig
-    , instanceGroupModifyConfig
-    , igmcEC2InstanceIdsToTerminate
-    , igmcInstanceCount
-    , igmcInstanceGroupId
-
-    -- * InstanceGroupDetail
-    , InstanceGroupDetail
-    , instanceGroupDetail
-    , igdBidPrice
-    , igdCreationDateTime
-    , igdEndDateTime
-    , igdInstanceGroupId
-    , igdInstanceRequestCount
-    , igdInstanceRole
-    , igdInstanceRunningCount
-    , igdInstanceType
-    , igdLastStateChangeReason
-    , igdMarket
-    , igdName
-    , igdReadyDateTime
-    , igdStartDateTime
-    , igdState
-
-    -- * StepStateChangeReason
-    , StepStateChangeReason
-    , stepStateChangeReason
-    , sscrCode
-    , sscrMessage
-
-    -- * ClusterStateChangeReasonCode
-    , ClusterStateChangeReasonCode (..)
-
-    -- * Step
-    , Step
-    , step
-    , sActionOnFailure
-    , sConfig
-    , sId
-    , sName
-    , sStatus
-
-    -- * StepState
-    , StepState (..)
-
-    -- * InstanceGroupTimeline
-    , InstanceGroupTimeline
-    , instanceGroupTimeline
-    , igtCreationDateTime
-    , igtEndDateTime
-    , igtReadyDateTime
-
-    -- * BootstrapActionDetail
-    , BootstrapActionDetail
-    , bootstrapActionDetail
-    , badBootstrapActionConfig
-
-    -- * StepExecutionStatusDetail
-    , StepExecutionStatusDetail
-    , stepExecutionStatusDetail
-    , sesdCreationDateTime
-    , sesdEndDateTime
-    , sesdLastStateChangeReason
-    , sesdStartDateTime
-    , sesdState
-
-    -- * InstanceStatus
-    , InstanceStatus
-    , instanceStatus
-    , isState
-    , isStateChangeReason
-    , isTimeline
-
-    -- * InstanceRoleType
-    , InstanceRoleType (..)
-
-    -- * JobFlowInstancesConfig
-    , JobFlowInstancesConfig
-    , jobFlowInstancesConfig
-    , jficAdditionalMasterSecurityGroups
-    , jficAdditionalSlaveSecurityGroups
-    , jficEc2KeyName
-    , jficEc2SubnetId
-    , jficEmrManagedMasterSecurityGroup
-    , jficEmrManagedSlaveSecurityGroup
-    , jficHadoopVersion
-    , jficInstanceCount
-    , jficInstanceGroups
-    , jficKeepJobFlowAliveWhenNoSteps
-    , jficMasterInstanceType
-    , jficPlacement
-    , jficSlaveInstanceType
-    , jficTerminationProtected
-
-    -- * StepConfig
-    , StepConfig
-    , stepConfig
-    , scActionOnFailure
-    , scHadoopJarStep
-    , scName
-
-    -- * InstanceGroup
-    , InstanceGroup
-    , instanceGroup
-    , igBidPrice
-    , igId
-    , igInstanceGroupType
-    , igInstanceType
-    , igMarket
-    , igName
-    , igRequestedInstanceCount
-    , igRunningInstanceCount
-    , igStatus
-
-    -- * BootstrapActionConfig
-    , BootstrapActionConfig
-    , bootstrapActionConfig
-    , bacName
-    , bacScriptBootstrapAction
-
-    -- * ClusterSummary
-    , ClusterSummary
-    , clusterSummary
-    , csId
-    , csName
-    , csNormalizedInstanceHours
-    , csStatus
-
-    -- * JobFlowInstancesDetail
-    , JobFlowInstancesDetail
-    , jobFlowInstancesDetail
-    , jfidEc2KeyName
-    , jfidEc2SubnetId
-    , jfidHadoopVersion
-    , jfidInstanceCount
-    , jfidInstanceGroups
-    , jfidKeepJobFlowAliveWhenNoSteps
-    , jfidMasterInstanceId
-    , jfidMasterInstanceType
-    , jfidMasterPublicDnsName
-    , jfidNormalizedInstanceHours
-    , jfidPlacement
-    , jfidSlaveInstanceType
-    , jfidTerminationProtected
-
-    -- * ClusterStatus
-    , ClusterStatus
-    , clusterStatus
-    , csState
-    , csStateChangeReason
-    , csTimeline
-
-    -- * InstanceState
-    , InstanceState (..)
-
-    -- * ClusterTimeline
-    , ClusterTimeline
-    , clusterTimeline
-    , ctCreationDateTime
-    , ctEndDateTime
-    , ctReadyDateTime
-
-    -- * InstanceStateChangeReasonCode
-    , InstanceStateChangeReasonCode (..)
-
-    -- * Instance
-    , Instance
-    , instance'
-    , iEc2InstanceId
-    , iId
-    , iPrivateDnsName
-    , iPrivateIpAddress
-    , iPublicDnsName
-    , iPublicIpAddress
-    , iStatus
-
-    -- * ScriptBootstrapActionConfig
-    , ScriptBootstrapActionConfig
-    , scriptBootstrapActionConfig
-    , sbacArgs
-    , sbacPath
-    ) where
-
-import Network.AWS.Prelude
-import Network.AWS.Signing
-import qualified GHC.Exts
-
--- | Version @2009-03-31@ of the Amazon Elastic MapReduce service.
-data EMR
-
-instance AWSService EMR where
-    type Sg EMR = V4
-    type Er EMR = JSONError
-
-    service = service'
-      where
-        service' :: Service EMR
-        service' = Service
-            { _svcAbbrev       = "EMR"
-            , _svcPrefix       = "elasticmapreduce"
-            , _svcVersion      = "2009-03-31"
-            , _svcTargetPrefix = Just "ElasticMapReduce"
-            , _svcJSONVersion  = Just "1.1"
-            , _svcHandle       = handle
-            , _svcRetry        = retry
-            }
-
-        handle :: Status
-               -> Maybe (LazyByteString -> ServiceError JSONError)
-        handle = jsonError statusSuccess service'
-
-        retry :: Retry EMR
-        retry = Exponential
-            { _retryBase     = 0.05
-            , _retryGrowth   = 2
-            , _retryAttempts = 5
-            , _retryCheck    = check
-            }
-
-        check :: Status
-              -> JSONError
-              -> Bool
-        check (statusCode -> s) (awsErrorCode -> e)
-            | s == 400 && (Just "ThrottlingException") == e = True -- Throttling
-            | s == 500  = True -- General Server Error
-            | s == 509  = True -- Limit Exceeded
-            | s == 503  = True -- Service Unavailable
-            | otherwise = False
-
-data MarketType
-    = OnDemand -- ^ ON_DEMAND
-    | Spot     -- ^ SPOT
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable MarketType
-
-instance FromText MarketType where
-    parser = takeLowerText >>= \case
-        "on_demand" -> pure OnDemand
-        "spot"      -> pure Spot
-        e           -> fail $
-            "Failure parsing MarketType from " ++ show e
-
-instance ToText MarketType where
-    toText = \case
-        OnDemand -> "ON_DEMAND"
-        Spot     -> "SPOT"
-
-instance ToByteString MarketType
-instance ToHeader     MarketType
-instance ToQuery      MarketType
-
-instance FromJSON MarketType where
-    parseJSON = parseJSONText "MarketType"
-
-instance ToJSON MarketType where
-    toJSON = toJSONText
-
-data InstanceGroupConfig = InstanceGroupConfig
-    { _igcBidPrice      :: Maybe Text
-    , _igcInstanceCount :: Int
-    , _igcInstanceRole  :: InstanceRoleType
-    , _igcInstanceType  :: Text
-    , _igcMarket        :: Maybe MarketType
-    , _igcName          :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceGroupConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igcBidPrice' @::@ 'Maybe' 'Text'
---
--- * 'igcInstanceCount' @::@ 'Int'
---
--- * 'igcInstanceRole' @::@ 'InstanceRoleType'
---
--- * 'igcInstanceType' @::@ 'Text'
---
--- * 'igcMarket' @::@ 'Maybe' 'MarketType'
---
--- * 'igcName' @::@ 'Maybe' 'Text'
---
-instanceGroupConfig :: InstanceRoleType -- ^ 'igcInstanceRole'
-                    -> Text -- ^ 'igcInstanceType'
-                    -> Int -- ^ 'igcInstanceCount'
-                    -> InstanceGroupConfig
-instanceGroupConfig p1 p2 p3 = InstanceGroupConfig
-    { _igcInstanceRole  = p1
-    , _igcInstanceType  = p2
-    , _igcInstanceCount = p3
-    , _igcName          = Nothing
-    , _igcMarket        = Nothing
-    , _igcBidPrice      = Nothing
-    }
-
--- | 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)
-igcBidPrice = lens _igcBidPrice (\s a -> s { _igcBidPrice = a })
-
--- | Target number of instances for the instance group.
-igcInstanceCount :: Lens' InstanceGroupConfig Int
-igcInstanceCount = lens _igcInstanceCount (\s a -> s { _igcInstanceCount = a })
-
--- | The role of the instance group in the cluster.
-igcInstanceRole :: Lens' InstanceGroupConfig InstanceRoleType
-igcInstanceRole = lens _igcInstanceRole (\s a -> s { _igcInstanceRole = a })
-
--- | The Amazon EC2 instance type for all instances in the instance group.
-igcInstanceType :: Lens' InstanceGroupConfig Text
-igcInstanceType = lens _igcInstanceType (\s a -> s { _igcInstanceType = a })
-
--- | Market type of the Amazon EC2 instances used to create a cluster node.
-igcMarket :: Lens' InstanceGroupConfig (Maybe MarketType)
-igcMarket = lens _igcMarket (\s a -> s { _igcMarket = a })
-
--- | Friendly name given to the instance group.
-igcName :: Lens' InstanceGroupConfig (Maybe Text)
-igcName = lens _igcName (\s a -> s { _igcName = a })
-
-instance FromJSON InstanceGroupConfig where
-    parseJSON = withObject "InstanceGroupConfig" $ \o -> InstanceGroupConfig
-        <$> o .:? "BidPrice"
-        <*> o .:  "InstanceCount"
-        <*> o .:  "InstanceRole"
-        <*> o .:  "InstanceType"
-        <*> o .:? "Market"
-        <*> o .:? "Name"
-
-instance ToJSON InstanceGroupConfig where
-    toJSON InstanceGroupConfig{..} = object
-        [ "Name"          .= _igcName
-        , "Market"        .= _igcMarket
-        , "InstanceRole"  .= _igcInstanceRole
-        , "BidPrice"      .= _igcBidPrice
-        , "InstanceType"  .= _igcInstanceType
-        , "InstanceCount" .= _igcInstanceCount
-        ]
-
-data InstanceStateChangeReason = InstanceStateChangeReason
-    { _iscrCode    :: Maybe InstanceStateChangeReasonCode
-    , _iscrMessage :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceStateChangeReason' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'iscrCode' @::@ 'Maybe' 'InstanceStateChangeReasonCode'
---
--- * 'iscrMessage' @::@ 'Maybe' 'Text'
---
-instanceStateChangeReason :: InstanceStateChangeReason
-instanceStateChangeReason = InstanceStateChangeReason
-    { _iscrCode    = Nothing
-    , _iscrMessage = Nothing
-    }
-
--- | The programmable code for the state change reason.
-iscrCode :: Lens' InstanceStateChangeReason (Maybe InstanceStateChangeReasonCode)
-iscrCode = lens _iscrCode (\s a -> s { _iscrCode = a })
-
--- | The status change reason description.
-iscrMessage :: Lens' InstanceStateChangeReason (Maybe Text)
-iscrMessage = lens _iscrMessage (\s a -> s { _iscrMessage = a })
-
-instance FromJSON InstanceStateChangeReason where
-    parseJSON = withObject "InstanceStateChangeReason" $ \o -> InstanceStateChangeReason
-        <$> o .:? "Code"
-        <*> o .:? "Message"
-
-instance ToJSON InstanceStateChangeReason where
-    toJSON InstanceStateChangeReason{..} = object
-        [ "Code"    .= _iscrCode
-        , "Message" .= _iscrMessage
-        ]
-
-data JobFlowDetail = JobFlowDetail
-    { _jfdAmiVersion            :: Maybe Text
-    , _jfdBootstrapActions      :: List "BootstrapActions" BootstrapActionDetail
-    , _jfdExecutionStatusDetail :: JobFlowExecutionStatusDetail
-    , _jfdInstances             :: JobFlowInstancesDetail
-    , _jfdJobFlowId             :: Text
-    , _jfdJobFlowRole           :: Maybe Text
-    , _jfdLogUri                :: Maybe Text
-    , _jfdName                  :: Text
-    , _jfdServiceRole           :: Maybe Text
-    , _jfdSteps                 :: List "Steps" StepDetail
-    , _jfdSupportedProducts     :: List "SupportedProducts" Text
-    , _jfdVisibleToAllUsers     :: Maybe Bool
-    } deriving (Eq, Read, Show)
-
--- | 'JobFlowDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'jfdAmiVersion' @::@ 'Maybe' 'Text'
---
--- * 'jfdBootstrapActions' @::@ ['BootstrapActionDetail']
---
--- * 'jfdExecutionStatusDetail' @::@ 'JobFlowExecutionStatusDetail'
---
--- * 'jfdInstances' @::@ 'JobFlowInstancesDetail'
---
--- * 'jfdJobFlowId' @::@ 'Text'
---
--- * 'jfdJobFlowRole' @::@ 'Maybe' 'Text'
---
--- * 'jfdLogUri' @::@ 'Maybe' 'Text'
---
--- * 'jfdName' @::@ 'Text'
---
--- * 'jfdServiceRole' @::@ 'Maybe' 'Text'
---
--- * 'jfdSteps' @::@ ['StepDetail']
---
--- * 'jfdSupportedProducts' @::@ ['Text']
---
--- * 'jfdVisibleToAllUsers' @::@ 'Maybe' 'Bool'
---
-jobFlowDetail :: Text -- ^ 'jfdJobFlowId'
-              -> Text -- ^ 'jfdName'
-              -> JobFlowExecutionStatusDetail -- ^ 'jfdExecutionStatusDetail'
-              -> JobFlowInstancesDetail -- ^ 'jfdInstances'
-              -> JobFlowDetail
-jobFlowDetail p1 p2 p3 p4 = JobFlowDetail
-    { _jfdJobFlowId             = p1
-    , _jfdName                  = p2
-    , _jfdExecutionStatusDetail = p3
-    , _jfdInstances             = p4
-    , _jfdLogUri                = Nothing
-    , _jfdAmiVersion            = Nothing
-    , _jfdSteps                 = mempty
-    , _jfdBootstrapActions      = mempty
-    , _jfdSupportedProducts     = mempty
-    , _jfdVisibleToAllUsers     = Nothing
-    , _jfdJobFlowRole           = Nothing
-    , _jfdServiceRole           = Nothing
-    }
-
--- | The version of the AMI used to initialize Amazon EC2 instances in the job
--- flow. For a list of AMI versions currently supported by Amazon
--- ElasticMapReduce, go to <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EnvironmentConfig_AMIVersion.html#ami-versions-supported AMI Versions Supported in Elastic MapReduce> in the /Amazon Elastic MapReduce Developer's Guide./
-jfdAmiVersion :: Lens' JobFlowDetail (Maybe Text)
-jfdAmiVersion = lens _jfdAmiVersion (\s a -> s { _jfdAmiVersion = a })
-
--- | A list of the bootstrap actions run by the job flow.
-jfdBootstrapActions :: Lens' JobFlowDetail [BootstrapActionDetail]
-jfdBootstrapActions =
-    lens _jfdBootstrapActions (\s a -> s { _jfdBootstrapActions = a })
-        . _List
-
--- | Describes the execution status of the job flow.
-jfdExecutionStatusDetail :: Lens' JobFlowDetail JobFlowExecutionStatusDetail
-jfdExecutionStatusDetail =
-    lens _jfdExecutionStatusDetail
-        (\s a -> s { _jfdExecutionStatusDetail = a })
-
--- | Describes the Amazon EC2 instances of the job flow.
-jfdInstances :: Lens' JobFlowDetail JobFlowInstancesDetail
-jfdInstances = lens _jfdInstances (\s a -> s { _jfdInstances = a })
-
--- | The job flow identifier.
-jfdJobFlowId :: Lens' JobFlowDetail Text
-jfdJobFlowId = lens _jfdJobFlowId (\s a -> s { _jfdJobFlowId = a })
-
--- | The IAM role that was specified when the job flow was launched. The EC2
--- instances of the job flow assume this role.
-jfdJobFlowRole :: Lens' JobFlowDetail (Maybe Text)
-jfdJobFlowRole = lens _jfdJobFlowRole (\s a -> s { _jfdJobFlowRole = a })
-
--- | The location in Amazon S3 where log files for the job are stored.
-jfdLogUri :: Lens' JobFlowDetail (Maybe Text)
-jfdLogUri = lens _jfdLogUri (\s a -> s { _jfdLogUri = a })
-
--- | The name of the job flow.
-jfdName :: Lens' JobFlowDetail Text
-jfdName = lens _jfdName (\s a -> s { _jfdName = a })
-
--- | The IAM role that will be assumed by the Amazon EMR service to access AWS
--- resources on your behalf.
-jfdServiceRole :: Lens' JobFlowDetail (Maybe Text)
-jfdServiceRole = lens _jfdServiceRole (\s a -> s { _jfdServiceRole = a })
-
--- | A list of steps run by the job flow.
-jfdSteps :: Lens' JobFlowDetail [StepDetail]
-jfdSteps = lens _jfdSteps (\s a -> s { _jfdSteps = a }) . _List
-
--- | A list of strings set by third party software when the job flow is launched.
--- If you are not using third party software to manage the job flow this value
--- is empty.
-jfdSupportedProducts :: Lens' JobFlowDetail [Text]
-jfdSupportedProducts =
-    lens _jfdSupportedProducts (\s a -> s { _jfdSupportedProducts = a })
-        . _List
-
--- | Specifies whether the job flow is visible to all IAM users of the AWS account
--- associated with the job flow. If this value is set to 'true', all IAM users of
--- that AWS account can view and (if they have the proper policy permissions
--- set) manage the job flow. If it is set to 'false', only the IAM user that
--- created the job flow can view and manage it. This value can be changed using
--- the 'SetVisibleToAllUsers' action.
-jfdVisibleToAllUsers :: Lens' JobFlowDetail (Maybe Bool)
-jfdVisibleToAllUsers =
-    lens _jfdVisibleToAllUsers (\s a -> s { _jfdVisibleToAllUsers = a })
-
-instance FromJSON JobFlowDetail where
-    parseJSON = withObject "JobFlowDetail" $ \o -> JobFlowDetail
-        <$> o .:? "AmiVersion"
-        <*> o .:? "BootstrapActions" .!= mempty
-        <*> o .:  "ExecutionStatusDetail"
-        <*> o .:  "Instances"
-        <*> o .:  "JobFlowId"
-        <*> o .:? "JobFlowRole"
-        <*> o .:? "LogUri"
-        <*> o .:  "Name"
-        <*> o .:? "ServiceRole"
-        <*> o .:? "Steps" .!= mempty
-        <*> o .:? "SupportedProducts" .!= mempty
-        <*> o .:? "VisibleToAllUsers"
-
-instance ToJSON JobFlowDetail where
-    toJSON JobFlowDetail{..} = object
-        [ "JobFlowId"             .= _jfdJobFlowId
-        , "Name"                  .= _jfdName
-        , "LogUri"                .= _jfdLogUri
-        , "AmiVersion"            .= _jfdAmiVersion
-        , "ExecutionStatusDetail" .= _jfdExecutionStatusDetail
-        , "Instances"             .= _jfdInstances
-        , "Steps"                 .= _jfdSteps
-        , "BootstrapActions"      .= _jfdBootstrapActions
-        , "SupportedProducts"     .= _jfdSupportedProducts
-        , "VisibleToAllUsers"     .= _jfdVisibleToAllUsers
-        , "JobFlowRole"           .= _jfdJobFlowRole
-        , "ServiceRole"           .= _jfdServiceRole
-        ]
-
-data KeyValue = KeyValue
-    { _kvKey   :: Maybe Text
-    , _kvValue :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'KeyValue' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'kvKey' @::@ 'Maybe' 'Text'
---
--- * 'kvValue' @::@ 'Maybe' 'Text'
---
-keyValue :: KeyValue
-keyValue = KeyValue
-    { _kvKey   = Nothing
-    , _kvValue = Nothing
-    }
-
--- | The unique identifier of a key value pair.
-kvKey :: Lens' KeyValue (Maybe Text)
-kvKey = lens _kvKey (\s a -> s { _kvKey = a })
-
--- | The value part of the identified key.
-kvValue :: Lens' KeyValue (Maybe Text)
-kvValue = lens _kvValue (\s a -> s { _kvValue = a })
-
-instance FromJSON KeyValue where
-    parseJSON = withObject "KeyValue" $ \o -> KeyValue
-        <$> o .:? "Key"
-        <*> o .:? "Value"
-
-instance ToJSON KeyValue where
-    toJSON KeyValue{..} = object
-        [ "Key"   .= _kvKey
-        , "Value" .= _kvValue
-        ]
-
-data SupportedProductConfig = SupportedProductConfig
-    { _spcArgs :: List "Args" Text
-    , _spcName :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'SupportedProductConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'spcArgs' @::@ ['Text']
---
--- * 'spcName' @::@ 'Maybe' 'Text'
---
-supportedProductConfig :: SupportedProductConfig
-supportedProductConfig = SupportedProductConfig
-    { _spcName = Nothing
-    , _spcArgs = mempty
-    }
-
--- | The list of user-supplied arguments.
-spcArgs :: Lens' SupportedProductConfig [Text]
-spcArgs = lens _spcArgs (\s a -> s { _spcArgs = a }) . _List
-
--- | The name of the product configuration.
-spcName :: Lens' SupportedProductConfig (Maybe Text)
-spcName = lens _spcName (\s a -> s { _spcName = a })
-
-instance FromJSON SupportedProductConfig where
-    parseJSON = withObject "SupportedProductConfig" $ \o -> SupportedProductConfig
-        <$> o .:? "Args" .!= mempty
-        <*> o .:? "Name"
-
-instance ToJSON SupportedProductConfig where
-    toJSON SupportedProductConfig{..} = object
-        [ "Name" .= _spcName
-        , "Args" .= _spcArgs
-        ]
-
-data Command = Command
-    { _cArgs       :: List "Args" Text
-    , _cName       :: Maybe Text
-    , _cScriptPath :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'Command' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cArgs' @::@ ['Text']
---
--- * 'cName' @::@ 'Maybe' 'Text'
---
--- * 'cScriptPath' @::@ 'Maybe' 'Text'
---
-command :: Command
-command = Command
-    { _cName       = Nothing
-    , _cScriptPath = Nothing
-    , _cArgs       = mempty
-    }
-
--- | Arguments for Amazon EMR to pass to the command for execution.
-cArgs :: Lens' Command [Text]
-cArgs = lens _cArgs (\s a -> s { _cArgs = a }) . _List
-
--- | The name of the command.
-cName :: Lens' Command (Maybe Text)
-cName = lens _cName (\s a -> s { _cName = a })
-
--- | The Amazon S3 location of the command script.
-cScriptPath :: Lens' Command (Maybe Text)
-cScriptPath = lens _cScriptPath (\s a -> s { _cScriptPath = a })
-
-instance FromJSON Command where
-    parseJSON = withObject "Command" $ \o -> Command
-        <$> o .:? "Args" .!= mempty
-        <*> o .:? "Name"
-        <*> o .:? "ScriptPath"
-
-instance ToJSON Command where
-    toJSON Command{..} = object
-        [ "Name"       .= _cName
-        , "ScriptPath" .= _cScriptPath
-        , "Args"       .= _cArgs
-        ]
-
-data StepExecutionState
-    = Cancelled   -- ^ CANCELLED
-    | Completed   -- ^ COMPLETED
-    | Continue    -- ^ CONTINUE
-    | Failed      -- ^ FAILED
-    | Interrupted -- ^ INTERRUPTED
-    | Pending     -- ^ PENDING
-    | Running     -- ^ RUNNING
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable StepExecutionState
-
-instance FromText StepExecutionState where
-    parser = takeLowerText >>= \case
-        "cancelled"   -> pure Cancelled
-        "completed"   -> pure Completed
-        "continue"    -> pure Continue
-        "failed"      -> pure Failed
-        "interrupted" -> pure Interrupted
-        "pending"     -> pure Pending
-        "running"     -> pure Running
-        e             -> fail $
-            "Failure parsing StepExecutionState from " ++ show e
-
-instance ToText StepExecutionState where
-    toText = \case
-        Cancelled   -> "CANCELLED"
-        Completed   -> "COMPLETED"
-        Continue    -> "CONTINUE"
-        Failed      -> "FAILED"
-        Interrupted -> "INTERRUPTED"
-        Pending     -> "PENDING"
-        Running     -> "RUNNING"
-
-instance ToByteString StepExecutionState
-instance ToHeader     StepExecutionState
-instance ToQuery      StepExecutionState
-
-instance FromJSON StepExecutionState where
-    parseJSON = parseJSONText "StepExecutionState"
-
-instance ToJSON StepExecutionState where
-    toJSON = toJSONText
-
-data ActionOnFailure
-    = AOFCancelAndWait    -- ^ CANCEL_AND_WAIT
-    | AOFContinue         -- ^ CONTINUE
-    | AOFTerminateCluster -- ^ TERMINATE_CLUSTER
-    | AOFTerminateJobFlow -- ^ TERMINATE_JOB_FLOW
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable ActionOnFailure
-
-instance FromText ActionOnFailure where
-    parser = takeLowerText >>= \case
-        "cancel_and_wait"    -> pure AOFCancelAndWait
-        "continue"           -> pure AOFContinue
-        "terminate_cluster"  -> pure AOFTerminateCluster
-        "terminate_job_flow" -> pure AOFTerminateJobFlow
-        e                    -> fail $
-            "Failure parsing ActionOnFailure from " ++ show e
-
-instance ToText ActionOnFailure where
-    toText = \case
-        AOFCancelAndWait    -> "CANCEL_AND_WAIT"
-        AOFContinue         -> "CONTINUE"
-        AOFTerminateCluster -> "TERMINATE_CLUSTER"
-        AOFTerminateJobFlow -> "TERMINATE_JOB_FLOW"
-
-instance ToByteString ActionOnFailure
-instance ToHeader     ActionOnFailure
-instance ToQuery      ActionOnFailure
-
-instance FromJSON ActionOnFailure where
-    parseJSON = parseJSONText "ActionOnFailure"
-
-instance ToJSON ActionOnFailure where
-    toJSON = toJSONText
-
-data ClusterStateChangeReason = ClusterStateChangeReason
-    { _cscrCode    :: Maybe ClusterStateChangeReasonCode
-    , _cscrMessage :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'ClusterStateChangeReason' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'cscrCode' @::@ 'Maybe' 'ClusterStateChangeReasonCode'
---
--- * 'cscrMessage' @::@ 'Maybe' 'Text'
---
-clusterStateChangeReason :: ClusterStateChangeReason
-clusterStateChangeReason = ClusterStateChangeReason
-    { _cscrCode    = Nothing
-    , _cscrMessage = Nothing
-    }
-
--- | The programmatic code for the state change reason.
-cscrCode :: Lens' ClusterStateChangeReason (Maybe ClusterStateChangeReasonCode)
-cscrCode = lens _cscrCode (\s a -> s { _cscrCode = a })
-
--- | The descriptive message for the state change reason.
-cscrMessage :: Lens' ClusterStateChangeReason (Maybe Text)
-cscrMessage = lens _cscrMessage (\s a -> s { _cscrMessage = a })
-
-instance FromJSON ClusterStateChangeReason where
-    parseJSON = withObject "ClusterStateChangeReason" $ \o -> ClusterStateChangeReason
-        <$> o .:? "Code"
-        <*> o .:? "Message"
-
-instance ToJSON ClusterStateChangeReason where
-    toJSON ClusterStateChangeReason{..} = object
-        [ "Code"    .= _cscrCode
-        , "Message" .= _cscrMessage
-        ]
-
-data Tag = Tag
-    { _tagKey   :: Maybe Text
-    , _tagValue :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'Tag' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'tagKey' @::@ 'Maybe' 'Text'
---
--- * 'tagValue' @::@ 'Maybe' 'Text'
---
-tag :: Tag
-tag = Tag
-    { _tagKey   = Nothing
-    , _tagValue = Nothing
-    }
-
--- | A user-defined key, which is the minimum required information for a valid
--- tag. For more information, see <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-tags.html Tagging Amazon EMR Resources>.
-tagKey :: Lens' Tag (Maybe Text)
-tagKey = lens _tagKey (\s a -> s { _tagKey = a })
-
--- | A user-defined value, which is optional in a tag. For more information, see <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-tags.html Tagging Amazon EMR Resources>.
-tagValue :: Lens' Tag (Maybe Text)
-tagValue = lens _tagValue (\s a -> s { _tagValue = a })
-
-instance FromJSON Tag where
-    parseJSON = withObject "Tag" $ \o -> Tag
-        <$> o .:? "Key"
-        <*> o .:? "Value"
-
-instance ToJSON Tag where
-    toJSON Tag{..} = object
-        [ "Key"   .= _tagKey
-        , "Value" .= _tagValue
-        ]
-
-data Application = Application
-    { _aAdditionalInfo :: Map Text Text
-    , _aArgs           :: List "Args" Text
-    , _aName           :: Maybe Text
-    , _aVersion        :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'Application' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'aAdditionalInfo' @::@ 'HashMap' 'Text' 'Text'
---
--- * 'aArgs' @::@ ['Text']
---
--- * 'aName' @::@ 'Maybe' 'Text'
---
--- * 'aVersion' @::@ 'Maybe' 'Text'
---
-application :: Application
-application = Application
-    { _aName           = Nothing
-    , _aVersion        = Nothing
-    , _aArgs           = mempty
-    , _aAdditionalInfo = mempty
-    }
-
--- | This option is for advanced users only. This is meta information about
--- third-party applications that third-party vendors use for testing purposes.
-aAdditionalInfo :: Lens' Application (HashMap Text Text)
-aAdditionalInfo = lens _aAdditionalInfo (\s a -> s { _aAdditionalInfo = a }) . _Map
-
--- | Arguments for Amazon EMR to pass to the application.
-aArgs :: Lens' Application [Text]
-aArgs = lens _aArgs (\s a -> s { _aArgs = a }) . _List
-
--- | The name of the application.
-aName :: Lens' Application (Maybe Text)
-aName = lens _aName (\s a -> s { _aName = a })
-
--- | The version of the application.
-aVersion :: Lens' Application (Maybe Text)
-aVersion = lens _aVersion (\s a -> s { _aVersion = a })
-
-instance FromJSON Application where
-    parseJSON = withObject "Application" $ \o -> Application
-        <$> o .:? "AdditionalInfo" .!= mempty
-        <*> o .:? "Args" .!= mempty
-        <*> o .:? "Name"
-        <*> o .:? "Version"
-
-instance ToJSON Application where
-    toJSON Application{..} = object
-        [ "Name"           .= _aName
-        , "Version"        .= _aVersion
-        , "Args"           .= _aArgs
-        , "AdditionalInfo" .= _aAdditionalInfo
-        ]
-
-data JobFlowExecutionStatusDetail = JobFlowExecutionStatusDetail
-    { _jfesdCreationDateTime      :: POSIX
-    , _jfesdEndDateTime           :: Maybe POSIX
-    , _jfesdLastStateChangeReason :: Maybe Text
-    , _jfesdReadyDateTime         :: Maybe POSIX
-    , _jfesdStartDateTime         :: Maybe POSIX
-    , _jfesdState                 :: JobFlowExecutionState
-    } deriving (Eq, Read, Show)
-
--- | 'JobFlowExecutionStatusDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'jfesdCreationDateTime' @::@ 'UTCTime'
---
--- * 'jfesdEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'jfesdLastStateChangeReason' @::@ 'Maybe' 'Text'
---
--- * 'jfesdReadyDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'jfesdStartDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'jfesdState' @::@ 'JobFlowExecutionState'
---
-jobFlowExecutionStatusDetail :: JobFlowExecutionState -- ^ 'jfesdState'
-                             -> UTCTime -- ^ 'jfesdCreationDateTime'
-                             -> JobFlowExecutionStatusDetail
-jobFlowExecutionStatusDetail p1 p2 = JobFlowExecutionStatusDetail
-    { _jfesdState                 = p1
-    , _jfesdCreationDateTime      = withIso _Time (const id) p2
-    , _jfesdStartDateTime         = Nothing
-    , _jfesdReadyDateTime         = Nothing
-    , _jfesdEndDateTime           = Nothing
-    , _jfesdLastStateChangeReason = Nothing
-    }
-
--- | The creation date and time of the job flow.
-jfesdCreationDateTime :: Lens' JobFlowExecutionStatusDetail UTCTime
-jfesdCreationDateTime =
-    lens _jfesdCreationDateTime (\s a -> s { _jfesdCreationDateTime = a })
-        . _Time
-
--- | The completion date and time of the job flow.
-jfesdEndDateTime :: Lens' JobFlowExecutionStatusDetail (Maybe UTCTime)
-jfesdEndDateTime = lens _jfesdEndDateTime (\s a -> s { _jfesdEndDateTime = a }) . mapping _Time
-
--- | Description of the job flow last changed state.
-jfesdLastStateChangeReason :: Lens' JobFlowExecutionStatusDetail (Maybe Text)
-jfesdLastStateChangeReason =
-    lens _jfesdLastStateChangeReason
-        (\s a -> s { _jfesdLastStateChangeReason = a })
-
--- | The date and time when the job flow was ready to start running bootstrap
--- actions.
-jfesdReadyDateTime :: Lens' JobFlowExecutionStatusDetail (Maybe UTCTime)
-jfesdReadyDateTime =
-    lens _jfesdReadyDateTime (\s a -> s { _jfesdReadyDateTime = a })
-        . mapping _Time
-
--- | The start date and time of the job flow.
-jfesdStartDateTime :: Lens' JobFlowExecutionStatusDetail (Maybe UTCTime)
-jfesdStartDateTime =
-    lens _jfesdStartDateTime (\s a -> s { _jfesdStartDateTime = a })
-        . mapping _Time
-
--- | The state of the job flow.
-jfesdState :: Lens' JobFlowExecutionStatusDetail JobFlowExecutionState
-jfesdState = lens _jfesdState (\s a -> s { _jfesdState = a })
-
-instance FromJSON JobFlowExecutionStatusDetail where
-    parseJSON = withObject "JobFlowExecutionStatusDetail" $ \o -> JobFlowExecutionStatusDetail
-        <$> o .:  "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "LastStateChangeReason"
-        <*> o .:? "ReadyDateTime"
-        <*> o .:? "StartDateTime"
-        <*> o .:  "State"
-
-instance ToJSON JobFlowExecutionStatusDetail where
-    toJSON JobFlowExecutionStatusDetail{..} = object
-        [ "State"                 .= _jfesdState
-        , "CreationDateTime"      .= _jfesdCreationDateTime
-        , "StartDateTime"         .= _jfesdStartDateTime
-        , "ReadyDateTime"         .= _jfesdReadyDateTime
-        , "EndDateTime"           .= _jfesdEndDateTime
-        , "LastStateChangeReason" .= _jfesdLastStateChangeReason
-        ]
-
-data InstanceGroupStatus = InstanceGroupStatus
-    { _igsState             :: Maybe InstanceGroupState
-    , _igsStateChangeReason :: Maybe InstanceGroupStateChangeReason
-    , _igsTimeline          :: Maybe InstanceGroupTimeline
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceGroupStatus' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igsState' @::@ 'Maybe' 'InstanceGroupState'
---
--- * 'igsStateChangeReason' @::@ 'Maybe' 'InstanceGroupStateChangeReason'
---
--- * 'igsTimeline' @::@ 'Maybe' 'InstanceGroupTimeline'
---
-instanceGroupStatus :: InstanceGroupStatus
-instanceGroupStatus = InstanceGroupStatus
-    { _igsState             = Nothing
-    , _igsStateChangeReason = Nothing
-    , _igsTimeline          = Nothing
-    }
-
--- | The current state of the instance group.
-igsState :: Lens' InstanceGroupStatus (Maybe InstanceGroupState)
-igsState = lens _igsState (\s a -> s { _igsState = a })
-
--- | The status change reason details for the instance group.
-igsStateChangeReason :: Lens' InstanceGroupStatus (Maybe InstanceGroupStateChangeReason)
-igsStateChangeReason =
-    lens _igsStateChangeReason (\s a -> s { _igsStateChangeReason = a })
-
--- | The timeline of the instance group status over time.
-igsTimeline :: Lens' InstanceGroupStatus (Maybe InstanceGroupTimeline)
-igsTimeline = lens _igsTimeline (\s a -> s { _igsTimeline = a })
-
-instance FromJSON InstanceGroupStatus where
-    parseJSON = withObject "InstanceGroupStatus" $ \o -> InstanceGroupStatus
-        <$> o .:? "State"
-        <*> o .:? "StateChangeReason"
-        <*> o .:? "Timeline"
-
-instance ToJSON InstanceGroupStatus where
-    toJSON InstanceGroupStatus{..} = object
-        [ "State"             .= _igsState
-        , "StateChangeReason" .= _igsStateChangeReason
-        , "Timeline"          .= _igsTimeline
-        ]
-
-data Cluster = Cluster
-    { _c1Applications            :: List "Applications" Application
-    , _c1AutoTerminate           :: Maybe Bool
-    , _c1Ec2InstanceAttributes   :: Maybe Ec2InstanceAttributes
-    , _c1Id                      :: Text
-    , _c1LogUri                  :: Maybe Text
-    , _c1MasterPublicDnsName     :: Maybe Text
-    , _c1Name                    :: Text
-    , _c1NormalizedInstanceHours :: Maybe Int
-    , _c1RequestedAmiVersion     :: Maybe Text
-    , _c1RunningAmiVersion       :: Maybe Text
-    , _c1ServiceRole             :: Maybe Text
-    , _c1Status                  :: ClusterStatus
-    , _c1Tags                    :: List "Tags" Tag
-    , _c1TerminationProtected    :: Maybe Bool
-    , _c1VisibleToAllUsers       :: Maybe Bool
-    } deriving (Eq, Read, Show)
-
--- | 'Cluster' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'c1Applications' @::@ ['Application']
---
--- * 'c1AutoTerminate' @::@ 'Maybe' 'Bool'
---
--- * 'c1Ec2InstanceAttributes' @::@ 'Maybe' 'Ec2InstanceAttributes'
---
--- * 'c1Id' @::@ 'Text'
---
--- * 'c1LogUri' @::@ 'Maybe' 'Text'
---
--- * 'c1MasterPublicDnsName' @::@ 'Maybe' 'Text'
---
--- * 'c1Name' @::@ 'Text'
---
--- * 'c1NormalizedInstanceHours' @::@ 'Maybe' 'Int'
---
--- * 'c1RequestedAmiVersion' @::@ 'Maybe' 'Text'
---
--- * 'c1RunningAmiVersion' @::@ 'Maybe' 'Text'
---
--- * 'c1ServiceRole' @::@ 'Maybe' 'Text'
---
--- * 'c1Status' @::@ 'ClusterStatus'
---
--- * 'c1Tags' @::@ ['Tag']
---
--- * 'c1TerminationProtected' @::@ 'Maybe' 'Bool'
---
--- * 'c1VisibleToAllUsers' @::@ 'Maybe' 'Bool'
---
-cluster :: Text -- ^ 'c1Id'
-        -> Text -- ^ 'c1Name'
-        -> ClusterStatus -- ^ 'c1Status'
-        -> Cluster
-cluster p1 p2 p3 = Cluster
-    { _c1Id                      = p1
-    , _c1Name                    = p2
-    , _c1Status                  = p3
-    , _c1Ec2InstanceAttributes   = Nothing
-    , _c1LogUri                  = Nothing
-    , _c1RequestedAmiVersion     = Nothing
-    , _c1RunningAmiVersion       = Nothing
-    , _c1AutoTerminate           = Nothing
-    , _c1TerminationProtected    = Nothing
-    , _c1VisibleToAllUsers       = Nothing
-    , _c1Applications            = mempty
-    , _c1Tags                    = mempty
-    , _c1ServiceRole             = Nothing
-    , _c1NormalizedInstanceHours = Nothing
-    , _c1MasterPublicDnsName     = Nothing
-    }
-
--- | The applications installed on this cluster.
-c1Applications :: Lens' Cluster [Application]
-c1Applications = lens _c1Applications (\s a -> s { _c1Applications = a }) . _List
-
--- | Specifies whether the cluster should terminate after completing all steps.
-c1AutoTerminate :: Lens' Cluster (Maybe Bool)
-c1AutoTerminate = lens _c1AutoTerminate (\s a -> s { _c1AutoTerminate = a })
-
-c1Ec2InstanceAttributes :: Lens' Cluster (Maybe Ec2InstanceAttributes)
-c1Ec2InstanceAttributes =
-    lens _c1Ec2InstanceAttributes (\s a -> s { _c1Ec2InstanceAttributes = a })
-
--- | The unique identifier for the cluster.
-c1Id :: Lens' Cluster Text
-c1Id = lens _c1Id (\s a -> s { _c1Id = a })
-
--- | The path to the Amazon S3 location where logs for this cluster are stored.
-c1LogUri :: Lens' Cluster (Maybe Text)
-c1LogUri = lens _c1LogUri (\s a -> s { _c1LogUri = a })
-
--- | The public DNS name of the master Ec2 instance.
-c1MasterPublicDnsName :: Lens' Cluster (Maybe Text)
-c1MasterPublicDnsName =
-    lens _c1MasterPublicDnsName (\s a -> s { _c1MasterPublicDnsName = a })
-
--- | The name of the cluster.
-c1Name :: Lens' Cluster Text
-c1Name = lens _c1Name (\s a -> s { _c1Name = a })
-
--- | An approximation of the cost of the job flow, represented in m1.small/hours.
--- This value is incremented one time for every hour an m1.small instance runs.
--- Larger instances are weighted more, so an EC2 instance that is roughly four
--- times more expensive would result in the normalized instance hours being
--- incremented by four. This result is only an approximation and does not
--- reflect the actual billing rate.
-c1NormalizedInstanceHours :: Lens' Cluster (Maybe Int)
-c1NormalizedInstanceHours =
-    lens _c1NormalizedInstanceHours
-        (\s a -> s { _c1NormalizedInstanceHours = a })
-
--- | The AMI version requested for this cluster.
-c1RequestedAmiVersion :: Lens' Cluster (Maybe Text)
-c1RequestedAmiVersion =
-    lens _c1RequestedAmiVersion (\s a -> s { _c1RequestedAmiVersion = a })
-
--- | The AMI version running on this cluster. This differs from the requested
--- version only if the requested version is a meta version, such as "latest".
-c1RunningAmiVersion :: Lens' Cluster (Maybe Text)
-c1RunningAmiVersion =
-    lens _c1RunningAmiVersion (\s a -> s { _c1RunningAmiVersion = a })
-
--- | The IAM role that will be assumed by the Amazon EMR service to access AWS
--- resources on your behalf.
-c1ServiceRole :: Lens' Cluster (Maybe Text)
-c1ServiceRole = lens _c1ServiceRole (\s a -> s { _c1ServiceRole = a })
-
--- | The current status details about the cluster.
-c1Status :: Lens' Cluster ClusterStatus
-c1Status = lens _c1Status (\s a -> s { _c1Status = a })
-
--- | A list of tags associated with a cluster.
-c1Tags :: Lens' Cluster [Tag]
-c1Tags = lens _c1Tags (\s a -> s { _c1Tags = a }) . _List
-
--- | Indicates whether Amazon EMR will lock the cluster to prevent the EC2
--- instances from being terminated by an API call or user intervention, or in
--- the event of a cluster error.
-c1TerminationProtected :: Lens' Cluster (Maybe Bool)
-c1TerminationProtected =
-    lens _c1TerminationProtected (\s a -> s { _c1TerminationProtected = a })
-
--- | Indicates whether the job flow is visible to all IAM users of the AWS account
--- associated with the job flow. If this value is set to 'true', 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.
-c1VisibleToAllUsers :: Lens' Cluster (Maybe Bool)
-c1VisibleToAllUsers =
-    lens _c1VisibleToAllUsers (\s a -> s { _c1VisibleToAllUsers = a })
-
-instance FromJSON Cluster where
-    parseJSON = withObject "Cluster" $ \o -> Cluster
-        <$> o .:? "Applications" .!= mempty
-        <*> o .:? "AutoTerminate"
-        <*> o .:? "Ec2InstanceAttributes"
-        <*> o .:  "Id"
-        <*> o .:? "LogUri"
-        <*> o .:? "MasterPublicDnsName"
-        <*> o .:  "Name"
-        <*> o .:? "NormalizedInstanceHours"
-        <*> o .:? "RequestedAmiVersion"
-        <*> o .:? "RunningAmiVersion"
-        <*> o .:? "ServiceRole"
-        <*> o .:  "Status"
-        <*> o .:? "Tags" .!= mempty
-        <*> o .:? "TerminationProtected"
-        <*> o .:? "VisibleToAllUsers"
-
-instance ToJSON Cluster where
-    toJSON Cluster{..} = object
-        [ "Id"                      .= _c1Id
-        , "Name"                    .= _c1Name
-        , "Status"                  .= _c1Status
-        , "Ec2InstanceAttributes"   .= _c1Ec2InstanceAttributes
-        , "LogUri"                  .= _c1LogUri
-        , "RequestedAmiVersion"     .= _c1RequestedAmiVersion
-        , "RunningAmiVersion"       .= _c1RunningAmiVersion
-        , "AutoTerminate"           .= _c1AutoTerminate
-        , "TerminationProtected"    .= _c1TerminationProtected
-        , "VisibleToAllUsers"       .= _c1VisibleToAllUsers
-        , "Applications"            .= _c1Applications
-        , "Tags"                    .= _c1Tags
-        , "ServiceRole"             .= _c1ServiceRole
-        , "NormalizedInstanceHours" .= _c1NormalizedInstanceHours
-        , "MasterPublicDnsName"     .= _c1MasterPublicDnsName
-        ]
-
-data InstanceTimeline = InstanceTimeline
-    { _itCreationDateTime :: Maybe POSIX
-    , _itEndDateTime      :: Maybe POSIX
-    , _itReadyDateTime    :: Maybe POSIX
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'InstanceTimeline' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'itCreationDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'itEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'itReadyDateTime' @::@ 'Maybe' 'UTCTime'
---
-instanceTimeline :: InstanceTimeline
-instanceTimeline = InstanceTimeline
-    { _itCreationDateTime = Nothing
-    , _itReadyDateTime    = Nothing
-    , _itEndDateTime      = Nothing
-    }
-
--- | The creation date and time of the instance.
-itCreationDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
-itCreationDateTime =
-    lens _itCreationDateTime (\s a -> s { _itCreationDateTime = a })
-        . mapping _Time
-
--- | The date and time when the instance was terminated.
-itEndDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
-itEndDateTime = lens _itEndDateTime (\s a -> s { _itEndDateTime = a }) . mapping _Time
-
--- | The date and time when the instance was ready to perform tasks.
-itReadyDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
-itReadyDateTime = lens _itReadyDateTime (\s a -> s { _itReadyDateTime = a }) . mapping _Time
-
-instance FromJSON InstanceTimeline where
-    parseJSON = withObject "InstanceTimeline" $ \o -> InstanceTimeline
-        <$> o .:? "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "ReadyDateTime"
-
-instance ToJSON InstanceTimeline where
-    toJSON InstanceTimeline{..} = object
-        [ "CreationDateTime" .= _itCreationDateTime
-        , "ReadyDateTime"    .= _itReadyDateTime
-        , "EndDateTime"      .= _itEndDateTime
-        ]
-
-data Ec2InstanceAttributes = Ec2InstanceAttributes
-    { _eiaAdditionalMasterSecurityGroups :: List "AdditionalMasterSecurityGroups" Text
-    , _eiaAdditionalSlaveSecurityGroups  :: List "AdditionalSlaveSecurityGroups" Text
-    , _eiaEc2AvailabilityZone            :: Maybe Text
-    , _eiaEc2KeyName                     :: Maybe Text
-    , _eiaEc2SubnetId                    :: Maybe Text
-    , _eiaEmrManagedMasterSecurityGroup  :: Maybe Text
-    , _eiaEmrManagedSlaveSecurityGroup   :: Maybe Text
-    , _eiaIamInstanceProfile             :: Maybe Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'Ec2InstanceAttributes' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'eiaAdditionalMasterSecurityGroups' @::@ ['Text']
---
--- * 'eiaAdditionalSlaveSecurityGroups' @::@ ['Text']
---
--- * 'eiaEc2AvailabilityZone' @::@ 'Maybe' 'Text'
---
--- * 'eiaEc2KeyName' @::@ 'Maybe' 'Text'
---
--- * 'eiaEc2SubnetId' @::@ 'Maybe' 'Text'
---
--- * 'eiaEmrManagedMasterSecurityGroup' @::@ 'Maybe' 'Text'
---
--- * 'eiaEmrManagedSlaveSecurityGroup' @::@ 'Maybe' 'Text'
---
--- * 'eiaIamInstanceProfile' @::@ 'Maybe' 'Text'
---
-ec2InstanceAttributes :: Ec2InstanceAttributes
-ec2InstanceAttributes = Ec2InstanceAttributes
-    { _eiaEc2KeyName                     = Nothing
-    , _eiaEc2SubnetId                    = Nothing
-    , _eiaEc2AvailabilityZone            = Nothing
-    , _eiaIamInstanceProfile             = Nothing
-    , _eiaEmrManagedMasterSecurityGroup  = Nothing
-    , _eiaEmrManagedSlaveSecurityGroup   = Nothing
-    , _eiaAdditionalMasterSecurityGroups = mempty
-    , _eiaAdditionalSlaveSecurityGroups  = mempty
-    }
-
--- | A list of additional Amazon EC2 security group IDs for the master node.
-eiaAdditionalMasterSecurityGroups :: Lens' Ec2InstanceAttributes [Text]
-eiaAdditionalMasterSecurityGroups =
-    lens _eiaAdditionalMasterSecurityGroups
-        (\s a -> s { _eiaAdditionalMasterSecurityGroups = a })
-            . _List
-
--- | A list of additional Amazon EC2 security group IDs for the slave nodes.
-eiaAdditionalSlaveSecurityGroups :: Lens' Ec2InstanceAttributes [Text]
-eiaAdditionalSlaveSecurityGroups =
-    lens _eiaAdditionalSlaveSecurityGroups
-        (\s a -> s { _eiaAdditionalSlaveSecurityGroups = a })
-            . _List
-
--- | The Availability Zone in which the cluster will run.
-eiaEc2AvailabilityZone :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaEc2AvailabilityZone =
-    lens _eiaEc2AvailabilityZone (\s a -> s { _eiaEc2AvailabilityZone = a })
-
--- | The name of the Amazon EC2 key pair to use when connecting with SSH into the
--- master node as a user named "hadoop".
-eiaEc2KeyName :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaEc2KeyName = lens _eiaEc2KeyName (\s a -> s { _eiaEc2KeyName = a })
-
--- | To launch the job flow in Amazon VPC, set this parameter to the identifier
--- of the Amazon VPC subnet where you want the job flow to launch. If you do not
--- specify this value, the job flow is launched in the normal AWS cloud, outside
--- of a VPC.
---
--- Amazon VPC currently does not support cluster compute quadruple extra large
--- (cc1.4xlarge) instances. Thus, you cannot specify the cc1.4xlarge instance
--- type for nodes of a job flow launched in a VPC.
-eiaEc2SubnetId :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaEc2SubnetId = lens _eiaEc2SubnetId (\s a -> s { _eiaEc2SubnetId = a })
-
--- | The identifier of the Amazon EC2 security group (managed by Amazon Elastic
--- MapReduce) for the master node.
-eiaEmrManagedMasterSecurityGroup :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaEmrManagedMasterSecurityGroup =
-    lens _eiaEmrManagedMasterSecurityGroup
-        (\s a -> s { _eiaEmrManagedMasterSecurityGroup = a })
-
--- | The identifier of the Amazon EC2 security group (managed by Amazon Elastic
--- MapReduce) for the slave nodes.
-eiaEmrManagedSlaveSecurityGroup :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaEmrManagedSlaveSecurityGroup =
-    lens _eiaEmrManagedSlaveSecurityGroup
-        (\s a -> s { _eiaEmrManagedSlaveSecurityGroup = a })
-
--- | The IAM role that was specified when the job flow was launched. The EC2
--- instances of the job flow assume this role.
-eiaIamInstanceProfile :: Lens' Ec2InstanceAttributes (Maybe Text)
-eiaIamInstanceProfile =
-    lens _eiaIamInstanceProfile (\s a -> s { _eiaIamInstanceProfile = a })
-
-instance FromJSON Ec2InstanceAttributes where
-    parseJSON = withObject "Ec2InstanceAttributes" $ \o -> Ec2InstanceAttributes
-        <$> o .:? "AdditionalMasterSecurityGroups" .!= mempty
-        <*> o .:? "AdditionalSlaveSecurityGroups" .!= mempty
-        <*> o .:? "Ec2AvailabilityZone"
-        <*> o .:? "Ec2KeyName"
-        <*> o .:? "Ec2SubnetId"
-        <*> o .:? "EmrManagedMasterSecurityGroup"
-        <*> o .:? "EmrManagedSlaveSecurityGroup"
-        <*> o .:? "IamInstanceProfile"
-
-instance ToJSON Ec2InstanceAttributes where
-    toJSON Ec2InstanceAttributes{..} = object
-        [ "Ec2KeyName"                     .= _eiaEc2KeyName
-        , "Ec2SubnetId"                    .= _eiaEc2SubnetId
-        , "Ec2AvailabilityZone"            .= _eiaEc2AvailabilityZone
-        , "IamInstanceProfile"             .= _eiaIamInstanceProfile
-        , "EmrManagedMasterSecurityGroup"  .= _eiaEmrManagedMasterSecurityGroup
-        , "EmrManagedSlaveSecurityGroup"   .= _eiaEmrManagedSlaveSecurityGroup
-        , "AdditionalMasterSecurityGroups" .= _eiaAdditionalMasterSecurityGroups
-        , "AdditionalSlaveSecurityGroups"  .= _eiaAdditionalSlaveSecurityGroups
-        ]
-
-data StepStateChangeReasonCode
-    = None -- ^ NONE
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable StepStateChangeReasonCode
-
-instance FromText StepStateChangeReasonCode where
-    parser = takeLowerText >>= \case
-        "none" -> pure None
-        e      -> fail $
-            "Failure parsing StepStateChangeReasonCode from " ++ show e
-
-instance ToText StepStateChangeReasonCode where
-    toText None = "NONE"
-
-instance ToByteString StepStateChangeReasonCode
-instance ToHeader     StepStateChangeReasonCode
-instance ToQuery      StepStateChangeReasonCode
-
-instance FromJSON StepStateChangeReasonCode where
-    parseJSON = parseJSONText "StepStateChangeReasonCode"
-
-instance ToJSON StepStateChangeReasonCode where
-    toJSON = toJSONText
-
-data ClusterState
-    = CSBootstrapping        -- ^ BOOTSTRAPPING
-    | CSRunning              -- ^ RUNNING
-    | CSStarting             -- ^ STARTING
-    | CSTerminated           -- ^ TERMINATED
-    | CSTerminatedWithErrors -- ^ TERMINATED_WITH_ERRORS
-    | CSTerminating          -- ^ TERMINATING
-    | CSWaiting              -- ^ WAITING
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable ClusterState
-
-instance FromText ClusterState where
-    parser = takeLowerText >>= \case
-        "bootstrapping"          -> pure CSBootstrapping
-        "running"                -> pure CSRunning
-        "starting"               -> pure CSStarting
-        "terminated"             -> pure CSTerminated
-        "terminated_with_errors" -> pure CSTerminatedWithErrors
-        "terminating"            -> pure CSTerminating
-        "waiting"                -> pure CSWaiting
-        e                        -> fail $
-            "Failure parsing ClusterState from " ++ show e
-
-instance ToText ClusterState where
-    toText = \case
-        CSBootstrapping        -> "BOOTSTRAPPING"
-        CSRunning              -> "RUNNING"
-        CSStarting             -> "STARTING"
-        CSTerminated           -> "TERMINATED"
-        CSTerminatedWithErrors -> "TERMINATED_WITH_ERRORS"
-        CSTerminating          -> "TERMINATING"
-        CSWaiting              -> "WAITING"
-
-instance ToByteString ClusterState
-instance ToHeader     ClusterState
-instance ToQuery      ClusterState
-
-instance FromJSON ClusterState where
-    parseJSON = parseJSONText "ClusterState"
-
-instance ToJSON ClusterState where
-    toJSON = toJSONText
-
-data HadoopStepConfig = HadoopStepConfig
-    { _hscArgs       :: List "Args" Text
-    , _hscJar        :: Maybe Text
-    , _hscMainClass  :: Maybe Text
-    , _hscProperties :: Map Text Text
-    } deriving (Eq, Read, Show)
-
--- | 'HadoopStepConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'hscArgs' @::@ ['Text']
---
--- * 'hscJar' @::@ 'Maybe' 'Text'
---
--- * 'hscMainClass' @::@ 'Maybe' 'Text'
---
--- * 'hscProperties' @::@ 'HashMap' 'Text' 'Text'
---
-hadoopStepConfig :: HadoopStepConfig
-hadoopStepConfig = HadoopStepConfig
-    { _hscJar        = Nothing
-    , _hscProperties = mempty
-    , _hscMainClass  = Nothing
-    , _hscArgs       = mempty
-    }
-
--- | The list of command line arguments to pass to the JAR file's main function
--- for execution.
-hscArgs :: Lens' HadoopStepConfig [Text]
-hscArgs = lens _hscArgs (\s a -> s { _hscArgs = a }) . _List
-
--- | The path to the JAR file that runs during the step.
-hscJar :: Lens' HadoopStepConfig (Maybe Text)
-hscJar = lens _hscJar (\s a -> s { _hscJar = a })
-
--- | The name of the main class in the specified Java file. If not specified, the
--- JAR file should specify a main class in its manifest file.
-hscMainClass :: Lens' HadoopStepConfig (Maybe Text)
-hscMainClass = lens _hscMainClass (\s a -> s { _hscMainClass = a })
-
--- | The list of Java properties that are set when the step runs. You can use
--- these properties to pass key value pairs to your main function.
-hscProperties :: Lens' HadoopStepConfig (HashMap Text Text)
-hscProperties = lens _hscProperties (\s a -> s { _hscProperties = a }) . _Map
-
-instance FromJSON HadoopStepConfig where
-    parseJSON = withObject "HadoopStepConfig" $ \o -> HadoopStepConfig
-        <$> o .:? "Args" .!= mempty
-        <*> o .:? "Jar"
-        <*> o .:? "MainClass"
-        <*> o .:? "Properties" .!= mempty
-
-instance ToJSON HadoopStepConfig where
-    toJSON HadoopStepConfig{..} = object
-        [ "Jar"        .= _hscJar
-        , "Properties" .= _hscProperties
-        , "MainClass"  .= _hscMainClass
-        , "Args"       .= _hscArgs
-        ]
-
-data JobFlowExecutionState
-    = JFESBootstrapping -- ^ BOOTSTRAPPING
-    | JFESCompleted     -- ^ COMPLETED
-    | JFESFailed        -- ^ FAILED
-    | JFESRunning       -- ^ RUNNING
-    | JFESShuttingDown  -- ^ SHUTTING_DOWN
-    | JFESStarting      -- ^ STARTING
-    | JFESTerminated    -- ^ TERMINATED
-    | JFESWaiting       -- ^ WAITING
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable JobFlowExecutionState
-
-instance FromText JobFlowExecutionState where
-    parser = takeLowerText >>= \case
-        "bootstrapping" -> pure JFESBootstrapping
-        "completed"     -> pure JFESCompleted
-        "failed"        -> pure JFESFailed
-        "running"       -> pure JFESRunning
-        "shutting_down" -> pure JFESShuttingDown
-        "starting"      -> pure JFESStarting
-        "terminated"    -> pure JFESTerminated
-        "waiting"       -> pure JFESWaiting
-        e               -> fail $
-            "Failure parsing JobFlowExecutionState from " ++ show e
-
-instance ToText JobFlowExecutionState where
-    toText = \case
-        JFESBootstrapping -> "BOOTSTRAPPING"
-        JFESCompleted     -> "COMPLETED"
-        JFESFailed        -> "FAILED"
-        JFESRunning       -> "RUNNING"
-        JFESShuttingDown  -> "SHUTTING_DOWN"
-        JFESStarting      -> "STARTING"
-        JFESTerminated    -> "TERMINATED"
-        JFESWaiting       -> "WAITING"
-
-instance ToByteString JobFlowExecutionState
-instance ToHeader     JobFlowExecutionState
-instance ToQuery      JobFlowExecutionState
-
-instance FromJSON JobFlowExecutionState where
-    parseJSON = parseJSONText "JobFlowExecutionState"
-
-instance ToJSON JobFlowExecutionState where
-    toJSON = toJSONText
-
-data StepDetail = StepDetail
-    { _sdExecutionStatusDetail :: StepExecutionStatusDetail
-    , _sdStepConfig            :: StepConfig
-    } deriving (Eq, Read, Show)
-
--- | 'StepDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sdExecutionStatusDetail' @::@ 'StepExecutionStatusDetail'
---
--- * 'sdStepConfig' @::@ 'StepConfig'
---
-stepDetail :: StepConfig -- ^ 'sdStepConfig'
-           -> StepExecutionStatusDetail -- ^ 'sdExecutionStatusDetail'
-           -> StepDetail
-stepDetail p1 p2 = StepDetail
-    { _sdStepConfig            = p1
-    , _sdExecutionStatusDetail = p2
-    }
-
--- | The description of the step status.
-sdExecutionStatusDetail :: Lens' StepDetail StepExecutionStatusDetail
-sdExecutionStatusDetail =
-    lens _sdExecutionStatusDetail (\s a -> s { _sdExecutionStatusDetail = a })
-
--- | The step configuration.
-sdStepConfig :: Lens' StepDetail StepConfig
-sdStepConfig = lens _sdStepConfig (\s a -> s { _sdStepConfig = a })
-
-instance FromJSON StepDetail where
-    parseJSON = withObject "StepDetail" $ \o -> StepDetail
-        <$> o .:  "ExecutionStatusDetail"
-        <*> o .:  "StepConfig"
-
-instance ToJSON StepDetail where
-    toJSON StepDetail{..} = object
-        [ "StepConfig"            .= _sdStepConfig
-        , "ExecutionStatusDetail" .= _sdExecutionStatusDetail
-        ]
-
-data InstanceGroupStateChangeReason = InstanceGroupStateChangeReason
-    { _igscrCode    :: Maybe InstanceGroupStateChangeReasonCode
-    , _igscrMessage :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceGroupStateChangeReason' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igscrCode' @::@ 'Maybe' 'InstanceGroupStateChangeReasonCode'
---
--- * 'igscrMessage' @::@ 'Maybe' 'Text'
---
-instanceGroupStateChangeReason :: InstanceGroupStateChangeReason
-instanceGroupStateChangeReason = InstanceGroupStateChangeReason
-    { _igscrCode    = Nothing
-    , _igscrMessage = Nothing
-    }
-
--- | The programmable code for the state change reason.
-igscrCode :: Lens' InstanceGroupStateChangeReason (Maybe InstanceGroupStateChangeReasonCode)
-igscrCode = lens _igscrCode (\s a -> s { _igscrCode = a })
-
--- | The status change reason description.
-igscrMessage :: Lens' InstanceGroupStateChangeReason (Maybe Text)
-igscrMessage = lens _igscrMessage (\s a -> s { _igscrMessage = a })
-
-instance FromJSON InstanceGroupStateChangeReason where
-    parseJSON = withObject "InstanceGroupStateChangeReason" $ \o -> InstanceGroupStateChangeReason
-        <$> o .:? "Code"
-        <*> o .:? "Message"
-
-instance ToJSON InstanceGroupStateChangeReason where
-    toJSON InstanceGroupStateChangeReason{..} = object
-        [ "Code"    .= _igscrCode
-        , "Message" .= _igscrMessage
-        ]
-
-data InstanceGroupType
-    = Core   -- ^ CORE
-    | Master -- ^ MASTER
-    | Task   -- ^ TASK
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceGroupType
-
-instance FromText InstanceGroupType where
-    parser = takeLowerText >>= \case
-        "core"   -> pure Core
-        "master" -> pure Master
-        "task"   -> pure Task
-        e        -> fail $
-            "Failure parsing InstanceGroupType from " ++ show e
-
-instance ToText InstanceGroupType where
-    toText = \case
-        Core   -> "CORE"
-        Master -> "MASTER"
-        Task   -> "TASK"
-
-instance ToByteString InstanceGroupType
-instance ToHeader     InstanceGroupType
-instance ToQuery      InstanceGroupType
-
-instance FromJSON InstanceGroupType where
-    parseJSON = parseJSONText "InstanceGroupType"
-
-instance ToJSON InstanceGroupType where
-    toJSON = toJSONText
-
-data InstanceGroupStateChangeReasonCode
-    = ClusterTerminated -- ^ CLUSTER_TERMINATED
-    | InstanceFailure   -- ^ INSTANCE_FAILURE
-    | InternalError     -- ^ INTERNAL_ERROR
-    | ValidationError   -- ^ VALIDATION_ERROR
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceGroupStateChangeReasonCode
-
-instance FromText InstanceGroupStateChangeReasonCode where
-    parser = takeLowerText >>= \case
-        "cluster_terminated" -> pure ClusterTerminated
-        "instance_failure"   -> pure InstanceFailure
-        "internal_error"     -> pure InternalError
-        "validation_error"   -> pure ValidationError
-        e                    -> fail $
-            "Failure parsing InstanceGroupStateChangeReasonCode from " ++ show e
-
-instance ToText InstanceGroupStateChangeReasonCode where
-    toText = \case
-        ClusterTerminated -> "CLUSTER_TERMINATED"
-        InstanceFailure   -> "INSTANCE_FAILURE"
-        InternalError     -> "INTERNAL_ERROR"
-        ValidationError   -> "VALIDATION_ERROR"
-
-instance ToByteString InstanceGroupStateChangeReasonCode
-instance ToHeader     InstanceGroupStateChangeReasonCode
-instance ToQuery      InstanceGroupStateChangeReasonCode
-
-instance FromJSON InstanceGroupStateChangeReasonCode where
-    parseJSON = parseJSONText "InstanceGroupStateChangeReasonCode"
-
-instance ToJSON InstanceGroupStateChangeReasonCode where
-    toJSON = toJSONText
-
-data StepStatus = StepStatus
-    { _ssState             :: Maybe StepState
-    , _ssStateChangeReason :: Maybe StepStateChangeReason
-    , _ssTimeline          :: Maybe StepTimeline
-    } deriving (Eq, Read, Show)
-
--- | 'StepStatus' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ssState' @::@ 'Maybe' 'StepState'
---
--- * 'ssStateChangeReason' @::@ 'Maybe' 'StepStateChangeReason'
---
--- * 'ssTimeline' @::@ 'Maybe' 'StepTimeline'
---
-stepStatus :: StepStatus
-stepStatus = StepStatus
-    { _ssState             = Nothing
-    , _ssStateChangeReason = Nothing
-    , _ssTimeline          = Nothing
-    }
-
--- | The execution state of the cluster step.
-ssState :: Lens' StepStatus (Maybe StepState)
-ssState = lens _ssState (\s a -> s { _ssState = a })
-
--- | The reason for the step execution status change.
-ssStateChangeReason :: Lens' StepStatus (Maybe StepStateChangeReason)
-ssStateChangeReason =
-    lens _ssStateChangeReason (\s a -> s { _ssStateChangeReason = a })
-
--- | The timeline of the cluster step status over time.
-ssTimeline :: Lens' StepStatus (Maybe StepTimeline)
-ssTimeline = lens _ssTimeline (\s a -> s { _ssTimeline = a })
-
-instance FromJSON StepStatus where
-    parseJSON = withObject "StepStatus" $ \o -> StepStatus
-        <$> o .:? "State"
-        <*> o .:? "StateChangeReason"
-        <*> o .:? "Timeline"
-
-instance ToJSON StepStatus where
-    toJSON StepStatus{..} = object
-        [ "State"             .= _ssState
-        , "StateChangeReason" .= _ssStateChangeReason
-        , "Timeline"          .= _ssTimeline
-        ]
-
-data StepSummary = StepSummary
-    { _ssActionOnFailure :: Maybe ActionOnFailure
-    , _ssConfig          :: Maybe HadoopStepConfig
-    , _ssId              :: Maybe Text
-    , _ssName            :: Maybe Text
-    , _ssStatus          :: Maybe StepStatus
-    } deriving (Eq, Read, Show)
-
--- | 'StepSummary' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ssActionOnFailure' @::@ 'Maybe' 'ActionOnFailure'
---
--- * 'ssConfig' @::@ 'Maybe' 'HadoopStepConfig'
---
--- * 'ssId' @::@ 'Maybe' 'Text'
---
--- * 'ssName' @::@ 'Maybe' 'Text'
---
--- * 'ssStatus' @::@ 'Maybe' 'StepStatus'
---
-stepSummary :: StepSummary
-stepSummary = StepSummary
-    { _ssId              = Nothing
-    , _ssName            = Nothing
-    , _ssConfig          = Nothing
-    , _ssActionOnFailure = Nothing
-    , _ssStatus          = Nothing
-    }
-
--- | This specifies what action to take when the cluster step fails. Possible
--- values are TERMINATE_CLUSTER, CANCEL_AND_WAIT, and CONTINUE.
-ssActionOnFailure :: Lens' StepSummary (Maybe ActionOnFailure)
-ssActionOnFailure =
-    lens _ssActionOnFailure (\s a -> s { _ssActionOnFailure = a })
-
--- | The Hadoop job configuration of the cluster step.
-ssConfig :: Lens' StepSummary (Maybe HadoopStepConfig)
-ssConfig = lens _ssConfig (\s a -> s { _ssConfig = a })
-
--- | The identifier of the cluster step.
-ssId :: Lens' StepSummary (Maybe Text)
-ssId = lens _ssId (\s a -> s { _ssId = a })
-
--- | The name of the cluster step.
-ssName :: Lens' StepSummary (Maybe Text)
-ssName = lens _ssName (\s a -> s { _ssName = a })
-
--- | The current execution status details of the cluster step.
-ssStatus :: Lens' StepSummary (Maybe StepStatus)
-ssStatus = lens _ssStatus (\s a -> s { _ssStatus = a })
-
-instance FromJSON StepSummary where
-    parseJSON = withObject "StepSummary" $ \o -> StepSummary
-        <$> o .:? "ActionOnFailure"
-        <*> o .:? "Config"
-        <*> o .:? "Id"
-        <*> o .:? "Name"
-        <*> o .:? "Status"
-
-instance ToJSON StepSummary where
-    toJSON StepSummary{..} = object
-        [ "Id"              .= _ssId
-        , "Name"            .= _ssName
-        , "Config"          .= _ssConfig
-        , "ActionOnFailure" .= _ssActionOnFailure
-        , "Status"          .= _ssStatus
-        ]
-
-data InstanceGroupState
-    = IGSArrested      -- ^ ARRESTED
-    | IGSBootstrapping -- ^ BOOTSTRAPPING
-    | IGSEnded         -- ^ ENDED
-    | IGSProvisioning  -- ^ PROVISIONING
-    | IGSResizing      -- ^ RESIZING
-    | IGSRunning       -- ^ RUNNING
-    | IGSShuttingDown  -- ^ SHUTTING_DOWN
-    | IGSSuspended     -- ^ SUSPENDED
-    | IGSTerminated    -- ^ TERMINATED
-    | IGSTerminating   -- ^ TERMINATING
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceGroupState
-
-instance FromText InstanceGroupState where
-    parser = takeLowerText >>= \case
-        "arrested"      -> pure IGSArrested
-        "bootstrapping" -> pure IGSBootstrapping
-        "ended"         -> pure IGSEnded
-        "provisioning"  -> pure IGSProvisioning
-        "resizing"      -> pure IGSResizing
-        "running"       -> pure IGSRunning
-        "shutting_down" -> pure IGSShuttingDown
-        "suspended"     -> pure IGSSuspended
-        "terminated"    -> pure IGSTerminated
-        "terminating"   -> pure IGSTerminating
-        e               -> fail $
-            "Failure parsing InstanceGroupState from " ++ show e
-
-instance ToText InstanceGroupState where
-    toText = \case
-        IGSArrested      -> "ARRESTED"
-        IGSBootstrapping -> "BOOTSTRAPPING"
-        IGSEnded         -> "ENDED"
-        IGSProvisioning  -> "PROVISIONING"
-        IGSResizing      -> "RESIZING"
-        IGSRunning       -> "RUNNING"
-        IGSShuttingDown  -> "SHUTTING_DOWN"
-        IGSSuspended     -> "SUSPENDED"
-        IGSTerminated    -> "TERMINATED"
-        IGSTerminating   -> "TERMINATING"
-
-instance ToByteString InstanceGroupState
-instance ToHeader     InstanceGroupState
-instance ToQuery      InstanceGroupState
-
-instance FromJSON InstanceGroupState where
-    parseJSON = parseJSONText "InstanceGroupState"
-
-instance ToJSON InstanceGroupState where
-    toJSON = toJSONText
-
-data StepTimeline = StepTimeline
-    { _stCreationDateTime :: Maybe POSIX
-    , _stEndDateTime      :: Maybe POSIX
-    , _stStartDateTime    :: Maybe POSIX
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'StepTimeline' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'stCreationDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'stEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'stStartDateTime' @::@ 'Maybe' 'UTCTime'
---
-stepTimeline :: StepTimeline
-stepTimeline = StepTimeline
-    { _stCreationDateTime = Nothing
-    , _stStartDateTime    = Nothing
-    , _stEndDateTime      = Nothing
-    }
-
--- | The date and time when the cluster step was created.
-stCreationDateTime :: Lens' StepTimeline (Maybe UTCTime)
-stCreationDateTime =
-    lens _stCreationDateTime (\s a -> s { _stCreationDateTime = a })
-        . mapping _Time
-
--- | The date and time when the cluster step execution completed or failed.
-stEndDateTime :: Lens' StepTimeline (Maybe UTCTime)
-stEndDateTime = lens _stEndDateTime (\s a -> s { _stEndDateTime = a }) . mapping _Time
-
--- | The date and time when the cluster step execution started.
-stStartDateTime :: Lens' StepTimeline (Maybe UTCTime)
-stStartDateTime = lens _stStartDateTime (\s a -> s { _stStartDateTime = a }) . mapping _Time
-
-instance FromJSON StepTimeline where
-    parseJSON = withObject "StepTimeline" $ \o -> StepTimeline
-        <$> o .:? "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "StartDateTime"
-
-instance ToJSON StepTimeline where
-    toJSON StepTimeline{..} = object
-        [ "CreationDateTime" .= _stCreationDateTime
-        , "StartDateTime"    .= _stStartDateTime
-        , "EndDateTime"      .= _stEndDateTime
-        ]
-
-newtype PlacementType = PlacementType
-    { _ptAvailabilityZone :: Text
-    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
-
--- | 'PlacementType' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ptAvailabilityZone' @::@ 'Text'
---
-placementType :: Text -- ^ 'ptAvailabilityZone'
-              -> PlacementType
-placementType p1 = PlacementType
-    { _ptAvailabilityZone = p1
-    }
-
--- | The Amazon EC2 Availability Zone for the job flow.
-ptAvailabilityZone :: Lens' PlacementType Text
-ptAvailabilityZone =
-    lens _ptAvailabilityZone (\s a -> s { _ptAvailabilityZone = a })
-
-instance FromJSON PlacementType where
-    parseJSON = withObject "PlacementType" $ \o -> PlacementType
-        <$> o .:  "AvailabilityZone"
-
-instance ToJSON PlacementType where
-    toJSON PlacementType{..} = object
-        [ "AvailabilityZone" .= _ptAvailabilityZone
-        ]
-
-data HadoopJarStepConfig = HadoopJarStepConfig
-    { _hjscArgs       :: List "Args" Text
-    , _hjscJar        :: Text
-    , _hjscMainClass  :: Maybe Text
-    , _hjscProperties :: List "Properties" KeyValue
-    } deriving (Eq, Read, Show)
-
--- | 'HadoopJarStepConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'hjscArgs' @::@ ['Text']
---
--- * 'hjscJar' @::@ 'Text'
---
--- * 'hjscMainClass' @::@ 'Maybe' 'Text'
---
--- * 'hjscProperties' @::@ ['KeyValue']
---
-hadoopJarStepConfig :: Text -- ^ 'hjscJar'
-                    -> HadoopJarStepConfig
-hadoopJarStepConfig p1 = HadoopJarStepConfig
-    { _hjscJar        = p1
-    , _hjscProperties = mempty
-    , _hjscMainClass  = Nothing
-    , _hjscArgs       = mempty
-    }
-
--- | A list of command line arguments passed to the JAR file's main function when
--- executed.
-hjscArgs :: Lens' HadoopJarStepConfig [Text]
-hjscArgs = lens _hjscArgs (\s a -> s { _hjscArgs = a }) . _List
-
--- | A path to a JAR file run during the step.
-hjscJar :: Lens' HadoopJarStepConfig Text
-hjscJar = lens _hjscJar (\s a -> s { _hjscJar = a })
-
--- | The name of the main class in the specified Java file. If not specified, the
--- JAR file should specify a Main-Class in its manifest file.
-hjscMainClass :: Lens' HadoopJarStepConfig (Maybe Text)
-hjscMainClass = lens _hjscMainClass (\s a -> s { _hjscMainClass = a })
-
--- | A list of Java properties that are set when the step runs. You can use these
--- properties to pass key value pairs to your main function.
-hjscProperties :: Lens' HadoopJarStepConfig [KeyValue]
-hjscProperties = lens _hjscProperties (\s a -> s { _hjscProperties = a }) . _List
-
-instance FromJSON HadoopJarStepConfig where
-    parseJSON = withObject "HadoopJarStepConfig" $ \o -> HadoopJarStepConfig
-        <$> o .:? "Args" .!= mempty
-        <*> o .:  "Jar"
-        <*> o .:? "MainClass"
-        <*> o .:? "Properties" .!= mempty
-
-instance ToJSON HadoopJarStepConfig where
-    toJSON HadoopJarStepConfig{..} = object
-        [ "Properties" .= _hjscProperties
-        , "Jar"        .= _hjscJar
-        , "MainClass"  .= _hjscMainClass
-        , "Args"       .= _hjscArgs
-        ]
-
-data InstanceGroupModifyConfig = InstanceGroupModifyConfig
-    { _igmcEC2InstanceIdsToTerminate :: List "EC2InstanceIdsToTerminate" Text
-    , _igmcInstanceCount             :: Maybe Int
-    , _igmcInstanceGroupId           :: Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'InstanceGroupModifyConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igmcEC2InstanceIdsToTerminate' @::@ ['Text']
---
--- * 'igmcInstanceCount' @::@ 'Maybe' 'Int'
---
--- * 'igmcInstanceGroupId' @::@ 'Text'
---
-instanceGroupModifyConfig :: Text -- ^ 'igmcInstanceGroupId'
-                          -> InstanceGroupModifyConfig
-instanceGroupModifyConfig p1 = InstanceGroupModifyConfig
-    { _igmcInstanceGroupId           = p1
-    , _igmcInstanceCount             = Nothing
-    , _igmcEC2InstanceIdsToTerminate = mempty
-    }
-
--- | The EC2 InstanceIds to terminate. For advanced users only. Once you terminate
--- the instances, the instance group will not return to its original requested
--- size.
-igmcEC2InstanceIdsToTerminate :: Lens' InstanceGroupModifyConfig [Text]
-igmcEC2InstanceIdsToTerminate =
-    lens _igmcEC2InstanceIdsToTerminate
-        (\s a -> s { _igmcEC2InstanceIdsToTerminate = a })
-            . _List
-
--- | Target size for the instance group.
-igmcInstanceCount :: Lens' InstanceGroupModifyConfig (Maybe Int)
-igmcInstanceCount =
-    lens _igmcInstanceCount (\s a -> s { _igmcInstanceCount = a })
-
--- | Unique ID of the instance group to expand or shrink.
-igmcInstanceGroupId :: Lens' InstanceGroupModifyConfig Text
-igmcInstanceGroupId =
-    lens _igmcInstanceGroupId (\s a -> s { _igmcInstanceGroupId = a })
-
-instance FromJSON InstanceGroupModifyConfig where
-    parseJSON = withObject "InstanceGroupModifyConfig" $ \o -> InstanceGroupModifyConfig
-        <$> o .:? "EC2InstanceIdsToTerminate" .!= mempty
-        <*> o .:? "InstanceCount"
-        <*> o .:  "InstanceGroupId"
-
-instance ToJSON InstanceGroupModifyConfig where
-    toJSON InstanceGroupModifyConfig{..} = object
-        [ "InstanceGroupId"           .= _igmcInstanceGroupId
-        , "InstanceCount"             .= _igmcInstanceCount
-        , "EC2InstanceIdsToTerminate" .= _igmcEC2InstanceIdsToTerminate
-        ]
-
-data InstanceGroupDetail = InstanceGroupDetail
-    { _igdBidPrice              :: Maybe Text
-    , _igdCreationDateTime      :: POSIX
-    , _igdEndDateTime           :: Maybe POSIX
-    , _igdInstanceGroupId       :: Maybe Text
-    , _igdInstanceRequestCount  :: Int
-    , _igdInstanceRole          :: InstanceRoleType
-    , _igdInstanceRunningCount  :: Int
-    , _igdInstanceType          :: Text
-    , _igdLastStateChangeReason :: Maybe Text
-    , _igdMarket                :: MarketType
-    , _igdName                  :: Maybe Text
-    , _igdReadyDateTime         :: Maybe POSIX
-    , _igdStartDateTime         :: Maybe POSIX
-    , _igdState                 :: InstanceGroupState
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceGroupDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igdBidPrice' @::@ 'Maybe' 'Text'
---
--- * 'igdCreationDateTime' @::@ 'UTCTime'
---
--- * 'igdEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'igdInstanceGroupId' @::@ 'Maybe' 'Text'
---
--- * 'igdInstanceRequestCount' @::@ 'Int'
---
--- * 'igdInstanceRole' @::@ 'InstanceRoleType'
---
--- * 'igdInstanceRunningCount' @::@ 'Int'
---
--- * 'igdInstanceType' @::@ 'Text'
---
--- * 'igdLastStateChangeReason' @::@ 'Maybe' 'Text'
---
--- * 'igdMarket' @::@ 'MarketType'
---
--- * 'igdName' @::@ 'Maybe' 'Text'
---
--- * 'igdReadyDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'igdStartDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'igdState' @::@ 'InstanceGroupState'
---
-instanceGroupDetail :: MarketType -- ^ 'igdMarket'
-                    -> InstanceRoleType -- ^ 'igdInstanceRole'
-                    -> Text -- ^ 'igdInstanceType'
-                    -> Int -- ^ 'igdInstanceRequestCount'
-                    -> Int -- ^ 'igdInstanceRunningCount'
-                    -> InstanceGroupState -- ^ 'igdState'
-                    -> UTCTime -- ^ 'igdCreationDateTime'
-                    -> InstanceGroupDetail
-instanceGroupDetail p1 p2 p3 p4 p5 p6 p7 = InstanceGroupDetail
-    { _igdMarket                = p1
-    , _igdInstanceRole          = p2
-    , _igdInstanceType          = p3
-    , _igdInstanceRequestCount  = p4
-    , _igdInstanceRunningCount  = p5
-    , _igdState                 = p6
-    , _igdCreationDateTime      = withIso _Time (const id) p7
-    , _igdInstanceGroupId       = Nothing
-    , _igdName                  = Nothing
-    , _igdBidPrice              = Nothing
-    , _igdLastStateChangeReason = Nothing
-    , _igdStartDateTime         = Nothing
-    , _igdReadyDateTime         = Nothing
-    , _igdEndDateTime           = Nothing
-    }
-
--- | Bid price for EC2 Instances when launching nodes as Spot Instances, expressed
--- in USD.
-igdBidPrice :: Lens' InstanceGroupDetail (Maybe Text)
-igdBidPrice = lens _igdBidPrice (\s a -> s { _igdBidPrice = a })
-
--- | The date/time the instance group was created.
-igdCreationDateTime :: Lens' InstanceGroupDetail UTCTime
-igdCreationDateTime =
-    lens _igdCreationDateTime (\s a -> s { _igdCreationDateTime = a })
-        . _Time
-
--- | The date/time the instance group was terminated.
-igdEndDateTime :: Lens' InstanceGroupDetail (Maybe UTCTime)
-igdEndDateTime = lens _igdEndDateTime (\s a -> s { _igdEndDateTime = a }) . mapping _Time
-
--- | Unique identifier for the instance group.
-igdInstanceGroupId :: Lens' InstanceGroupDetail (Maybe Text)
-igdInstanceGroupId =
-    lens _igdInstanceGroupId (\s a -> s { _igdInstanceGroupId = a })
-
--- | Target number of instances to run in the instance group.
-igdInstanceRequestCount :: Lens' InstanceGroupDetail Int
-igdInstanceRequestCount =
-    lens _igdInstanceRequestCount (\s a -> s { _igdInstanceRequestCount = a })
-
--- | Instance group role in the cluster
-igdInstanceRole :: Lens' InstanceGroupDetail InstanceRoleType
-igdInstanceRole = lens _igdInstanceRole (\s a -> s { _igdInstanceRole = a })
-
--- | Actual count of running instances.
-igdInstanceRunningCount :: Lens' InstanceGroupDetail Int
-igdInstanceRunningCount =
-    lens _igdInstanceRunningCount (\s a -> s { _igdInstanceRunningCount = a })
-
--- | Amazon EC2 Instance type.
-igdInstanceType :: Lens' InstanceGroupDetail Text
-igdInstanceType = lens _igdInstanceType (\s a -> s { _igdInstanceType = a })
-
--- | Details regarding the state of the instance group.
-igdLastStateChangeReason :: Lens' InstanceGroupDetail (Maybe Text)
-igdLastStateChangeReason =
-    lens _igdLastStateChangeReason
-        (\s a -> s { _igdLastStateChangeReason = a })
-
--- | Market type of the Amazon EC2 instances used to create a cluster node.
-igdMarket :: Lens' InstanceGroupDetail MarketType
-igdMarket = lens _igdMarket (\s a -> s { _igdMarket = a })
-
--- | Friendly name for the instance group.
-igdName :: Lens' InstanceGroupDetail (Maybe Text)
-igdName = lens _igdName (\s a -> s { _igdName = a })
-
--- | The date/time the instance group was available to the cluster.
-igdReadyDateTime :: Lens' InstanceGroupDetail (Maybe UTCTime)
-igdReadyDateTime = lens _igdReadyDateTime (\s a -> s { _igdReadyDateTime = a }) . mapping _Time
-
--- | The date/time the instance group was started.
-igdStartDateTime :: Lens' InstanceGroupDetail (Maybe UTCTime)
-igdStartDateTime = lens _igdStartDateTime (\s a -> s { _igdStartDateTime = a }) . mapping _Time
-
--- | State of instance group. The following values are deprecated: STARTING,
--- TERMINATED, and FAILED.
-igdState :: Lens' InstanceGroupDetail InstanceGroupState
-igdState = lens _igdState (\s a -> s { _igdState = a })
-
-instance FromJSON InstanceGroupDetail where
-    parseJSON = withObject "InstanceGroupDetail" $ \o -> InstanceGroupDetail
-        <$> o .:? "BidPrice"
-        <*> o .:  "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "InstanceGroupId"
-        <*> o .:  "InstanceRequestCount"
-        <*> o .:  "InstanceRole"
-        <*> o .:  "InstanceRunningCount"
-        <*> o .:  "InstanceType"
-        <*> o .:? "LastStateChangeReason"
-        <*> o .:  "Market"
-        <*> o .:? "Name"
-        <*> o .:? "ReadyDateTime"
-        <*> o .:? "StartDateTime"
-        <*> o .:  "State"
-
-instance ToJSON InstanceGroupDetail where
-    toJSON InstanceGroupDetail{..} = object
-        [ "InstanceGroupId"       .= _igdInstanceGroupId
-        , "Name"                  .= _igdName
-        , "Market"                .= _igdMarket
-        , "InstanceRole"          .= _igdInstanceRole
-        , "BidPrice"              .= _igdBidPrice
-        , "InstanceType"          .= _igdInstanceType
-        , "InstanceRequestCount"  .= _igdInstanceRequestCount
-        , "InstanceRunningCount"  .= _igdInstanceRunningCount
-        , "State"                 .= _igdState
-        , "LastStateChangeReason" .= _igdLastStateChangeReason
-        , "CreationDateTime"      .= _igdCreationDateTime
-        , "StartDateTime"         .= _igdStartDateTime
-        , "ReadyDateTime"         .= _igdReadyDateTime
-        , "EndDateTime"           .= _igdEndDateTime
-        ]
-
-data StepStateChangeReason = StepStateChangeReason
-    { _sscrCode    :: Maybe StepStateChangeReasonCode
-    , _sscrMessage :: Maybe Text
-    } deriving (Eq, Read, Show)
-
--- | 'StepStateChangeReason' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sscrCode' @::@ 'Maybe' 'StepStateChangeReasonCode'
---
--- * 'sscrMessage' @::@ 'Maybe' 'Text'
---
-stepStateChangeReason :: StepStateChangeReason
-stepStateChangeReason = StepStateChangeReason
-    { _sscrCode    = Nothing
-    , _sscrMessage = Nothing
-    }
-
--- | The programmable code for the state change reason.
-sscrCode :: Lens' StepStateChangeReason (Maybe StepStateChangeReasonCode)
-sscrCode = lens _sscrCode (\s a -> s { _sscrCode = a })
-
--- | The descriptive message for the state change reason.
-sscrMessage :: Lens' StepStateChangeReason (Maybe Text)
-sscrMessage = lens _sscrMessage (\s a -> s { _sscrMessage = a })
-
-instance FromJSON StepStateChangeReason where
-    parseJSON = withObject "StepStateChangeReason" $ \o -> StepStateChangeReason
-        <$> o .:? "Code"
-        <*> o .:? "Message"
-
-instance ToJSON StepStateChangeReason where
-    toJSON StepStateChangeReason{..} = object
-        [ "Code"    .= _sscrCode
-        , "Message" .= _sscrMessage
-        ]
-
-data ClusterStateChangeReasonCode
-    = CSCRCAllStepsCompleted -- ^ ALL_STEPS_COMPLETED
-    | CSCRCBootstrapFailure  -- ^ BOOTSTRAP_FAILURE
-    | CSCRCInstanceFailure   -- ^ INSTANCE_FAILURE
-    | CSCRCInternalError     -- ^ INTERNAL_ERROR
-    | CSCRCStepFailure       -- ^ STEP_FAILURE
-    | CSCRCUserRequest       -- ^ USER_REQUEST
-    | CSCRCValidationError   -- ^ VALIDATION_ERROR
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable ClusterStateChangeReasonCode
-
-instance FromText ClusterStateChangeReasonCode where
-    parser = takeLowerText >>= \case
-        "all_steps_completed" -> pure CSCRCAllStepsCompleted
-        "bootstrap_failure"   -> pure CSCRCBootstrapFailure
-        "instance_failure"    -> pure CSCRCInstanceFailure
-        "internal_error"      -> pure CSCRCInternalError
-        "step_failure"        -> pure CSCRCStepFailure
-        "user_request"        -> pure CSCRCUserRequest
-        "validation_error"    -> pure CSCRCValidationError
-        e                     -> fail $
-            "Failure parsing ClusterStateChangeReasonCode from " ++ show e
-
-instance ToText ClusterStateChangeReasonCode where
-    toText = \case
-        CSCRCAllStepsCompleted -> "ALL_STEPS_COMPLETED"
-        CSCRCBootstrapFailure  -> "BOOTSTRAP_FAILURE"
-        CSCRCInstanceFailure   -> "INSTANCE_FAILURE"
-        CSCRCInternalError     -> "INTERNAL_ERROR"
-        CSCRCStepFailure       -> "STEP_FAILURE"
-        CSCRCUserRequest       -> "USER_REQUEST"
-        CSCRCValidationError   -> "VALIDATION_ERROR"
-
-instance ToByteString ClusterStateChangeReasonCode
-instance ToHeader     ClusterStateChangeReasonCode
-instance ToQuery      ClusterStateChangeReasonCode
-
-instance FromJSON ClusterStateChangeReasonCode where
-    parseJSON = parseJSONText "ClusterStateChangeReasonCode"
-
-instance ToJSON ClusterStateChangeReasonCode where
-    toJSON = toJSONText
-
-data Step = Step
-    { _sActionOnFailure :: Maybe ActionOnFailure
-    , _sConfig          :: Maybe HadoopStepConfig
-    , _sId              :: Maybe Text
-    , _sName            :: Maybe Text
-    , _sStatus          :: Maybe StepStatus
-    } deriving (Eq, Read, Show)
-
--- | 'Step' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sActionOnFailure' @::@ 'Maybe' 'ActionOnFailure'
---
--- * 'sConfig' @::@ 'Maybe' 'HadoopStepConfig'
---
--- * 'sId' @::@ 'Maybe' 'Text'
---
--- * 'sName' @::@ 'Maybe' 'Text'
---
--- * 'sStatus' @::@ 'Maybe' 'StepStatus'
---
-step :: Step
-step = Step
-    { _sId              = Nothing
-    , _sName            = Nothing
-    , _sConfig          = Nothing
-    , _sActionOnFailure = Nothing
-    , _sStatus          = Nothing
-    }
-
--- | This specifies what action to take when the cluster step fails. Possible
--- values are TERMINATE_CLUSTER, CANCEL_AND_WAIT, and CONTINUE.
-sActionOnFailure :: Lens' Step (Maybe ActionOnFailure)
-sActionOnFailure = lens _sActionOnFailure (\s a -> s { _sActionOnFailure = a })
-
--- | The Hadoop job configuration of the cluster step.
-sConfig :: Lens' Step (Maybe HadoopStepConfig)
-sConfig = lens _sConfig (\s a -> s { _sConfig = a })
-
--- | The identifier of the cluster step.
-sId :: Lens' Step (Maybe Text)
-sId = lens _sId (\s a -> s { _sId = a })
-
--- | The name of the cluster step.
-sName :: Lens' Step (Maybe Text)
-sName = lens _sName (\s a -> s { _sName = a })
-
--- | The current execution status details of the cluster step.
-sStatus :: Lens' Step (Maybe StepStatus)
-sStatus = lens _sStatus (\s a -> s { _sStatus = a })
-
-instance FromJSON Step where
-    parseJSON = withObject "Step" $ \o -> Step
-        <$> o .:? "ActionOnFailure"
-        <*> o .:? "Config"
-        <*> o .:? "Id"
-        <*> o .:? "Name"
-        <*> o .:? "Status"
-
-instance ToJSON Step where
-    toJSON Step{..} = object
-        [ "Id"              .= _sId
-        , "Name"            .= _sName
-        , "Config"          .= _sConfig
-        , "ActionOnFailure" .= _sActionOnFailure
-        , "Status"          .= _sStatus
-        ]
-
-data StepState
-    = SSCancelled   -- ^ CANCELLED
-    | SSCompleted   -- ^ COMPLETED
-    | SSFailed      -- ^ FAILED
-    | SSInterrupted -- ^ INTERRUPTED
-    | SSPending     -- ^ PENDING
-    | SSRunning     -- ^ RUNNING
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable StepState
-
-instance FromText StepState where
-    parser = takeLowerText >>= \case
-        "cancelled"   -> pure SSCancelled
-        "completed"   -> pure SSCompleted
-        "failed"      -> pure SSFailed
-        "interrupted" -> pure SSInterrupted
-        "pending"     -> pure SSPending
-        "running"     -> pure SSRunning
-        e             -> fail $
-            "Failure parsing StepState from " ++ show e
-
-instance ToText StepState where
-    toText = \case
-        SSCancelled   -> "CANCELLED"
-        SSCompleted   -> "COMPLETED"
-        SSFailed      -> "FAILED"
-        SSInterrupted -> "INTERRUPTED"
-        SSPending     -> "PENDING"
-        SSRunning     -> "RUNNING"
-
-instance ToByteString StepState
-instance ToHeader     StepState
-instance ToQuery      StepState
-
-instance FromJSON StepState where
-    parseJSON = parseJSONText "StepState"
-
-instance ToJSON StepState where
-    toJSON = toJSONText
-
-data InstanceGroupTimeline = InstanceGroupTimeline
-    { _igtCreationDateTime :: Maybe POSIX
-    , _igtEndDateTime      :: Maybe POSIX
-    , _igtReadyDateTime    :: Maybe POSIX
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'InstanceGroupTimeline' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igtCreationDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'igtEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'igtReadyDateTime' @::@ 'Maybe' 'UTCTime'
---
-instanceGroupTimeline :: InstanceGroupTimeline
-instanceGroupTimeline = InstanceGroupTimeline
-    { _igtCreationDateTime = Nothing
-    , _igtReadyDateTime    = Nothing
-    , _igtEndDateTime      = Nothing
-    }
-
--- | The creation date and time of the instance group.
-igtCreationDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
-igtCreationDateTime =
-    lens _igtCreationDateTime (\s a -> s { _igtCreationDateTime = a })
-        . mapping _Time
-
--- | The date and time when the instance group terminated.
-igtEndDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
-igtEndDateTime = lens _igtEndDateTime (\s a -> s { _igtEndDateTime = a }) . mapping _Time
-
--- | The date and time when the instance group became ready to perform tasks.
-igtReadyDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
-igtReadyDateTime = lens _igtReadyDateTime (\s a -> s { _igtReadyDateTime = a }) . mapping _Time
-
-instance FromJSON InstanceGroupTimeline where
-    parseJSON = withObject "InstanceGroupTimeline" $ \o -> InstanceGroupTimeline
-        <$> o .:? "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "ReadyDateTime"
-
-instance ToJSON InstanceGroupTimeline where
-    toJSON InstanceGroupTimeline{..} = object
-        [ "CreationDateTime" .= _igtCreationDateTime
-        , "ReadyDateTime"    .= _igtReadyDateTime
-        , "EndDateTime"      .= _igtEndDateTime
-        ]
-
-newtype BootstrapActionDetail = BootstrapActionDetail
-    { _badBootstrapActionConfig :: Maybe BootstrapActionConfig
-    } deriving (Eq, Read, Show)
-
--- | 'BootstrapActionDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'badBootstrapActionConfig' @::@ 'Maybe' 'BootstrapActionConfig'
---
-bootstrapActionDetail :: BootstrapActionDetail
-bootstrapActionDetail = BootstrapActionDetail
-    { _badBootstrapActionConfig = Nothing
-    }
-
--- | A description of the bootstrap action.
-badBootstrapActionConfig :: Lens' BootstrapActionDetail (Maybe BootstrapActionConfig)
-badBootstrapActionConfig =
-    lens _badBootstrapActionConfig
-        (\s a -> s { _badBootstrapActionConfig = a })
-
-instance FromJSON BootstrapActionDetail where
-    parseJSON = withObject "BootstrapActionDetail" $ \o -> BootstrapActionDetail
-        <$> o .:? "BootstrapActionConfig"
-
-instance ToJSON BootstrapActionDetail where
-    toJSON BootstrapActionDetail{..} = object
-        [ "BootstrapActionConfig" .= _badBootstrapActionConfig
-        ]
-
-data StepExecutionStatusDetail = StepExecutionStatusDetail
-    { _sesdCreationDateTime      :: POSIX
-    , _sesdEndDateTime           :: Maybe POSIX
-    , _sesdLastStateChangeReason :: Maybe Text
-    , _sesdStartDateTime         :: Maybe POSIX
-    , _sesdState                 :: StepExecutionState
-    } deriving (Eq, Read, Show)
-
--- | 'StepExecutionStatusDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sesdCreationDateTime' @::@ 'UTCTime'
---
--- * 'sesdEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'sesdLastStateChangeReason' @::@ 'Maybe' 'Text'
---
--- * 'sesdStartDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'sesdState' @::@ 'StepExecutionState'
---
-stepExecutionStatusDetail :: StepExecutionState -- ^ 'sesdState'
-                          -> UTCTime -- ^ 'sesdCreationDateTime'
-                          -> StepExecutionStatusDetail
-stepExecutionStatusDetail p1 p2 = StepExecutionStatusDetail
-    { _sesdState                 = p1
-    , _sesdCreationDateTime      = withIso _Time (const id) p2
-    , _sesdStartDateTime         = Nothing
-    , _sesdEndDateTime           = Nothing
-    , _sesdLastStateChangeReason = Nothing
-    }
-
--- | The creation date and time of the step.
-sesdCreationDateTime :: Lens' StepExecutionStatusDetail UTCTime
-sesdCreationDateTime =
-    lens _sesdCreationDateTime (\s a -> s { _sesdCreationDateTime = a })
-        . _Time
-
--- | The completion date and time of the step.
-sesdEndDateTime :: Lens' StepExecutionStatusDetail (Maybe UTCTime)
-sesdEndDateTime = lens _sesdEndDateTime (\s a -> s { _sesdEndDateTime = a }) . mapping _Time
-
--- | A description of the step's current state.
-sesdLastStateChangeReason :: Lens' StepExecutionStatusDetail (Maybe Text)
-sesdLastStateChangeReason =
-    lens _sesdLastStateChangeReason
-        (\s a -> s { _sesdLastStateChangeReason = a })
-
--- | The start date and time of the step.
-sesdStartDateTime :: Lens' StepExecutionStatusDetail (Maybe UTCTime)
-sesdStartDateTime =
-    lens _sesdStartDateTime (\s a -> s { _sesdStartDateTime = a })
-        . mapping _Time
-
--- | The state of the job flow step.
-sesdState :: Lens' StepExecutionStatusDetail StepExecutionState
-sesdState = lens _sesdState (\s a -> s { _sesdState = a })
-
-instance FromJSON StepExecutionStatusDetail where
-    parseJSON = withObject "StepExecutionStatusDetail" $ \o -> StepExecutionStatusDetail
-        <$> o .:  "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "LastStateChangeReason"
-        <*> o .:? "StartDateTime"
-        <*> o .:  "State"
-
-instance ToJSON StepExecutionStatusDetail where
-    toJSON StepExecutionStatusDetail{..} = object
-        [ "State"                 .= _sesdState
-        , "CreationDateTime"      .= _sesdCreationDateTime
-        , "StartDateTime"         .= _sesdStartDateTime
-        , "EndDateTime"           .= _sesdEndDateTime
-        , "LastStateChangeReason" .= _sesdLastStateChangeReason
-        ]
-
-data InstanceStatus = InstanceStatus
-    { _isState             :: Maybe InstanceState
-    , _isStateChangeReason :: Maybe InstanceStateChangeReason
-    , _isTimeline          :: Maybe InstanceTimeline
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceStatus' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'isState' @::@ 'Maybe' 'InstanceState'
---
--- * 'isStateChangeReason' @::@ 'Maybe' 'InstanceStateChangeReason'
---
--- * 'isTimeline' @::@ 'Maybe' 'InstanceTimeline'
---
-instanceStatus :: InstanceStatus
-instanceStatus = InstanceStatus
-    { _isState             = Nothing
-    , _isStateChangeReason = Nothing
-    , _isTimeline          = Nothing
-    }
-
--- | The current state of the instance.
-isState :: Lens' InstanceStatus (Maybe InstanceState)
-isState = lens _isState (\s a -> s { _isState = a })
-
--- | The details of the status change reason for the instance.
-isStateChangeReason :: Lens' InstanceStatus (Maybe InstanceStateChangeReason)
-isStateChangeReason =
-    lens _isStateChangeReason (\s a -> s { _isStateChangeReason = a })
-
--- | The timeline of the instance status over time.
-isTimeline :: Lens' InstanceStatus (Maybe InstanceTimeline)
-isTimeline = lens _isTimeline (\s a -> s { _isTimeline = a })
-
-instance FromJSON InstanceStatus where
-    parseJSON = withObject "InstanceStatus" $ \o -> InstanceStatus
-        <$> o .:? "State"
-        <*> o .:? "StateChangeReason"
-        <*> o .:? "Timeline"
-
-instance ToJSON InstanceStatus where
-    toJSON InstanceStatus{..} = object
-        [ "State"             .= _isState
-        , "StateChangeReason" .= _isStateChangeReason
-        , "Timeline"          .= _isTimeline
-        ]
-
-data InstanceRoleType
-    = IRTCore   -- ^ CORE
-    | IRTMaster -- ^ MASTER
-    | IRTTask   -- ^ TASK
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceRoleType
-
-instance FromText InstanceRoleType where
-    parser = takeLowerText >>= \case
-        "core"   -> pure IRTCore
-        "master" -> pure IRTMaster
-        "task"   -> pure IRTTask
-        e        -> fail $
-            "Failure parsing InstanceRoleType from " ++ show e
-
-instance ToText InstanceRoleType where
-    toText = \case
-        IRTCore   -> "CORE"
-        IRTMaster -> "MASTER"
-        IRTTask   -> "TASK"
-
-instance ToByteString InstanceRoleType
-instance ToHeader     InstanceRoleType
-instance ToQuery      InstanceRoleType
-
-instance FromJSON InstanceRoleType where
-    parseJSON = parseJSONText "InstanceRoleType"
-
-instance ToJSON InstanceRoleType where
-    toJSON = toJSONText
-
-data JobFlowInstancesConfig = JobFlowInstancesConfig
-    { _jficAdditionalMasterSecurityGroups :: List "AdditionalMasterSecurityGroups" Text
-    , _jficAdditionalSlaveSecurityGroups  :: List "AdditionalSlaveSecurityGroups" Text
-    , _jficEc2KeyName                     :: Maybe Text
-    , _jficEc2SubnetId                    :: Maybe Text
-    , _jficEmrManagedMasterSecurityGroup  :: Maybe Text
-    , _jficEmrManagedSlaveSecurityGroup   :: Maybe Text
-    , _jficHadoopVersion                  :: Maybe Text
-    , _jficInstanceCount                  :: Maybe Int
-    , _jficInstanceGroups                 :: List "InstanceGroups" InstanceGroupConfig
-    , _jficKeepJobFlowAliveWhenNoSteps    :: Maybe Bool
-    , _jficMasterInstanceType             :: Maybe Text
-    , _jficPlacement                      :: Maybe PlacementType
-    , _jficSlaveInstanceType              :: Maybe Text
-    , _jficTerminationProtected           :: Maybe Bool
-    } deriving (Eq, Read, Show)
-
--- | 'JobFlowInstancesConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'jficAdditionalMasterSecurityGroups' @::@ ['Text']
---
--- * 'jficAdditionalSlaveSecurityGroups' @::@ ['Text']
---
--- * 'jficEc2KeyName' @::@ 'Maybe' 'Text'
---
--- * 'jficEc2SubnetId' @::@ 'Maybe' 'Text'
---
--- * 'jficEmrManagedMasterSecurityGroup' @::@ 'Maybe' 'Text'
---
--- * 'jficEmrManagedSlaveSecurityGroup' @::@ 'Maybe' 'Text'
---
--- * 'jficHadoopVersion' @::@ 'Maybe' 'Text'
---
--- * 'jficInstanceCount' @::@ 'Maybe' 'Int'
---
--- * 'jficInstanceGroups' @::@ ['InstanceGroupConfig']
---
--- * 'jficKeepJobFlowAliveWhenNoSteps' @::@ 'Maybe' 'Bool'
---
--- * 'jficMasterInstanceType' @::@ 'Maybe' 'Text'
---
--- * 'jficPlacement' @::@ 'Maybe' 'PlacementType'
---
--- * 'jficSlaveInstanceType' @::@ 'Maybe' 'Text'
---
--- * 'jficTerminationProtected' @::@ 'Maybe' 'Bool'
---
-jobFlowInstancesConfig :: JobFlowInstancesConfig
-jobFlowInstancesConfig = JobFlowInstancesConfig
-    { _jficMasterInstanceType             = Nothing
-    , _jficSlaveInstanceType              = Nothing
-    , _jficInstanceCount                  = Nothing
-    , _jficInstanceGroups                 = mempty
-    , _jficEc2KeyName                     = Nothing
-    , _jficPlacement                      = Nothing
-    , _jficKeepJobFlowAliveWhenNoSteps    = Nothing
-    , _jficTerminationProtected           = Nothing
-    , _jficHadoopVersion                  = Nothing
-    , _jficEc2SubnetId                    = Nothing
-    , _jficEmrManagedMasterSecurityGroup  = Nothing
-    , _jficEmrManagedSlaveSecurityGroup   = Nothing
-    , _jficAdditionalMasterSecurityGroups = mempty
-    , _jficAdditionalSlaveSecurityGroups  = mempty
-    }
-
--- | A list of additional Amazon EC2 security group IDs for the master node.
-jficAdditionalMasterSecurityGroups :: Lens' JobFlowInstancesConfig [Text]
-jficAdditionalMasterSecurityGroups =
-    lens _jficAdditionalMasterSecurityGroups
-        (\s a -> s { _jficAdditionalMasterSecurityGroups = a })
-            . _List
-
--- | A list of additional Amazon EC2 security group IDs for the slave nodes.
-jficAdditionalSlaveSecurityGroups :: Lens' JobFlowInstancesConfig [Text]
-jficAdditionalSlaveSecurityGroups =
-    lens _jficAdditionalSlaveSecurityGroups
-        (\s a -> s { _jficAdditionalSlaveSecurityGroups = a })
-            . _List
-
--- | The name of the Amazon EC2 key pair that can be used to ssh to the master
--- node as the user called "hadoop."
-jficEc2KeyName :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficEc2KeyName = lens _jficEc2KeyName (\s a -> s { _jficEc2KeyName = a })
-
--- | To launch the job flow in Amazon Virtual Private Cloud (Amazon VPC), set
--- this parameter to the identifier of the Amazon VPC subnet where you want the
--- job flow to launch. If you do not specify this value, the job flow is
--- launched in the normal Amazon Web Services cloud, outside of an Amazon VPC.
---
--- Amazon VPC currently does not support cluster compute quadruple extra large
--- (cc1.4xlarge) instances. Thus you cannot specify the cc1.4xlarge instance
--- type for nodes of a job flow launched in a Amazon VPC.
-jficEc2SubnetId :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficEc2SubnetId = lens _jficEc2SubnetId (\s a -> s { _jficEc2SubnetId = a })
-
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- ElasticMapReduce) for the master node.
-jficEmrManagedMasterSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficEmrManagedMasterSecurityGroup =
-    lens _jficEmrManagedMasterSecurityGroup
-        (\s a -> s { _jficEmrManagedMasterSecurityGroup = a })
-
--- | The identifier of the Amazon EC2 security group (managed by Amazon
--- ElasticMapReduce) for the slave nodes.
-jficEmrManagedSlaveSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficEmrManagedSlaveSecurityGroup =
-    lens _jficEmrManagedSlaveSecurityGroup
-        (\s a -> s { _jficEmrManagedSlaveSecurityGroup = a })
-
--- | The Hadoop version for the job flow. Valid inputs are "0.18", "0.20",
--- "0.20.205", "1.0.3", "2.2.0", or "2.4.0". If you do not set this value, the
--- default of 0.18 is used, unless the AmiVersion parameter is set in the
--- RunJobFlow call, in which case the default version of Hadoop for that AMI
--- version is used.
-jficHadoopVersion :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficHadoopVersion =
-    lens _jficHadoopVersion (\s a -> s { _jficHadoopVersion = a })
-
--- | The number of Amazon EC2 instances used to execute the job flow.
-jficInstanceCount :: Lens' JobFlowInstancesConfig (Maybe Int)
-jficInstanceCount =
-    lens _jficInstanceCount (\s a -> s { _jficInstanceCount = a })
-
--- | Configuration for the job flow's instance groups.
-jficInstanceGroups :: Lens' JobFlowInstancesConfig [InstanceGroupConfig]
-jficInstanceGroups =
-    lens _jficInstanceGroups (\s a -> s { _jficInstanceGroups = a })
-        . _List
-
--- | Specifies whether the job flow should terminate after completing all steps.
-jficKeepJobFlowAliveWhenNoSteps :: Lens' JobFlowInstancesConfig (Maybe Bool)
-jficKeepJobFlowAliveWhenNoSteps =
-    lens _jficKeepJobFlowAliveWhenNoSteps
-        (\s a -> s { _jficKeepJobFlowAliveWhenNoSteps = a })
-
--- | The EC2 instance type of the master node.
-jficMasterInstanceType :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficMasterInstanceType =
-    lens _jficMasterInstanceType (\s a -> s { _jficMasterInstanceType = a })
-
--- | The Availability Zone the job flow will run in.
-jficPlacement :: Lens' JobFlowInstancesConfig (Maybe PlacementType)
-jficPlacement = lens _jficPlacement (\s a -> s { _jficPlacement = a })
-
--- | The EC2 instance type of the slave nodes.
-jficSlaveInstanceType :: Lens' JobFlowInstancesConfig (Maybe Text)
-jficSlaveInstanceType =
-    lens _jficSlaveInstanceType (\s a -> s { _jficSlaveInstanceType = 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.
-jficTerminationProtected :: Lens' JobFlowInstancesConfig (Maybe Bool)
-jficTerminationProtected =
-    lens _jficTerminationProtected
-        (\s a -> s { _jficTerminationProtected = a })
-
-instance FromJSON JobFlowInstancesConfig where
-    parseJSON = withObject "JobFlowInstancesConfig" $ \o -> JobFlowInstancesConfig
-        <$> o .:? "AdditionalMasterSecurityGroups" .!= mempty
-        <*> o .:? "AdditionalSlaveSecurityGroups" .!= mempty
-        <*> o .:? "Ec2KeyName"
-        <*> o .:? "Ec2SubnetId"
-        <*> o .:? "EmrManagedMasterSecurityGroup"
-        <*> o .:? "EmrManagedSlaveSecurityGroup"
-        <*> o .:? "HadoopVersion"
-        <*> o .:? "InstanceCount"
-        <*> o .:? "InstanceGroups" .!= mempty
-        <*> o .:? "KeepJobFlowAliveWhenNoSteps"
-        <*> o .:? "MasterInstanceType"
-        <*> o .:? "Placement"
-        <*> o .:? "SlaveInstanceType"
-        <*> o .:? "TerminationProtected"
-
-instance ToJSON JobFlowInstancesConfig where
-    toJSON JobFlowInstancesConfig{..} = object
-        [ "MasterInstanceType"             .= _jficMasterInstanceType
-        , "SlaveInstanceType"              .= _jficSlaveInstanceType
-        , "InstanceCount"                  .= _jficInstanceCount
-        , "InstanceGroups"                 .= _jficInstanceGroups
-        , "Ec2KeyName"                     .= _jficEc2KeyName
-        , "Placement"                      .= _jficPlacement
-        , "KeepJobFlowAliveWhenNoSteps"    .= _jficKeepJobFlowAliveWhenNoSteps
-        , "TerminationProtected"           .= _jficTerminationProtected
-        , "HadoopVersion"                  .= _jficHadoopVersion
-        , "Ec2SubnetId"                    .= _jficEc2SubnetId
-        , "EmrManagedMasterSecurityGroup"  .= _jficEmrManagedMasterSecurityGroup
-        , "EmrManagedSlaveSecurityGroup"   .= _jficEmrManagedSlaveSecurityGroup
-        , "AdditionalMasterSecurityGroups" .= _jficAdditionalMasterSecurityGroups
-        , "AdditionalSlaveSecurityGroups"  .= _jficAdditionalSlaveSecurityGroups
-        ]
-
-data StepConfig = StepConfig
-    { _scActionOnFailure :: Maybe ActionOnFailure
-    , _scHadoopJarStep   :: HadoopJarStepConfig
-    , _scName            :: Text
-    } deriving (Eq, Read, Show)
-
--- | 'StepConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'scActionOnFailure' @::@ 'Maybe' 'ActionOnFailure'
---
--- * 'scHadoopJarStep' @::@ 'HadoopJarStepConfig'
---
--- * 'scName' @::@ 'Text'
---
-stepConfig :: Text -- ^ 'scName'
-           -> HadoopJarStepConfig -- ^ 'scHadoopJarStep'
-           -> StepConfig
-stepConfig p1 p2 = StepConfig
-    { _scName            = p1
-    , _scHadoopJarStep   = p2
-    , _scActionOnFailure = Nothing
-    }
-
--- | The action to take if the job flow step fails.
-scActionOnFailure :: Lens' StepConfig (Maybe ActionOnFailure)
-scActionOnFailure =
-    lens _scActionOnFailure (\s a -> s { _scActionOnFailure = a })
-
--- | The JAR file used for the job flow step.
-scHadoopJarStep :: Lens' StepConfig HadoopJarStepConfig
-scHadoopJarStep = lens _scHadoopJarStep (\s a -> s { _scHadoopJarStep = a })
-
--- | The name of the job flow step.
-scName :: Lens' StepConfig Text
-scName = lens _scName (\s a -> s { _scName = a })
-
-instance FromJSON StepConfig where
-    parseJSON = withObject "StepConfig" $ \o -> StepConfig
-        <$> o .:? "ActionOnFailure"
-        <*> o .:  "HadoopJarStep"
-        <*> o .:  "Name"
-
-instance ToJSON StepConfig where
-    toJSON StepConfig{..} = object
-        [ "Name"            .= _scName
-        , "ActionOnFailure" .= _scActionOnFailure
-        , "HadoopJarStep"   .= _scHadoopJarStep
-        ]
-
-data InstanceGroup = InstanceGroup
-    { _igBidPrice               :: Maybe Text
-    , _igId                     :: Maybe Text
-    , _igInstanceGroupType      :: Maybe InstanceGroupType
-    , _igInstanceType           :: Maybe Text
-    , _igMarket                 :: Maybe MarketType
-    , _igName                   :: Maybe Text
-    , _igRequestedInstanceCount :: Maybe Int
-    , _igRunningInstanceCount   :: Maybe Int
-    , _igStatus                 :: Maybe InstanceGroupStatus
-    } deriving (Eq, Read, Show)
-
--- | 'InstanceGroup' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'igBidPrice' @::@ 'Maybe' 'Text'
---
--- * 'igId' @::@ 'Maybe' 'Text'
---
--- * 'igInstanceGroupType' @::@ 'Maybe' 'InstanceGroupType'
---
--- * 'igInstanceType' @::@ 'Maybe' 'Text'
---
--- * 'igMarket' @::@ 'Maybe' 'MarketType'
---
--- * 'igName' @::@ 'Maybe' 'Text'
---
--- * 'igRequestedInstanceCount' @::@ 'Maybe' 'Int'
---
--- * 'igRunningInstanceCount' @::@ 'Maybe' 'Int'
---
--- * 'igStatus' @::@ 'Maybe' 'InstanceGroupStatus'
---
-instanceGroup :: InstanceGroup
-instanceGroup = InstanceGroup
-    { _igId                     = Nothing
-    , _igName                   = Nothing
-    , _igMarket                 = Nothing
-    , _igInstanceGroupType      = Nothing
-    , _igBidPrice               = Nothing
-    , _igInstanceType           = Nothing
-    , _igRequestedInstanceCount = Nothing
-    , _igRunningInstanceCount   = Nothing
-    , _igStatus                 = Nothing
-    }
-
--- | The bid price for each EC2 instance in the instance group when launching
--- nodes as Spot Instances, expressed in USD.
-igBidPrice :: Lens' InstanceGroup (Maybe Text)
-igBidPrice = lens _igBidPrice (\s a -> s { _igBidPrice = a })
-
--- | The identifier of the instance group.
-igId :: Lens' InstanceGroup (Maybe Text)
-igId = lens _igId (\s a -> s { _igId = a })
-
--- | The type of the instance group. Valid values are MASTER, CORE or TASK.
-igInstanceGroupType :: Lens' InstanceGroup (Maybe InstanceGroupType)
-igInstanceGroupType =
-    lens _igInstanceGroupType (\s a -> s { _igInstanceGroupType = a })
-
--- | The EC2 instance type for all instances in the instance group.
-igInstanceType :: Lens' InstanceGroup (Maybe Text)
-igInstanceType = lens _igInstanceType (\s a -> s { _igInstanceType = a })
-
--- | The marketplace to provision instances for this group. Valid values are
--- ON_DEMAND or SPOT.
-igMarket :: Lens' InstanceGroup (Maybe MarketType)
-igMarket = lens _igMarket (\s a -> s { _igMarket = a })
-
--- | The name of the instance group.
-igName :: Lens' InstanceGroup (Maybe Text)
-igName = lens _igName (\s a -> s { _igName = a })
-
--- | The target number of instances for the instance group.
-igRequestedInstanceCount :: Lens' InstanceGroup (Maybe Int)
-igRequestedInstanceCount =
-    lens _igRequestedInstanceCount
-        (\s a -> s { _igRequestedInstanceCount = a })
-
--- | The number of instances currently running in this instance group.
-igRunningInstanceCount :: Lens' InstanceGroup (Maybe Int)
-igRunningInstanceCount =
-    lens _igRunningInstanceCount (\s a -> s { _igRunningInstanceCount = a })
-
--- | The current status of the instance group.
-igStatus :: Lens' InstanceGroup (Maybe InstanceGroupStatus)
-igStatus = lens _igStatus (\s a -> s { _igStatus = a })
-
-instance FromJSON InstanceGroup where
-    parseJSON = withObject "InstanceGroup" $ \o -> InstanceGroup
-        <$> o .:? "BidPrice"
-        <*> o .:? "Id"
-        <*> o .:? "InstanceGroupType"
-        <*> o .:? "InstanceType"
-        <*> o .:? "Market"
-        <*> o .:? "Name"
-        <*> o .:? "RequestedInstanceCount"
-        <*> o .:? "RunningInstanceCount"
-        <*> o .:? "Status"
-
-instance ToJSON InstanceGroup where
-    toJSON InstanceGroup{..} = object
-        [ "Id"                     .= _igId
-        , "Name"                   .= _igName
-        , "Market"                 .= _igMarket
-        , "InstanceGroupType"      .= _igInstanceGroupType
-        , "BidPrice"               .= _igBidPrice
-        , "InstanceType"           .= _igInstanceType
-        , "RequestedInstanceCount" .= _igRequestedInstanceCount
-        , "RunningInstanceCount"   .= _igRunningInstanceCount
-        , "Status"                 .= _igStatus
-        ]
-
-data BootstrapActionConfig = BootstrapActionConfig
-    { _bacName                  :: Text
-    , _bacScriptBootstrapAction :: ScriptBootstrapActionConfig
-    } deriving (Eq, Read, Show)
-
--- | 'BootstrapActionConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'bacName' @::@ 'Text'
---
--- * 'bacScriptBootstrapAction' @::@ 'ScriptBootstrapActionConfig'
---
-bootstrapActionConfig :: Text -- ^ 'bacName'
-                      -> ScriptBootstrapActionConfig -- ^ 'bacScriptBootstrapAction'
-                      -> BootstrapActionConfig
-bootstrapActionConfig p1 p2 = BootstrapActionConfig
-    { _bacName                  = p1
-    , _bacScriptBootstrapAction = p2
-    }
-
--- | The name of the bootstrap action.
-bacName :: Lens' BootstrapActionConfig Text
-bacName = lens _bacName (\s a -> s { _bacName = a })
-
--- | The script run by the bootstrap action.
-bacScriptBootstrapAction :: Lens' BootstrapActionConfig ScriptBootstrapActionConfig
-bacScriptBootstrapAction =
-    lens _bacScriptBootstrapAction
-        (\s a -> s { _bacScriptBootstrapAction = a })
-
-instance FromJSON BootstrapActionConfig where
-    parseJSON = withObject "BootstrapActionConfig" $ \o -> BootstrapActionConfig
-        <$> o .:  "Name"
-        <*> o .:  "ScriptBootstrapAction"
-
-instance ToJSON BootstrapActionConfig where
-    toJSON BootstrapActionConfig{..} = object
-        [ "Name"                  .= _bacName
-        , "ScriptBootstrapAction" .= _bacScriptBootstrapAction
-        ]
-
-data ClusterSummary = ClusterSummary
-    { _csId                      :: Maybe Text
-    , _csName                    :: Maybe Text
-    , _csNormalizedInstanceHours :: Maybe Int
-    , _csStatus                  :: Maybe ClusterStatus
-    } deriving (Eq, Read, Show)
-
--- | 'ClusterSummary' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csId' @::@ 'Maybe' 'Text'
---
--- * 'csName' @::@ 'Maybe' 'Text'
---
--- * 'csNormalizedInstanceHours' @::@ 'Maybe' 'Int'
---
--- * 'csStatus' @::@ 'Maybe' 'ClusterStatus'
---
-clusterSummary :: ClusterSummary
-clusterSummary = ClusterSummary
-    { _csId                      = Nothing
-    , _csName                    = Nothing
-    , _csStatus                  = Nothing
-    , _csNormalizedInstanceHours = Nothing
-    }
-
--- | The unique identifier for the cluster.
-csId :: Lens' ClusterSummary (Maybe Text)
-csId = lens _csId (\s a -> s { _csId = a })
-
--- | The name of the cluster.
-csName :: Lens' ClusterSummary (Maybe Text)
-csName = lens _csName (\s a -> s { _csName = a })
-
--- | An approximation of the cost of the job flow, represented in m1.small/hours.
--- This value is incremented one time for every hour an m1.small instance runs.
--- Larger instances are weighted more, so an EC2 instance that is roughly four
--- times more expensive would result in the normalized instance hours being
--- incremented by four. This result is only an approximation and does not
--- reflect the actual billing rate.
-csNormalizedInstanceHours :: Lens' ClusterSummary (Maybe Int)
-csNormalizedInstanceHours =
-    lens _csNormalizedInstanceHours
-        (\s a -> s { _csNormalizedInstanceHours = a })
-
--- | The details about the current status of the cluster.
-csStatus :: Lens' ClusterSummary (Maybe ClusterStatus)
-csStatus = lens _csStatus (\s a -> s { _csStatus = a })
-
-instance FromJSON ClusterSummary where
-    parseJSON = withObject "ClusterSummary" $ \o -> ClusterSummary
-        <$> o .:? "Id"
-        <*> o .:? "Name"
-        <*> o .:? "NormalizedInstanceHours"
-        <*> o .:? "Status"
-
-instance ToJSON ClusterSummary where
-    toJSON ClusterSummary{..} = object
-        [ "Id"                      .= _csId
-        , "Name"                    .= _csName
-        , "Status"                  .= _csStatus
-        , "NormalizedInstanceHours" .= _csNormalizedInstanceHours
-        ]
-
-data JobFlowInstancesDetail = JobFlowInstancesDetail
-    { _jfidEc2KeyName                  :: Maybe Text
-    , _jfidEc2SubnetId                 :: Maybe Text
-    , _jfidHadoopVersion               :: Maybe Text
-    , _jfidInstanceCount               :: Int
-    , _jfidInstanceGroups              :: List "InstanceGroups" InstanceGroupDetail
-    , _jfidKeepJobFlowAliveWhenNoSteps :: Maybe Bool
-    , _jfidMasterInstanceId            :: Maybe Text
-    , _jfidMasterInstanceType          :: Text
-    , _jfidMasterPublicDnsName         :: Maybe Text
-    , _jfidNormalizedInstanceHours     :: Maybe Int
-    , _jfidPlacement                   :: Maybe PlacementType
-    , _jfidSlaveInstanceType           :: Text
-    , _jfidTerminationProtected        :: Maybe Bool
-    } deriving (Eq, Read, Show)
-
--- | 'JobFlowInstancesDetail' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'jfidEc2KeyName' @::@ 'Maybe' 'Text'
---
--- * 'jfidEc2SubnetId' @::@ 'Maybe' 'Text'
---
--- * 'jfidHadoopVersion' @::@ 'Maybe' 'Text'
---
--- * 'jfidInstanceCount' @::@ 'Int'
---
--- * 'jfidInstanceGroups' @::@ ['InstanceGroupDetail']
---
--- * 'jfidKeepJobFlowAliveWhenNoSteps' @::@ 'Maybe' 'Bool'
---
--- * 'jfidMasterInstanceId' @::@ 'Maybe' 'Text'
---
--- * 'jfidMasterInstanceType' @::@ 'Text'
---
--- * 'jfidMasterPublicDnsName' @::@ 'Maybe' 'Text'
---
--- * 'jfidNormalizedInstanceHours' @::@ 'Maybe' 'Int'
---
--- * 'jfidPlacement' @::@ 'Maybe' 'PlacementType'
---
--- * 'jfidSlaveInstanceType' @::@ 'Text'
---
--- * 'jfidTerminationProtected' @::@ 'Maybe' 'Bool'
---
-jobFlowInstancesDetail :: Text -- ^ 'jfidMasterInstanceType'
-                       -> Text -- ^ 'jfidSlaveInstanceType'
-                       -> Int -- ^ 'jfidInstanceCount'
-                       -> JobFlowInstancesDetail
-jobFlowInstancesDetail p1 p2 p3 = JobFlowInstancesDetail
-    { _jfidMasterInstanceType          = p1
-    , _jfidSlaveInstanceType           = p2
-    , _jfidInstanceCount               = p3
-    , _jfidMasterPublicDnsName         = Nothing
-    , _jfidMasterInstanceId            = Nothing
-    , _jfidInstanceGroups              = mempty
-    , _jfidNormalizedInstanceHours     = Nothing
-    , _jfidEc2KeyName                  = Nothing
-    , _jfidEc2SubnetId                 = Nothing
-    , _jfidPlacement                   = Nothing
-    , _jfidKeepJobFlowAliveWhenNoSteps = Nothing
-    , _jfidTerminationProtected        = Nothing
-    , _jfidHadoopVersion               = Nothing
-    }
-
--- | The name of an Amazon EC2 key pair that can be used to ssh to the master node
--- of job flow.
-jfidEc2KeyName :: Lens' JobFlowInstancesDetail (Maybe Text)
-jfidEc2KeyName = lens _jfidEc2KeyName (\s a -> s { _jfidEc2KeyName = a })
-
--- | For job flows launched within Amazon Virtual Private Cloud, this value
--- specifies the identifier of the subnet where the job flow was launched.
-jfidEc2SubnetId :: Lens' JobFlowInstancesDetail (Maybe Text)
-jfidEc2SubnetId = lens _jfidEc2SubnetId (\s a -> s { _jfidEc2SubnetId = a })
-
--- | The Hadoop version for the job flow.
-jfidHadoopVersion :: Lens' JobFlowInstancesDetail (Maybe Text)
-jfidHadoopVersion =
-    lens _jfidHadoopVersion (\s a -> s { _jfidHadoopVersion = a })
-
--- | The number of Amazon EC2 instances in the cluster. If the value is 1, the
--- same instance serves as both the master and slave node. If the value is
--- greater than 1, one instance is the master node and all others are slave
--- nodes.
-jfidInstanceCount :: Lens' JobFlowInstancesDetail Int
-jfidInstanceCount =
-    lens _jfidInstanceCount (\s a -> s { _jfidInstanceCount = a })
-
--- | Details about the job flow's instance groups.
-jfidInstanceGroups :: Lens' JobFlowInstancesDetail [InstanceGroupDetail]
-jfidInstanceGroups =
-    lens _jfidInstanceGroups (\s a -> s { _jfidInstanceGroups = a })
-        . _List
-
--- | Specifies whether the job flow should terminate after completing all steps.
-jfidKeepJobFlowAliveWhenNoSteps :: Lens' JobFlowInstancesDetail (Maybe Bool)
-jfidKeepJobFlowAliveWhenNoSteps =
-    lens _jfidKeepJobFlowAliveWhenNoSteps
-        (\s a -> s { _jfidKeepJobFlowAliveWhenNoSteps = a })
-
--- | The Amazon EC2 instance identifier of the master node.
-jfidMasterInstanceId :: Lens' JobFlowInstancesDetail (Maybe Text)
-jfidMasterInstanceId =
-    lens _jfidMasterInstanceId (\s a -> s { _jfidMasterInstanceId = a })
-
--- | The Amazon EC2 master node instance type.
-jfidMasterInstanceType :: Lens' JobFlowInstancesDetail Text
-jfidMasterInstanceType =
-    lens _jfidMasterInstanceType (\s a -> s { _jfidMasterInstanceType = a })
-
--- | The DNS name of the master node.
-jfidMasterPublicDnsName :: Lens' JobFlowInstancesDetail (Maybe Text)
-jfidMasterPublicDnsName =
-    lens _jfidMasterPublicDnsName (\s a -> s { _jfidMasterPublicDnsName = a })
-
--- | An approximation of the cost of the job flow, represented in m1.small/hours.
--- This value is incremented once for every hour an m1.small runs. Larger
--- instances are weighted more, so an Amazon EC2 instance that is roughly four
--- times more expensive would result in the normalized instance hours being
--- incremented by four. This result is only an approximation and does not
--- reflect the actual billing rate.
-jfidNormalizedInstanceHours :: Lens' JobFlowInstancesDetail (Maybe Int)
-jfidNormalizedInstanceHours =
-    lens _jfidNormalizedInstanceHours
-        (\s a -> s { _jfidNormalizedInstanceHours = a })
-
--- | The Amazon EC2 Availability Zone for the job flow.
-jfidPlacement :: Lens' JobFlowInstancesDetail (Maybe PlacementType)
-jfidPlacement = lens _jfidPlacement (\s a -> s { _jfidPlacement = a })
-
--- | The Amazon EC2 slave node instance type.
-jfidSlaveInstanceType :: Lens' JobFlowInstancesDetail Text
-jfidSlaveInstanceType =
-    lens _jfidSlaveInstanceType (\s a -> s { _jfidSlaveInstanceType = a })
-
--- | Specifies whether the Amazon EC2 instances in the cluster are protected from
--- termination by API calls, user intervention, or in the event of a job flow
--- error.
-jfidTerminationProtected :: Lens' JobFlowInstancesDetail (Maybe Bool)
-jfidTerminationProtected =
-    lens _jfidTerminationProtected
-        (\s a -> s { _jfidTerminationProtected = a })
-
-instance FromJSON JobFlowInstancesDetail where
-    parseJSON = withObject "JobFlowInstancesDetail" $ \o -> JobFlowInstancesDetail
-        <$> o .:? "Ec2KeyName"
-        <*> o .:? "Ec2SubnetId"
-        <*> o .:? "HadoopVersion"
-        <*> o .:  "InstanceCount"
-        <*> o .:? "InstanceGroups" .!= mempty
-        <*> o .:? "KeepJobFlowAliveWhenNoSteps"
-        <*> o .:? "MasterInstanceId"
-        <*> o .:  "MasterInstanceType"
-        <*> o .:? "MasterPublicDnsName"
-        <*> o .:? "NormalizedInstanceHours"
-        <*> o .:? "Placement"
-        <*> o .:  "SlaveInstanceType"
-        <*> o .:? "TerminationProtected"
-
-instance ToJSON JobFlowInstancesDetail where
-    toJSON JobFlowInstancesDetail{..} = object
-        [ "MasterInstanceType"          .= _jfidMasterInstanceType
-        , "MasterPublicDnsName"         .= _jfidMasterPublicDnsName
-        , "MasterInstanceId"            .= _jfidMasterInstanceId
-        , "SlaveInstanceType"           .= _jfidSlaveInstanceType
-        , "InstanceCount"               .= _jfidInstanceCount
-        , "InstanceGroups"              .= _jfidInstanceGroups
-        , "NormalizedInstanceHours"     .= _jfidNormalizedInstanceHours
-        , "Ec2KeyName"                  .= _jfidEc2KeyName
-        , "Ec2SubnetId"                 .= _jfidEc2SubnetId
-        , "Placement"                   .= _jfidPlacement
-        , "KeepJobFlowAliveWhenNoSteps" .= _jfidKeepJobFlowAliveWhenNoSteps
-        , "TerminationProtected"        .= _jfidTerminationProtected
-        , "HadoopVersion"               .= _jfidHadoopVersion
-        ]
-
-data ClusterStatus = ClusterStatus
-    { _csState             :: Maybe ClusterState
-    , _csStateChangeReason :: Maybe ClusterStateChangeReason
-    , _csTimeline          :: Maybe ClusterTimeline
-    } deriving (Eq, Read, Show)
-
--- | 'ClusterStatus' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'csState' @::@ 'Maybe' 'ClusterState'
---
--- * 'csStateChangeReason' @::@ 'Maybe' 'ClusterStateChangeReason'
---
--- * 'csTimeline' @::@ 'Maybe' 'ClusterTimeline'
---
-clusterStatus :: ClusterStatus
-clusterStatus = ClusterStatus
-    { _csState             = Nothing
-    , _csStateChangeReason = Nothing
-    , _csTimeline          = Nothing
-    }
-
--- | The current state of the cluster.
-csState :: Lens' ClusterStatus (Maybe ClusterState)
-csState = lens _csState (\s a -> s { _csState = a })
-
--- | The reason for the cluster status change.
-csStateChangeReason :: Lens' ClusterStatus (Maybe ClusterStateChangeReason)
-csStateChangeReason =
-    lens _csStateChangeReason (\s a -> s { _csStateChangeReason = a })
-
--- | A timeline that represents the status of a cluster over the lifetime of the
--- cluster.
-csTimeline :: Lens' ClusterStatus (Maybe ClusterTimeline)
-csTimeline = lens _csTimeline (\s a -> s { _csTimeline = a })
-
-instance FromJSON ClusterStatus where
-    parseJSON = withObject "ClusterStatus" $ \o -> ClusterStatus
-        <$> o .:? "State"
-        <*> o .:? "StateChangeReason"
-        <*> o .:? "Timeline"
-
-instance ToJSON ClusterStatus where
-    toJSON ClusterStatus{..} = object
-        [ "State"             .= _csState
-        , "StateChangeReason" .= _csStateChangeReason
-        , "Timeline"          .= _csTimeline
-        ]
-
-data InstanceState
-    = ISAwaitingFulfillment -- ^ AWAITING_FULFILLMENT
-    | ISBootstrapping       -- ^ BOOTSTRAPPING
-    | ISProvisioning        -- ^ PROVISIONING
-    | ISRunning             -- ^ RUNNING
-    | ISTerminated          -- ^ TERMINATED
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceState
-
-instance FromText InstanceState where
-    parser = takeLowerText >>= \case
-        "awaiting_fulfillment" -> pure ISAwaitingFulfillment
-        "bootstrapping"        -> pure ISBootstrapping
-        "provisioning"         -> pure ISProvisioning
-        "running"              -> pure ISRunning
-        "terminated"           -> pure ISTerminated
-        e                      -> fail $
-            "Failure parsing InstanceState from " ++ show e
-
-instance ToText InstanceState where
-    toText = \case
-        ISAwaitingFulfillment -> "AWAITING_FULFILLMENT"
-        ISBootstrapping       -> "BOOTSTRAPPING"
-        ISProvisioning        -> "PROVISIONING"
-        ISRunning             -> "RUNNING"
-        ISTerminated          -> "TERMINATED"
-
-instance ToByteString InstanceState
-instance ToHeader     InstanceState
-instance ToQuery      InstanceState
-
-instance FromJSON InstanceState where
-    parseJSON = parseJSONText "InstanceState"
-
-instance ToJSON InstanceState where
-    toJSON = toJSONText
-
-data ClusterTimeline = ClusterTimeline
-    { _ctCreationDateTime :: Maybe POSIX
-    , _ctEndDateTime      :: Maybe POSIX
-    , _ctReadyDateTime    :: Maybe POSIX
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'ClusterTimeline' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'ctCreationDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'ctEndDateTime' @::@ 'Maybe' 'UTCTime'
---
--- * 'ctReadyDateTime' @::@ 'Maybe' 'UTCTime'
---
-clusterTimeline :: ClusterTimeline
-clusterTimeline = ClusterTimeline
-    { _ctCreationDateTime = Nothing
-    , _ctReadyDateTime    = Nothing
-    , _ctEndDateTime      = Nothing
-    }
-
--- | The creation date and time of the cluster.
-ctCreationDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
-ctCreationDateTime =
-    lens _ctCreationDateTime (\s a -> s { _ctCreationDateTime = a })
-        . mapping _Time
-
--- | The date and time when the cluster was terminated.
-ctEndDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
-ctEndDateTime = lens _ctEndDateTime (\s a -> s { _ctEndDateTime = a }) . mapping _Time
-
--- | The date and time when the cluster was ready to execute steps.
-ctReadyDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
-ctReadyDateTime = lens _ctReadyDateTime (\s a -> s { _ctReadyDateTime = a }) . mapping _Time
-
-instance FromJSON ClusterTimeline where
-    parseJSON = withObject "ClusterTimeline" $ \o -> ClusterTimeline
-        <$> o .:? "CreationDateTime"
-        <*> o .:? "EndDateTime"
-        <*> o .:? "ReadyDateTime"
-
-instance ToJSON ClusterTimeline where
-    toJSON ClusterTimeline{..} = object
-        [ "CreationDateTime" .= _ctCreationDateTime
-        , "ReadyDateTime"    .= _ctReadyDateTime
-        , "EndDateTime"      .= _ctEndDateTime
-        ]
-
-data InstanceStateChangeReasonCode
-    = ISCRCBootstrapFailure  -- ^ BOOTSTRAP_FAILURE
-    | ISCRCClusterTerminated -- ^ CLUSTER_TERMINATED
-    | ISCRCInstanceFailure   -- ^ INSTANCE_FAILURE
-    | ISCRCInternalError     -- ^ INTERNAL_ERROR
-    | ISCRCValidationError   -- ^ VALIDATION_ERROR
-      deriving (Eq, Ord, Read, Show, Generic, Enum)
-
-instance Hashable InstanceStateChangeReasonCode
-
-instance FromText InstanceStateChangeReasonCode where
-    parser = takeLowerText >>= \case
-        "bootstrap_failure"  -> pure ISCRCBootstrapFailure
-        "cluster_terminated" -> pure ISCRCClusterTerminated
-        "instance_failure"   -> pure ISCRCInstanceFailure
-        "internal_error"     -> pure ISCRCInternalError
-        "validation_error"   -> pure ISCRCValidationError
-        e                    -> fail $
-            "Failure parsing InstanceStateChangeReasonCode from " ++ show e
-
-instance ToText InstanceStateChangeReasonCode where
-    toText = \case
-        ISCRCBootstrapFailure  -> "BOOTSTRAP_FAILURE"
-        ISCRCClusterTerminated -> "CLUSTER_TERMINATED"
-        ISCRCInstanceFailure   -> "INSTANCE_FAILURE"
-        ISCRCInternalError     -> "INTERNAL_ERROR"
-        ISCRCValidationError   -> "VALIDATION_ERROR"
-
-instance ToByteString InstanceStateChangeReasonCode
-instance ToHeader     InstanceStateChangeReasonCode
-instance ToQuery      InstanceStateChangeReasonCode
-
-instance FromJSON InstanceStateChangeReasonCode where
-    parseJSON = parseJSONText "InstanceStateChangeReasonCode"
-
-instance ToJSON InstanceStateChangeReasonCode where
-    toJSON = toJSONText
-
-data Instance = Instance
-    { _iEc2InstanceId    :: Maybe Text
-    , _iId               :: Maybe Text
-    , _iPrivateDnsName   :: Maybe Text
-    , _iPrivateIpAddress :: Maybe Text
-    , _iPublicDnsName    :: Maybe Text
-    , _iPublicIpAddress  :: Maybe Text
-    , _iStatus           :: Maybe InstanceStatus
-    } deriving (Eq, Read, Show)
-
--- | 'Instance' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'iEc2InstanceId' @::@ 'Maybe' 'Text'
---
--- * 'iId' @::@ 'Maybe' 'Text'
---
--- * 'iPrivateDnsName' @::@ 'Maybe' 'Text'
---
--- * 'iPrivateIpAddress' @::@ 'Maybe' 'Text'
---
--- * 'iPublicDnsName' @::@ 'Maybe' 'Text'
---
--- * 'iPublicIpAddress' @::@ 'Maybe' 'Text'
---
--- * 'iStatus' @::@ 'Maybe' 'InstanceStatus'
---
-instance' :: Instance
-instance' = Instance
-    { _iId               = Nothing
-    , _iEc2InstanceId    = Nothing
-    , _iPublicDnsName    = Nothing
-    , _iPublicIpAddress  = Nothing
-    , _iPrivateDnsName   = Nothing
-    , _iPrivateIpAddress = Nothing
-    , _iStatus           = Nothing
-    }
-
--- | The unique identifier of the instance in Amazon EC2.
-iEc2InstanceId :: Lens' Instance (Maybe Text)
-iEc2InstanceId = lens _iEc2InstanceId (\s a -> s { _iEc2InstanceId = a })
-
--- | The unique identifier for the instance in Amazon EMR.
-iId :: Lens' Instance (Maybe Text)
-iId = lens _iId (\s a -> s { _iId = a })
-
--- | The private DNS name of the instance.
-iPrivateDnsName :: Lens' Instance (Maybe Text)
-iPrivateDnsName = lens _iPrivateDnsName (\s a -> s { _iPrivateDnsName = a })
-
--- | The private IP address of the instance.
-iPrivateIpAddress :: Lens' Instance (Maybe Text)
-iPrivateIpAddress =
-    lens _iPrivateIpAddress (\s a -> s { _iPrivateIpAddress = a })
-
--- | The public DNS name of the instance.
-iPublicDnsName :: Lens' Instance (Maybe Text)
-iPublicDnsName = lens _iPublicDnsName (\s a -> s { _iPublicDnsName = a })
-
--- | The public IP address of the instance.
-iPublicIpAddress :: Lens' Instance (Maybe Text)
-iPublicIpAddress = lens _iPublicIpAddress (\s a -> s { _iPublicIpAddress = a })
-
--- | The current status of the instance.
-iStatus :: Lens' Instance (Maybe InstanceStatus)
-iStatus = lens _iStatus (\s a -> s { _iStatus = a })
-
-instance FromJSON Instance where
-    parseJSON = withObject "Instance" $ \o -> Instance
-        <$> o .:? "Ec2InstanceId"
-        <*> o .:? "Id"
-        <*> o .:? "PrivateDnsName"
-        <*> o .:? "PrivateIpAddress"
-        <*> o .:? "PublicDnsName"
-        <*> o .:? "PublicIpAddress"
-        <*> o .:? "Status"
-
-instance ToJSON Instance where
-    toJSON Instance{..} = object
-        [ "Id"               .= _iId
-        , "Ec2InstanceId"    .= _iEc2InstanceId
-        , "PublicDnsName"    .= _iPublicDnsName
-        , "PublicIpAddress"  .= _iPublicIpAddress
-        , "PrivateDnsName"   .= _iPrivateDnsName
-        , "PrivateIpAddress" .= _iPrivateIpAddress
-        , "Status"           .= _iStatus
-        ]
-
-data ScriptBootstrapActionConfig = ScriptBootstrapActionConfig
-    { _sbacArgs :: List "Args" Text
-    , _sbacPath :: Text
-    } deriving (Eq, Ord, Read, Show)
-
--- | 'ScriptBootstrapActionConfig' constructor.
---
--- The fields accessible through corresponding lenses are:
---
--- * 'sbacArgs' @::@ ['Text']
---
--- * 'sbacPath' @::@ 'Text'
---
-scriptBootstrapActionConfig :: Text -- ^ 'sbacPath'
-                            -> ScriptBootstrapActionConfig
-scriptBootstrapActionConfig p1 = ScriptBootstrapActionConfig
-    { _sbacPath = p1
-    , _sbacArgs = mempty
-    }
-
--- | A list of command line arguments to pass to the bootstrap action script.
-sbacArgs :: Lens' ScriptBootstrapActionConfig [Text]
-sbacArgs = lens _sbacArgs (\s a -> s { _sbacArgs = a }) . _List
-
--- | Location of the script to run during a bootstrap action. Can be either a
--- location in Amazon S3 or on a local file system.
-sbacPath :: Lens' ScriptBootstrapActionConfig Text
-sbacPath = lens _sbacPath (\s a -> s { _sbacPath = a })
-
-instance FromJSON ScriptBootstrapActionConfig where
-    parseJSON = withObject "ScriptBootstrapActionConfig" $ \o -> ScriptBootstrapActionConfig
-        <$> o .:? "Args" .!= mempty
-        <*> o .:  "Path"
-
-instance ToJSON ScriptBootstrapActionConfig where
-    toJSON ScriptBootstrapActionConfig{..} = object
-        [ "Path" .= _sbacPath
-        , "Args" .= _sbacArgs
-        ]
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EMR.Types
+-- Copyright   : (c) 2013-2015 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)
+--
+module Network.AWS.EMR.Types
+    (
+    -- * Service
+      EMR
+
+    -- * Errors
+    , _InvalidRequestException
+    , _InternalServerError
+    , _InternalServerException
+
+    -- * ActionOnFailure
+    , ActionOnFailure (..)
+
+    -- * ClusterState
+    , ClusterState (..)
+
+    -- * ClusterStateChangeReasonCode
+    , ClusterStateChangeReasonCode (..)
+
+    -- * InstanceGroupState
+    , InstanceGroupState (..)
+
+    -- * InstanceGroupStateChangeReasonCode
+    , InstanceGroupStateChangeReasonCode (..)
+
+    -- * InstanceGroupType
+    , InstanceGroupType (..)
+
+    -- * InstanceRoleType
+    , InstanceRoleType (..)
+
+    -- * InstanceState
+    , InstanceState (..)
+
+    -- * InstanceStateChangeReasonCode
+    , InstanceStateChangeReasonCode (..)
+
+    -- * MarketType
+    , MarketType (..)
+
+    -- * StepState
+    , StepState (..)
+
+    -- * StepStateChangeReasonCode
+    , StepStateChangeReasonCode (..)
+
+    -- * Application
+    , Application
+    , application
+    , aAdditionalInfo
+    , aArgs
+    , aName
+    , aVersion
+
+    -- * BootstrapActionConfig
+    , BootstrapActionConfig
+    , bootstrapActionConfig
+    , bacName
+    , bacScriptBootstrapAction
+
+    -- * Cluster
+    , Cluster
+    , cluster
+    , cluRequestedAMIVersion
+    , cluEC2InstanceAttributes
+    , cluNormalizedInstanceHours
+    , cluConfigurations
+    , cluReleaseLabel
+    , cluLogURI
+    , cluRunningAMIVersion
+    , cluMasterPublicDNSName
+    , cluAutoTerminate
+    , cluTerminationProtected
+    , cluVisibleToAllUsers
+    , cluApplications
+    , cluTags
+    , cluServiceRole
+    , cluId
+    , cluName
+    , cluStatus
+
+    -- * ClusterStateChangeReason
+    , ClusterStateChangeReason
+    , clusterStateChangeReason
+    , cscrCode
+    , cscrMessage
+
+    -- * ClusterStatus
+    , ClusterStatus
+    , clusterStatus
+    , csState
+    , csStateChangeReason
+    , csTimeline
+
+    -- * ClusterSummary
+    , ClusterSummary
+    , clusterSummary
+    , csStatus
+    , csNormalizedInstanceHours
+    , csName
+    , csId
+
+    -- * ClusterTimeline
+    , ClusterTimeline
+    , clusterTimeline
+    , ctReadyDateTime
+    , ctCreationDateTime
+    , ctEndDateTime
+
+    -- * Command
+    , Command
+    , command
+    , cArgs
+    , cScriptPath
+    , cName
+
+    -- * Configuration
+    , Configuration
+    , configuration
+    , cConfigurations
+    , cClassification
+    , cProperties
+
+    -- * EC2InstanceAttributes
+    , EC2InstanceAttributes
+    , ec2InstanceAttributes
+    , eiaEC2KeyName
+    , eiaEmrManagedSlaveSecurityGroup
+    , eiaAdditionalSlaveSecurityGroups
+    , eiaIAMInstanceProfile
+    , eiaAdditionalMasterSecurityGroups
+    , eiaEmrManagedMasterSecurityGroup
+    , eiaEC2SubnetId
+    , eiaEC2AvailabilityZone
+
+    -- * HadoopJARStepConfig
+    , HadoopJARStepConfig
+    , hadoopJARStepConfig
+    , hjscArgs
+    , hjscMainClass
+    , hjscProperties
+    , hjscJAR
+
+    -- * HadoopStepConfig
+    , HadoopStepConfig
+    , hadoopStepConfig
+    , hscArgs
+    , hscJAR
+    , hscMainClass
+    , hscProperties
+
+    -- * Instance
+    , Instance
+    , instance'
+    , iStatus
+    , iPublicDNSName
+    , iEC2InstanceId
+    , iPrivateIPAddress
+    , iId
+    , iPrivateDNSName
+    , iPublicIPAddress
+
+    -- * InstanceGroup
+    , InstanceGroup
+    , instanceGroup
+    , igStatus
+    , igBidPrice
+    , igRequestedInstanceCount
+    , igRunningInstanceCount
+    , igConfigurations
+    , igInstanceGroupType
+    , igInstanceType
+    , igMarket
+    , igName
+    , igId
+
+    -- * InstanceGroupConfig
+    , InstanceGroupConfig
+    , instanceGroupConfig
+    , igcBidPrice
+    , igcConfigurations
+    , igcMarket
+    , igcName
+    , igcInstanceRole
+    , igcInstanceType
+    , igcInstanceCount
+
+    -- * InstanceGroupModifyConfig
+    , InstanceGroupModifyConfig
+    , instanceGroupModifyConfig
+    , igmcInstanceCount
+    , igmcEC2InstanceIdsToTerminate
+    , igmcInstanceGroupId
+
+    -- * InstanceGroupStateChangeReason
+    , InstanceGroupStateChangeReason
+    , instanceGroupStateChangeReason
+    , igscrCode
+    , igscrMessage
+
+    -- * InstanceGroupStatus
+    , InstanceGroupStatus
+    , instanceGroupStatus
+    , igsState
+    , igsStateChangeReason
+    , igsTimeline
+
+    -- * InstanceGroupTimeline
+    , InstanceGroupTimeline
+    , instanceGroupTimeline
+    , igtReadyDateTime
+    , igtCreationDateTime
+    , igtEndDateTime
+
+    -- * InstanceStateChangeReason
+    , InstanceStateChangeReason
+    , instanceStateChangeReason
+    , iscrCode
+    , iscrMessage
+
+    -- * InstanceStatus
+    , InstanceStatus
+    , instanceStatus
+    , isState
+    , isStateChangeReason
+    , isTimeline
+
+    -- * InstanceTimeline
+    , InstanceTimeline
+    , instanceTimeline
+    , itReadyDateTime
+    , itCreationDateTime
+    , itEndDateTime
+
+    -- * JobFlowInstancesConfig
+    , JobFlowInstancesConfig
+    , jobFlowInstancesConfig
+    , jficSlaveInstanceType
+    , jficEC2KeyName
+    , jficInstanceCount
+    , jficEmrManagedSlaveSecurityGroup
+    , jficAdditionalSlaveSecurityGroups
+    , jficHadoopVersion
+    , jficAdditionalMasterSecurityGroups
+    , jficEmrManagedMasterSecurityGroup
+    , jficEC2SubnetId
+    , jficMasterInstanceType
+    , jficInstanceGroups
+    , jficKeepJobFlowAliveWhenNoSteps
+    , jficTerminationProtected
+    , jficPlacement
+
+    -- * KeyValue
+    , KeyValue
+    , keyValue
+    , kvValue
+    , kvKey
+
+    -- * PlacementType
+    , PlacementType
+    , placementType
+    , ptAvailabilityZone
+
+    -- * ScriptBootstrapActionConfig
+    , ScriptBootstrapActionConfig
+    , scriptBootstrapActionConfig
+    , sbacArgs
+    , sbacPath
+
+    -- * Step
+    , Step
+    , step
+    , sStatus
+    , sActionOnFailure
+    , sConfig
+    , sName
+    , sId
+
+    -- * StepConfig
+    , StepConfig
+    , stepConfig
+    , scActionOnFailure
+    , scName
+    , scHadoopJARStep
+
+    -- * StepStateChangeReason
+    , StepStateChangeReason
+    , stepStateChangeReason
+    , sscrCode
+    , sscrMessage
+
+    -- * StepStatus
+    , StepStatus
+    , stepStatus
+    , ssState
+    , ssStateChangeReason
+    , ssTimeline
+
+    -- * StepSummary
+    , StepSummary
+    , stepSummary
+    , ssStatus
+    , ssActionOnFailure
+    , ssConfig
+    , ssName
+    , ssId
+
+    -- * StepTimeline
+    , StepTimeline
+    , stepTimeline
+    , stCreationDateTime
+    , stEndDateTime
+    , stStartDateTime
+
+    -- * SupportedProductConfig
+    , SupportedProductConfig
+    , supportedProductConfig
+    , spcArgs
+    , spcName
+
+    -- * Tag
+    , Tag
+    , tag
+    , tagValue
+    , tagKey
+    ) where
+
+import           Network.AWS.EMR.Types.Product
+import           Network.AWS.EMR.Types.Sum
+import           Network.AWS.Prelude
+import           Network.AWS.Sign.V4
+
+-- | Version @2009-03-31@ of the Amazon Elastic MapReduce SDK.
+data EMR
+
+instance AWSService EMR where
+    type Sg EMR = V4
+    service = const svc
+      where
+        svc =
+            Service
+            { _svcAbbrev = "EMR"
+            , _svcPrefix = "elasticmapreduce"
+            , _svcVersion = "2009-03-31"
+            , _svcEndpoint = defaultEndpoint svc
+            , _svcTimeout = Just 70
+            , _svcStatus = statusSuccess
+            , _svcError = parseJSONError
+            , _svcRetry = retry
+            }
+        retry =
+            Exponential
+            { _retryBase = 5.0e-2
+            , _retryGrowth = 2
+            , _retryAttempts = 5
+            , _retryCheck = check
+            }
+        check e
+          | has (hasCode "ThrottlingException" . hasStatus 400) e =
+              Just "throttling_exception"
+          | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+          | has (hasStatus 503) e = Just "service_unavailable"
+          | has (hasStatus 500) e = Just "general_server_error"
+          | has (hasStatus 509) e = Just "limit_exceeded"
+          | otherwise = Nothing
+
+-- | This exception occurs when there is something wrong with user input.
+_InvalidRequestException :: AsError a => Getting (First ServiceError) a ServiceError
+_InvalidRequestException = _ServiceError . hasCode "InvalidRequestException"
+
+-- | 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"
+
+-- | This exception occurs when there is an internal failure in the EMR
+-- service.
+_InternalServerException :: AsError a => Getting (First ServiceError) a ServiceError
+_InternalServerException = _ServiceError . hasCode "InternalServerException"
diff --git a/gen/Network/AWS/EMR/Types/Product.hs b/gen/Network/AWS/EMR/Types/Product.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EMR/Types/Product.hs
@@ -0,0 +1,2151 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EMR.Types.Product
+-- Copyright   : (c) 2013-2015 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)
+--
+module Network.AWS.EMR.Types.Product where
+
+import           Network.AWS.EMR.Types.Sum
+import           Network.AWS.Prelude
+
+-- | An application is any Amazon or third-party software that you can add to
+-- the cluster. This structure contains a list of strings that indicates
+-- the software to use with the cluster and accepts a user argument list.
+-- Amazon EMR accepts and forwards the argument list to the corresponding
+-- installation script as bootstrap action argument. For more information,
+-- see
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-mapr.html Launch a Job Flow on the MapR Distribution for Hadoop>.
+-- Currently supported values are:
+--
+-- -   \"mapr-m3\" - launch the job flow using MapR M3 Edition.
+-- -   \"mapr-m5\" - launch the job flow using MapR M5 Edition.
+-- -   \"mapr\" with the user arguments specifying \"--edition,m3\" or
+--     \"--edition,m5\" - launch the job flow using MapR M3 or M5 Edition,
+--     respectively.
+--
+-- In Amazon EMR releases 4.0 and greater, the only accepted parameter is
+-- the application name. To pass arguments to applications, you supply a
+-- configuration for each application.
+--
+-- /See:/ 'application' smart constructor.
+data Application = Application'
+    { _aAdditionalInfo :: !(Maybe (Map Text Text))
+    , _aArgs           :: !(Maybe [Text])
+    , _aName           :: !(Maybe Text)
+    , _aVersion        :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Application' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'aAdditionalInfo'
+--
+-- * 'aArgs'
+--
+-- * 'aName'
+--
+-- * 'aVersion'
+application
+    :: Application
+application =
+    Application'
+    { _aAdditionalInfo = Nothing
+    , _aArgs = Nothing
+    , _aName = Nothing
+    , _aVersion = Nothing
+    }
+
+-- | This option is for advanced users only. This is meta information about
+-- third-party applications that third-party vendors use for testing
+-- purposes.
+aAdditionalInfo :: Lens' Application (HashMap Text Text)
+aAdditionalInfo = lens _aAdditionalInfo (\ s a -> s{_aAdditionalInfo = a}) . _Default . _Map;
+
+-- | Arguments for Amazon EMR to pass to the application.
+aArgs :: Lens' Application [Text]
+aArgs = lens _aArgs (\ s a -> s{_aArgs = a}) . _Default . _Coerce;
+
+-- | The name of the application.
+aName :: Lens' Application (Maybe Text)
+aName = lens _aName (\ s a -> s{_aName = a});
+
+-- | The version of the application.
+aVersion :: Lens' Application (Maybe Text)
+aVersion = lens _aVersion (\ s a -> s{_aVersion = a});
+
+instance FromJSON Application where
+        parseJSON
+          = withObject "Application"
+              (\ x ->
+                 Application' <$>
+                   (x .:? "AdditionalInfo" .!= mempty) <*>
+                     (x .:? "Args" .!= mempty)
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Version"))
+
+instance ToJSON Application where
+        toJSON Application'{..}
+          = object
+              ["AdditionalInfo" .= _aAdditionalInfo,
+               "Args" .= _aArgs, "Name" .= _aName,
+               "Version" .= _aVersion]
+
+-- | Configuration of a bootstrap action.
+--
+-- /See:/ 'bootstrapActionConfig' smart constructor.
+data BootstrapActionConfig = BootstrapActionConfig'
+    { _bacName                  :: !Text
+    , _bacScriptBootstrapAction :: !ScriptBootstrapActionConfig
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'BootstrapActionConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'bacName'
+--
+-- * 'bacScriptBootstrapAction'
+bootstrapActionConfig
+    :: Text -- ^ 'bacName'
+    -> ScriptBootstrapActionConfig -- ^ 'bacScriptBootstrapAction'
+    -> BootstrapActionConfig
+bootstrapActionConfig pName_ pScriptBootstrapAction_ =
+    BootstrapActionConfig'
+    { _bacName = pName_
+    , _bacScriptBootstrapAction = pScriptBootstrapAction_
+    }
+
+-- | The name of the bootstrap action.
+bacName :: Lens' BootstrapActionConfig Text
+bacName = lens _bacName (\ s a -> s{_bacName = a});
+
+-- | The script run by the bootstrap action.
+bacScriptBootstrapAction :: Lens' BootstrapActionConfig ScriptBootstrapActionConfig
+bacScriptBootstrapAction = lens _bacScriptBootstrapAction (\ s a -> s{_bacScriptBootstrapAction = a});
+
+instance ToJSON BootstrapActionConfig where
+        toJSON BootstrapActionConfig'{..}
+          = object
+              ["Name" .= _bacName,
+               "ScriptBootstrapAction" .= _bacScriptBootstrapAction]
+
+-- | The detailed description of the cluster.
+--
+-- /See:/ 'cluster' smart constructor.
+data Cluster = Cluster'
+    { _cluRequestedAMIVersion     :: !(Maybe Text)
+    , _cluEC2InstanceAttributes   :: !(Maybe EC2InstanceAttributes)
+    , _cluNormalizedInstanceHours :: !(Maybe Int)
+    , _cluConfigurations          :: !(Maybe [Configuration])
+    , _cluReleaseLabel            :: !(Maybe Text)
+    , _cluLogURI                  :: !(Maybe Text)
+    , _cluRunningAMIVersion       :: !(Maybe Text)
+    , _cluMasterPublicDNSName     :: !(Maybe Text)
+    , _cluAutoTerminate           :: !(Maybe Bool)
+    , _cluTerminationProtected    :: !(Maybe Bool)
+    , _cluVisibleToAllUsers       :: !(Maybe Bool)
+    , _cluApplications            :: !(Maybe [Application])
+    , _cluTags                    :: !(Maybe [Tag])
+    , _cluServiceRole             :: !(Maybe Text)
+    , _cluId                      :: !Text
+    , _cluName                    :: !Text
+    , _cluStatus                  :: !ClusterStatus
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Cluster' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cluRequestedAMIVersion'
+--
+-- * 'cluEC2InstanceAttributes'
+--
+-- * 'cluNormalizedInstanceHours'
+--
+-- * 'cluConfigurations'
+--
+-- * 'cluReleaseLabel'
+--
+-- * 'cluLogURI'
+--
+-- * 'cluRunningAMIVersion'
+--
+-- * 'cluMasterPublicDNSName'
+--
+-- * 'cluAutoTerminate'
+--
+-- * 'cluTerminationProtected'
+--
+-- * 'cluVisibleToAllUsers'
+--
+-- * 'cluApplications'
+--
+-- * 'cluTags'
+--
+-- * 'cluServiceRole'
+--
+-- * 'cluId'
+--
+-- * 'cluName'
+--
+-- * 'cluStatus'
+cluster
+    :: Text -- ^ 'cluId'
+    -> Text -- ^ 'cluName'
+    -> ClusterStatus -- ^ 'cluStatus'
+    -> Cluster
+cluster pId_ pName_ pStatus_ =
+    Cluster'
+    { _cluRequestedAMIVersion = Nothing
+    , _cluEC2InstanceAttributes = Nothing
+    , _cluNormalizedInstanceHours = Nothing
+    , _cluConfigurations = Nothing
+    , _cluReleaseLabel = Nothing
+    , _cluLogURI = Nothing
+    , _cluRunningAMIVersion = Nothing
+    , _cluMasterPublicDNSName = Nothing
+    , _cluAutoTerminate = Nothing
+    , _cluTerminationProtected = Nothing
+    , _cluVisibleToAllUsers = Nothing
+    , _cluApplications = Nothing
+    , _cluTags = Nothing
+    , _cluServiceRole = Nothing
+    , _cluId = pId_
+    , _cluName = pName_
+    , _cluStatus = pStatus_
+    }
+
+-- | The AMI version requested for this cluster.
+cluRequestedAMIVersion :: Lens' Cluster (Maybe Text)
+cluRequestedAMIVersion = lens _cluRequestedAMIVersion (\ s a -> s{_cluRequestedAMIVersion = a});
+
+-- | Undocumented member.
+cluEC2InstanceAttributes :: Lens' Cluster (Maybe EC2InstanceAttributes)
+cluEC2InstanceAttributes = lens _cluEC2InstanceAttributes (\ s a -> s{_cluEC2InstanceAttributes = a});
+
+-- | An approximation of the cost of the job flow, represented in
+-- m1.small\/hours. This value is incremented one time for every hour an
+-- m1.small instance runs. Larger instances are weighted more, so an EC2
+-- instance that is roughly four times more expensive would result in the
+-- normalized instance hours being incremented by four. This result is only
+-- an approximation and does not reflect the actual billing rate.
+cluNormalizedInstanceHours :: Lens' Cluster (Maybe Int)
+cluNormalizedInstanceHours = lens _cluNormalizedInstanceHours (\ s a -> s{_cluNormalizedInstanceHours = a});
+
+-- | Amazon EMR releases 4.x or later.
+--
+-- The list of Configurations supplied to the EMR cluster.
+cluConfigurations :: Lens' Cluster [Configuration]
+cluConfigurations = lens _cluConfigurations (\ s a -> s{_cluConfigurations = a}) . _Default . _Coerce;
+
+-- | The release label for the Amazon EMR release. For Amazon EMR 3.x and 2.x
+-- AMIs, use amiVersion instead instead of ReleaseLabel.
+cluReleaseLabel :: Lens' Cluster (Maybe Text)
+cluReleaseLabel = lens _cluReleaseLabel (\ s a -> s{_cluReleaseLabel = a});
+
+-- | The path to the Amazon S3 location where logs for this cluster are
+-- stored.
+cluLogURI :: Lens' Cluster (Maybe Text)
+cluLogURI = lens _cluLogURI (\ s a -> s{_cluLogURI = a});
+
+-- | The AMI version running on this cluster.
+cluRunningAMIVersion :: Lens' Cluster (Maybe Text)
+cluRunningAMIVersion = lens _cluRunningAMIVersion (\ s a -> s{_cluRunningAMIVersion = a});
+
+-- | The public DNS name of the master EC2 instance.
+cluMasterPublicDNSName :: Lens' Cluster (Maybe Text)
+cluMasterPublicDNSName = lens _cluMasterPublicDNSName (\ s a -> s{_cluMasterPublicDNSName = a});
+
+-- | Specifies whether the cluster should terminate after completing all
+-- steps.
+cluAutoTerminate :: Lens' Cluster (Maybe Bool)
+cluAutoTerminate = lens _cluAutoTerminate (\ s a -> s{_cluAutoTerminate = a});
+
+-- | Indicates whether Amazon EMR will lock the cluster to prevent the EC2
+-- instances from being terminated by an API call or user intervention, or
+-- in the event of a cluster error.
+cluTerminationProtected :: Lens' Cluster (Maybe Bool)
+cluTerminationProtected = lens _cluTerminationProtected (\ s a -> s{_cluTerminationProtected = a});
+
+-- | Indicates whether the job flow is visible to all IAM users of the AWS
+-- account associated with the job flow. If this value is set to 'true',
+-- 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.
+cluVisibleToAllUsers :: Lens' Cluster (Maybe Bool)
+cluVisibleToAllUsers = lens _cluVisibleToAllUsers (\ s a -> s{_cluVisibleToAllUsers = a});
+
+-- | The applications installed on this cluster.
+cluApplications :: Lens' Cluster [Application]
+cluApplications = lens _cluApplications (\ s a -> s{_cluApplications = a}) . _Default . _Coerce;
+
+-- | A list of tags associated with a cluster.
+cluTags :: Lens' Cluster [Tag]
+cluTags = lens _cluTags (\ s a -> s{_cluTags = a}) . _Default . _Coerce;
+
+-- | The IAM role that will be assumed by the Amazon EMR service to access
+-- AWS resources on your behalf.
+cluServiceRole :: Lens' Cluster (Maybe Text)
+cluServiceRole = lens _cluServiceRole (\ s a -> s{_cluServiceRole = a});
+
+-- | The unique identifier for the cluster.
+cluId :: Lens' Cluster Text
+cluId = lens _cluId (\ s a -> s{_cluId = a});
+
+-- | The name of the cluster.
+cluName :: Lens' Cluster Text
+cluName = lens _cluName (\ s a -> s{_cluName = a});
+
+-- | The current status details about the cluster.
+cluStatus :: Lens' Cluster ClusterStatus
+cluStatus = lens _cluStatus (\ s a -> s{_cluStatus = a});
+
+instance FromJSON Cluster where
+        parseJSON
+          = withObject "Cluster"
+              (\ x ->
+                 Cluster' <$>
+                   (x .:? "RequestedAmiVersion") <*>
+                     (x .:? "Ec2InstanceAttributes")
+                     <*> (x .:? "NormalizedInstanceHours")
+                     <*> (x .:? "Configurations" .!= mempty)
+                     <*> (x .:? "ReleaseLabel")
+                     <*> (x .:? "LogUri")
+                     <*> (x .:? "RunningAmiVersion")
+                     <*> (x .:? "MasterPublicDnsName")
+                     <*> (x .:? "AutoTerminate")
+                     <*> (x .:? "TerminationProtected")
+                     <*> (x .:? "VisibleToAllUsers")
+                     <*> (x .:? "Applications" .!= mempty)
+                     <*> (x .:? "Tags" .!= mempty)
+                     <*> (x .:? "ServiceRole")
+                     <*> (x .: "Id")
+                     <*> (x .: "Name")
+                     <*> (x .: "Status"))
+
+-- | The reason that the cluster changed to its current state.
+--
+-- /See:/ 'clusterStateChangeReason' smart constructor.
+data ClusterStateChangeReason = ClusterStateChangeReason'
+    { _cscrCode    :: !(Maybe ClusterStateChangeReasonCode)
+    , _cscrMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ClusterStateChangeReason' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cscrCode'
+--
+-- * 'cscrMessage'
+clusterStateChangeReason
+    :: ClusterStateChangeReason
+clusterStateChangeReason =
+    ClusterStateChangeReason'
+    { _cscrCode = Nothing
+    , _cscrMessage = Nothing
+    }
+
+-- | The programmatic code for the state change reason.
+cscrCode :: Lens' ClusterStateChangeReason (Maybe ClusterStateChangeReasonCode)
+cscrCode = lens _cscrCode (\ s a -> s{_cscrCode = a});
+
+-- | The descriptive message for the state change reason.
+cscrMessage :: Lens' ClusterStateChangeReason (Maybe Text)
+cscrMessage = lens _cscrMessage (\ s a -> s{_cscrMessage = a});
+
+instance FromJSON ClusterStateChangeReason where
+        parseJSON
+          = withObject "ClusterStateChangeReason"
+              (\ x ->
+                 ClusterStateChangeReason' <$>
+                   (x .:? "Code") <*> (x .:? "Message"))
+
+-- | The detailed status of the cluster.
+--
+-- /See:/ 'clusterStatus' smart constructor.
+data ClusterStatus = ClusterStatus'
+    { _csState             :: !(Maybe ClusterState)
+    , _csStateChangeReason :: !(Maybe ClusterStateChangeReason)
+    , _csTimeline          :: !(Maybe ClusterTimeline)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ClusterStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csState'
+--
+-- * 'csStateChangeReason'
+--
+-- * 'csTimeline'
+clusterStatus
+    :: ClusterStatus
+clusterStatus =
+    ClusterStatus'
+    { _csState = Nothing
+    , _csStateChangeReason = Nothing
+    , _csTimeline = Nothing
+    }
+
+-- | The current state of the cluster.
+csState :: Lens' ClusterStatus (Maybe ClusterState)
+csState = lens _csState (\ s a -> s{_csState = a});
+
+-- | The reason for the cluster status change.
+csStateChangeReason :: Lens' ClusterStatus (Maybe ClusterStateChangeReason)
+csStateChangeReason = lens _csStateChangeReason (\ s a -> s{_csStateChangeReason = a});
+
+-- | A timeline that represents the status of a cluster over the lifetime of
+-- the cluster.
+csTimeline :: Lens' ClusterStatus (Maybe ClusterTimeline)
+csTimeline = lens _csTimeline (\ s a -> s{_csTimeline = a});
+
+instance FromJSON ClusterStatus where
+        parseJSON
+          = withObject "ClusterStatus"
+              (\ x ->
+                 ClusterStatus' <$>
+                   (x .:? "State") <*> (x .:? "StateChangeReason") <*>
+                     (x .:? "Timeline"))
+
+-- | The summary description of the cluster.
+--
+-- /See:/ 'clusterSummary' smart constructor.
+data ClusterSummary = ClusterSummary'
+    { _csStatus                  :: !(Maybe ClusterStatus)
+    , _csNormalizedInstanceHours :: !(Maybe Int)
+    , _csName                    :: !(Maybe Text)
+    , _csId                      :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ClusterSummary' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'csStatus'
+--
+-- * 'csNormalizedInstanceHours'
+--
+-- * 'csName'
+--
+-- * 'csId'
+clusterSummary
+    :: ClusterSummary
+clusterSummary =
+    ClusterSummary'
+    { _csStatus = Nothing
+    , _csNormalizedInstanceHours = Nothing
+    , _csName = Nothing
+    , _csId = Nothing
+    }
+
+-- | The details about the current status of the cluster.
+csStatus :: Lens' ClusterSummary (Maybe ClusterStatus)
+csStatus = lens _csStatus (\ s a -> s{_csStatus = a});
+
+-- | An approximation of the cost of the job flow, represented in
+-- m1.small\/hours. This value is incremented one time for every hour an
+-- m1.small instance runs. Larger instances are weighted more, so an EC2
+-- instance that is roughly four times more expensive would result in the
+-- normalized instance hours being incremented by four. This result is only
+-- an approximation and does not reflect the actual billing rate.
+csNormalizedInstanceHours :: Lens' ClusterSummary (Maybe Int)
+csNormalizedInstanceHours = lens _csNormalizedInstanceHours (\ s a -> s{_csNormalizedInstanceHours = a});
+
+-- | The name of the cluster.
+csName :: Lens' ClusterSummary (Maybe Text)
+csName = lens _csName (\ s a -> s{_csName = a});
+
+-- | The unique identifier for the cluster.
+csId :: Lens' ClusterSummary (Maybe Text)
+csId = lens _csId (\ s a -> s{_csId = a});
+
+instance FromJSON ClusterSummary where
+        parseJSON
+          = withObject "ClusterSummary"
+              (\ x ->
+                 ClusterSummary' <$>
+                   (x .:? "Status") <*>
+                     (x .:? "NormalizedInstanceHours")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Id"))
+
+-- | Represents the timeline of the cluster\'s lifecycle.
+--
+-- /See:/ 'clusterTimeline' smart constructor.
+data ClusterTimeline = ClusterTimeline'
+    { _ctReadyDateTime    :: !(Maybe POSIX)
+    , _ctCreationDateTime :: !(Maybe POSIX)
+    , _ctEndDateTime      :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ClusterTimeline' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ctReadyDateTime'
+--
+-- * 'ctCreationDateTime'
+--
+-- * 'ctEndDateTime'
+clusterTimeline
+    :: ClusterTimeline
+clusterTimeline =
+    ClusterTimeline'
+    { _ctReadyDateTime = Nothing
+    , _ctCreationDateTime = Nothing
+    , _ctEndDateTime = Nothing
+    }
+
+-- | The date and time when the cluster was ready to execute steps.
+ctReadyDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
+ctReadyDateTime = lens _ctReadyDateTime (\ s a -> s{_ctReadyDateTime = a}) . mapping _Time;
+
+-- | The creation date and time of the cluster.
+ctCreationDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
+ctCreationDateTime = lens _ctCreationDateTime (\ s a -> s{_ctCreationDateTime = a}) . mapping _Time;
+
+-- | The date and time when the cluster was terminated.
+ctEndDateTime :: Lens' ClusterTimeline (Maybe UTCTime)
+ctEndDateTime = lens _ctEndDateTime (\ s a -> s{_ctEndDateTime = a}) . mapping _Time;
+
+instance FromJSON ClusterTimeline where
+        parseJSON
+          = withObject "ClusterTimeline"
+              (\ x ->
+                 ClusterTimeline' <$>
+                   (x .:? "ReadyDateTime") <*>
+                     (x .:? "CreationDateTime")
+                     <*> (x .:? "EndDateTime"))
+
+-- | An entity describing an executable that runs on a cluster.
+--
+-- /See:/ 'command' smart constructor.
+data Command = Command'
+    { _cArgs       :: !(Maybe [Text])
+    , _cScriptPath :: !(Maybe Text)
+    , _cName       :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Command' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cArgs'
+--
+-- * 'cScriptPath'
+--
+-- * 'cName'
+command
+    :: Command
+command =
+    Command'
+    { _cArgs = Nothing
+    , _cScriptPath = Nothing
+    , _cName = Nothing
+    }
+
+-- | Arguments for Amazon EMR to pass to the command for execution.
+cArgs :: Lens' Command [Text]
+cArgs = lens _cArgs (\ s a -> s{_cArgs = a}) . _Default . _Coerce;
+
+-- | The Amazon S3 location of the command script.
+cScriptPath :: Lens' Command (Maybe Text)
+cScriptPath = lens _cScriptPath (\ s a -> s{_cScriptPath = a});
+
+-- | The name of the command.
+cName :: Lens' Command (Maybe Text)
+cName = lens _cName (\ s a -> s{_cName = a});
+
+instance FromJSON Command where
+        parseJSON
+          = withObject "Command"
+              (\ x ->
+                 Command' <$>
+                   (x .:? "Args" .!= mempty) <*> (x .:? "ScriptPath")
+                     <*> (x .:? "Name"))
+
+-- | Amazon EMR releases 4.x or later.
+--
+-- Specifies a hardware and software configuration of the EMR cluster. This
+-- includes configurations for applications and software bundled with
+-- Amazon EMR. The Configuration object is a JSON object which is defined
+-- by a classification and a set of properties. Configurations can be
+-- nested, so a configuration may have its own Configuration objects
+-- listed.
+--
+-- /See:/ 'configuration' smart constructor.
+data Configuration = Configuration'
+    { _cConfigurations :: !(Maybe [Configuration])
+    , _cClassification :: !(Maybe Text)
+    , _cProperties     :: !(Maybe (Map Text Text))
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Configuration' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cConfigurations'
+--
+-- * 'cClassification'
+--
+-- * 'cProperties'
+configuration
+    :: Configuration
+configuration =
+    Configuration'
+    { _cConfigurations = Nothing
+    , _cClassification = Nothing
+    , _cProperties = Nothing
+    }
+
+-- | A list of configurations you apply to this configuration object.
+cConfigurations :: Lens' Configuration [Configuration]
+cConfigurations = lens _cConfigurations (\ s a -> s{_cConfigurations = a}) . _Default . _Coerce;
+
+-- | The classification of a configuration. For more information see,
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/EmrConfigurations.html Amazon EMR Configurations>.
+cClassification :: Lens' Configuration (Maybe Text)
+cClassification = lens _cClassification (\ s a -> s{_cClassification = a});
+
+-- | A set of properties supplied to the Configuration object.
+cProperties :: Lens' Configuration (HashMap Text Text)
+cProperties = lens _cProperties (\ s a -> s{_cProperties = a}) . _Default . _Map;
+
+instance FromJSON Configuration where
+        parseJSON
+          = withObject "Configuration"
+              (\ x ->
+                 Configuration' <$>
+                   (x .:? "Configurations" .!= mempty) <*>
+                     (x .:? "Classification")
+                     <*> (x .:? "Properties" .!= mempty))
+
+instance ToJSON Configuration where
+        toJSON Configuration'{..}
+          = object
+              ["Configurations" .= _cConfigurations,
+               "Classification" .= _cClassification,
+               "Properties" .= _cProperties]
+
+-- | Provides information about the EC2 instances in a cluster grouped by
+-- category. For example, key name, subnet ID, IAM instance profile, and so
+-- on.
+--
+-- /See:/ 'ec2InstanceAttributes' smart constructor.
+data EC2InstanceAttributes = EC2InstanceAttributes'
+    { _eiaEC2KeyName                     :: !(Maybe Text)
+    , _eiaEmrManagedSlaveSecurityGroup   :: !(Maybe Text)
+    , _eiaAdditionalSlaveSecurityGroups  :: !(Maybe [Text])
+    , _eiaIAMInstanceProfile             :: !(Maybe Text)
+    , _eiaAdditionalMasterSecurityGroups :: !(Maybe [Text])
+    , _eiaEmrManagedMasterSecurityGroup  :: !(Maybe Text)
+    , _eiaEC2SubnetId                    :: !(Maybe Text)
+    , _eiaEC2AvailabilityZone            :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EC2InstanceAttributes' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eiaEC2KeyName'
+--
+-- * 'eiaEmrManagedSlaveSecurityGroup'
+--
+-- * 'eiaAdditionalSlaveSecurityGroups'
+--
+-- * 'eiaIAMInstanceProfile'
+--
+-- * 'eiaAdditionalMasterSecurityGroups'
+--
+-- * 'eiaEmrManagedMasterSecurityGroup'
+--
+-- * 'eiaEC2SubnetId'
+--
+-- * 'eiaEC2AvailabilityZone'
+ec2InstanceAttributes
+    :: EC2InstanceAttributes
+ec2InstanceAttributes =
+    EC2InstanceAttributes'
+    { _eiaEC2KeyName = Nothing
+    , _eiaEmrManagedSlaveSecurityGroup = Nothing
+    , _eiaAdditionalSlaveSecurityGroups = Nothing
+    , _eiaIAMInstanceProfile = Nothing
+    , _eiaAdditionalMasterSecurityGroups = Nothing
+    , _eiaEmrManagedMasterSecurityGroup = Nothing
+    , _eiaEC2SubnetId = Nothing
+    , _eiaEC2AvailabilityZone = Nothing
+    }
+
+-- | The name of the Amazon EC2 key pair to use when connecting with SSH into
+-- the master node as a user named \"hadoop\".
+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.
+eiaEmrManagedSlaveSecurityGroup :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaEmrManagedSlaveSecurityGroup = lens _eiaEmrManagedSlaveSecurityGroup (\ s a -> s{_eiaEmrManagedSlaveSecurityGroup = a});
+
+-- | A list of additional Amazon EC2 security group IDs for the slave nodes.
+eiaAdditionalSlaveSecurityGroups :: Lens' EC2InstanceAttributes [Text]
+eiaAdditionalSlaveSecurityGroups = lens _eiaAdditionalSlaveSecurityGroups (\ s a -> s{_eiaAdditionalSlaveSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The IAM role that was specified when the job flow was launched. The EC2
+-- instances of the job flow assume this role.
+eiaIAMInstanceProfile :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaIAMInstanceProfile = lens _eiaIAMInstanceProfile (\ s a -> s{_eiaIAMInstanceProfile = a});
+
+-- | A list of additional Amazon EC2 security group IDs for the master node.
+eiaAdditionalMasterSecurityGroups :: Lens' EC2InstanceAttributes [Text]
+eiaAdditionalMasterSecurityGroups = lens _eiaAdditionalMasterSecurityGroups (\ s a -> s{_eiaAdditionalMasterSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The identifier of the Amazon EC2 security group (managed by Amazon
+-- Elastic MapReduce) for the master node.
+eiaEmrManagedMasterSecurityGroup :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaEmrManagedMasterSecurityGroup = lens _eiaEmrManagedMasterSecurityGroup (\ s a -> s{_eiaEmrManagedMasterSecurityGroup = a});
+
+-- | To launch the job flow in Amazon VPC, set this parameter to the
+-- identifier of the Amazon VPC subnet where you want the job flow to
+-- launch. If you do not specify this value, the job flow is launched in
+-- the normal AWS cloud, outside of a VPC.
+--
+-- Amazon VPC currently does not support cluster compute quadruple extra
+-- large (cc1.4xlarge) instances. Thus, you cannot specify the cc1.4xlarge
+-- instance type for nodes of a job flow launched in a VPC.
+eiaEC2SubnetId :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaEC2SubnetId = lens _eiaEC2SubnetId (\ s a -> s{_eiaEC2SubnetId = a});
+
+-- | The Availability Zone in which the cluster will run.
+eiaEC2AvailabilityZone :: Lens' EC2InstanceAttributes (Maybe Text)
+eiaEC2AvailabilityZone = lens _eiaEC2AvailabilityZone (\ s a -> s{_eiaEC2AvailabilityZone = a});
+
+instance FromJSON EC2InstanceAttributes where
+        parseJSON
+          = withObject "EC2InstanceAttributes"
+              (\ x ->
+                 EC2InstanceAttributes' <$>
+                   (x .:? "Ec2KeyName") <*>
+                     (x .:? "EmrManagedSlaveSecurityGroup")
+                     <*>
+                     (x .:? "AdditionalSlaveSecurityGroups" .!= mempty)
+                     <*> (x .:? "IamInstanceProfile")
+                     <*>
+                     (x .:? "AdditionalMasterSecurityGroups" .!= mempty)
+                     <*> (x .:? "EmrManagedMasterSecurityGroup")
+                     <*> (x .:? "Ec2SubnetId")
+                     <*> (x .:? "Ec2AvailabilityZone"))
+
+-- | 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.
+--
+-- /See:/ 'hadoopJARStepConfig' smart constructor.
+data HadoopJARStepConfig = HadoopJARStepConfig'
+    { _hjscArgs       :: !(Maybe [Text])
+    , _hjscMainClass  :: !(Maybe Text)
+    , _hjscProperties :: !(Maybe [KeyValue])
+    , _hjscJAR        :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'HadoopJARStepConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'hjscArgs'
+--
+-- * 'hjscMainClass'
+--
+-- * 'hjscProperties'
+--
+-- * 'hjscJAR'
+hadoopJARStepConfig
+    :: Text -- ^ 'hjscJAR'
+    -> HadoopJARStepConfig
+hadoopJARStepConfig pJAR_ =
+    HadoopJARStepConfig'
+    { _hjscArgs = Nothing
+    , _hjscMainClass = Nothing
+    , _hjscProperties = Nothing
+    , _hjscJAR = pJAR_
+    }
+
+-- | A list of command line arguments passed to the JAR file\'s main function
+-- when executed.
+hjscArgs :: Lens' HadoopJARStepConfig [Text]
+hjscArgs = lens _hjscArgs (\ s a -> s{_hjscArgs = a}) . _Default . _Coerce;
+
+-- | The name of the main class in the specified Java file. If not specified,
+-- the JAR file should specify a Main-Class in its manifest file.
+hjscMainClass :: Lens' HadoopJARStepConfig (Maybe Text)
+hjscMainClass = lens _hjscMainClass (\ s a -> s{_hjscMainClass = a});
+
+-- | A list of Java properties that are set when the step runs. You can use
+-- these properties to pass key value pairs to your main function.
+hjscProperties :: Lens' HadoopJARStepConfig [KeyValue]
+hjscProperties = lens _hjscProperties (\ s a -> s{_hjscProperties = a}) . _Default . _Coerce;
+
+-- | A path to a JAR file run during the step.
+hjscJAR :: Lens' HadoopJARStepConfig Text
+hjscJAR = lens _hjscJAR (\ s a -> s{_hjscJAR = a});
+
+instance ToJSON HadoopJARStepConfig where
+        toJSON HadoopJARStepConfig'{..}
+          = object
+              ["Args" .= _hjscArgs, "MainClass" .= _hjscMainClass,
+               "Properties" .= _hjscProperties, "Jar" .= _hjscJAR]
+
+-- | A cluster 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.
+--
+-- /See:/ 'hadoopStepConfig' smart constructor.
+data HadoopStepConfig = HadoopStepConfig'
+    { _hscArgs       :: !(Maybe [Text])
+    , _hscJAR        :: !(Maybe Text)
+    , _hscMainClass  :: !(Maybe Text)
+    , _hscProperties :: !(Maybe (Map Text Text))
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'HadoopStepConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'hscArgs'
+--
+-- * 'hscJAR'
+--
+-- * 'hscMainClass'
+--
+-- * 'hscProperties'
+hadoopStepConfig
+    :: HadoopStepConfig
+hadoopStepConfig =
+    HadoopStepConfig'
+    { _hscArgs = Nothing
+    , _hscJAR = Nothing
+    , _hscMainClass = Nothing
+    , _hscProperties = Nothing
+    }
+
+-- | The list of command line arguments to pass to the JAR file\'s main
+-- function for execution.
+hscArgs :: Lens' HadoopStepConfig [Text]
+hscArgs = lens _hscArgs (\ s a -> s{_hscArgs = a}) . _Default . _Coerce;
+
+-- | The path to the JAR file that runs during the step.
+hscJAR :: Lens' HadoopStepConfig (Maybe Text)
+hscJAR = lens _hscJAR (\ s a -> s{_hscJAR = a});
+
+-- | The name of the main class in the specified Java file. If not specified,
+-- the JAR file should specify a main class in its manifest file.
+hscMainClass :: Lens' HadoopStepConfig (Maybe Text)
+hscMainClass = lens _hscMainClass (\ s a -> s{_hscMainClass = a});
+
+-- | The list of Java properties that are set when the step runs. You can use
+-- these properties to pass key value pairs to your main function.
+hscProperties :: Lens' HadoopStepConfig (HashMap Text Text)
+hscProperties = lens _hscProperties (\ s a -> s{_hscProperties = a}) . _Default . _Map;
+
+instance FromJSON HadoopStepConfig where
+        parseJSON
+          = withObject "HadoopStepConfig"
+              (\ x ->
+                 HadoopStepConfig' <$>
+                   (x .:? "Args" .!= mempty) <*> (x .:? "Jar") <*>
+                     (x .:? "MainClass")
+                     <*> (x .:? "Properties" .!= mempty))
+
+-- | Represents an EC2 instance provisioned as part of cluster.
+--
+-- /See:/ 'instance'' smart constructor.
+data Instance = Instance'
+    { _iStatus           :: !(Maybe InstanceStatus)
+    , _iPublicDNSName    :: !(Maybe Text)
+    , _iEC2InstanceId    :: !(Maybe Text)
+    , _iPrivateIPAddress :: !(Maybe Text)
+    , _iId               :: !(Maybe Text)
+    , _iPrivateDNSName   :: !(Maybe Text)
+    , _iPublicIPAddress  :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Instance' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iStatus'
+--
+-- * 'iPublicDNSName'
+--
+-- * 'iEC2InstanceId'
+--
+-- * 'iPrivateIPAddress'
+--
+-- * 'iId'
+--
+-- * 'iPrivateDNSName'
+--
+-- * 'iPublicIPAddress'
+instance'
+    :: Instance
+instance' =
+    Instance'
+    { _iStatus = Nothing
+    , _iPublicDNSName = Nothing
+    , _iEC2InstanceId = Nothing
+    , _iPrivateIPAddress = Nothing
+    , _iId = Nothing
+    , _iPrivateDNSName = Nothing
+    , _iPublicIPAddress = Nothing
+    }
+
+-- | The current status of the instance.
+iStatus :: Lens' Instance (Maybe InstanceStatus)
+iStatus = lens _iStatus (\ s a -> s{_iStatus = a});
+
+-- | The public DNS name of the instance.
+iPublicDNSName :: Lens' Instance (Maybe Text)
+iPublicDNSName = lens _iPublicDNSName (\ s a -> s{_iPublicDNSName = a});
+
+-- | The unique identifier of the instance in Amazon EC2.
+iEC2InstanceId :: Lens' Instance (Maybe Text)
+iEC2InstanceId = lens _iEC2InstanceId (\ s a -> s{_iEC2InstanceId = a});
+
+-- | The private IP address of the instance.
+iPrivateIPAddress :: Lens' Instance (Maybe Text)
+iPrivateIPAddress = lens _iPrivateIPAddress (\ s a -> s{_iPrivateIPAddress = a});
+
+-- | The unique identifier for the instance in Amazon EMR.
+iId :: Lens' Instance (Maybe Text)
+iId = lens _iId (\ s a -> s{_iId = a});
+
+-- | The private DNS name of the instance.
+iPrivateDNSName :: Lens' Instance (Maybe Text)
+iPrivateDNSName = lens _iPrivateDNSName (\ s a -> s{_iPrivateDNSName = a});
+
+-- | The public IP address of the instance.
+iPublicIPAddress :: Lens' Instance (Maybe Text)
+iPublicIPAddress = lens _iPublicIPAddress (\ s a -> s{_iPublicIPAddress = a});
+
+instance FromJSON Instance where
+        parseJSON
+          = withObject "Instance"
+              (\ x ->
+                 Instance' <$>
+                   (x .:? "Status") <*> (x .:? "PublicDnsName") <*>
+                     (x .:? "Ec2InstanceId")
+                     <*> (x .:? "PrivateIpAddress")
+                     <*> (x .:? "Id")
+                     <*> (x .:? "PrivateDnsName")
+                     <*> (x .:? "PublicIpAddress"))
+
+-- | 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.
+--
+-- /See:/ 'instanceGroup' smart constructor.
+data InstanceGroup = InstanceGroup'
+    { _igStatus                 :: !(Maybe InstanceGroupStatus)
+    , _igBidPrice               :: !(Maybe Text)
+    , _igRequestedInstanceCount :: !(Maybe Int)
+    , _igRunningInstanceCount   :: !(Maybe Int)
+    , _igConfigurations         :: !(Maybe [Configuration])
+    , _igInstanceGroupType      :: !(Maybe InstanceGroupType)
+    , _igInstanceType           :: !(Maybe Text)
+    , _igMarket                 :: !(Maybe MarketType)
+    , _igName                   :: !(Maybe Text)
+    , _igId                     :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceGroup' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'igStatus'
+--
+-- * 'igBidPrice'
+--
+-- * 'igRequestedInstanceCount'
+--
+-- * 'igRunningInstanceCount'
+--
+-- * 'igConfigurations'
+--
+-- * 'igInstanceGroupType'
+--
+-- * 'igInstanceType'
+--
+-- * 'igMarket'
+--
+-- * 'igName'
+--
+-- * 'igId'
+instanceGroup
+    :: InstanceGroup
+instanceGroup =
+    InstanceGroup'
+    { _igStatus = Nothing
+    , _igBidPrice = Nothing
+    , _igRequestedInstanceCount = Nothing
+    , _igRunningInstanceCount = Nothing
+    , _igConfigurations = Nothing
+    , _igInstanceGroupType = Nothing
+    , _igInstanceType = Nothing
+    , _igMarket = Nothing
+    , _igName = Nothing
+    , _igId = Nothing
+    }
+
+-- | The current status of the instance group.
+igStatus :: Lens' InstanceGroup (Maybe InstanceGroupStatus)
+igStatus = lens _igStatus (\ s a -> s{_igStatus = a});
+
+-- | The bid price for each EC2 instance in the instance group when launching
+-- nodes as Spot Instances, expressed in USD.
+igBidPrice :: Lens' InstanceGroup (Maybe Text)
+igBidPrice = lens _igBidPrice (\ s a -> s{_igBidPrice = a});
+
+-- | The target number of instances for the instance group.
+igRequestedInstanceCount :: Lens' InstanceGroup (Maybe Int)
+igRequestedInstanceCount = lens _igRequestedInstanceCount (\ s a -> s{_igRequestedInstanceCount = a});
+
+-- | The number of instances currently running in this instance group.
+igRunningInstanceCount :: Lens' InstanceGroup (Maybe Int)
+igRunningInstanceCount = lens _igRunningInstanceCount (\ s a -> s{_igRunningInstanceCount = a});
+
+-- | Amazon EMR releases 4.x or later.
+--
+-- The list of configurations supplied for an EMR cluster instance group.
+-- You can specify a separate configuration for each instance group
+-- (master, core, and task).
+igConfigurations :: Lens' InstanceGroup [Configuration]
+igConfigurations = lens _igConfigurations (\ s a -> s{_igConfigurations = a}) . _Default . _Coerce;
+
+-- | The type of the instance group. Valid values are MASTER, CORE or TASK.
+igInstanceGroupType :: Lens' InstanceGroup (Maybe InstanceGroupType)
+igInstanceGroupType = lens _igInstanceGroupType (\ s a -> s{_igInstanceGroupType = a});
+
+-- | The EC2 instance type for all instances in the instance group.
+igInstanceType :: Lens' InstanceGroup (Maybe Text)
+igInstanceType = lens _igInstanceType (\ s a -> s{_igInstanceType = a});
+
+-- | The marketplace to provision instances for this group. Valid values are
+-- ON_DEMAND or SPOT.
+igMarket :: Lens' InstanceGroup (Maybe MarketType)
+igMarket = lens _igMarket (\ s a -> s{_igMarket = a});
+
+-- | The name of the instance group.
+igName :: Lens' InstanceGroup (Maybe Text)
+igName = lens _igName (\ s a -> s{_igName = a});
+
+-- | The identifier of the instance group.
+igId :: Lens' InstanceGroup (Maybe Text)
+igId = lens _igId (\ s a -> s{_igId = a});
+
+instance FromJSON InstanceGroup where
+        parseJSON
+          = withObject "InstanceGroup"
+              (\ x ->
+                 InstanceGroup' <$>
+                   (x .:? "Status") <*> (x .:? "BidPrice") <*>
+                     (x .:? "RequestedInstanceCount")
+                     <*> (x .:? "RunningInstanceCount")
+                     <*> (x .:? "Configurations" .!= mempty)
+                     <*> (x .:? "InstanceGroupType")
+                     <*> (x .:? "InstanceType")
+                     <*> (x .:? "Market")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Id"))
+
+-- | 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
+    } 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:
+--
+-- * 'igcBidPrice'
+--
+-- * 'igcConfigurations'
+--
+-- * 'igcMarket'
+--
+-- * 'igcName'
+--
+-- * 'igcInstanceRole'
+--
+-- * 'igcInstanceType'
+--
+-- * 'igcInstanceCount'
+instanceGroupConfig
+    :: InstanceRoleType -- ^ 'igcInstanceRole'
+    -> Text -- ^ 'igcInstanceType'
+    -> Int -- ^ 'igcInstanceCount'
+    -> InstanceGroupConfig
+instanceGroupConfig pInstanceRole_ pInstanceType_ pInstanceCount_ =
+    InstanceGroupConfig'
+    { _igcBidPrice = Nothing
+    , _igcConfigurations = Nothing
+    , _igcMarket = Nothing
+    , _igcName = Nothing
+    , _igcInstanceRole = pInstanceRole_
+    , _igcInstanceType = pInstanceType_
+    , _igcInstanceCount = pInstanceCount_
+    }
+
+-- | 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)
+igcBidPrice = lens _igcBidPrice (\ s a -> s{_igcBidPrice = a});
+
+-- | Amazon EMR releases 4.x or later.
+--
+-- The list of configurations supplied for an EMR cluster instance group.
+-- You can specify a separate configuration for each instance group
+-- (master, core, and task).
+igcConfigurations :: Lens' InstanceGroupConfig [Configuration]
+igcConfigurations = lens _igcConfigurations (\ s a -> s{_igcConfigurations = a}) . _Default . _Coerce;
+
+-- | Market type of the Amazon EC2 instances used to create a cluster node.
+igcMarket :: Lens' InstanceGroupConfig (Maybe MarketType)
+igcMarket = lens _igcMarket (\ s a -> s{_igcMarket = a});
+
+-- | Friendly name given to the instance group.
+igcName :: Lens' InstanceGroupConfig (Maybe Text)
+igcName = lens _igcName (\ s a -> s{_igcName = a});
+
+-- | The role of the instance group in the cluster.
+igcInstanceRole :: Lens' InstanceGroupConfig InstanceRoleType
+igcInstanceRole = lens _igcInstanceRole (\ s a -> s{_igcInstanceRole = a});
+
+-- | The Amazon EC2 instance type for all instances in the instance group.
+igcInstanceType :: Lens' InstanceGroupConfig Text
+igcInstanceType = lens _igcInstanceType (\ s a -> s{_igcInstanceType = a});
+
+-- | Target number of instances for the instance group.
+igcInstanceCount :: Lens' InstanceGroupConfig Int
+igcInstanceCount = lens _igcInstanceCount (\ s a -> s{_igcInstanceCount = a});
+
+instance ToJSON InstanceGroupConfig where
+        toJSON InstanceGroupConfig'{..}
+          = object
+              ["BidPrice" .= _igcBidPrice,
+               "Configurations" .= _igcConfigurations,
+               "Market" .= _igcMarket, "Name" .= _igcName,
+               "InstanceRole" .= _igcInstanceRole,
+               "InstanceType" .= _igcInstanceType,
+               "InstanceCount" .= _igcInstanceCount]
+
+-- | Modify an instance group size.
+--
+-- /See:/ 'instanceGroupModifyConfig' smart constructor.
+data InstanceGroupModifyConfig = InstanceGroupModifyConfig'
+    { _igmcInstanceCount             :: !(Maybe Int)
+    , _igmcEC2InstanceIdsToTerminate :: !(Maybe [Text])
+    , _igmcInstanceGroupId           :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceGroupModifyConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'igmcInstanceCount'
+--
+-- * 'igmcEC2InstanceIdsToTerminate'
+--
+-- * 'igmcInstanceGroupId'
+instanceGroupModifyConfig
+    :: Text -- ^ 'igmcInstanceGroupId'
+    -> InstanceGroupModifyConfig
+instanceGroupModifyConfig pInstanceGroupId_ =
+    InstanceGroupModifyConfig'
+    { _igmcInstanceCount = Nothing
+    , _igmcEC2InstanceIdsToTerminate = Nothing
+    , _igmcInstanceGroupId = pInstanceGroupId_
+    }
+
+-- | Target size for the instance group.
+igmcInstanceCount :: Lens' InstanceGroupModifyConfig (Maybe Int)
+igmcInstanceCount = lens _igmcInstanceCount (\ s a -> s{_igmcInstanceCount = a});
+
+-- | The EC2 InstanceIds to terminate. For advanced users only. Once you
+-- terminate the instances, the instance group will not return to its
+-- original requested size.
+igmcEC2InstanceIdsToTerminate :: Lens' InstanceGroupModifyConfig [Text]
+igmcEC2InstanceIdsToTerminate = lens _igmcEC2InstanceIdsToTerminate (\ s a -> s{_igmcEC2InstanceIdsToTerminate = a}) . _Default . _Coerce;
+
+-- | Unique ID of the instance group to expand or shrink.
+igmcInstanceGroupId :: Lens' InstanceGroupModifyConfig Text
+igmcInstanceGroupId = lens _igmcInstanceGroupId (\ s a -> s{_igmcInstanceGroupId = a});
+
+instance ToJSON InstanceGroupModifyConfig where
+        toJSON InstanceGroupModifyConfig'{..}
+          = object
+              ["InstanceCount" .= _igmcInstanceCount,
+               "EC2InstanceIdsToTerminate" .=
+                 _igmcEC2InstanceIdsToTerminate,
+               "InstanceGroupId" .= _igmcInstanceGroupId]
+
+-- | The status change reason details for the instance group.
+--
+-- /See:/ 'instanceGroupStateChangeReason' smart constructor.
+data InstanceGroupStateChangeReason = InstanceGroupStateChangeReason'
+    { _igscrCode    :: !(Maybe InstanceGroupStateChangeReasonCode)
+    , _igscrMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceGroupStateChangeReason' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'igscrCode'
+--
+-- * 'igscrMessage'
+instanceGroupStateChangeReason
+    :: InstanceGroupStateChangeReason
+instanceGroupStateChangeReason =
+    InstanceGroupStateChangeReason'
+    { _igscrCode = Nothing
+    , _igscrMessage = Nothing
+    }
+
+-- | The programmable code for the state change reason.
+igscrCode :: Lens' InstanceGroupStateChangeReason (Maybe InstanceGroupStateChangeReasonCode)
+igscrCode = lens _igscrCode (\ s a -> s{_igscrCode = a});
+
+-- | The status change reason description.
+igscrMessage :: Lens' InstanceGroupStateChangeReason (Maybe Text)
+igscrMessage = lens _igscrMessage (\ s a -> s{_igscrMessage = a});
+
+instance FromJSON InstanceGroupStateChangeReason
+         where
+        parseJSON
+          = withObject "InstanceGroupStateChangeReason"
+              (\ x ->
+                 InstanceGroupStateChangeReason' <$>
+                   (x .:? "Code") <*> (x .:? "Message"))
+
+-- | The details of the instance group status.
+--
+-- /See:/ 'instanceGroupStatus' smart constructor.
+data InstanceGroupStatus = InstanceGroupStatus'
+    { _igsState             :: !(Maybe InstanceGroupState)
+    , _igsStateChangeReason :: !(Maybe InstanceGroupStateChangeReason)
+    , _igsTimeline          :: !(Maybe InstanceGroupTimeline)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceGroupStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'igsState'
+--
+-- * 'igsStateChangeReason'
+--
+-- * 'igsTimeline'
+instanceGroupStatus
+    :: InstanceGroupStatus
+instanceGroupStatus =
+    InstanceGroupStatus'
+    { _igsState = Nothing
+    , _igsStateChangeReason = Nothing
+    , _igsTimeline = Nothing
+    }
+
+-- | The current state of the instance group.
+igsState :: Lens' InstanceGroupStatus (Maybe InstanceGroupState)
+igsState = lens _igsState (\ s a -> s{_igsState = a});
+
+-- | The status change reason details for the instance group.
+igsStateChangeReason :: Lens' InstanceGroupStatus (Maybe InstanceGroupStateChangeReason)
+igsStateChangeReason = lens _igsStateChangeReason (\ s a -> s{_igsStateChangeReason = a});
+
+-- | The timeline of the instance group status over time.
+igsTimeline :: Lens' InstanceGroupStatus (Maybe InstanceGroupTimeline)
+igsTimeline = lens _igsTimeline (\ s a -> s{_igsTimeline = a});
+
+instance FromJSON InstanceGroupStatus where
+        parseJSON
+          = withObject "InstanceGroupStatus"
+              (\ x ->
+                 InstanceGroupStatus' <$>
+                   (x .:? "State") <*> (x .:? "StateChangeReason") <*>
+                     (x .:? "Timeline"))
+
+-- | The timeline of the instance group lifecycle.
+--
+-- /See:/ 'instanceGroupTimeline' smart constructor.
+data InstanceGroupTimeline = InstanceGroupTimeline'
+    { _igtReadyDateTime    :: !(Maybe POSIX)
+    , _igtCreationDateTime :: !(Maybe POSIX)
+    , _igtEndDateTime      :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceGroupTimeline' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'igtReadyDateTime'
+--
+-- * 'igtCreationDateTime'
+--
+-- * 'igtEndDateTime'
+instanceGroupTimeline
+    :: InstanceGroupTimeline
+instanceGroupTimeline =
+    InstanceGroupTimeline'
+    { _igtReadyDateTime = Nothing
+    , _igtCreationDateTime = Nothing
+    , _igtEndDateTime = Nothing
+    }
+
+-- | The date and time when the instance group became ready to perform tasks.
+igtReadyDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
+igtReadyDateTime = lens _igtReadyDateTime (\ s a -> s{_igtReadyDateTime = a}) . mapping _Time;
+
+-- | The creation date and time of the instance group.
+igtCreationDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
+igtCreationDateTime = lens _igtCreationDateTime (\ s a -> s{_igtCreationDateTime = a}) . mapping _Time;
+
+-- | The date and time when the instance group terminated.
+igtEndDateTime :: Lens' InstanceGroupTimeline (Maybe UTCTime)
+igtEndDateTime = lens _igtEndDateTime (\ s a -> s{_igtEndDateTime = a}) . mapping _Time;
+
+instance FromJSON InstanceGroupTimeline where
+        parseJSON
+          = withObject "InstanceGroupTimeline"
+              (\ x ->
+                 InstanceGroupTimeline' <$>
+                   (x .:? "ReadyDateTime") <*>
+                     (x .:? "CreationDateTime")
+                     <*> (x .:? "EndDateTime"))
+
+-- | The details of the status change reason for the instance.
+--
+-- /See:/ 'instanceStateChangeReason' smart constructor.
+data InstanceStateChangeReason = InstanceStateChangeReason'
+    { _iscrCode    :: !(Maybe InstanceStateChangeReasonCode)
+    , _iscrMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceStateChangeReason' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'iscrCode'
+--
+-- * 'iscrMessage'
+instanceStateChangeReason
+    :: InstanceStateChangeReason
+instanceStateChangeReason =
+    InstanceStateChangeReason'
+    { _iscrCode = Nothing
+    , _iscrMessage = Nothing
+    }
+
+-- | The programmable code for the state change reason.
+iscrCode :: Lens' InstanceStateChangeReason (Maybe InstanceStateChangeReasonCode)
+iscrCode = lens _iscrCode (\ s a -> s{_iscrCode = a});
+
+-- | The status change reason description.
+iscrMessage :: Lens' InstanceStateChangeReason (Maybe Text)
+iscrMessage = lens _iscrMessage (\ s a -> s{_iscrMessage = a});
+
+instance FromJSON InstanceStateChangeReason where
+        parseJSON
+          = withObject "InstanceStateChangeReason"
+              (\ x ->
+                 InstanceStateChangeReason' <$>
+                   (x .:? "Code") <*> (x .:? "Message"))
+
+-- | The instance status details.
+--
+-- /See:/ 'instanceStatus' smart constructor.
+data InstanceStatus = InstanceStatus'
+    { _isState             :: !(Maybe InstanceState)
+    , _isStateChangeReason :: !(Maybe InstanceStateChangeReason)
+    , _isTimeline          :: !(Maybe InstanceTimeline)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'isState'
+--
+-- * 'isStateChangeReason'
+--
+-- * 'isTimeline'
+instanceStatus
+    :: InstanceStatus
+instanceStatus =
+    InstanceStatus'
+    { _isState = Nothing
+    , _isStateChangeReason = Nothing
+    , _isTimeline = Nothing
+    }
+
+-- | The current state of the instance.
+isState :: Lens' InstanceStatus (Maybe InstanceState)
+isState = lens _isState (\ s a -> s{_isState = a});
+
+-- | The details of the status change reason for the instance.
+isStateChangeReason :: Lens' InstanceStatus (Maybe InstanceStateChangeReason)
+isStateChangeReason = lens _isStateChangeReason (\ s a -> s{_isStateChangeReason = a});
+
+-- | The timeline of the instance status over time.
+isTimeline :: Lens' InstanceStatus (Maybe InstanceTimeline)
+isTimeline = lens _isTimeline (\ s a -> s{_isTimeline = a});
+
+instance FromJSON InstanceStatus where
+        parseJSON
+          = withObject "InstanceStatus"
+              (\ x ->
+                 InstanceStatus' <$>
+                   (x .:? "State") <*> (x .:? "StateChangeReason") <*>
+                     (x .:? "Timeline"))
+
+-- | The timeline of the instance lifecycle.
+--
+-- /See:/ 'instanceTimeline' smart constructor.
+data InstanceTimeline = InstanceTimeline'
+    { _itReadyDateTime    :: !(Maybe POSIX)
+    , _itCreationDateTime :: !(Maybe POSIX)
+    , _itEndDateTime      :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceTimeline' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'itReadyDateTime'
+--
+-- * 'itCreationDateTime'
+--
+-- * 'itEndDateTime'
+instanceTimeline
+    :: InstanceTimeline
+instanceTimeline =
+    InstanceTimeline'
+    { _itReadyDateTime = Nothing
+    , _itCreationDateTime = Nothing
+    , _itEndDateTime = Nothing
+    }
+
+-- | The date and time when the instance was ready to perform tasks.
+itReadyDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
+itReadyDateTime = lens _itReadyDateTime (\ s a -> s{_itReadyDateTime = a}) . mapping _Time;
+
+-- | The creation date and time of the instance.
+itCreationDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
+itCreationDateTime = lens _itCreationDateTime (\ s a -> s{_itCreationDateTime = a}) . mapping _Time;
+
+-- | The date and time when the instance was terminated.
+itEndDateTime :: Lens' InstanceTimeline (Maybe UTCTime)
+itEndDateTime = lens _itEndDateTime (\ s a -> s{_itEndDateTime = a}) . mapping _Time;
+
+instance FromJSON InstanceTimeline where
+        parseJSON
+          = withObject "InstanceTimeline"
+              (\ x ->
+                 InstanceTimeline' <$>
+                   (x .:? "ReadyDateTime") <*>
+                     (x .:? "CreationDateTime")
+                     <*> (x .:? "EndDateTime"))
+
+-- | 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
+-- MasterInstanceType, SlaveInstanceType, and InstanceCount (all three must
+-- be present).
+--
+-- /See:/ 'jobFlowInstancesConfig' smart constructor.
+data JobFlowInstancesConfig = JobFlowInstancesConfig'
+    { _jficSlaveInstanceType              :: !(Maybe Text)
+    , _jficEC2KeyName                     :: !(Maybe Text)
+    , _jficInstanceCount                  :: !(Maybe Int)
+    , _jficEmrManagedSlaveSecurityGroup   :: !(Maybe Text)
+    , _jficAdditionalSlaveSecurityGroups  :: !(Maybe [Text])
+    , _jficHadoopVersion                  :: !(Maybe Text)
+    , _jficAdditionalMasterSecurityGroups :: !(Maybe [Text])
+    , _jficEmrManagedMasterSecurityGroup  :: !(Maybe Text)
+    , _jficEC2SubnetId                    :: !(Maybe Text)
+    , _jficMasterInstanceType             :: !(Maybe Text)
+    , _jficInstanceGroups                 :: !(Maybe [InstanceGroupConfig])
+    , _jficKeepJobFlowAliveWhenNoSteps    :: !(Maybe Bool)
+    , _jficTerminationProtected           :: !(Maybe Bool)
+    , _jficPlacement                      :: !(Maybe PlacementType)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'JobFlowInstancesConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'jficSlaveInstanceType'
+--
+-- * 'jficEC2KeyName'
+--
+-- * 'jficInstanceCount'
+--
+-- * 'jficEmrManagedSlaveSecurityGroup'
+--
+-- * 'jficAdditionalSlaveSecurityGroups'
+--
+-- * 'jficHadoopVersion'
+--
+-- * 'jficAdditionalMasterSecurityGroups'
+--
+-- * 'jficEmrManagedMasterSecurityGroup'
+--
+-- * 'jficEC2SubnetId'
+--
+-- * 'jficMasterInstanceType'
+--
+-- * 'jficInstanceGroups'
+--
+-- * 'jficKeepJobFlowAliveWhenNoSteps'
+--
+-- * 'jficTerminationProtected'
+--
+-- * 'jficPlacement'
+jobFlowInstancesConfig
+    :: JobFlowInstancesConfig
+jobFlowInstancesConfig =
+    JobFlowInstancesConfig'
+    { _jficSlaveInstanceType = Nothing
+    , _jficEC2KeyName = Nothing
+    , _jficInstanceCount = Nothing
+    , _jficEmrManagedSlaveSecurityGroup = Nothing
+    , _jficAdditionalSlaveSecurityGroups = Nothing
+    , _jficHadoopVersion = Nothing
+    , _jficAdditionalMasterSecurityGroups = Nothing
+    , _jficEmrManagedMasterSecurityGroup = Nothing
+    , _jficEC2SubnetId = Nothing
+    , _jficMasterInstanceType = Nothing
+    , _jficInstanceGroups = Nothing
+    , _jficKeepJobFlowAliveWhenNoSteps = Nothing
+    , _jficTerminationProtected = Nothing
+    , _jficPlacement = Nothing
+    }
+
+-- | The EC2 instance type of the slave nodes.
+jficSlaveInstanceType :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficSlaveInstanceType = lens _jficSlaveInstanceType (\ s a -> s{_jficSlaveInstanceType = a});
+
+-- | The name of the Amazon EC2 key pair that can be used to ssh to the
+-- master node as the user called \"hadoop.\"
+jficEC2KeyName :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficEC2KeyName = lens _jficEC2KeyName (\ s a -> s{_jficEC2KeyName = a});
+
+-- | The number of Amazon EC2 instances used to execute the job flow.
+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.
+jficEmrManagedSlaveSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficEmrManagedSlaveSecurityGroup = lens _jficEmrManagedSlaveSecurityGroup (\ s a -> s{_jficEmrManagedSlaveSecurityGroup = a});
+
+-- | A list of additional Amazon EC2 security group IDs for the slave nodes.
+jficAdditionalSlaveSecurityGroups :: Lens' JobFlowInstancesConfig [Text]
+jficAdditionalSlaveSecurityGroups = lens _jficAdditionalSlaveSecurityGroups (\ s a -> s{_jficAdditionalSlaveSecurityGroups = a}) . _Default . _Coerce;
+
+-- | The Hadoop version for the job flow. Valid inputs are \"0.18\"
+-- (deprecated), \"0.20\" (deprecated), \"0.20.205\" (deprecated),
+-- \"1.0.3\", \"2.2.0\", or \"2.4.0\". If you do not set this value, the
+-- default of 0.18 is used, unless the AmiVersion parameter is set in the
+-- RunJobFlow call, in which case the default version of Hadoop for that
+-- AMI version is used.
+jficHadoopVersion :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficHadoopVersion = lens _jficHadoopVersion (\ s a -> s{_jficHadoopVersion = a});
+
+-- | A list of additional Amazon EC2 security group IDs for the master node.
+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.
+jficEmrManagedMasterSecurityGroup :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficEmrManagedMasterSecurityGroup = lens _jficEmrManagedMasterSecurityGroup (\ s a -> s{_jficEmrManagedMasterSecurityGroup = a});
+
+-- | To launch the job flow in Amazon Virtual Private Cloud (Amazon VPC), set
+-- this parameter to the identifier of the Amazon VPC subnet where you want
+-- the job flow to launch. If you do not specify this value, the job flow
+-- is launched in the normal Amazon Web Services cloud, outside of an
+-- Amazon VPC.
+--
+-- Amazon VPC currently does not support cluster compute quadruple extra
+-- large (cc1.4xlarge) instances. Thus you cannot specify the cc1.4xlarge
+-- instance type for nodes of a job flow launched in a Amazon VPC.
+jficEC2SubnetId :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficEC2SubnetId = lens _jficEC2SubnetId (\ s a -> s{_jficEC2SubnetId = a});
+
+-- | The EC2 instance type of the master node.
+jficMasterInstanceType :: Lens' JobFlowInstancesConfig (Maybe Text)
+jficMasterInstanceType = lens _jficMasterInstanceType (\ s a -> s{_jficMasterInstanceType = a});
+
+-- | Configuration for the job flow\'s instance groups.
+jficInstanceGroups :: Lens' JobFlowInstancesConfig [InstanceGroupConfig]
+jficInstanceGroups = lens _jficInstanceGroups (\ s a -> s{_jficInstanceGroups = a}) . _Default . _Coerce;
+
+-- | Specifies whether the job flow should be kept alive after completing all
+-- steps.
+jficKeepJobFlowAliveWhenNoSteps :: Lens' JobFlowInstancesConfig (Maybe Bool)
+jficKeepJobFlowAliveWhenNoSteps = lens _jficKeepJobFlowAliveWhenNoSteps (\ s a -> s{_jficKeepJobFlowAliveWhenNoSteps = 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.
+jficTerminationProtected :: Lens' JobFlowInstancesConfig (Maybe Bool)
+jficTerminationProtected = lens _jficTerminationProtected (\ s a -> s{_jficTerminationProtected = a});
+
+-- | The Availability Zone the job flow will run in.
+jficPlacement :: Lens' JobFlowInstancesConfig (Maybe PlacementType)
+jficPlacement = lens _jficPlacement (\ s a -> s{_jficPlacement = a});
+
+instance ToJSON JobFlowInstancesConfig where
+        toJSON JobFlowInstancesConfig'{..}
+          = object
+              ["SlaveInstanceType" .= _jficSlaveInstanceType,
+               "Ec2KeyName" .= _jficEC2KeyName,
+               "InstanceCount" .= _jficInstanceCount,
+               "EmrManagedSlaveSecurityGroup" .=
+                 _jficEmrManagedSlaveSecurityGroup,
+               "AdditionalSlaveSecurityGroups" .=
+                 _jficAdditionalSlaveSecurityGroups,
+               "HadoopVersion" .= _jficHadoopVersion,
+               "AdditionalMasterSecurityGroups" .=
+                 _jficAdditionalMasterSecurityGroups,
+               "EmrManagedMasterSecurityGroup" .=
+                 _jficEmrManagedMasterSecurityGroup,
+               "Ec2SubnetId" .= _jficEC2SubnetId,
+               "MasterInstanceType" .= _jficMasterInstanceType,
+               "InstanceGroups" .= _jficInstanceGroups,
+               "KeepJobFlowAliveWhenNoSteps" .=
+                 _jficKeepJobFlowAliveWhenNoSteps,
+               "TerminationProtected" .= _jficTerminationProtected,
+               "Placement" .= _jficPlacement]
+
+-- | A key value pair.
+--
+-- /See:/ 'keyValue' smart constructor.
+data KeyValue = KeyValue'
+    { _kvValue :: !(Maybe Text)
+    , _kvKey   :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'KeyValue' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'kvValue'
+--
+-- * 'kvKey'
+keyValue
+    :: KeyValue
+keyValue =
+    KeyValue'
+    { _kvValue = Nothing
+    , _kvKey = Nothing
+    }
+
+-- | The value part of the identified key.
+kvValue :: Lens' KeyValue (Maybe Text)
+kvValue = lens _kvValue (\ s a -> s{_kvValue = a});
+
+-- | The unique identifier of a key value pair.
+kvKey :: Lens' KeyValue (Maybe Text)
+kvKey = lens _kvKey (\ s a -> s{_kvKey = a});
+
+instance ToJSON KeyValue where
+        toJSON KeyValue'{..}
+          = object ["Value" .= _kvValue, "Key" .= _kvKey]
+
+-- | The Amazon EC2 location for the job flow.
+--
+-- /See:/ 'placementType' smart constructor.
+newtype PlacementType = PlacementType'
+    { _ptAvailabilityZone :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'PlacementType' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ptAvailabilityZone'
+placementType
+    :: Text -- ^ 'ptAvailabilityZone'
+    -> PlacementType
+placementType pAvailabilityZone_ =
+    PlacementType'
+    { _ptAvailabilityZone = pAvailabilityZone_
+    }
+
+-- | The Amazon EC2 Availability Zone for the job flow.
+ptAvailabilityZone :: Lens' PlacementType Text
+ptAvailabilityZone = lens _ptAvailabilityZone (\ s a -> s{_ptAvailabilityZone = a});
+
+instance ToJSON PlacementType where
+        toJSON PlacementType'{..}
+          = object ["AvailabilityZone" .= _ptAvailabilityZone]
+
+-- | Configuration of the script to run during a bootstrap action.
+--
+-- /See:/ 'scriptBootstrapActionConfig' smart constructor.
+data ScriptBootstrapActionConfig = ScriptBootstrapActionConfig'
+    { _sbacArgs :: !(Maybe [Text])
+    , _sbacPath :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ScriptBootstrapActionConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sbacArgs'
+--
+-- * 'sbacPath'
+scriptBootstrapActionConfig
+    :: Text -- ^ 'sbacPath'
+    -> ScriptBootstrapActionConfig
+scriptBootstrapActionConfig pPath_ =
+    ScriptBootstrapActionConfig'
+    { _sbacArgs = Nothing
+    , _sbacPath = pPath_
+    }
+
+-- | A list of command line arguments to pass to the bootstrap action script.
+sbacArgs :: Lens' ScriptBootstrapActionConfig [Text]
+sbacArgs = lens _sbacArgs (\ s a -> s{_sbacArgs = a}) . _Default . _Coerce;
+
+-- | Location of the script to run during a bootstrap action. Can be either a
+-- location in Amazon S3 or on a local file system.
+sbacPath :: Lens' ScriptBootstrapActionConfig Text
+sbacPath = lens _sbacPath (\ s a -> s{_sbacPath = a});
+
+instance ToJSON ScriptBootstrapActionConfig where
+        toJSON ScriptBootstrapActionConfig'{..}
+          = object ["Args" .= _sbacArgs, "Path" .= _sbacPath]
+
+-- | This represents a step in a cluster.
+--
+-- /See:/ 'step' smart constructor.
+data Step = Step'
+    { _sStatus          :: !(Maybe StepStatus)
+    , _sActionOnFailure :: !(Maybe ActionOnFailure)
+    , _sConfig          :: !(Maybe HadoopStepConfig)
+    , _sName            :: !(Maybe Text)
+    , _sId              :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'Step' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sStatus'
+--
+-- * 'sActionOnFailure'
+--
+-- * 'sConfig'
+--
+-- * 'sName'
+--
+-- * 'sId'
+step
+    :: Step
+step =
+    Step'
+    { _sStatus = Nothing
+    , _sActionOnFailure = Nothing
+    , _sConfig = Nothing
+    , _sName = Nothing
+    , _sId = Nothing
+    }
+
+-- | The current execution status details of the cluster step.
+sStatus :: Lens' Step (Maybe StepStatus)
+sStatus = lens _sStatus (\ s a -> s{_sStatus = a});
+
+-- | This specifies what action to take when the cluster step fails. Possible
+-- values are TERMINATE_CLUSTER, CANCEL_AND_WAIT, and CONTINUE.
+sActionOnFailure :: Lens' Step (Maybe ActionOnFailure)
+sActionOnFailure = lens _sActionOnFailure (\ s a -> s{_sActionOnFailure = a});
+
+-- | The Hadoop job configuration of the cluster step.
+sConfig :: Lens' Step (Maybe HadoopStepConfig)
+sConfig = lens _sConfig (\ s a -> s{_sConfig = a});
+
+-- | The name of the cluster step.
+sName :: Lens' Step (Maybe Text)
+sName = lens _sName (\ s a -> s{_sName = a});
+
+-- | The identifier of the cluster step.
+sId :: Lens' Step (Maybe Text)
+sId = lens _sId (\ s a -> s{_sId = a});
+
+instance FromJSON Step where
+        parseJSON
+          = withObject "Step"
+              (\ x ->
+                 Step' <$>
+                   (x .:? "Status") <*> (x .:? "ActionOnFailure") <*>
+                     (x .:? "Config")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Id"))
+
+-- | Specification of a job flow step.
+--
+-- /See:/ 'stepConfig' smart constructor.
+data StepConfig = StepConfig'
+    { _scActionOnFailure :: !(Maybe ActionOnFailure)
+    , _scName            :: !Text
+    , _scHadoopJARStep   :: !HadoopJARStepConfig
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StepConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'scActionOnFailure'
+--
+-- * 'scName'
+--
+-- * 'scHadoopJARStep'
+stepConfig
+    :: Text -- ^ 'scName'
+    -> HadoopJARStepConfig -- ^ 'scHadoopJARStep'
+    -> StepConfig
+stepConfig pName_ pHadoopJARStep_ =
+    StepConfig'
+    { _scActionOnFailure = Nothing
+    , _scName = pName_
+    , _scHadoopJARStep = pHadoopJARStep_
+    }
+
+-- | The action to take if the job flow step fails.
+scActionOnFailure :: Lens' StepConfig (Maybe ActionOnFailure)
+scActionOnFailure = lens _scActionOnFailure (\ s a -> s{_scActionOnFailure = a});
+
+-- | The name of the job flow step.
+scName :: Lens' StepConfig Text
+scName = lens _scName (\ s a -> s{_scName = a});
+
+-- | The JAR file used for the job flow step.
+scHadoopJARStep :: Lens' StepConfig HadoopJARStepConfig
+scHadoopJARStep = lens _scHadoopJARStep (\ s a -> s{_scHadoopJARStep = a});
+
+instance ToJSON StepConfig where
+        toJSON StepConfig'{..}
+          = object
+              ["ActionOnFailure" .= _scActionOnFailure,
+               "Name" .= _scName,
+               "HadoopJarStep" .= _scHadoopJARStep]
+
+-- | The details of the step state change reason.
+--
+-- /See:/ 'stepStateChangeReason' smart constructor.
+data StepStateChangeReason = StepStateChangeReason'
+    { _sscrCode    :: !(Maybe StepStateChangeReasonCode)
+    , _sscrMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StepStateChangeReason' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'sscrCode'
+--
+-- * 'sscrMessage'
+stepStateChangeReason
+    :: StepStateChangeReason
+stepStateChangeReason =
+    StepStateChangeReason'
+    { _sscrCode = Nothing
+    , _sscrMessage = Nothing
+    }
+
+-- | The programmable code for the state change reason. Note: Currently, the
+-- service provides no code for the state change.
+sscrCode :: Lens' StepStateChangeReason (Maybe StepStateChangeReasonCode)
+sscrCode = lens _sscrCode (\ s a -> s{_sscrCode = a});
+
+-- | The descriptive message for the state change reason.
+sscrMessage :: Lens' StepStateChangeReason (Maybe Text)
+sscrMessage = lens _sscrMessage (\ s a -> s{_sscrMessage = a});
+
+instance FromJSON StepStateChangeReason where
+        parseJSON
+          = withObject "StepStateChangeReason"
+              (\ x ->
+                 StepStateChangeReason' <$>
+                   (x .:? "Code") <*> (x .:? "Message"))
+
+-- | The execution status details of the cluster step.
+--
+-- /See:/ 'stepStatus' smart constructor.
+data StepStatus = StepStatus'
+    { _ssState             :: !(Maybe StepState)
+    , _ssStateChangeReason :: !(Maybe StepStateChangeReason)
+    , _ssTimeline          :: !(Maybe StepTimeline)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StepStatus' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssState'
+--
+-- * 'ssStateChangeReason'
+--
+-- * 'ssTimeline'
+stepStatus
+    :: StepStatus
+stepStatus =
+    StepStatus'
+    { _ssState = Nothing
+    , _ssStateChangeReason = Nothing
+    , _ssTimeline = Nothing
+    }
+
+-- | The execution state of the cluster step.
+ssState :: Lens' StepStatus (Maybe StepState)
+ssState = lens _ssState (\ s a -> s{_ssState = a});
+
+-- | The reason for the step execution status change.
+ssStateChangeReason :: Lens' StepStatus (Maybe StepStateChangeReason)
+ssStateChangeReason = lens _ssStateChangeReason (\ s a -> s{_ssStateChangeReason = a});
+
+-- | The timeline of the cluster step status over time.
+ssTimeline :: Lens' StepStatus (Maybe StepTimeline)
+ssTimeline = lens _ssTimeline (\ s a -> s{_ssTimeline = a});
+
+instance FromJSON StepStatus where
+        parseJSON
+          = withObject "StepStatus"
+              (\ x ->
+                 StepStatus' <$>
+                   (x .:? "State") <*> (x .:? "StateChangeReason") <*>
+                     (x .:? "Timeline"))
+
+-- | The summary of the cluster step.
+--
+-- /See:/ 'stepSummary' smart constructor.
+data StepSummary = StepSummary'
+    { _ssStatus          :: !(Maybe StepStatus)
+    , _ssActionOnFailure :: !(Maybe ActionOnFailure)
+    , _ssConfig          :: !(Maybe HadoopStepConfig)
+    , _ssName            :: !(Maybe Text)
+    , _ssId              :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StepSummary' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'ssStatus'
+--
+-- * 'ssActionOnFailure'
+--
+-- * 'ssConfig'
+--
+-- * 'ssName'
+--
+-- * 'ssId'
+stepSummary
+    :: StepSummary
+stepSummary =
+    StepSummary'
+    { _ssStatus = Nothing
+    , _ssActionOnFailure = Nothing
+    , _ssConfig = Nothing
+    , _ssName = Nothing
+    , _ssId = Nothing
+    }
+
+-- | The current execution status details of the cluster step.
+ssStatus :: Lens' StepSummary (Maybe StepStatus)
+ssStatus = lens _ssStatus (\ s a -> s{_ssStatus = a});
+
+-- | This specifies what action to take when the cluster step fails. Possible
+-- values are TERMINATE_CLUSTER, CANCEL_AND_WAIT, and CONTINUE.
+ssActionOnFailure :: Lens' StepSummary (Maybe ActionOnFailure)
+ssActionOnFailure = lens _ssActionOnFailure (\ s a -> s{_ssActionOnFailure = a});
+
+-- | The Hadoop job configuration of the cluster step.
+ssConfig :: Lens' StepSummary (Maybe HadoopStepConfig)
+ssConfig = lens _ssConfig (\ s a -> s{_ssConfig = a});
+
+-- | The name of the cluster step.
+ssName :: Lens' StepSummary (Maybe Text)
+ssName = lens _ssName (\ s a -> s{_ssName = a});
+
+-- | The identifier of the cluster step.
+ssId :: Lens' StepSummary (Maybe Text)
+ssId = lens _ssId (\ s a -> s{_ssId = a});
+
+instance FromJSON StepSummary where
+        parseJSON
+          = withObject "StepSummary"
+              (\ x ->
+                 StepSummary' <$>
+                   (x .:? "Status") <*> (x .:? "ActionOnFailure") <*>
+                     (x .:? "Config")
+                     <*> (x .:? "Name")
+                     <*> (x .:? "Id"))
+
+-- | The timeline of the cluster step lifecycle.
+--
+-- /See:/ 'stepTimeline' smart constructor.
+data StepTimeline = StepTimeline'
+    { _stCreationDateTime :: !(Maybe POSIX)
+    , _stEndDateTime      :: !(Maybe POSIX)
+    , _stStartDateTime    :: !(Maybe POSIX)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'StepTimeline' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'stCreationDateTime'
+--
+-- * 'stEndDateTime'
+--
+-- * 'stStartDateTime'
+stepTimeline
+    :: StepTimeline
+stepTimeline =
+    StepTimeline'
+    { _stCreationDateTime = Nothing
+    , _stEndDateTime = Nothing
+    , _stStartDateTime = Nothing
+    }
+
+-- | The date and time when the cluster step was created.
+stCreationDateTime :: Lens' StepTimeline (Maybe UTCTime)
+stCreationDateTime = lens _stCreationDateTime (\ s a -> s{_stCreationDateTime = a}) . mapping _Time;
+
+-- | The date and time when the cluster step execution completed or failed.
+stEndDateTime :: Lens' StepTimeline (Maybe UTCTime)
+stEndDateTime = lens _stEndDateTime (\ s a -> s{_stEndDateTime = a}) . mapping _Time;
+
+-- | The date and time when the cluster step execution started.
+stStartDateTime :: Lens' StepTimeline (Maybe UTCTime)
+stStartDateTime = lens _stStartDateTime (\ s a -> s{_stStartDateTime = a}) . mapping _Time;
+
+instance FromJSON StepTimeline where
+        parseJSON
+          = withObject "StepTimeline"
+              (\ x ->
+                 StepTimeline' <$>
+                   (x .:? "CreationDateTime") <*> (x .:? "EndDateTime")
+                     <*> (x .:? "StartDateTime"))
+
+-- | 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.
+--
+-- /See:/ 'supportedProductConfig' smart constructor.
+data SupportedProductConfig = SupportedProductConfig'
+    { _spcArgs :: !(Maybe [Text])
+    , _spcName :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'SupportedProductConfig' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'spcArgs'
+--
+-- * 'spcName'
+supportedProductConfig
+    :: SupportedProductConfig
+supportedProductConfig =
+    SupportedProductConfig'
+    { _spcArgs = Nothing
+    , _spcName = Nothing
+    }
+
+-- | The list of user-supplied arguments.
+spcArgs :: Lens' SupportedProductConfig [Text]
+spcArgs = lens _spcArgs (\ s a -> s{_spcArgs = a}) . _Default . _Coerce;
+
+-- | The name of the product configuration.
+spcName :: Lens' SupportedProductConfig (Maybe Text)
+spcName = lens _spcName (\ s a -> s{_spcName = a});
+
+instance ToJSON SupportedProductConfig where
+        toJSON SupportedProductConfig'{..}
+          = object ["Args" .= _spcArgs, "Name" .= _spcName]
+
+-- | A key\/value pair containing user-defined metadata that you can
+-- associate with an Amazon EMR resource. Tags make it easier to associate
+-- clusters in various ways, such as grouping clu\\ sters 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:/ 'tag' smart constructor.
+data Tag = Tag'
+    { _tagValue :: !(Maybe Text)
+    , _tagKey   :: !(Maybe 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:
+--
+-- * 'tagValue'
+--
+-- * 'tagKey'
+tag
+    :: Tag
+tag =
+    Tag'
+    { _tagValue = Nothing
+    , _tagKey = Nothing
+    }
+
+-- | A user-defined value, which is optional in a tag. For more information,
+-- see
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-tags.html Tagging Amazon EMR Resources>.
+tagValue :: Lens' Tag (Maybe Text)
+tagValue = lens _tagValue (\ s a -> s{_tagValue = a});
+
+-- | A user-defined key, which is the minimum required information for a
+-- valid tag. For more information, see
+-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-tags.html Tagging Amazon EMR Resources>.
+tagKey :: Lens' Tag (Maybe Text)
+tagKey = lens _tagKey (\ s a -> s{_tagKey = a});
+
+instance FromJSON Tag where
+        parseJSON
+          = withObject "Tag"
+              (\ x -> Tag' <$> (x .:? "Value") <*> (x .:? "Key"))
+
+instance ToJSON Tag where
+        toJSON Tag'{..}
+          = object ["Value" .= _tagValue, "Key" .= _tagKey]
diff --git a/gen/Network/AWS/EMR/Types/Sum.hs b/gen/Network/AWS/EMR/Types/Sum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/EMR/Types/Sum.hs
@@ -0,0 +1,434 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE LambdaCase         #-}
+{-# LANGUAGE OverloadedStrings  #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Network.AWS.EMR.Types.Sum
+-- Copyright   : (c) 2013-2015 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)
+--
+module Network.AWS.EMR.Types.Sum where
+
+import           Network.AWS.Prelude
+
+data ActionOnFailure
+    = CancelAndWait
+    | Continue
+    | TerminateCluster
+    | TerminateJobFlow
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ActionOnFailure where
+    parser = takeLowerText >>= \case
+        "cancel_and_wait" -> pure CancelAndWait
+        "continue" -> pure Continue
+        "terminate_cluster" -> pure TerminateCluster
+        "terminate_job_flow" -> pure TerminateJobFlow
+        e -> fromTextError $ "Failure parsing ActionOnFailure from value: '" <> e
+           <> "'. Accepted values: cancel_and_wait, continue, terminate_cluster, terminate_job_flow"
+
+instance ToText ActionOnFailure where
+    toText = \case
+        CancelAndWait -> "cancel_and_wait"
+        Continue -> "continue"
+        TerminateCluster -> "terminate_cluster"
+        TerminateJobFlow -> "terminate_job_flow"
+
+instance Hashable     ActionOnFailure
+instance ToByteString ActionOnFailure
+instance ToQuery      ActionOnFailure
+instance ToHeader     ActionOnFailure
+
+instance ToJSON ActionOnFailure where
+    toJSON = toJSONText
+
+instance FromJSON ActionOnFailure where
+    parseJSON = parseJSONText "ActionOnFailure"
+
+data ClusterState
+    = Bootstrapping
+    | Running
+    | Starting
+    | Terminated
+    | TerminatedWithErrors
+    | Terminating
+    | Waiting
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ClusterState where
+    parser = takeLowerText >>= \case
+        "bootstrapping" -> pure Bootstrapping
+        "running" -> pure Running
+        "starting" -> pure Starting
+        "terminated" -> pure Terminated
+        "terminated_with_errors" -> pure TerminatedWithErrors
+        "terminating" -> pure Terminating
+        "waiting" -> pure Waiting
+        e -> fromTextError $ "Failure parsing ClusterState from value: '" <> e
+           <> "'. Accepted values: bootstrapping, running, starting, terminated, terminated_with_errors, terminating, waiting"
+
+instance ToText ClusterState where
+    toText = \case
+        Bootstrapping -> "bootstrapping"
+        Running -> "running"
+        Starting -> "starting"
+        Terminated -> "terminated"
+        TerminatedWithErrors -> "terminated_with_errors"
+        Terminating -> "terminating"
+        Waiting -> "waiting"
+
+instance Hashable     ClusterState
+instance ToByteString ClusterState
+instance ToQuery      ClusterState
+instance ToHeader     ClusterState
+
+instance ToJSON ClusterState where
+    toJSON = toJSONText
+
+instance FromJSON ClusterState where
+    parseJSON = parseJSONText "ClusterState"
+
+data ClusterStateChangeReasonCode
+    = AllStepsCompleted
+    | BootstrapFailure
+    | InstanceFailure
+    | InternalError
+    | StepFailure
+    | UserRequest
+    | ValidationError
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText ClusterStateChangeReasonCode where
+    parser = takeLowerText >>= \case
+        "all_steps_completed" -> pure AllStepsCompleted
+        "bootstrap_failure" -> pure BootstrapFailure
+        "instance_failure" -> pure InstanceFailure
+        "internal_error" -> pure InternalError
+        "step_failure" -> pure StepFailure
+        "user_request" -> pure UserRequest
+        "validation_error" -> pure ValidationError
+        e -> fromTextError $ "Failure parsing ClusterStateChangeReasonCode from value: '" <> e
+           <> "'. Accepted values: all_steps_completed, bootstrap_failure, instance_failure, internal_error, step_failure, user_request, validation_error"
+
+instance ToText ClusterStateChangeReasonCode where
+    toText = \case
+        AllStepsCompleted -> "all_steps_completed"
+        BootstrapFailure -> "bootstrap_failure"
+        InstanceFailure -> "instance_failure"
+        InternalError -> "internal_error"
+        StepFailure -> "step_failure"
+        UserRequest -> "user_request"
+        ValidationError -> "validation_error"
+
+instance Hashable     ClusterStateChangeReasonCode
+instance ToByteString ClusterStateChangeReasonCode
+instance ToQuery      ClusterStateChangeReasonCode
+instance ToHeader     ClusterStateChangeReasonCode
+
+instance FromJSON ClusterStateChangeReasonCode where
+    parseJSON = parseJSONText "ClusterStateChangeReasonCode"
+
+data InstanceGroupState
+    = IGSArrested
+    | IGSBootstrapping
+    | IGSEnded
+    | IGSProvisioning
+    | IGSResizing
+    | IGSRunning
+    | IGSShuttingDown
+    | IGSSuspended
+    | IGSTerminated
+    | IGSTerminating
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceGroupState where
+    parser = takeLowerText >>= \case
+        "arrested" -> pure IGSArrested
+        "bootstrapping" -> pure IGSBootstrapping
+        "ended" -> pure IGSEnded
+        "provisioning" -> pure IGSProvisioning
+        "resizing" -> pure IGSResizing
+        "running" -> pure IGSRunning
+        "shutting_down" -> pure IGSShuttingDown
+        "suspended" -> pure IGSSuspended
+        "terminated" -> pure IGSTerminated
+        "terminating" -> pure IGSTerminating
+        e -> fromTextError $ "Failure parsing InstanceGroupState from value: '" <> e
+           <> "'. Accepted values: arrested, bootstrapping, ended, provisioning, resizing, running, shutting_down, suspended, terminated, terminating"
+
+instance ToText InstanceGroupState where
+    toText = \case
+        IGSArrested -> "arrested"
+        IGSBootstrapping -> "bootstrapping"
+        IGSEnded -> "ended"
+        IGSProvisioning -> "provisioning"
+        IGSResizing -> "resizing"
+        IGSRunning -> "running"
+        IGSShuttingDown -> "shutting_down"
+        IGSSuspended -> "suspended"
+        IGSTerminated -> "terminated"
+        IGSTerminating -> "terminating"
+
+instance Hashable     InstanceGroupState
+instance ToByteString InstanceGroupState
+instance ToQuery      InstanceGroupState
+instance ToHeader     InstanceGroupState
+
+instance FromJSON InstanceGroupState where
+    parseJSON = parseJSONText "InstanceGroupState"
+
+data InstanceGroupStateChangeReasonCode
+    = IGSCRCClusterTerminated
+    | IGSCRCInstanceFailure
+    | IGSCRCInternalError
+    | IGSCRCValidationError
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceGroupStateChangeReasonCode where
+    parser = takeLowerText >>= \case
+        "cluster_terminated" -> pure IGSCRCClusterTerminated
+        "instance_failure" -> pure IGSCRCInstanceFailure
+        "internal_error" -> pure IGSCRCInternalError
+        "validation_error" -> pure IGSCRCValidationError
+        e -> fromTextError $ "Failure parsing InstanceGroupStateChangeReasonCode from value: '" <> e
+           <> "'. Accepted values: cluster_terminated, instance_failure, internal_error, validation_error"
+
+instance ToText InstanceGroupStateChangeReasonCode where
+    toText = \case
+        IGSCRCClusterTerminated -> "cluster_terminated"
+        IGSCRCInstanceFailure -> "instance_failure"
+        IGSCRCInternalError -> "internal_error"
+        IGSCRCValidationError -> "validation_error"
+
+instance Hashable     InstanceGroupStateChangeReasonCode
+instance ToByteString InstanceGroupStateChangeReasonCode
+instance ToQuery      InstanceGroupStateChangeReasonCode
+instance ToHeader     InstanceGroupStateChangeReasonCode
+
+instance FromJSON InstanceGroupStateChangeReasonCode where
+    parseJSON = parseJSONText "InstanceGroupStateChangeReasonCode"
+
+data InstanceGroupType
+    = IGTCore
+    | IGTMaster
+    | IGTTask
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceGroupType where
+    parser = takeLowerText >>= \case
+        "core" -> pure IGTCore
+        "master" -> pure IGTMaster
+        "task" -> pure IGTTask
+        e -> fromTextError $ "Failure parsing InstanceGroupType from value: '" <> e
+           <> "'. Accepted values: core, master, task"
+
+instance ToText InstanceGroupType where
+    toText = \case
+        IGTCore -> "core"
+        IGTMaster -> "master"
+        IGTTask -> "task"
+
+instance Hashable     InstanceGroupType
+instance ToByteString InstanceGroupType
+instance ToQuery      InstanceGroupType
+instance ToHeader     InstanceGroupType
+
+instance ToJSON InstanceGroupType where
+    toJSON = toJSONText
+
+instance FromJSON InstanceGroupType where
+    parseJSON = parseJSONText "InstanceGroupType"
+
+data InstanceRoleType
+    = Core
+    | Master
+    | Task
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceRoleType where
+    parser = takeLowerText >>= \case
+        "core" -> pure Core
+        "master" -> pure Master
+        "task" -> pure Task
+        e -> fromTextError $ "Failure parsing InstanceRoleType from value: '" <> e
+           <> "'. Accepted values: core, master, task"
+
+instance ToText InstanceRoleType where
+    toText = \case
+        Core -> "core"
+        Master -> "master"
+        Task -> "task"
+
+instance Hashable     InstanceRoleType
+instance ToByteString InstanceRoleType
+instance ToQuery      InstanceRoleType
+instance ToHeader     InstanceRoleType
+
+instance ToJSON InstanceRoleType where
+    toJSON = toJSONText
+
+data InstanceState
+    = ISAwaitingFulfillment
+    | ISBootstrapping
+    | ISProvisioning
+    | ISRunning
+    | ISTerminated
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceState where
+    parser = takeLowerText >>= \case
+        "awaiting_fulfillment" -> pure ISAwaitingFulfillment
+        "bootstrapping" -> pure ISBootstrapping
+        "provisioning" -> pure ISProvisioning
+        "running" -> pure ISRunning
+        "terminated" -> pure ISTerminated
+        e -> fromTextError $ "Failure parsing InstanceState from value: '" <> e
+           <> "'. Accepted values: awaiting_fulfillment, bootstrapping, provisioning, running, terminated"
+
+instance ToText InstanceState where
+    toText = \case
+        ISAwaitingFulfillment -> "awaiting_fulfillment"
+        ISBootstrapping -> "bootstrapping"
+        ISProvisioning -> "provisioning"
+        ISRunning -> "running"
+        ISTerminated -> "terminated"
+
+instance Hashable     InstanceState
+instance ToByteString InstanceState
+instance ToQuery      InstanceState
+instance ToHeader     InstanceState
+
+instance FromJSON InstanceState where
+    parseJSON = parseJSONText "InstanceState"
+
+data InstanceStateChangeReasonCode
+    = ISCRCBootstrapFailure
+    | ISCRCClusterTerminated
+    | ISCRCInstanceFailure
+    | ISCRCInternalError
+    | ISCRCValidationError
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText InstanceStateChangeReasonCode where
+    parser = takeLowerText >>= \case
+        "bootstrap_failure" -> pure ISCRCBootstrapFailure
+        "cluster_terminated" -> pure ISCRCClusterTerminated
+        "instance_failure" -> pure ISCRCInstanceFailure
+        "internal_error" -> pure ISCRCInternalError
+        "validation_error" -> pure ISCRCValidationError
+        e -> fromTextError $ "Failure parsing InstanceStateChangeReasonCode from value: '" <> e
+           <> "'. Accepted values: bootstrap_failure, cluster_terminated, instance_failure, internal_error, validation_error"
+
+instance ToText InstanceStateChangeReasonCode where
+    toText = \case
+        ISCRCBootstrapFailure -> "bootstrap_failure"
+        ISCRCClusterTerminated -> "cluster_terminated"
+        ISCRCInstanceFailure -> "instance_failure"
+        ISCRCInternalError -> "internal_error"
+        ISCRCValidationError -> "validation_error"
+
+instance Hashable     InstanceStateChangeReasonCode
+instance ToByteString InstanceStateChangeReasonCode
+instance ToQuery      InstanceStateChangeReasonCode
+instance ToHeader     InstanceStateChangeReasonCode
+
+instance FromJSON InstanceStateChangeReasonCode where
+    parseJSON = parseJSONText "InstanceStateChangeReasonCode"
+
+data MarketType
+    = OnDemand
+    | Spot
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText MarketType where
+    parser = takeLowerText >>= \case
+        "on_demand" -> pure OnDemand
+        "spot" -> pure Spot
+        e -> fromTextError $ "Failure parsing MarketType from value: '" <> e
+           <> "'. Accepted values: on_demand, spot"
+
+instance ToText MarketType where
+    toText = \case
+        OnDemand -> "on_demand"
+        Spot -> "spot"
+
+instance Hashable     MarketType
+instance ToByteString MarketType
+instance ToQuery      MarketType
+instance ToHeader     MarketType
+
+instance ToJSON MarketType where
+    toJSON = toJSONText
+
+instance FromJSON MarketType where
+    parseJSON = parseJSONText "MarketType"
+
+data StepState
+    = SSCancelled
+    | SSCompleted
+    | SSFailed
+    | SSInterrupted
+    | SSPending
+    | SSRunning
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText StepState where
+    parser = takeLowerText >>= \case
+        "cancelled" -> pure SSCancelled
+        "completed" -> pure SSCompleted
+        "failed" -> pure SSFailed
+        "interrupted" -> pure SSInterrupted
+        "pending" -> pure SSPending
+        "running" -> pure SSRunning
+        e -> fromTextError $ "Failure parsing StepState from value: '" <> e
+           <> "'. Accepted values: cancelled, completed, failed, interrupted, pending, running"
+
+instance ToText StepState where
+    toText = \case
+        SSCancelled -> "cancelled"
+        SSCompleted -> "completed"
+        SSFailed -> "failed"
+        SSInterrupted -> "interrupted"
+        SSPending -> "pending"
+        SSRunning -> "running"
+
+instance Hashable     StepState
+instance ToByteString StepState
+instance ToQuery      StepState
+instance ToHeader     StepState
+
+instance ToJSON StepState where
+    toJSON = toJSONText
+
+instance FromJSON StepState where
+    parseJSON = parseJSONText "StepState"
+
+data StepStateChangeReasonCode =
+    None
+    deriving (Eq,Ord,Read,Show,Enum,Data,Typeable,Generic)
+
+instance FromText StepStateChangeReasonCode where
+    parser = takeLowerText >>= \case
+        "none" -> pure None
+        e -> fromTextError $ "Failure parsing StepStateChangeReasonCode from value: '" <> e
+           <> "'. Accepted values: none"
+
+instance ToText StepStateChangeReasonCode where
+    toText = \case
+        None -> "none"
+
+instance Hashable     StepStateChangeReasonCode
+instance ToByteString StepStateChangeReasonCode
+instance ToQuery      StepStateChangeReasonCode
+instance ToHeader     StepStateChangeReasonCode
+
+instance FromJSON StepStateChangeReasonCode where
+    parseJSON = parseJSONText "StepStateChangeReasonCode"
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
@@ -1,39 +1,56 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeFamilies      #-}
 
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
 -- Module      : Network.AWS.EMR.Waiters
--- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
--- 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
---               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Copyright   : (c) 2013-2015 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
+-- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
 module Network.AWS.EMR.Waiters where
 
-import Network.AWS.EMR.DescribeCluster
-import Network.AWS.EMR.Types
-import Network.AWS.Waiters
+import           Network.AWS.EMR.DescribeCluster
+import           Network.AWS.EMR.Types
+import           Network.AWS.Prelude
+import           Network.AWS.Waiter
 
+-- | Polls 'Network.AWS.EMR.DescribeCluster' every 30 seconds until a
+-- successful state is reached. An error is returned after 60 failed checks.
 clusterRunning :: Wait DescribeCluster
-clusterRunning = Wait
-    { _waitName      = "ClusterRunning"
-    , _waitAttempts  = 60
-    , _waitDelay     = 30
-    , _waitAcceptors =
-        [ matchAll CSRunning AcceptSuccess
-            (dcrCluster . c1Status . csState . _Just)
-        , matchAll CSWaiting AcceptSuccess
-            (dcrCluster . c1Status . csState . _Just)
-        , matchAll CSTerminating AcceptFailure
-            (dcrCluster . c1Status . csState . _Just)
-        , matchAll CSTerminated AcceptFailure
-            (dcrCluster . c1Status . csState . _Just)
-        , matchAll CSTerminatedWithErrors AcceptFailure
-            (dcrCluster . c1Status . csState . _Just)
-        ]
+clusterRunning =
+    Wait
+    { _waitName = "ClusterRunning"
+    , _waitAttempts = 60
+    , _waitDelay = 30
+    , _waitAcceptors = [ matchAll
+                             "RUNNING"
+                             AcceptSuccess
+                             (dcrsCluster .
+                              cluStatus . csState . _Just . to toTextCI)
+                       , matchAll
+                             "WAITING"
+                             AcceptSuccess
+                             (dcrsCluster .
+                              cluStatus . csState . _Just . to toTextCI)
+                       , matchAll
+                             "TERMINATING"
+                             AcceptFailure
+                             (dcrsCluster .
+                              cluStatus . csState . _Just . to toTextCI)
+                       , matchAll
+                             "TERMINATED"
+                             AcceptFailure
+                             (dcrsCluster .
+                              cluStatus . csState . _Just . to toTextCI)
+                       , matchAll
+                             "TERMINATED_WITH_ERRORS"
+                             AcceptFailure
+                             (dcrsCluster .
+                              cluStatus . csState . _Just . to toTextCI)]
     }
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2015 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)
+--
+module Main (main) where
+
+import Test.Tasty
+import Test.AWS.EMR
+import Test.AWS.EMR.Internal
+
+main :: IO ()
+main = defaultMain $ testGroup "EMR"
+    [ testGroup "tests"    tests
+    , testGroup "fixtures" fixtures
+    ]
diff --git a/test/Test/AWS/EMR.hs b/test/Test/AWS/EMR.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/EMR.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Test.AWS.EMR
+-- Copyright   : (c) 2013-2015 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
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.EMR
+    ( tests
+    , fixtures
+    ) where
+
+import           Network.AWS.EMR
+import           Test.AWS.Gen.EMR
+import           Test.Tasty
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/AWS/EMR/Internal.hs b/test/Test/AWS/EMR/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/EMR/Internal.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Test.AWS.EMR.Internal
+-- Copyright   : (c) 2013-2015 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
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Test.AWS.EMR.Internal where
+
+import Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/EMR.hs b/test/Test/AWS/Gen/EMR.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/EMR.hs
@@ -0,0 +1,311 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-orphans        #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.AWS.Gen.EMR
+-- Copyright   : (c) 2013-2015 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)
+--
+module Test.AWS.Gen.EMR where
+
+import Data.Proxy
+import Test.AWS.Fixture
+import Test.AWS.Prelude
+import Test.Tasty
+import Network.AWS.EMR
+import Test.AWS.EMR.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.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ testRunJobFlow $
+--             runJobFlow
+--
+--         , testSetVisibleToAllUsers $
+--             setVisibleToAllUsers
+--
+--         , testTerminateJobFlows $
+--             terminateJobFlows
+--
+--         , testRemoveTags $
+--             removeTags
+--
+--         , testDescribeStep $
+--             describeStep
+--
+--         , testDescribeCluster $
+--             describeCluster
+--
+--         , testModifyInstanceGroups $
+--             modifyInstanceGroups
+--
+--         , testAddJobFlowSteps $
+--             addJobFlowSteps
+--
+--         , testSetTerminationProtection $
+--             setTerminationProtection
+--
+--         , testListSteps $
+--             listSteps
+--
+--         , testAddInstanceGroups $
+--             addInstanceGroups
+--
+--         , testListInstanceGroups $
+--             listInstanceGroups
+--
+--         , testListBootstrapActions $
+--             listBootstrapActions
+--
+--         , testAddTags $
+--             addTags
+--
+--         , testListInstances $
+--             listInstances
+--
+--         , testListClusters $
+--             listClusters
+--
+--           ]
+
+--     , testGroup "response"
+--         [ testRunJobFlowResponse $
+--             runJobFlowResponse
+--
+--         , testSetVisibleToAllUsersResponse $
+--             setVisibleToAllUsersResponse
+--
+--         , testTerminateJobFlowsResponse $
+--             terminateJobFlowsResponse
+--
+--         , testRemoveTagsResponse $
+--             removeTagsResponse
+--
+--         , testDescribeStepResponse $
+--             describeStepResponse
+--
+--         , testDescribeClusterResponse $
+--             describeClusterResponse
+--
+--         , testModifyInstanceGroupsResponse $
+--             modifyInstanceGroupsResponse
+--
+--         , testAddJobFlowStepsResponse $
+--             addJobFlowStepsResponse
+--
+--         , testSetTerminationProtectionResponse $
+--             setTerminationProtectionResponse
+--
+--         , testListStepsResponse $
+--             listStepsResponse
+--
+--         , testAddInstanceGroupsResponse $
+--             addInstanceGroupsResponse
+--
+--         , testListInstanceGroupsResponse $
+--             listInstanceGroupsResponse
+--
+--         , testListBootstrapActionsResponse $
+--             listBootstrapActionsResponse
+--
+--         , testAddTagsResponse $
+--             addTagsResponse
+--
+--         , testListInstancesResponse $
+--             listInstancesResponse
+--
+--         , testListClustersResponse $
+--             listClustersResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+testRunJobFlow :: RunJobFlow -> TestTree
+testRunJobFlow = req
+    "RunJobFlow"
+    "fixture/RunJobFlow"
+
+testSetVisibleToAllUsers :: SetVisibleToAllUsers -> TestTree
+testSetVisibleToAllUsers = req
+    "SetVisibleToAllUsers"
+    "fixture/SetVisibleToAllUsers"
+
+testTerminateJobFlows :: TerminateJobFlows -> TestTree
+testTerminateJobFlows = req
+    "TerminateJobFlows"
+    "fixture/TerminateJobFlows"
+
+testRemoveTags :: RemoveTags -> TestTree
+testRemoveTags = req
+    "RemoveTags"
+    "fixture/RemoveTags"
+
+testDescribeStep :: DescribeStep -> TestTree
+testDescribeStep = req
+    "DescribeStep"
+    "fixture/DescribeStep"
+
+testDescribeCluster :: DescribeCluster -> TestTree
+testDescribeCluster = req
+    "DescribeCluster"
+    "fixture/DescribeCluster"
+
+testModifyInstanceGroups :: ModifyInstanceGroups -> TestTree
+testModifyInstanceGroups = req
+    "ModifyInstanceGroups"
+    "fixture/ModifyInstanceGroups"
+
+testAddJobFlowSteps :: AddJobFlowSteps -> TestTree
+testAddJobFlowSteps = req
+    "AddJobFlowSteps"
+    "fixture/AddJobFlowSteps"
+
+testSetTerminationProtection :: SetTerminationProtection -> TestTree
+testSetTerminationProtection = req
+    "SetTerminationProtection"
+    "fixture/SetTerminationProtection"
+
+testListSteps :: ListSteps -> TestTree
+testListSteps = req
+    "ListSteps"
+    "fixture/ListSteps"
+
+testAddInstanceGroups :: AddInstanceGroups -> TestTree
+testAddInstanceGroups = req
+    "AddInstanceGroups"
+    "fixture/AddInstanceGroups"
+
+testListInstanceGroups :: ListInstanceGroups -> TestTree
+testListInstanceGroups = req
+    "ListInstanceGroups"
+    "fixture/ListInstanceGroups"
+
+testListBootstrapActions :: ListBootstrapActions -> TestTree
+testListBootstrapActions = req
+    "ListBootstrapActions"
+    "fixture/ListBootstrapActions"
+
+testAddTags :: AddTags -> TestTree
+testAddTags = req
+    "AddTags"
+    "fixture/AddTags"
+
+testListInstances :: ListInstances -> TestTree
+testListInstances = req
+    "ListInstances"
+    "fixture/ListInstances"
+
+testListClusters :: ListClusters -> TestTree
+testListClusters = req
+    "ListClusters"
+    "fixture/ListClusters"
+
+-- Responses
+
+testRunJobFlowResponse :: RunJobFlowResponse -> TestTree
+testRunJobFlowResponse = res
+    "RunJobFlowResponse"
+    "fixture/RunJobFlowResponse"
+    (Proxy :: Proxy RunJobFlow)
+
+testSetVisibleToAllUsersResponse :: SetVisibleToAllUsersResponse -> TestTree
+testSetVisibleToAllUsersResponse = res
+    "SetVisibleToAllUsersResponse"
+    "fixture/SetVisibleToAllUsersResponse"
+    (Proxy :: Proxy SetVisibleToAllUsers)
+
+testTerminateJobFlowsResponse :: TerminateJobFlowsResponse -> TestTree
+testTerminateJobFlowsResponse = res
+    "TerminateJobFlowsResponse"
+    "fixture/TerminateJobFlowsResponse"
+    (Proxy :: Proxy TerminateJobFlows)
+
+testRemoveTagsResponse :: RemoveTagsResponse -> TestTree
+testRemoveTagsResponse = res
+    "RemoveTagsResponse"
+    "fixture/RemoveTagsResponse"
+    (Proxy :: Proxy RemoveTags)
+
+testDescribeStepResponse :: DescribeStepResponse -> TestTree
+testDescribeStepResponse = res
+    "DescribeStepResponse"
+    "fixture/DescribeStepResponse"
+    (Proxy :: Proxy DescribeStep)
+
+testDescribeClusterResponse :: DescribeClusterResponse -> TestTree
+testDescribeClusterResponse = res
+    "DescribeClusterResponse"
+    "fixture/DescribeClusterResponse"
+    (Proxy :: Proxy DescribeCluster)
+
+testModifyInstanceGroupsResponse :: ModifyInstanceGroupsResponse -> TestTree
+testModifyInstanceGroupsResponse = res
+    "ModifyInstanceGroupsResponse"
+    "fixture/ModifyInstanceGroupsResponse"
+    (Proxy :: Proxy ModifyInstanceGroups)
+
+testAddJobFlowStepsResponse :: AddJobFlowStepsResponse -> TestTree
+testAddJobFlowStepsResponse = res
+    "AddJobFlowStepsResponse"
+    "fixture/AddJobFlowStepsResponse"
+    (Proxy :: Proxy AddJobFlowSteps)
+
+testSetTerminationProtectionResponse :: SetTerminationProtectionResponse -> TestTree
+testSetTerminationProtectionResponse = res
+    "SetTerminationProtectionResponse"
+    "fixture/SetTerminationProtectionResponse"
+    (Proxy :: Proxy SetTerminationProtection)
+
+testListStepsResponse :: ListStepsResponse -> TestTree
+testListStepsResponse = res
+    "ListStepsResponse"
+    "fixture/ListStepsResponse"
+    (Proxy :: Proxy ListSteps)
+
+testAddInstanceGroupsResponse :: AddInstanceGroupsResponse -> TestTree
+testAddInstanceGroupsResponse = res
+    "AddInstanceGroupsResponse"
+    "fixture/AddInstanceGroupsResponse"
+    (Proxy :: Proxy AddInstanceGroups)
+
+testListInstanceGroupsResponse :: ListInstanceGroupsResponse -> TestTree
+testListInstanceGroupsResponse = res
+    "ListInstanceGroupsResponse"
+    "fixture/ListInstanceGroupsResponse"
+    (Proxy :: Proxy ListInstanceGroups)
+
+testListBootstrapActionsResponse :: ListBootstrapActionsResponse -> TestTree
+testListBootstrapActionsResponse = res
+    "ListBootstrapActionsResponse"
+    "fixture/ListBootstrapActionsResponse"
+    (Proxy :: Proxy ListBootstrapActions)
+
+testAddTagsResponse :: AddTagsResponse -> TestTree
+testAddTagsResponse = res
+    "AddTagsResponse"
+    "fixture/AddTagsResponse"
+    (Proxy :: Proxy AddTags)
+
+testListInstancesResponse :: ListInstancesResponse -> TestTree
+testListInstancesResponse = res
+    "ListInstancesResponse"
+    "fixture/ListInstancesResponse"
+    (Proxy :: Proxy ListInstances)
+
+testListClustersResponse :: ListClustersResponse -> TestTree
+testListClustersResponse = res
+    "ListClustersResponse"
+    "fixture/ListClustersResponse"
+    (Proxy :: Proxy ListClusters)
