diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.4.3`
+`1.4.4`
 
 
 ## Description
diff --git a/amazonka-emr.cabal b/amazonka-emr.cabal
--- a/amazonka-emr.cabal
+++ b/amazonka-emr.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-emr
-version:               1.4.3
+version:               1.4.4
 synopsis:              Amazon Elastic MapReduce SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
@@ -11,7 +11,7 @@
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto
+extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
 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 tasks such as web indexing, data mining, log file analysis, machine learning, scientific simulation, and data warehousing.
     .
@@ -65,7 +65,7 @@
         , Network.AWS.EMR.Types.Sum
 
     build-depends:
-          amazonka-core == 1.4.3.*
+          amazonka-core == 1.4.4.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-emr-test
@@ -85,9 +85,9 @@
         , Test.AWS.EMR.Internal
 
     build-depends:
-          amazonka-core == 1.4.3.*
-        , amazonka-test == 1.4.3.*
-        , amazonka-emr == 1.4.3.*
+          amazonka-core == 1.4.4.*
+        , amazonka-test == 1.4.4.*
+        , amazonka-emr == 1.4.4.*
         , base
         , bytestring
         , tasty
diff --git a/gen/Network/AWS/EMR.hs b/gen/Network/AWS/EMR.hs
--- a/gen/Network/AWS/EMR.hs
+++ b/gen/Network/AWS/EMR.hs
@@ -238,6 +238,13 @@
     , eiaServiceAccessSecurityGroup
     , eiaEC2AvailabilityZone
 
+    -- ** FailureDetails
+    , FailureDetails
+    , failureDetails
+    , fdLogFile
+    , fdReason
+    , fdMessage
+
     -- ** HadoopJARStepConfig
     , HadoopJARStepConfig
     , hadoopJARStepConfig
@@ -419,6 +426,7 @@
     , StepStatus
     , stepStatus
     , ssState
+    , ssFailureDetails
     , ssStateChangeReason
     , ssTimeline
 
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
@@ -29,6 +29,7 @@
     -- * Request Lenses
     , liInstanceGroupTypes
     , liMarker
+    , liInstanceStates
     , liInstanceGroupId
     , liClusterId
 
@@ -55,6 +56,7 @@
 data ListInstances = ListInstances'
     { _liInstanceGroupTypes :: !(Maybe [InstanceGroupType])
     , _liMarker             :: !(Maybe Text)
+    , _liInstanceStates     :: !(Maybe [InstanceState])
     , _liInstanceGroupId    :: !(Maybe Text)
     , _liClusterId          :: !Text
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
@@ -67,6 +69,8 @@
 --
 -- * 'liMarker'
 --
+-- * 'liInstanceStates'
+--
 -- * 'liInstanceGroupId'
 --
 -- * 'liClusterId'
@@ -77,6 +81,7 @@
     ListInstances'
     { _liInstanceGroupTypes = Nothing
     , _liMarker = Nothing
+    , _liInstanceStates = Nothing
     , _liInstanceGroupId = Nothing
     , _liClusterId = pClusterId_
     }
@@ -89,6 +94,10 @@
 liMarker :: Lens' ListInstances (Maybe Text)
 liMarker = lens _liMarker (\ s a -> s{_liMarker = a});
 
+-- | A list of instance states that will filter the instances returned with this request.
+liInstanceStates :: Lens' ListInstances [InstanceState]
+liInstanceStates = lens _liInstanceStates (\ s a -> s{_liInstanceStates = a}) . _Default . _Coerce;
+
 -- | 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});
@@ -133,6 +142,7 @@
               (catMaybes
                  [("InstanceGroupTypes" .=) <$> _liInstanceGroupTypes,
                   ("Marker" .=) <$> _liMarker,
+                  ("InstanceStates" .=) <$> _liInstanceStates,
                   ("InstanceGroupId" .=) <$> _liInstanceGroupId,
                   Just ("ClusterId" .= _liClusterId)])
 
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
@@ -195,13 +195,21 @@
 -- 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;
 
@@ -214,7 +222,9 @@
 -- 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}) . _Default . _Coerce;
 
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
@@ -170,6 +170,13 @@
     , eiaServiceAccessSecurityGroup
     , eiaEC2AvailabilityZone
 
+    -- * FailureDetails
+    , FailureDetails
+    , failureDetails
+    , fdLogFile
+    , fdReason
+    , fdMessage
+
     -- * HadoopJARStepConfig
     , HadoopJARStepConfig
     , hadoopJARStepConfig
@@ -351,6 +358,7 @@
     , StepStatus
     , stepStatus
     , ssState
+    , ssFailureDetails
     , ssStateChangeReason
     , ssTimeline
 
diff --git a/gen/Network/AWS/EMR/Types/Product.hs b/gen/Network/AWS/EMR/Types/Product.hs
--- a/gen/Network/AWS/EMR/Types/Product.hs
+++ b/gen/Network/AWS/EMR/Types/Product.hs
@@ -24,7 +24,9 @@
 -- | 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.
@@ -925,6 +927,57 @@
 
 instance NFData EC2InstanceAttributes
 
+-- | The details of the step failure. The service attempts to detect the root cause for many common failures.
+--
+-- /See:/ 'failureDetails' smart constructor.
+data FailureDetails = FailureDetails'
+    { _fdLogFile :: !(Maybe Text)
+    , _fdReason  :: !(Maybe Text)
+    , _fdMessage :: !(Maybe Text)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'FailureDetails' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'fdLogFile'
+--
+-- * 'fdReason'
+--
+-- * 'fdMessage'
+failureDetails
+    :: FailureDetails
+failureDetails =
+    FailureDetails'
+    { _fdLogFile = Nothing
+    , _fdReason = Nothing
+    , _fdMessage = Nothing
+    }
+
+-- | The path to the log file where the step failure root cause was originally recorded.
+fdLogFile :: Lens' FailureDetails (Maybe Text)
+fdLogFile = lens _fdLogFile (\ s a -> s{_fdLogFile = a});
+
+-- | The reason for the step failure. In the case where the service cannot successfully determine the root cause of the failure, it returns \"Unknown Error\" as a reason.
+fdReason :: Lens' FailureDetails (Maybe Text)
+fdReason = lens _fdReason (\ s a -> s{_fdReason = a});
+
+-- | The descriptive message including the error the EMR service has identified as the cause of step failure. This is text from an error log that describes the root cause of the failure.
+fdMessage :: Lens' FailureDetails (Maybe Text)
+fdMessage = lens _fdMessage (\ s a -> s{_fdMessage = a});
+
+instance FromJSON FailureDetails where
+        parseJSON
+          = withObject "FailureDetails"
+              (\ x ->
+                 FailureDetails' <$>
+                   (x .:? "LogFile") <*> (x .:? "Reason") <*>
+                     (x .:? "Message"))
+
+instance Hashable FailureDetails
+
+instance NFData FailureDetails
+
 -- | 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.
@@ -1252,7 +1305,7 @@
 igInstanceType :: Lens' InstanceGroup (Maybe Text)
 igInstanceType = lens _igInstanceType (\ s a -> s{_igInstanceType = a});
 
--- | If the instance group is EBS-optimized. An Amazon EBS–optimized instance uses an optimized configuration stack and provides additional, dedicated capacity for Amazon EBS I\/O.
+-- | If the instance group is EBS-optimized. An Amazon EBS-optimized instance uses an optimized configuration stack and provides additional, dedicated capacity for Amazon EBS I\/O.
 igEBSOptimized :: Lens' InstanceGroup (Maybe Bool)
 igEBSOptimized = lens _igEBSOptimized (\ s a -> s{_igEBSOptimized = a});
 
@@ -2319,6 +2372,7 @@
 -- /See:/ 'stepStatus' smart constructor.
 data StepStatus = StepStatus'
     { _ssState             :: !(Maybe StepState)
+    , _ssFailureDetails    :: !(Maybe FailureDetails)
     , _ssStateChangeReason :: !(Maybe StepStateChangeReason)
     , _ssTimeline          :: !(Maybe StepTimeline)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
@@ -2329,6 +2383,8 @@
 --
 -- * 'ssState'
 --
+-- * 'ssFailureDetails'
+--
 -- * 'ssStateChangeReason'
 --
 -- * 'ssTimeline'
@@ -2337,6 +2393,7 @@
 stepStatus =
     StepStatus'
     { _ssState = Nothing
+    , _ssFailureDetails = Nothing
     , _ssStateChangeReason = Nothing
     , _ssTimeline = Nothing
     }
@@ -2345,6 +2402,10 @@
 ssState :: Lens' StepStatus (Maybe StepState)
 ssState = lens _ssState (\ s a -> s{_ssState = a});
 
+-- | The details for the step failure including reason, message, and log file path where the root cause was identified.
+ssFailureDetails :: Lens' StepStatus (Maybe FailureDetails)
+ssFailureDetails = lens _ssFailureDetails (\ s a -> s{_ssFailureDetails = a});
+
 -- | The reason for the step execution status change.
 ssStateChangeReason :: Lens' StepStatus (Maybe StepStateChangeReason)
 ssStateChangeReason = lens _ssStateChangeReason (\ s a -> s{_ssStateChangeReason = a});
@@ -2358,8 +2419,9 @@
           = withObject "StepStatus"
               (\ x ->
                  StepStatus' <$>
-                   (x .:? "State") <*> (x .:? "StateChangeReason") <*>
-                     (x .:? "Timeline"))
+                   (x .:? "State") <*> (x .:? "FailureDetails") <*>
+                     (x .:? "StateChangeReason")
+                     <*> (x .:? "Timeline"))
 
 instance Hashable StepStatus
 
@@ -2609,7 +2671,7 @@
 vsVolumeType :: Lens' VolumeSpecification Text
 vsVolumeType = lens _vsVolumeType (\ s a -> s{_vsVolumeType = a});
 
--- | The volume size, in gibibytes (GiB). This can be a number from 1 – 1024. If the volume type is EBS-optimized, the minimum value is 10.
+-- | The volume size, in gibibytes (GiB). This can be a number from 1 - 1024. If the volume type is EBS-optimized, the minimum value is 10.
 vsSizeInGB :: Lens' VolumeSpecification Int
 vsSizeInGB = lens _vsSizeInGB (\ s a -> s{_vsSizeInGB = a});
 
diff --git a/gen/Network/AWS/EMR/Types/Sum.hs b/gen/Network/AWS/EMR/Types/Sum.hs
--- a/gen/Network/AWS/EMR/Types/Sum.hs
+++ b/gen/Network/AWS/EMR/Types/Sum.hs
@@ -33,7 +33,7 @@
         "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"
+           <> "'. Accepted values: cancel_and_wait, continue, terminate_cluster, terminate_job_flow"
 
 instance ToText ActionOnFailure where
     toText = \case
@@ -74,7 +74,7 @@
         "terminating" -> pure CSTerminating
         "waiting" -> pure CSWaiting
         e -> fromTextError $ "Failure parsing ClusterState from value: '" <> e
-           <> "'. Accepted values: BOOTSTRAPPING, RUNNING, STARTING, TERMINATED, TERMINATED_WITH_ERRORS, TERMINATING, WAITING"
+           <> "'. Accepted values: bootstrapping, running, starting, terminated, terminated_with_errors, terminating, waiting"
 
 instance ToText ClusterState where
     toText = \case
@@ -118,7 +118,7 @@
         "user_request" -> pure CSCRCUserRequest
         "validation_error" -> pure CSCRCValidationError
         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"
+           <> "'. Accepted values: all_steps_completed, bootstrap_failure, instance_failure, internal_error, step_failure, user_request, validation_error"
 
 instance ToText ClusterStateChangeReasonCode where
     toText = \case
@@ -165,7 +165,7 @@
         "terminated" -> pure Terminated
         "terminating" -> pure Terminating
         e -> fromTextError $ "Failure parsing InstanceGroupState from value: '" <> e
-           <> "'. Accepted values: ARRESTED, BOOTSTRAPPING, ENDED, PROVISIONING, RESIZING, RUNNING, SHUTTING_DOWN, SUSPENDED, TERMINATED, TERMINATING"
+           <> "'. Accepted values: arrested, bootstrapping, ended, provisioning, resizing, running, shutting_down, suspended, terminated, terminating"
 
 instance ToText InstanceGroupState where
     toText = \case
@@ -203,7 +203,7 @@
         "internal_error" -> pure InternalError
         "validation_error" -> pure ValidationError
         e -> fromTextError $ "Failure parsing InstanceGroupStateChangeReasonCode from value: '" <> e
-           <> "'. Accepted values: CLUSTER_TERMINATED, INSTANCE_FAILURE, INTERNAL_ERROR, VALIDATION_ERROR"
+           <> "'. Accepted values: cluster_terminated, instance_failure, internal_error, validation_error"
 
 instance ToText InstanceGroupStateChangeReasonCode where
     toText = \case
@@ -233,7 +233,7 @@
         "master" -> pure Master
         "task" -> pure Task
         e -> fromTextError $ "Failure parsing InstanceGroupType from value: '" <> e
-           <> "'. Accepted values: CORE, MASTER, TASK"
+           <> "'. Accepted values: core, master, task"
 
 instance ToText InstanceGroupType where
     toText = \case
@@ -265,7 +265,7 @@
         "master" -> pure IRTMaster
         "task" -> pure IRTTask
         e -> fromTextError $ "Failure parsing InstanceRoleType from value: '" <> e
-           <> "'. Accepted values: CORE, MASTER, TASK"
+           <> "'. Accepted values: core, master, task"
 
 instance ToText InstanceRoleType where
     toText = \case
@@ -298,7 +298,7 @@
         "running" -> pure ISRunning
         "terminated" -> pure ISTerminated
         e -> fromTextError $ "Failure parsing InstanceState from value: '" <> e
-           <> "'. Accepted values: AWAITING_FULFILLMENT, BOOTSTRAPPING, PROVISIONING, RUNNING, TERMINATED"
+           <> "'. Accepted values: awaiting_fulfillment, bootstrapping, provisioning, running, terminated"
 
 instance ToText InstanceState where
     toText = \case
@@ -314,6 +314,9 @@
 instance ToQuery      InstanceState
 instance ToHeader     InstanceState
 
+instance ToJSON InstanceState where
+    toJSON = toJSONText
+
 instance FromJSON InstanceState where
     parseJSON = parseJSONText "InstanceState"
 
@@ -333,7 +336,7 @@
         "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"
+           <> "'. Accepted values: bootstrap_failure, cluster_terminated, instance_failure, internal_error, validation_error"
 
 instance ToText InstanceStateChangeReasonCode where
     toText = \case
@@ -362,7 +365,7 @@
         "on_demand" -> pure OnDemand
         "spot" -> pure Spot
         e -> fromTextError $ "Failure parsing MarketType from value: '" <> e
-           <> "'. Accepted values: ON_DEMAND, SPOT"
+           <> "'. Accepted values: on_demand, spot"
 
 instance ToText MarketType where
     toText = \case
@@ -399,7 +402,7 @@
         "pending" -> pure SSPending
         "running" -> pure SSRunning
         e -> fromTextError $ "Failure parsing StepState from value: '" <> e
-           <> "'. Accepted values: CANCELLED, COMPLETED, FAILED, INTERRUPTED, PENDING, RUNNING"
+           <> "'. Accepted values: cancelled, completed, failed, interrupted, pending, running"
 
 instance ToText StepState where
     toText = \case
@@ -430,7 +433,7 @@
     parser = takeLowerText >>= \case
         "none" -> pure None
         e -> fromTextError $ "Failure parsing StepStateChangeReasonCode from value: '" <> e
-           <> "'. Accepted values: NONE"
+           <> "'. Accepted values: none"
 
 instance ToText StepStateChangeReasonCode where
     toText = \case
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
