diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.3.7`
+`1.4.0`
 
 
 ## Description
@@ -27,7 +27,7 @@
 <http://docs.aws.amazon.com/iot/latest/developerguide/aws-iot-how-it-works.html Developer Guide>.
 
 Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-iot)
-and the [AWS API Reference](https://aws.amazon.com/iot).
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
 
 The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
 which provides mechanisms for specifying AuthN/AuthZ information and sending requests.
diff --git a/amazonka-iot.cabal b/amazonka-iot.cabal
--- a/amazonka-iot.cabal
+++ b/amazonka-iot.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-iot
-version:               1.3.7
+version:               1.4.0
 synopsis:              Amazon IoT SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
@@ -7,7 +7,7 @@
 license-file:          LICENSE
 author:                Brendan Hay
 maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
-copyright:             Copyright (c) 2013-2015 Brendan Hay
+copyright:             Copyright (c) 2013-2016 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
@@ -37,7 +37,7 @@
     such as <http://hackage.haskell.org/package/lens lens> or
     <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
     .
-    See "Network.AWS.IoT" and the <https://aws.amazon.com/iot AWS API Reference>
+    See "Network.AWS.IoT" or <https://aws.amazon.com/documentation/ the AWS Documentation>
     to get started.
 
 source-repository head
@@ -72,6 +72,8 @@
         , Network.AWS.IoT.DescribeThing
         , Network.AWS.IoT.DetachPrincipalPolicy
         , Network.AWS.IoT.DetachThingPrincipal
+        , Network.AWS.IoT.DisableTopicRule
+        , Network.AWS.IoT.EnableTopicRule
         , Network.AWS.IoT.GetLoggingOptions
         , Network.AWS.IoT.GetPolicy
         , Network.AWS.IoT.GetPolicyVersion
@@ -99,7 +101,7 @@
         , Network.AWS.IoT.Types.Sum
 
     build-depends:
-          amazonka-core == 1.3.7.*
+          amazonka-core == 1.4.0.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-iot-test
@@ -119,9 +121,9 @@
         , Test.AWS.IoT.Internal
 
     build-depends:
-          amazonka-core == 1.3.7.*
-        , amazonka-test == 1.3.7.*
-        , amazonka-iot == 1.3.7.*
+          amazonka-core == 1.4.0.*
+        , amazonka-test == 1.4.0.*
+        , amazonka-iot == 1.4.0.*
         , base
         , bytestring
         , tasty
diff --git a/fixture/DisableTopicRule.yaml b/fixture/DisableTopicRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisableTopicRule.yaml
diff --git a/fixture/DisableTopicRuleResponse.proto b/fixture/DisableTopicRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisableTopicRuleResponse.proto
diff --git a/fixture/EnableTopicRule.yaml b/fixture/EnableTopicRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/EnableTopicRule.yaml
diff --git a/fixture/EnableTopicRuleResponse.proto b/fixture/EnableTopicRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/EnableTopicRuleResponse.proto
diff --git a/gen/Network/AWS/IoT.hs b/gen/Network/AWS/IoT.hs
--- a/gen/Network/AWS/IoT.hs
+++ b/gen/Network/AWS/IoT.hs
@@ -5,7 +5,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -23,8 +23,6 @@
 --
 -- For more information about how AWS IoT works, see the
 -- <http://docs.aws.amazon.com/iot/latest/developerguide/aws-iot-how-it-works.html Developer Guide>.
---
--- /See:/ <https://aws.amazon.com/iot AWS API Reference>
 module Network.AWS.IoT
     (
     -- * Service Configuration
@@ -117,6 +115,9 @@
     -- ** DeletePolicyVersion
     , module Network.AWS.IoT.DeletePolicyVersion
 
+    -- ** DisableTopicRule
+    , module Network.AWS.IoT.DisableTopicRule
+
     -- ** CreateTopicRule
     , module Network.AWS.IoT.CreateTopicRule
 
@@ -183,6 +184,9 @@
     -- ** CreateKeysAndCertificate
     , module Network.AWS.IoT.CreateKeysAndCertificate
 
+    -- ** EnableTopicRule
+    , module Network.AWS.IoT.EnableTopicRule
+
     -- ** AcceptCertificateTransfer
     , module Network.AWS.IoT.AcceptCertificateTransfer
 
@@ -212,15 +216,21 @@
     -- ** LogLevel
     , LogLevel (..)
 
+    -- ** MessageFormat
+    , MessageFormat (..)
+
     -- ** Action
     , Action
     , action
+    , aCloudwatchMetric
+    , aCloudwatchAlarm
     , aSns
     , aDynamoDB
     , aFirehose
     , aLambda
     , aKinesis
     , aS3
+    , aElasticsearch
     , aRepublish
     , aSqs
 
@@ -248,6 +258,24 @@
     , cdCertificateId
     , cdCreationDate
 
+    -- ** CloudwatchAlarmAction
+    , CloudwatchAlarmAction
+    , cloudwatchAlarmAction
+    , caaRoleARN
+    , caaAlarmName
+    , caaStateReason
+    , caaStateValue
+
+    -- ** CloudwatchMetricAction
+    , CloudwatchMetricAction
+    , cloudwatchMetricAction
+    , cmaMetricTimestamp
+    , cmaRoleARN
+    , cmaMetricNamespace
+    , cmaMetricName
+    , cmaMetricValue
+    , cmaMetricUnit
+
     -- ** DynamoDBAction
     , DynamoDBAction
     , dynamoDBAction
@@ -259,6 +287,15 @@
     , ddaRangeKeyField
     , ddaRangeKeyValue
 
+    -- ** ElasticsearchAction
+    , ElasticsearchAction
+    , elasticsearchAction
+    , eaRoleARN
+    , eaEndpoint
+    , eaIndex
+    , eaType
+    , eaId
+
     -- ** FirehoseAction
     , FirehoseAction
     , firehoseAction
@@ -318,6 +355,7 @@
     -- ** SNSAction
     , SNSAction
     , snsAction
+    , snsaMessageFormat
     , snsaTargetARN
     , snsaRoleARN
 
@@ -350,6 +388,7 @@
     , trliCreatedAt
     , trliRuleDisabled
     , trliRuleName
+    , trliRuleARN
     , trliTopicPattern
 
     -- ** TopicRulePayload
@@ -381,6 +420,8 @@
 import           Network.AWS.IoT.DescribeThing
 import           Network.AWS.IoT.DetachPrincipalPolicy
 import           Network.AWS.IoT.DetachThingPrincipal
+import           Network.AWS.IoT.DisableTopicRule
+import           Network.AWS.IoT.EnableTopicRule
 import           Network.AWS.IoT.GetLoggingOptions
 import           Network.AWS.IoT.GetPolicy
 import           Network.AWS.IoT.GetPolicyVersion
diff --git a/gen/Network/AWS/IoT/AcceptCertificateTransfer.hs b/gen/Network/AWS/IoT/AcceptCertificateTransfer.hs
--- a/gen/Network/AWS/IoT/AcceptCertificateTransfer.hs
+++ b/gen/Network/AWS/IoT/AcceptCertificateTransfer.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.AcceptCertificateTransfer
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,10 +21,8 @@
 -- Accepts a pending certificate transfer. The default state of the
 -- certificate is INACTIVE.
 --
--- To check for pending certificate transfers, call ListCertificates to
+-- To check for pending certificate transfers, call < ListCertificates> to
 -- enumerate your certificates.
---
--- /See:/ <https://aws.amazon.com/iot#AcceptCertificateTransfer.html AWS API Reference> for AcceptCertificateTransfer.
 module Network.AWS.IoT.AcceptCertificateTransfer
     (
     -- * Creating a Request
@@ -84,6 +82,8 @@
         request = patchJSON ioT
         response
           = receiveNull AcceptCertificateTransferResponse'
+
+instance Hashable AcceptCertificateTransfer
 
 instance ToHeaders AcceptCertificateTransfer where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/AttachPrincipalPolicy.hs b/gen/Network/AWS/IoT/AttachPrincipalPolicy.hs
--- a/gen/Network/AWS/IoT/AttachPrincipalPolicy.hs
+++ b/gen/Network/AWS/IoT/AttachPrincipalPolicy.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.AttachPrincipalPolicy
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,8 +20,6 @@
 --
 -- Attaches the specified policy to the specified principal (certificate or
 -- other credential).
---
--- /See:/ <https://aws.amazon.com/iot#AttachPrincipalPolicy.html AWS API Reference> for AttachPrincipalPolicy.
 module Network.AWS.IoT.AttachPrincipalPolicy
     (
     -- * Creating a Request
@@ -72,8 +70,8 @@
 appPolicyName :: Lens' AttachPrincipalPolicy Text
 appPolicyName = lens _appPolicyName (\ s a -> s{_appPolicyName = a});
 
--- | The principal which can be a certificate ARN (as returned from the
--- CreateCertificate operation) or a Cognito ID.
+-- | The principal, which can be a certificate ARN (as returned from the
+-- CreateCertificate operation) or an Amazon Cognito ID.
 appPrincipal :: Lens' AttachPrincipalPolicy Text
 appPrincipal = lens _appPrincipal (\ s a -> s{_appPrincipal = a});
 
@@ -82,6 +80,8 @@
              AttachPrincipalPolicyResponse
         request = putJSON ioT
         response = receiveNull AttachPrincipalPolicyResponse'
+
+instance Hashable AttachPrincipalPolicy
 
 instance ToHeaders AttachPrincipalPolicy where
         toHeaders AttachPrincipalPolicy'{..}
diff --git a/gen/Network/AWS/IoT/AttachThingPrincipal.hs b/gen/Network/AWS/IoT/AttachThingPrincipal.hs
--- a/gen/Network/AWS/IoT/AttachThingPrincipal.hs
+++ b/gen/Network/AWS/IoT/AttachThingPrincipal.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.AttachThingPrincipal
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Attaches the specified principal to the specified thing.
---
--- /See:/ <https://aws.amazon.com/iot#AttachThingPrincipal.html AWS API Reference> for AttachThingPrincipal.
 module Network.AWS.IoT.AttachThingPrincipal
     (
     -- * Creating a Request
@@ -86,6 +84,8 @@
               (\ s h x ->
                  AttachThingPrincipalResponse' <$>
                    (pure (fromEnum s)))
+
+instance Hashable AttachThingPrincipal
 
 instance ToHeaders AttachThingPrincipal where
         toHeaders AttachThingPrincipal'{..}
diff --git a/gen/Network/AWS/IoT/CancelCertificateTransfer.hs b/gen/Network/AWS/IoT/CancelCertificateTransfer.hs
--- a/gen/Network/AWS/IoT/CancelCertificateTransfer.hs
+++ b/gen/Network/AWS/IoT/CancelCertificateTransfer.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CancelCertificateTransfer
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,16 +21,14 @@
 -- Cancels a pending transfer for the specified certificate.
 --
 -- __Note__ Only the transfer source account can use this operation to
--- cancel a transfer (transfer destinations can use
--- RejectCertificateTransfer instead). After transfer, AWS IoT returns the
--- certificate to the source account in the INACTIVE state. Once the
--- destination account has accepted the transfer, the transfer may no
--- longer be cancelled.
+-- cancel a transfer. (Transfer destinations can use
+-- < RejectCertificateTransfer> instead.) After transfer, AWS IoT returns
+-- the certificate to the source account in the INACTIVE state. After the
+-- destination account has accepted the transfer, the transfer cannot be
+-- cancelled.
 --
 -- After a certificate transfer is cancelled, the status of the certificate
 -- changes from PENDING_TRANSFER to INACTIVE.
---
--- /See:/ <https://aws.amazon.com/iot#CancelCertificateTransfer.html AWS API Reference> for CancelCertificateTransfer.
 module Network.AWS.IoT.CancelCertificateTransfer
     (
     -- * Creating a Request
@@ -81,6 +79,8 @@
         request = patchJSON ioT
         response
           = receiveNull CancelCertificateTransferResponse'
+
+instance Hashable CancelCertificateTransfer
 
 instance ToHeaders CancelCertificateTransfer where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/CreateCertificateFromCsr.hs b/gen/Network/AWS/IoT/CreateCertificateFromCsr.hs
--- a/gen/Network/AWS/IoT/CreateCertificateFromCsr.hs
+++ b/gen/Network/AWS/IoT/CreateCertificateFromCsr.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreateCertificateFromCsr
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -24,24 +24,24 @@
 -- __Note__ Reusing the same certificate signing request (CSR) results in a
 -- distinct certificate.
 --
--- You can create multiple certificates in a batch by creating a directory
--- and copying multiple .csr files into that directory and specifying that
--- directory on the command line. The following commands show how to create
--- a batch of certificates given a batch of CSRs.
+-- You can create multiple certificates in a batch by creating a directory,
+-- copying multiple .csr files into that directory, and then specifying
+-- that directory on the command line. The following commands show how to
+-- create a batch of certificates given a batch of CSRs.
 --
 -- Assuming a set of CSRs are located inside of the directory
 -- my-csr-directory:
 --
 -- >
 --
--- On Linux and OSX, the command is:
+-- On Linux and OS X, the command is:
 --
 -- $ ls my-csr-directory\/ | xargs -I {} aws iot
 -- create-certificate-from-csr --certificate-signing-request
 -- file:\/\/my-csr-directory\/{}
 --
 -- This command lists all of the CSRs in my-csr-directory and pipes each
--- CSR filename to the aws iot create-certificate-from-csr AWS CLI command
+-- CSR file name to the aws iot create-certificate-from-csr AWS CLI command
 -- to create a certificate for the corresponding CSR.
 --
 -- The aws iot create-certificate-from-csr part of the command can also be
@@ -57,14 +57,12 @@
 -- > ls -Name my-csr-directory | %{aws iot create-certificate-from-csr
 -- --certificate-signing-request file:\/\/my-csr-directory\/$_}
 --
--- On Windows Command Prompt, the command to create certificates for all
+-- On a Windows command prompt, the command to create certificates for all
 -- CSRs in my-csr-directory is:
 --
 -- > forfiles \/p my-csr-directory \/c \"cmd \/c aws iot
 -- create-certificate-from-csr --certificate-signing-request
 -- file:\/\/\'path\"
---
--- /See:/ <https://aws.amazon.com/iot#CreateCertificateFromCsr.html AWS API Reference> for CreateCertificateFromCsr.
 module Network.AWS.IoT.CreateCertificateFromCsr
     (
     -- * Creating a Request
@@ -134,6 +132,8 @@
                    (x .?> "certificatePem") <*> (x .?> "certificateArn")
                      <*> (x .?> "certificateId")
                      <*> (pure (fromEnum s)))
+
+instance Hashable CreateCertificateFromCsr
 
 instance ToHeaders CreateCertificateFromCsr where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/CreateKeysAndCertificate.hs b/gen/Network/AWS/IoT/CreateKeysAndCertificate.hs
--- a/gen/Network/AWS/IoT/CreateKeysAndCertificate.hs
+++ b/gen/Network/AWS/IoT/CreateKeysAndCertificate.hs
@@ -12,19 +12,17 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreateKeysAndCertificate
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Creates a 2048 bit RSA key pair and issues an X.509 certificate using
+-- Creates a 2048-bit RSA key pair and issues an X.509 certificate using
 -- the issued public key.
 --
 -- __Note__ This is the only time AWS IoT issues the private key for this
--- certificate. It is important to keep track of the private key.
---
--- /See:/ <https://aws.amazon.com/iot#CreateKeysAndCertificate.html AWS API Reference> for CreateKeysAndCertificate.
+-- certificate, so it is important to keep it in a secure location.
 module Network.AWS.IoT.CreateKeysAndCertificate
     (
     -- * Creating a Request
@@ -87,6 +85,8 @@
                      <*> (x .?> "certificateId")
                      <*> (pure (fromEnum s)))
 
+instance Hashable CreateKeysAndCertificate
+
 instance ToHeaders CreateKeysAndCertificate where
         toHeaders = const mempty
 
@@ -149,7 +149,7 @@
 ckacrsCertificateARN = lens _ckacrsCertificateARN (\ s a -> s{_ckacrsCertificateARN = a});
 
 -- | The ID of the certificate. AWS IoT issues a default subject name for the
--- certificate (e.g., AWS IoT Certificate).
+-- certificate (for example, AWS IoT Certificate).
 ckacrsCertificateId :: Lens' CreateKeysAndCertificateResponse (Maybe Text)
 ckacrsCertificateId = lens _ckacrsCertificateId (\ s a -> s{_ckacrsCertificateId = a});
 
diff --git a/gen/Network/AWS/IoT/CreatePolicy.hs b/gen/Network/AWS/IoT/CreatePolicy.hs
--- a/gen/Network/AWS/IoT/CreatePolicy.hs
+++ b/gen/Network/AWS/IoT/CreatePolicy.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreatePolicy
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -23,8 +23,6 @@
 -- The created policy is the default version for the policy. This operation
 -- creates a policy version with a version identifier of __1__ and sets
 -- __1__ as the policy\'s default version.
---
--- /See:/ <https://aws.amazon.com/iot#CreatePolicy.html AWS API Reference> for CreatePolicy.
 module Network.AWS.IoT.CreatePolicy
     (
     -- * Creating a Request
@@ -81,9 +79,9 @@
 cpPolicyName :: Lens' CreatePolicy Text
 cpPolicyName = lens _cpPolicyName (\ s a -> s{_cpPolicyName = a});
 
--- | The JSON document that describes the policy. The length of the
--- __policyDocument__ must be a minimum length of 1, with a maximum length
--- of 2048, excluding whitespace.
+-- | The JSON document that describes the policy. __policyDocument__ must
+-- have a minimum length of 1, with a maximum length of 2048, excluding
+-- whitespace.
 cpPolicyDocument :: Lens' CreatePolicy Text
 cpPolicyDocument = lens _cpPolicyDocument (\ s a -> s{_cpPolicyDocument = a});
 
@@ -98,6 +96,8 @@
                      (x .?> "policyVersionId")
                      <*> (x .?> "policyArn")
                      <*> (pure (fromEnum s)))
+
+instance Hashable CreatePolicy
 
 instance ToHeaders CreatePolicy where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/CreatePolicyVersion.hs b/gen/Network/AWS/IoT/CreatePolicyVersion.hs
--- a/gen/Network/AWS/IoT/CreatePolicyVersion.hs
+++ b/gen/Network/AWS/IoT/CreatePolicyVersion.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreatePolicyVersion
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,16 +20,14 @@
 --
 -- Creates a new version of the specified AWS IoT policy. To update a
 -- policy, create a new policy version. A managed policy can have up to
--- five versions. If the policy has five versions, you must delete an
--- existing version using DeletePolicyVersion before you create a new
--- version.
+-- five versions. If the policy has five versions, you must use
+-- < DeletePolicyVersion> to delete an existing version before you create a
+-- new one.
 --
 -- Optionally, you can set the new version as the policy\'s default
--- version. The default version is the operative version; that is, the
--- version that is in effect for the certificates that the policy is
--- attached to.
---
--- /See:/ <https://aws.amazon.com/iot#CreatePolicyVersion.html AWS API Reference> for CreatePolicyVersion.
+-- version. The default version is the operative version (that is, the
+-- version that is in effect for the certificates to which the policy is
+-- attached).
 module Network.AWS.IoT.CreatePolicyVersion
     (
     -- * Creating a Request
@@ -88,9 +86,9 @@
     }
 
 -- | Specifies whether the policy version is set as the default. When this
--- parameter is true, the new policy version becomes the operative version;
--- that is, the version that is in effect for the certificates that the
--- policy is attached to.
+-- parameter is true, the new policy version becomes the operative version
+-- (that is, the version that is in effect for the certificates to which
+-- the policy is attached).
 cpvSetAsDefault :: Lens' CreatePolicyVersion (Maybe Bool)
 cpvSetAsDefault = lens _cpvSetAsDefault (\ s a -> s{_cpvSetAsDefault = a});
 
@@ -99,7 +97,7 @@
 cpvPolicyName = lens _cpvPolicyName (\ s a -> s{_cpvPolicyName = a});
 
 -- | The JSON document that describes the policy. Minimum length of 1.
--- Maximum length of 2048 excluding whitespaces
+-- Maximum length of 2048, excluding whitespaces
 cpvPolicyDocument :: Lens' CreatePolicyVersion Text
 cpvPolicyDocument = lens _cpvPolicyDocument (\ s a -> s{_cpvPolicyDocument = a});
 
@@ -116,6 +114,8 @@
                      <*> (x .?> "policyArn")
                      <*> (x .?> "isDefaultVersion")
                      <*> (pure (fromEnum s)))
+
+instance Hashable CreatePolicyVersion
 
 instance ToHeaders CreatePolicyVersion where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/CreateThing.hs b/gen/Network/AWS/IoT/CreateThing.hs
--- a/gen/Network/AWS/IoT/CreateThing.hs
+++ b/gen/Network/AWS/IoT/CreateThing.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreateThing
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Creates a thing in the thing registry.
---
--- /See:/ <https://aws.amazon.com/iot#CreateThing.html AWS API Reference> for CreateThing.
+-- Creates a thing in the Thing Registry.
 module Network.AWS.IoT.CreateThing
     (
     -- * Creating a Request
@@ -70,9 +68,9 @@
     , _ctThingName = pThingName_
     }
 
--- | The attribute payload. Which consists of up to 3 name\/value pairs in a
--- JSON document. For example:
--- {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}
+-- | The attribute payload, which consists of up to 3 name\/value pairs in a
+-- JSON document (for example,
+-- {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}).
 ctAttributePayload :: Lens' CreateThing (Maybe AttributePayload)
 ctAttributePayload = lens _ctAttributePayload (\ s a -> s{_ctAttributePayload = a});
 
@@ -89,6 +87,8 @@
                  CreateThingResponse' <$>
                    (x .?> "thingArn") <*> (x .?> "thingName") <*>
                      (pure (fromEnum s)))
+
+instance Hashable CreateThing
 
 instance ToHeaders CreateThing where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/CreateTopicRule.hs b/gen/Network/AWS/IoT/CreateTopicRule.hs
--- a/gen/Network/AWS/IoT/CreateTopicRule.hs
+++ b/gen/Network/AWS/IoT/CreateTopicRule.hs
@@ -12,15 +12,15 @@
 
 -- |
 -- Module      : Network.AWS.IoT.CreateTopicRule
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Creates a rule.
---
--- /See:/ <https://aws.amazon.com/iot#CreateTopicRule.html AWS API Reference> for CreateTopicRule.
+-- Creates a rule. Creating rules is an administrator-level action. Any
+-- user who has permission to create rules will be able to access data
+-- processed by the rule.
 module Network.AWS.IoT.CreateTopicRule
     (
     -- * Creating a Request
@@ -79,6 +79,8 @@
         type Rs CreateTopicRule = CreateTopicRuleResponse
         request = postJSON ioT
         response = receiveNull CreateTopicRuleResponse'
+
+instance Hashable CreateTopicRule
 
 instance ToHeaders CreateTopicRule where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DeleteCertificate.hs b/gen/Network/AWS/IoT/DeleteCertificate.hs
--- a/gen/Network/AWS/IoT/DeleteCertificate.hs
+++ b/gen/Network/AWS/IoT/DeleteCertificate.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DeleteCertificate
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,11 +21,9 @@
 -- Deletes the specified certificate.
 --
 -- A certificate cannot be deleted if it has a policy attached to it or if
--- its status is set to ACTIVE. To delete a certificate, first detach all
--- policies using the DetachPrincipalPolicy API. Next use the
--- UpdateCertificate API to set the certificate to the INACTIVE status.
---
--- /See:/ <https://aws.amazon.com/iot#DeleteCertificate.html AWS API Reference> for DeleteCertificate.
+-- its status is set to ACTIVE. To delete a certificate, first use the
+-- < DetachPrincipalPolicy> API to detach all policies. Next, use the
+-- < UpdateCertificate> API to set the certificate to the INACTIVE status.
 module Network.AWS.IoT.DeleteCertificate
     (
     -- * Creating a Request
@@ -74,6 +72,8 @@
         type Rs DeleteCertificate = DeleteCertificateResponse
         request = delete ioT
         response = receiveNull DeleteCertificateResponse'
+
+instance Hashable DeleteCertificate
 
 instance ToHeaders DeleteCertificate where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DeletePolicy.hs b/gen/Network/AWS/IoT/DeletePolicy.hs
--- a/gen/Network/AWS/IoT/DeletePolicy.hs
+++ b/gen/Network/AWS/IoT/DeletePolicy.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DeletePolicy
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,18 +20,16 @@
 --
 -- Deletes the specified policy.
 --
--- A policy cannot be deleted if it has non-default versions and\/or it is
+-- A policy cannot be deleted if it has non-default versions or it is
 -- attached to any certificate.
 --
--- To delete a policy, delete all non-default versions of the policy using
--- the DeletePolicyVersion API, detach the policy from any certificate
--- using the DetachPrincipalPolicy API, and then use the DeletePolicy API
--- to delete the policy.
+-- To delete a policy, use the DeletePolicyVersion API to delete all
+-- non-default versions of the policy; use the DetachPrincipalPolicy API to
+-- detach the policy from any certificate; and then use the DeletePolicy
+-- API to delete the policy.
 --
 -- When a policy is deleted using DeletePolicy, its default version is
 -- deleted with it.
---
--- /See:/ <https://aws.amazon.com/iot#DeletePolicy.html AWS API Reference> for DeletePolicy.
 module Network.AWS.IoT.DeletePolicy
     (
     -- * Creating a Request
@@ -80,6 +78,8 @@
         type Rs DeletePolicy = DeletePolicyResponse
         request = delete ioT
         response = receiveNull DeletePolicyResponse'
+
+instance Hashable DeletePolicy
 
 instance ToHeaders DeletePolicy where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DeletePolicyVersion.hs b/gen/Network/AWS/IoT/DeletePolicyVersion.hs
--- a/gen/Network/AWS/IoT/DeletePolicyVersion.hs
+++ b/gen/Network/AWS/IoT/DeletePolicyVersion.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DeletePolicyVersion
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,10 +20,8 @@
 --
 -- Deletes the specified version of the specified policy. You cannot delete
 -- the default version of a policy using this API. To delete the default
--- version of a policy, use DeletePolicy. To find out which version of a
+-- version of a policy, use < DeletePolicy>. To find out which version of a
 -- policy is marked as the default version, use ListPolicyVersions.
---
--- /See:/ <https://aws.amazon.com/iot#DeletePolicyVersion.html AWS API Reference> for DeletePolicyVersion.
 module Network.AWS.IoT.DeletePolicyVersion
     (
     -- * Creating a Request
@@ -83,6 +81,8 @@
              DeletePolicyVersionResponse
         request = delete ioT
         response = receiveNull DeletePolicyVersionResponse'
+
+instance Hashable DeletePolicyVersion
 
 instance ToHeaders DeletePolicyVersion where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DeleteThing.hs b/gen/Network/AWS/IoT/DeleteThing.hs
--- a/gen/Network/AWS/IoT/DeleteThing.hs
+++ b/gen/Network/AWS/IoT/DeleteThing.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DeleteThing
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Deletes the specified thing from the Thing Registry.
---
--- /See:/ <https://aws.amazon.com/iot#DeleteThing.html AWS API Reference> for DeleteThing.
 module Network.AWS.IoT.DeleteThing
     (
     -- * Creating a Request
@@ -74,6 +72,8 @@
           = receiveEmpty
               (\ s h x ->
                  DeleteThingResponse' <$> (pure (fromEnum s)))
+
+instance Hashable DeleteThing
 
 instance ToHeaders DeleteThing where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DeleteTopicRule.hs b/gen/Network/AWS/IoT/DeleteTopicRule.hs
--- a/gen/Network/AWS/IoT/DeleteTopicRule.hs
+++ b/gen/Network/AWS/IoT/DeleteTopicRule.hs
@@ -12,22 +12,20 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DeleteTopicRule
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Deletes the specified rule.
---
--- /See:/ <https://aws.amazon.com/iot#DeleteTopicRule.html AWS API Reference> for DeleteTopicRule.
 module Network.AWS.IoT.DeleteTopicRule
     (
     -- * Creating a Request
       deleteTopicRule
     , DeleteTopicRule
     -- * Request Lenses
-    , dtrRuleName
+    , dRuleName
 
     -- * Destructuring the Response
     , deleteTopicRuleResponse
@@ -45,37 +43,39 @@
 --
 -- /See:/ 'deleteTopicRule' smart constructor.
 newtype DeleteTopicRule = DeleteTopicRule'
-    { _dtrRuleName :: Text
+    { _dRuleName :: Text
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
 -- | Creates a value of 'DeleteTopicRule' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
 --
--- * 'dtrRuleName'
+-- * 'dRuleName'
 deleteTopicRule
-    :: Text -- ^ 'dtrRuleName'
+    :: Text -- ^ 'dRuleName'
     -> DeleteTopicRule
 deleteTopicRule pRuleName_ =
     DeleteTopicRule'
-    { _dtrRuleName = pRuleName_
+    { _dRuleName = pRuleName_
     }
 
 -- | The name of the rule.
-dtrRuleName :: Lens' DeleteTopicRule Text
-dtrRuleName = lens _dtrRuleName (\ s a -> s{_dtrRuleName = a});
+dRuleName :: Lens' DeleteTopicRule Text
+dRuleName = lens _dRuleName (\ s a -> s{_dRuleName = a});
 
 instance AWSRequest DeleteTopicRule where
         type Rs DeleteTopicRule = DeleteTopicRuleResponse
         request = delete ioT
         response = receiveNull DeleteTopicRuleResponse'
 
+instance Hashable DeleteTopicRule
+
 instance ToHeaders DeleteTopicRule where
         toHeaders = const mempty
 
 instance ToPath DeleteTopicRule where
         toPath DeleteTopicRule'{..}
-          = mconcat ["/rules/", toBS _dtrRuleName]
+          = mconcat ["/rules/", toBS _dRuleName]
 
 instance ToQuery DeleteTopicRule where
         toQuery = const mempty
diff --git a/gen/Network/AWS/IoT/DescribeCertificate.hs b/gen/Network/AWS/IoT/DescribeCertificate.hs
--- a/gen/Network/AWS/IoT/DescribeCertificate.hs
+++ b/gen/Network/AWS/IoT/DescribeCertificate.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DescribeCertificate
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Gets information about the specified certificate.
---
--- /See:/ <https://aws.amazon.com/iot#DescribeCertificate.html AWS API Reference> for DescribeCertificate.
 module Network.AWS.IoT.DescribeCertificate
     (
     -- * Creating a Request
@@ -78,6 +76,8 @@
                  DescribeCertificateResponse' <$>
                    (x .?> "certificateDescription") <*>
                      (pure (fromEnum s)))
+
+instance Hashable DescribeCertificate
 
 instance ToHeaders DescribeCertificate where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DescribeEndpoint.hs b/gen/Network/AWS/IoT/DescribeEndpoint.hs
--- a/gen/Network/AWS/IoT/DescribeEndpoint.hs
+++ b/gen/Network/AWS/IoT/DescribeEndpoint.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DescribeEndpoint
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,8 +21,6 @@
 -- Returns a unique endpoint specific to the AWS account making the call.
 -- You specify the following URI when updating state information for your
 -- thing: https:\/\//endpoint/\/things\//thingName/\/shadow.
---
--- /See:/ <https://aws.amazon.com/iot#DescribeEndpoint.html AWS API Reference> for DescribeEndpoint.
 module Network.AWS.IoT.DescribeEndpoint
     (
     -- * Creating a Request
@@ -65,6 +63,8 @@
               (\ s h x ->
                  DescribeEndpointResponse' <$>
                    (x .?> "endpointAddress") <*> (pure (fromEnum s)))
+
+instance Hashable DescribeEndpoint
 
 instance ToHeaders DescribeEndpoint where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/DescribeThing.hs b/gen/Network/AWS/IoT/DescribeThing.hs
--- a/gen/Network/AWS/IoT/DescribeThing.hs
+++ b/gen/Network/AWS/IoT/DescribeThing.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DescribeThing
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Gets information about the specified thing.
---
--- /See:/ <https://aws.amazon.com/iot#DescribeThing.html AWS API Reference> for DescribeThing.
 module Network.AWS.IoT.DescribeThing
     (
     -- * Creating a Request
@@ -82,6 +80,8 @@
                      <*> (x .?> "thingName")
                      <*> (pure (fromEnum s)))
 
+instance Hashable DescribeThing
+
 instance ToHeaders DescribeThing where
         toHeaders = const mempty
 
@@ -128,11 +128,10 @@
 dtrsDefaultClientId :: Lens' DescribeThingResponse (Maybe Text)
 dtrsDefaultClientId = lens _dtrsDefaultClientId (\ s a -> s{_dtrsDefaultClientId = a});
 
--- | The attributes which are name\/value pairs in JSON format. For example:
---
+-- | The attributes, which are name\/value pairs in JSON format (for example:
 -- {\\\"attributes\\\":{\\\"some-name1\\\":\\\"some-value1\\\"},
 -- {\\\"some-name2\\\":\\\"some-value2\\\"},
--- {\\\"some-name3\\\":\\\"some-value3\\\"}}
+-- {\\\"some-name3\\\":\\\"some-value3\\\"}})
 dtrsAttributes :: Lens' DescribeThingResponse (HashMap Text Text)
 dtrsAttributes = lens _dtrsAttributes (\ s a -> s{_dtrsAttributes = a}) . _Default . _Map;
 
diff --git a/gen/Network/AWS/IoT/DetachPrincipalPolicy.hs b/gen/Network/AWS/IoT/DetachPrincipalPolicy.hs
--- a/gen/Network/AWS/IoT/DetachPrincipalPolicy.hs
+++ b/gen/Network/AWS/IoT/DetachPrincipalPolicy.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DetachPrincipalPolicy
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Removes the specified policy from the specified certificate.
---
--- /See:/ <https://aws.amazon.com/iot#DetachPrincipalPolicy.html AWS API Reference> for DetachPrincipalPolicy.
 module Network.AWS.IoT.DetachPrincipalPolicy
     (
     -- * Creating a Request
@@ -71,10 +69,10 @@
 dppPolicyName :: Lens' DetachPrincipalPolicy Text
 dppPolicyName = lens _dppPolicyName (\ s a -> s{_dppPolicyName = a});
 
--- | The principal
+-- | The principal.
 --
 -- If the principal is a certificate, specify the certificate ARN. If the
--- principal is a Cognito identity specify the identity ID.
+-- principal is an Amazon Cognito identity, specify the identity ID.
 dppPrincipal :: Lens' DetachPrincipalPolicy Text
 dppPrincipal = lens _dppPrincipal (\ s a -> s{_dppPrincipal = a});
 
@@ -83,6 +81,8 @@
              DetachPrincipalPolicyResponse
         request = delete ioT
         response = receiveNull DetachPrincipalPolicyResponse'
+
+instance Hashable DetachPrincipalPolicy
 
 instance ToHeaders DetachPrincipalPolicy where
         toHeaders DetachPrincipalPolicy'{..}
diff --git a/gen/Network/AWS/IoT/DetachThingPrincipal.hs b/gen/Network/AWS/IoT/DetachThingPrincipal.hs
--- a/gen/Network/AWS/IoT/DetachThingPrincipal.hs
+++ b/gen/Network/AWS/IoT/DetachThingPrincipal.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.DetachThingPrincipal
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Detaches the specified principal from the specified thing.
---
--- /See:/ <https://aws.amazon.com/iot#DetachThingPrincipal.html AWS API Reference> for DetachThingPrincipal.
 module Network.AWS.IoT.DetachThingPrincipal
     (
     -- * Creating a Request
@@ -86,6 +84,8 @@
               (\ s h x ->
                  DetachThingPrincipalResponse' <$>
                    (pure (fromEnum s)))
+
+instance Hashable DetachThingPrincipal
 
 instance ToHeaders DetachThingPrincipal where
         toHeaders DetachThingPrincipal'{..}
diff --git a/gen/Network/AWS/IoT/DisableTopicRule.hs b/gen/Network/AWS/IoT/DisableTopicRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/IoT/DisableTopicRule.hs
@@ -0,0 +1,95 @@
+{-# 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.IoT.DisableTopicRule
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disables the specified rule.
+module Network.AWS.IoT.DisableTopicRule
+    (
+    -- * Creating a Request
+      disableTopicRule
+    , DisableTopicRule
+    -- * Request Lenses
+    , dtrRuleName
+
+    -- * Destructuring the Response
+    , disableTopicRuleResponse
+    , DisableTopicRuleResponse
+    ) where
+
+import           Network.AWS.IoT.Types
+import           Network.AWS.IoT.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | The input for the DisableTopicRuleRequest operation.
+--
+-- /See:/ 'disableTopicRule' smart constructor.
+newtype DisableTopicRule = DisableTopicRule'
+    { _dtrRuleName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableTopicRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'dtrRuleName'
+disableTopicRule
+    :: Text -- ^ 'dtrRuleName'
+    -> DisableTopicRule
+disableTopicRule pRuleName_ =
+    DisableTopicRule'
+    { _dtrRuleName = pRuleName_
+    }
+
+-- | The name of the rule to disable.
+dtrRuleName :: Lens' DisableTopicRule Text
+dtrRuleName = lens _dtrRuleName (\ s a -> s{_dtrRuleName = a});
+
+instance AWSRequest DisableTopicRule where
+        type Rs DisableTopicRule = DisableTopicRuleResponse
+        request = postJSON ioT
+        response = receiveNull DisableTopicRuleResponse'
+
+instance Hashable DisableTopicRule
+
+instance ToHeaders DisableTopicRule where
+        toHeaders = const mempty
+
+instance ToJSON DisableTopicRule where
+        toJSON = const (Object mempty)
+
+instance ToPath DisableTopicRule where
+        toPath DisableTopicRule'{..}
+          = mconcat ["/rules/", toBS _dtrRuleName, "/disable"]
+
+instance ToQuery DisableTopicRule where
+        toQuery = const mempty
+
+-- | /See:/ 'disableTopicRuleResponse' smart constructor.
+data DisableTopicRuleResponse =
+    DisableTopicRuleResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'DisableTopicRuleResponse' with the minimum fields required to make a request.
+--
+disableTopicRuleResponse
+    :: DisableTopicRuleResponse
+disableTopicRuleResponse = DisableTopicRuleResponse'
diff --git a/gen/Network/AWS/IoT/EnableTopicRule.hs b/gen/Network/AWS/IoT/EnableTopicRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/IoT/EnableTopicRule.hs
@@ -0,0 +1,95 @@
+{-# 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.IoT.EnableTopicRule
+-- Copyright   : (c) 2013-2016 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Enables the specified rule.
+module Network.AWS.IoT.EnableTopicRule
+    (
+    -- * Creating a Request
+      enableTopicRule
+    , EnableTopicRule
+    -- * Request Lenses
+    , etrRuleName
+
+    -- * Destructuring the Response
+    , enableTopicRuleResponse
+    , EnableTopicRuleResponse
+    ) where
+
+import           Network.AWS.IoT.Types
+import           Network.AWS.IoT.Types.Product
+import           Network.AWS.Lens
+import           Network.AWS.Prelude
+import           Network.AWS.Request
+import           Network.AWS.Response
+
+-- | The input for the EnableTopicRuleRequest operation.
+--
+-- /See:/ 'enableTopicRule' smart constructor.
+newtype EnableTopicRule = EnableTopicRule'
+    { _etrRuleName :: Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableTopicRule' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'etrRuleName'
+enableTopicRule
+    :: Text -- ^ 'etrRuleName'
+    -> EnableTopicRule
+enableTopicRule pRuleName_ =
+    EnableTopicRule'
+    { _etrRuleName = pRuleName_
+    }
+
+-- | The name of the topic rule to enable.
+etrRuleName :: Lens' EnableTopicRule Text
+etrRuleName = lens _etrRuleName (\ s a -> s{_etrRuleName = a});
+
+instance AWSRequest EnableTopicRule where
+        type Rs EnableTopicRule = EnableTopicRuleResponse
+        request = postJSON ioT
+        response = receiveNull EnableTopicRuleResponse'
+
+instance Hashable EnableTopicRule
+
+instance ToHeaders EnableTopicRule where
+        toHeaders = const mempty
+
+instance ToJSON EnableTopicRule where
+        toJSON = const (Object mempty)
+
+instance ToPath EnableTopicRule where
+        toPath EnableTopicRule'{..}
+          = mconcat ["/rules/", toBS _etrRuleName, "/enable"]
+
+instance ToQuery EnableTopicRule where
+        toQuery = const mempty
+
+-- | /See:/ 'enableTopicRuleResponse' smart constructor.
+data EnableTopicRuleResponse =
+    EnableTopicRuleResponse'
+    deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'EnableTopicRuleResponse' with the minimum fields required to make a request.
+--
+enableTopicRuleResponse
+    :: EnableTopicRuleResponse
+enableTopicRuleResponse = EnableTopicRuleResponse'
diff --git a/gen/Network/AWS/IoT/GetLoggingOptions.hs b/gen/Network/AWS/IoT/GetLoggingOptions.hs
--- a/gen/Network/AWS/IoT/GetLoggingOptions.hs
+++ b/gen/Network/AWS/IoT/GetLoggingOptions.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.GetLoggingOptions
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Gets the logging options.
---
--- /See:/ <https://aws.amazon.com/iot#GetLoggingOptions.html AWS API Reference> for GetLoggingOptions.
 module Network.AWS.IoT.GetLoggingOptions
     (
     -- * Creating a Request
@@ -65,6 +63,8 @@
                  GetLoggingOptionsResponse' <$>
                    (x .?> "logLevel") <*> (x .?> "roleArn") <*>
                      (pure (fromEnum s)))
+
+instance Hashable GetLoggingOptions
 
 instance ToHeaders GetLoggingOptions where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/GetPolicy.hs b/gen/Network/AWS/IoT/GetPolicy.hs
--- a/gen/Network/AWS/IoT/GetPolicy.hs
+++ b/gen/Network/AWS/IoT/GetPolicy.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.GetPolicy
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,8 +20,6 @@
 --
 -- Gets information about the specified policy with the policy document of
 -- the default version.
---
--- /See:/ <https://aws.amazon.com/iot#GetPolicy.html AWS API Reference> for GetPolicy.
 module Network.AWS.IoT.GetPolicy
     (
     -- * Creating a Request
@@ -83,6 +81,8 @@
                      (x .?> "defaultVersionId")
                      <*> (x .?> "policyArn")
                      <*> (pure (fromEnum s)))
+
+instance Hashable GetPolicy
 
 instance ToHeaders GetPolicy where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/GetPolicyVersion.hs b/gen/Network/AWS/IoT/GetPolicyVersion.hs
--- a/gen/Network/AWS/IoT/GetPolicyVersion.hs
+++ b/gen/Network/AWS/IoT/GetPolicyVersion.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.GetPolicyVersion
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Gets information about the specified policy version.
---
--- /See:/ <https://aws.amazon.com/iot#GetPolicyVersion.html AWS API Reference> for GetPolicyVersion.
 module Network.AWS.IoT.GetPolicyVersion
     (
     -- * Creating a Request
@@ -94,6 +92,8 @@
                      <*> (x .?> "policyArn")
                      <*> (x .?> "isDefaultVersion")
                      <*> (pure (fromEnum s)))
+
+instance Hashable GetPolicyVersion
 
 instance ToHeaders GetPolicyVersion where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/GetTopicRule.hs b/gen/Network/AWS/IoT/GetTopicRule.hs
--- a/gen/Network/AWS/IoT/GetTopicRule.hs
+++ b/gen/Network/AWS/IoT/GetTopicRule.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.GetTopicRule
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Gets information about the specified rule.
---
--- /See:/ <https://aws.amazon.com/iot#GetTopicRule.html AWS API Reference> for GetTopicRule.
 module Network.AWS.IoT.GetTopicRule
     (
     -- * Creating a Request
@@ -34,6 +32,7 @@
     , GetTopicRuleResponse
     -- * Response Lenses
     , gtrrsRule
+    , gtrrsRuleARN
     , gtrrsResponseStatus
     ) where
 
@@ -75,8 +74,11 @@
           = receiveJSON
               (\ s h x ->
                  GetTopicRuleResponse' <$>
-                   (x .?> "rule") <*> (pure (fromEnum s)))
+                   (x .?> "rule") <*> (x .?> "ruleArn") <*>
+                     (pure (fromEnum s)))
 
+instance Hashable GetTopicRule
+
 instance ToHeaders GetTopicRule where
         toHeaders = const mempty
 
@@ -92,6 +94,7 @@
 -- /See:/ 'getTopicRuleResponse' smart constructor.
 data GetTopicRuleResponse = GetTopicRuleResponse'
     { _gtrrsRule           :: !(Maybe TopicRule)
+    , _gtrrsRuleARN        :: !(Maybe Text)
     , _gtrrsResponseStatus :: !Int
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
@@ -101,6 +104,8 @@
 --
 -- * 'gtrrsRule'
 --
+-- * 'gtrrsRuleARN'
+--
 -- * 'gtrrsResponseStatus'
 getTopicRuleResponse
     :: Int -- ^ 'gtrrsResponseStatus'
@@ -108,12 +113,17 @@
 getTopicRuleResponse pResponseStatus_ =
     GetTopicRuleResponse'
     { _gtrrsRule = Nothing
+    , _gtrrsRuleARN = Nothing
     , _gtrrsResponseStatus = pResponseStatus_
     }
 
 -- | The rule.
 gtrrsRule :: Lens' GetTopicRuleResponse (Maybe TopicRule)
 gtrrsRule = lens _gtrrsRule (\ s a -> s{_gtrrsRule = a});
+
+-- | The rule ARN.
+gtrrsRuleARN :: Lens' GetTopicRuleResponse (Maybe Text)
+gtrrsRuleARN = lens _gtrrsRuleARN (\ s a -> s{_gtrrsRuleARN = a});
 
 -- | The response status code.
 gtrrsResponseStatus :: Lens' GetTopicRuleResponse Int
diff --git a/gen/Network/AWS/IoT/ListCertificates.hs b/gen/Network/AWS/IoT/ListCertificates.hs
--- a/gen/Network/AWS/IoT/ListCertificates.hs
+++ b/gen/Network/AWS/IoT/ListCertificates.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListCertificates
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,10 +20,8 @@
 --
 -- Lists your certificates.
 --
--- The results are paginated with a default page size of 25. You can
--- retrieve additional results using the returned marker.
---
--- /See:/ <https://aws.amazon.com/iot#ListCertificates.html AWS API Reference> for ListCertificates.
+-- The results are paginated with a default page size of 25. You can use
+-- the returned marker to retrieve additional results.
 module Network.AWS.IoT.ListCertificates
     (
     -- * Creating a Request
@@ -100,6 +98,8 @@
                    (x .?> "certificates" .!@ mempty) <*>
                      (x .?> "nextMarker")
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListCertificates
 
 instance ToHeaders ListCertificates where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ListPolicies.hs b/gen/Network/AWS/IoT/ListPolicies.hs
--- a/gen/Network/AWS/IoT/ListPolicies.hs
+++ b/gen/Network/AWS/IoT/ListPolicies.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListPolicies
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Lists your policies.
---
--- /See:/ <https://aws.amazon.com/iot#ListPolicies.html AWS API Reference> for ListPolicies.
 module Network.AWS.IoT.ListPolicies
     (
     -- * Creating a Request
@@ -97,6 +95,8 @@
                    (x .?> "nextMarker") <*>
                      (x .?> "policies" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListPolicies
 
 instance ToHeaders ListPolicies where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ListPolicyVersions.hs b/gen/Network/AWS/IoT/ListPolicyVersions.hs
--- a/gen/Network/AWS/IoT/ListPolicyVersions.hs
+++ b/gen/Network/AWS/IoT/ListPolicyVersions.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListPolicyVersions
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -20,8 +20,6 @@
 --
 -- Lists the versions of the specified policy, and identifies the default
 -- version.
---
--- /See:/ <https://aws.amazon.com/iot#ListPolicyVersions.html AWS API Reference> for ListPolicyVersions.
 module Network.AWS.IoT.ListPolicyVersions
     (
     -- * Creating a Request
@@ -79,6 +77,8 @@
                  ListPolicyVersionsResponse' <$>
                    (x .?> "policyVersions" .!@ mempty) <*>
                      (pure (fromEnum s)))
+
+instance Hashable ListPolicyVersions
 
 instance ToHeaders ListPolicyVersions where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ListPrincipalPolicies.hs b/gen/Network/AWS/IoT/ListPrincipalPolicies.hs
--- a/gen/Network/AWS/IoT/ListPrincipalPolicies.hs
+++ b/gen/Network/AWS/IoT/ListPrincipalPolicies.hs
@@ -12,17 +12,15 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListPrincipalPolicies
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Lists the policies attached to the specified principal. If you use an
--- Amazon Cognito identity, the ID needs to be in
--- <http://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html#API_GetCredentialsForIdentity_RequestSyntax Amazon Cognito Identity format>.
---
--- /See:/ <https://aws.amazon.com/iot#ListPrincipalPolicies.html AWS API Reference> for ListPrincipalPolicies.
+-- Cognito identity, the ID must be in
+-- <http://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html#API_GetCredentialsForIdentity_RequestSyntax AmazonCognito Identity format>.
 module Network.AWS.IoT.ListPrincipalPolicies
     (
     -- * Creating a Request
@@ -110,6 +108,8 @@
                    (x .?> "nextMarker") <*>
                      (x .?> "policies" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListPrincipalPolicies
 
 instance ToHeaders ListPrincipalPolicies where
         toHeaders ListPrincipalPolicies'{..}
diff --git a/gen/Network/AWS/IoT/ListPrincipalThings.hs b/gen/Network/AWS/IoT/ListPrincipalThings.hs
--- a/gen/Network/AWS/IoT/ListPrincipalThings.hs
+++ b/gen/Network/AWS/IoT/ListPrincipalThings.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListPrincipalThings
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Lists the things associated with the specified principal.
---
--- /See:/ <https://aws.amazon.com/iot#ListPrincipalThings.html AWS API Reference> for ListPrincipalThings.
 module Network.AWS.IoT.ListPrincipalThings
     (
     -- * Creating a Request
@@ -75,7 +73,7 @@
     , _lptPrincipal = pPrincipal_
     }
 
--- | Undocumented member.
+-- | A token used to retrieve the next value.
 lptNextToken :: Lens' ListPrincipalThings (Maybe Text)
 lptNextToken = lens _lptNextToken (\ s a -> s{_lptNextToken = a});
 
@@ -97,6 +95,8 @@
                  ListPrincipalThingsResponse' <$>
                    (x .?> "nextToken") <*> (x .?> "things" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListPrincipalThings
 
 instance ToHeaders ListPrincipalThings where
         toHeaders ListPrincipalThings'{..}
diff --git a/gen/Network/AWS/IoT/ListThingPrincipals.hs b/gen/Network/AWS/IoT/ListThingPrincipals.hs
--- a/gen/Network/AWS/IoT/ListThingPrincipals.hs
+++ b/gen/Network/AWS/IoT/ListThingPrincipals.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListThingPrincipals
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Lists the principals associated with the specified thing.
---
--- /See:/ <https://aws.amazon.com/iot#ListThingPrincipals.html AWS API Reference> for ListThingPrincipals.
 module Network.AWS.IoT.ListThingPrincipals
     (
     -- * Creating a Request
@@ -78,6 +76,8 @@
                  ListThingPrincipalsResponse' <$>
                    (x .?> "principals" .!@ mempty) <*>
                      (pure (fromEnum s)))
+
+instance Hashable ListThingPrincipals
 
 instance ToHeaders ListThingPrincipals where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ListThings.hs b/gen/Network/AWS/IoT/ListThings.hs
--- a/gen/Network/AWS/IoT/ListThings.hs
+++ b/gen/Network/AWS/IoT/ListThings.hs
@@ -12,17 +12,15 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListThings
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Lists your things. You can pass an AttributeName and\/or AttributeValue
--- to filter your things. For example: \"ListThings where
--- AttributeName=Color and AttributeValue=Red\"
---
--- /See:/ <https://aws.amazon.com/iot#ListThings.html AWS API Reference> for ListThings.
+-- Lists your things. You can pass an AttributeName or AttributeValue to
+-- filter your things (for example, \"ListThings where AttributeName=Color
+-- and AttributeValue=Red\").
 module Network.AWS.IoT.ListThings
     (
     -- * Creating a Request
@@ -106,6 +104,8 @@
                  ListThingsResponse' <$>
                    (x .?> "nextToken") <*> (x .?> "things" .!@ mempty)
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListThings
 
 instance ToHeaders ListThings where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ListTopicRules.hs b/gen/Network/AWS/IoT/ListTopicRules.hs
--- a/gen/Network/AWS/IoT/ListTopicRules.hs
+++ b/gen/Network/AWS/IoT/ListTopicRules.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ListTopicRules
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Lists the rules for the specific topic.
---
--- /See:/ <https://aws.amazon.com/iot#ListTopicRules.html AWS API Reference> for ListTopicRules.
 module Network.AWS.IoT.ListTopicRules
     (
     -- * Creating a Request
@@ -104,6 +102,8 @@
                  ListTopicRulesResponse' <$>
                    (x .?> "rules" .!@ mempty) <*> (x .?> "nextToken")
                      <*> (pure (fromEnum s)))
+
+instance Hashable ListTopicRules
 
 instance ToHeaders ListTopicRules where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/RejectCertificateTransfer.hs b/gen/Network/AWS/IoT/RejectCertificateTransfer.hs
--- a/gen/Network/AWS/IoT/RejectCertificateTransfer.hs
+++ b/gen/Network/AWS/IoT/RejectCertificateTransfer.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.RejectCertificateTransfer
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -22,14 +22,12 @@
 -- certificate transfer, the certificate status changes from
 -- __PENDING_TRANFER__ to __INACTIVE__.
 --
--- To check for pending certificate transfers, call ListCertificates to
+-- To check for pending certificate transfers, call < ListCertificates> to
 -- enumerate your certificates.
 --
--- This operation can only be called by the transfer destination. Once
--- called, the certificate will be returned to the source\'s account in the
--- INACTIVE state.
---
--- /See:/ <https://aws.amazon.com/iot#RejectCertificateTransfer.html AWS API Reference> for RejectCertificateTransfer.
+-- This operation can only be called by the transfer destination. After it
+-- is called, the certificate will be returned to the source\'s account in
+-- the INACTIVE state.
 module Network.AWS.IoT.RejectCertificateTransfer
     (
     -- * Creating a Request
@@ -80,6 +78,8 @@
         request = patchJSON ioT
         response
           = receiveNull RejectCertificateTransferResponse'
+
+instance Hashable RejectCertificateTransfer
 
 instance ToHeaders RejectCertificateTransfer where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/ReplaceTopicRule.hs b/gen/Network/AWS/IoT/ReplaceTopicRule.hs
--- a/gen/Network/AWS/IoT/ReplaceTopicRule.hs
+++ b/gen/Network/AWS/IoT/ReplaceTopicRule.hs
@@ -12,16 +12,16 @@
 
 -- |
 -- Module      : Network.AWS.IoT.ReplaceTopicRule
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Replaces the specified rule. You must specify all parameters for the new
+-- rule. Creating rules is an administrator-level action. Any user who has
+-- permission to create rules will be able to access data processed by the
 -- rule.
---
--- /See:/ <https://aws.amazon.com/iot#ReplaceTopicRule.html AWS API Reference> for ReplaceTopicRule.
 module Network.AWS.IoT.ReplaceTopicRule
     (
     -- * Creating a Request
@@ -80,6 +80,8 @@
         type Rs ReplaceTopicRule = ReplaceTopicRuleResponse
         request = patchJSON ioT
         response = receiveNull ReplaceTopicRuleResponse'
+
+instance Hashable ReplaceTopicRule
 
 instance ToHeaders ReplaceTopicRule where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/SetDefaultPolicyVersion.hs b/gen/Network/AWS/IoT/SetDefaultPolicyVersion.hs
--- a/gen/Network/AWS/IoT/SetDefaultPolicyVersion.hs
+++ b/gen/Network/AWS/IoT/SetDefaultPolicyVersion.hs
@@ -12,18 +12,16 @@
 
 -- |
 -- Module      : Network.AWS.IoT.SetDefaultPolicyVersion
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Sets the specified version of the specified policy as the policy\'s
--- default (operative) version. This action affects all certificates that
--- the policy is attached to. To list the principals the policy is attached
--- to, use the ListPrincipalPolicy API.
---
--- /See:/ <https://aws.amazon.com/iot#SetDefaultPolicyVersion.html AWS API Reference> for SetDefaultPolicyVersion.
+-- default (operative) version. This action affects all certificates to
+-- which the policy is attached. To list the principals the policy is
+-- attached to, use the ListPrincipalPolicy API.
 module Network.AWS.IoT.SetDefaultPolicyVersion
     (
     -- * Creating a Request
@@ -84,6 +82,8 @@
         request = patchJSON ioT
         response
           = receiveNull SetDefaultPolicyVersionResponse'
+
+instance Hashable SetDefaultPolicyVersion
 
 instance ToHeaders SetDefaultPolicyVersion where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/SetLoggingOptions.hs b/gen/Network/AWS/IoT/SetLoggingOptions.hs
--- a/gen/Network/AWS/IoT/SetLoggingOptions.hs
+++ b/gen/Network/AWS/IoT/SetLoggingOptions.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.SetLoggingOptions
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Sets the logging options.
---
--- /See:/ <https://aws.amazon.com/iot#SetLoggingOptions.html AWS API Reference> for SetLoggingOptions.
 module Network.AWS.IoT.SetLoggingOptions
     (
     -- * Creating a Request
@@ -45,7 +43,7 @@
 --
 -- /See:/ 'setLoggingOptions' smart constructor.
 newtype SetLoggingOptions = SetLoggingOptions'
-    { _sloLoggingOptionsPayload :: Maybe LoggingOptionsPayload
+    { _sloLoggingOptionsPayload :: LoggingOptionsPayload
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
 -- | Creates a value of 'SetLoggingOptions' with the minimum fields required to make a request.
@@ -54,14 +52,15 @@
 --
 -- * 'sloLoggingOptionsPayload'
 setLoggingOptions
-    :: SetLoggingOptions
-setLoggingOptions =
+    :: LoggingOptionsPayload -- ^ 'sloLoggingOptionsPayload'
+    -> SetLoggingOptions
+setLoggingOptions pLoggingOptionsPayload_ =
     SetLoggingOptions'
-    { _sloLoggingOptionsPayload = Nothing
+    { _sloLoggingOptionsPayload = pLoggingOptionsPayload_
     }
 
 -- | The logging options payload.
-sloLoggingOptionsPayload :: Lens' SetLoggingOptions (Maybe LoggingOptionsPayload)
+sloLoggingOptionsPayload :: Lens' SetLoggingOptions LoggingOptionsPayload
 sloLoggingOptionsPayload = lens _sloLoggingOptionsPayload (\ s a -> s{_sloLoggingOptionsPayload = a});
 
 instance AWSRequest SetLoggingOptions where
@@ -69,6 +68,8 @@
         request = postJSON ioT
         response = receiveNull SetLoggingOptionsResponse'
 
+instance Hashable SetLoggingOptions
+
 instance ToHeaders SetLoggingOptions where
         toHeaders = const mempty
 
@@ -76,8 +77,9 @@
         toJSON SetLoggingOptions'{..}
           = object
               (catMaybes
-                 [("loggingOptionsPayload" .=) <$>
-                    _sloLoggingOptionsPayload])
+                 [Just
+                    ("loggingOptionsPayload" .=
+                       _sloLoggingOptionsPayload)])
 
 instance ToPath SetLoggingOptions where
         toPath = const "/loggingOptions"
diff --git a/gen/Network/AWS/IoT/TransferCertificate.hs b/gen/Network/AWS/IoT/TransferCertificate.hs
--- a/gen/Network/AWS/IoT/TransferCertificate.hs
+++ b/gen/Network/AWS/IoT/TransferCertificate.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.TransferCertificate
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -22,16 +22,14 @@
 --
 -- You can cancel the transfer until it is acknowledged by the recipient.
 --
--- No notification is sent to the transfer destination\'s account, it is up
+-- No notification is sent to the transfer destination\'s account. It is up
 -- to the caller to notify the transfer target.
 --
--- The certificate being transferred must not be in the ACTIVE state. It
--- can be deactivated using the UpdateCertificate API.
---
--- The certificate must not have any policies attached to it. These can be
--- detached using the DetachPrincipalPolicy API.
+-- The certificate being transferred must not be in the ACTIVE state. You
+-- can use the UpdateCertificate API to deactivate it.
 --
--- /See:/ <https://aws.amazon.com/iot#TransferCertificate.html AWS API Reference> for TransferCertificate.
+-- The certificate must not have any policies attached to it. You can use
+-- the DetachPrincipalPolicy API to detach them.
 module Network.AWS.IoT.TransferCertificate
     (
     -- * Creating a Request
@@ -99,6 +97,8 @@
                  TransferCertificateResponse' <$>
                    (x .?> "transferredCertificateArn") <*>
                      (pure (fromEnum s)))
+
+instance Hashable TransferCertificate
 
 instance ToHeaders TransferCertificate where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/Types.hs b/gen/Network/AWS/IoT/Types.hs
--- a/gen/Network/AWS/IoT/Types.hs
+++ b/gen/Network/AWS/IoT/Types.hs
@@ -4,7 +4,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.Types
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -39,15 +39,21 @@
     -- * LogLevel
     , LogLevel (..)
 
+    -- * MessageFormat
+    , MessageFormat (..)
+
     -- * Action
     , Action
     , action
+    , aCloudwatchMetric
+    , aCloudwatchAlarm
     , aSns
     , aDynamoDB
     , aFirehose
     , aLambda
     , aKinesis
     , aS3
+    , aElasticsearch
     , aRepublish
     , aSqs
 
@@ -75,6 +81,24 @@
     , cdCertificateId
     , cdCreationDate
 
+    -- * CloudwatchAlarmAction
+    , CloudwatchAlarmAction
+    , cloudwatchAlarmAction
+    , caaRoleARN
+    , caaAlarmName
+    , caaStateReason
+    , caaStateValue
+
+    -- * CloudwatchMetricAction
+    , CloudwatchMetricAction
+    , cloudwatchMetricAction
+    , cmaMetricTimestamp
+    , cmaRoleARN
+    , cmaMetricNamespace
+    , cmaMetricName
+    , cmaMetricValue
+    , cmaMetricUnit
+
     -- * DynamoDBAction
     , DynamoDBAction
     , dynamoDBAction
@@ -86,6 +110,15 @@
     , ddaRangeKeyField
     , ddaRangeKeyValue
 
+    -- * ElasticsearchAction
+    , ElasticsearchAction
+    , elasticsearchAction
+    , eaRoleARN
+    , eaEndpoint
+    , eaIndex
+    , eaType
+    , eaId
+
     -- * FirehoseAction
     , FirehoseAction
     , firehoseAction
@@ -145,6 +178,7 @@
     -- * SNSAction
     , SNSAction
     , snsAction
+    , snsaMessageFormat
     , snsaTargetARN
     , snsaRoleARN
 
@@ -177,6 +211,7 @@
     , trliCreatedAt
     , trliRuleDisabled
     , trliRuleName
+    , trliRuleARN
     , trliTopicPattern
 
     -- * TopicRulePayload
@@ -217,6 +252,7 @@
         , _retryCheck = check
         }
     check e
+      | has (hasStatus 429) e = Just "too_many_requests"
       | has (hasCode "ThrottlingException" . hasStatus 400) e =
           Just "throttling_exception"
       | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
@@ -235,8 +271,8 @@
 _InvalidRequestException =
     _ServiceError . hasStatus 400 . hasCode "InvalidRequestException"
 
--- | You can\'t transfer the the certificate because authorization policies
--- are still attached.
+-- | You can\'t transfer the certificate because authorization policies are
+-- still attached.
 _TransferConflictException :: AsError a => Getting (First ServiceError) a ServiceError
 _TransferConflictException =
     _ServiceError . hasStatus 409 . hasCode "TransferConflictException"
@@ -262,8 +298,8 @@
 _ResourceAlreadyExistsException =
     _ServiceError . hasStatus 409 . hasCode "ResourceAlreadyExistsException"
 
--- | You can\'t revert the certificate transfer because it has already
--- completed.
+-- | You can\'t revert the certificate transfer because the transfer is
+-- already complete.
 _TransferAlreadyCompletedException :: AsError a => Getting (First ServiceError) a ServiceError
 _TransferAlreadyCompletedException =
     _ServiceError . hasStatus 410 . hasCode "TransferAlreadyCompletedException"
diff --git a/gen/Network/AWS/IoT/Types/Product.hs b/gen/Network/AWS/IoT/Types/Product.hs
--- a/gen/Network/AWS/IoT/Types/Product.hs
+++ b/gen/Network/AWS/IoT/Types/Product.hs
@@ -9,7 +9,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.Types.Product
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -25,20 +25,27 @@
 --
 -- /See:/ 'action' smart constructor.
 data Action = Action'
-    { _aSns       :: !(Maybe SNSAction)
-    , _aDynamoDB  :: !(Maybe DynamoDBAction)
-    , _aFirehose  :: !(Maybe FirehoseAction)
-    , _aLambda    :: !(Maybe LambdaAction)
-    , _aKinesis   :: !(Maybe KinesisAction)
-    , _aS3        :: !(Maybe S3Action)
-    , _aRepublish :: !(Maybe RepublishAction)
-    , _aSqs       :: !(Maybe SqsAction)
+    { _aCloudwatchMetric :: !(Maybe CloudwatchMetricAction)
+    , _aCloudwatchAlarm  :: !(Maybe CloudwatchAlarmAction)
+    , _aSns              :: !(Maybe SNSAction)
+    , _aDynamoDB         :: !(Maybe DynamoDBAction)
+    , _aFirehose         :: !(Maybe FirehoseAction)
+    , _aLambda           :: !(Maybe LambdaAction)
+    , _aKinesis          :: !(Maybe KinesisAction)
+    , _aS3               :: !(Maybe S3Action)
+    , _aElasticsearch    :: !(Maybe ElasticsearchAction)
+    , _aRepublish        :: !(Maybe RepublishAction)
+    , _aSqs              :: !(Maybe SqsAction)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
 -- | Creates a value of 'Action' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
 --
+-- * 'aCloudwatchMetric'
+--
+-- * 'aCloudwatchAlarm'
+--
 -- * 'aSns'
 --
 -- * 'aDynamoDB'
@@ -51,6 +58,8 @@
 --
 -- * 'aS3'
 --
+-- * 'aElasticsearch'
+--
 -- * 'aRepublish'
 --
 -- * 'aSqs'
@@ -58,17 +67,28 @@
     :: Action
 action =
     Action'
-    { _aSns = Nothing
+    { _aCloudwatchMetric = Nothing
+    , _aCloudwatchAlarm = Nothing
+    , _aSns = Nothing
     , _aDynamoDB = Nothing
     , _aFirehose = Nothing
     , _aLambda = Nothing
     , _aKinesis = Nothing
     , _aS3 = Nothing
+    , _aElasticsearch = Nothing
     , _aRepublish = Nothing
     , _aSqs = Nothing
     }
 
--- | Publish to an SNS topic.
+-- | Capture a CloudWatch metric.
+aCloudwatchMetric :: Lens' Action (Maybe CloudwatchMetricAction)
+aCloudwatchMetric = lens _aCloudwatchMetric (\ s a -> s{_aCloudwatchMetric = a});
+
+-- | Change the state of a CloudWatch alarm.
+aCloudwatchAlarm :: Lens' Action (Maybe CloudwatchAlarmAction)
+aCloudwatchAlarm = lens _aCloudwatchAlarm (\ s a -> s{_aCloudwatchAlarm = a});
+
+-- | Publish to an Amazon SNS topic.
 aSns :: Lens' Action (Maybe SNSAction)
 aSns = lens _aSns (\ s a -> s{_aSns = a});
 
@@ -76,7 +96,7 @@
 aDynamoDB :: Lens' Action (Maybe DynamoDBAction)
 aDynamoDB = lens _aDynamoDB (\ s a -> s{_aDynamoDB = a});
 
--- | Undocumented member.
+-- | Write to an Amazon Kinesis Firehose stream.
 aFirehose :: Lens' Action (Maybe FirehoseAction)
 aFirehose = lens _aFirehose (\ s a -> s{_aFirehose = a});
 
@@ -84,19 +104,23 @@
 aLambda :: Lens' Action (Maybe LambdaAction)
 aLambda = lens _aLambda (\ s a -> s{_aLambda = a});
 
--- | Write data to a Kinesis stream.
+-- | Write data to an Amazon Kinesis stream.
 aKinesis :: Lens' Action (Maybe KinesisAction)
 aKinesis = lens _aKinesis (\ s a -> s{_aKinesis = a});
 
--- | Write to an S3 bucket.
+-- | Write to an Amazon S3 bucket.
 aS3 :: Lens' Action (Maybe S3Action)
 aS3 = lens _aS3 (\ s a -> s{_aS3 = a});
 
+-- | Write data to an Amazon Elasticsearch Service; domain.
+aElasticsearch :: Lens' Action (Maybe ElasticsearchAction)
+aElasticsearch = lens _aElasticsearch (\ s a -> s{_aElasticsearch = a});
+
 -- | Publish to another MQTT topic.
 aRepublish :: Lens' Action (Maybe RepublishAction)
 aRepublish = lens _aRepublish (\ s a -> s{_aRepublish = a});
 
--- | Publish to an SQS queue.
+-- | Publish to an Amazon SQS queue.
 aSqs :: Lens' Action (Maybe SqsAction)
 aSqs = lens _aSqs (\ s a -> s{_aSqs = a});
 
@@ -105,30 +129,37 @@
           = withObject "Action"
               (\ x ->
                  Action' <$>
-                   (x .:? "sns") <*> (x .:? "dynamoDB") <*>
-                     (x .:? "firehose")
+                   (x .:? "cloudwatchMetric") <*>
+                     (x .:? "cloudwatchAlarm")
+                     <*> (x .:? "sns")
+                     <*> (x .:? "dynamoDB")
+                     <*> (x .:? "firehose")
                      <*> (x .:? "lambda")
                      <*> (x .:? "kinesis")
                      <*> (x .:? "s3")
+                     <*> (x .:? "elasticsearch")
                      <*> (x .:? "republish")
                      <*> (x .:? "sqs"))
 
+instance Hashable Action
+
 instance ToJSON Action where
         toJSON Action'{..}
           = object
               (catMaybes
-                 [("sns" .=) <$> _aSns,
-                  ("dynamoDB" .=) <$> _aDynamoDB,
+                 [("cloudwatchMetric" .=) <$> _aCloudwatchMetric,
+                  ("cloudwatchAlarm" .=) <$> _aCloudwatchAlarm,
+                  ("sns" .=) <$> _aSns, ("dynamoDB" .=) <$> _aDynamoDB,
                   ("firehose" .=) <$> _aFirehose,
                   ("lambda" .=) <$> _aLambda,
                   ("kinesis" .=) <$> _aKinesis, ("s3" .=) <$> _aS3,
+                  ("elasticsearch" .=) <$> _aElasticsearch,
                   ("republish" .=) <$> _aRepublish,
                   ("sqs" .=) <$> _aSqs])
 
 -- | The attribute payload, a JSON string containing up to three key-value
--- pairs.
---
--- For example: {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}
+-- pairs (for example,
+-- {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}).
 --
 -- /See:/ 'attributePayload' smart constructor.
 newtype AttributePayload = AttributePayload'
@@ -147,12 +178,13 @@
     { _apAttributes = Nothing
     }
 
--- | A JSON string containing up to three key-value pair in JSON format.
---
--- For example: {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}
+-- | A JSON string containing up to three key-value pair in JSON format (for
+-- example, {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}).
 apAttributes :: Lens' AttributePayload (HashMap Text Text)
 apAttributes = lens _apAttributes (\ s a -> s{_apAttributes = a}) . _Default . _Map;
 
+instance Hashable AttributePayload
+
 instance ToJSON AttributePayload where
         toJSON AttributePayload'{..}
           = object
@@ -214,6 +246,8 @@
                      (x .:? "certificateId")
                      <*> (x .:? "creationDate"))
 
+instance Hashable Certificate
+
 -- | Describes a certificate.
 --
 -- /See:/ 'certificateDescription' smart constructor.
@@ -297,6 +331,175 @@
                      <*> (x .:? "certificateId")
                      <*> (x .:? "creationDate"))
 
+instance Hashable CertificateDescription
+
+-- | Describes an action that updates a CloudWatch alarm.
+--
+-- /See:/ 'cloudwatchAlarmAction' smart constructor.
+data CloudwatchAlarmAction = CloudwatchAlarmAction'
+    { _caaRoleARN     :: !Text
+    , _caaAlarmName   :: !Text
+    , _caaStateReason :: !Text
+    , _caaStateValue  :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CloudwatchAlarmAction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'caaRoleARN'
+--
+-- * 'caaAlarmName'
+--
+-- * 'caaStateReason'
+--
+-- * 'caaStateValue'
+cloudwatchAlarmAction
+    :: Text -- ^ 'caaRoleARN'
+    -> Text -- ^ 'caaAlarmName'
+    -> Text -- ^ 'caaStateReason'
+    -> Text -- ^ 'caaStateValue'
+    -> CloudwatchAlarmAction
+cloudwatchAlarmAction pRoleARN_ pAlarmName_ pStateReason_ pStateValue_ =
+    CloudwatchAlarmAction'
+    { _caaRoleARN = pRoleARN_
+    , _caaAlarmName = pAlarmName_
+    , _caaStateReason = pStateReason_
+    , _caaStateValue = pStateValue_
+    }
+
+-- | The IAM role that allows access to the CloudWatch alarm.
+caaRoleARN :: Lens' CloudwatchAlarmAction Text
+caaRoleARN = lens _caaRoleARN (\ s a -> s{_caaRoleARN = a});
+
+-- | The CloudWatch alarm name.
+caaAlarmName :: Lens' CloudwatchAlarmAction Text
+caaAlarmName = lens _caaAlarmName (\ s a -> s{_caaAlarmName = a});
+
+-- | The reason for the alarm change.
+caaStateReason :: Lens' CloudwatchAlarmAction Text
+caaStateReason = lens _caaStateReason (\ s a -> s{_caaStateReason = a});
+
+-- | The value of the alarm state. Acceptable values are: OK, ALARM,
+-- INSUFFICIENT_DATA.
+caaStateValue :: Lens' CloudwatchAlarmAction Text
+caaStateValue = lens _caaStateValue (\ s a -> s{_caaStateValue = a});
+
+instance FromJSON CloudwatchAlarmAction where
+        parseJSON
+          = withObject "CloudwatchAlarmAction"
+              (\ x ->
+                 CloudwatchAlarmAction' <$>
+                   (x .: "roleArn") <*> (x .: "alarmName") <*>
+                     (x .: "stateReason")
+                     <*> (x .: "stateValue"))
+
+instance Hashable CloudwatchAlarmAction
+
+instance ToJSON CloudwatchAlarmAction where
+        toJSON CloudwatchAlarmAction'{..}
+          = object
+              (catMaybes
+                 [Just ("roleArn" .= _caaRoleARN),
+                  Just ("alarmName" .= _caaAlarmName),
+                  Just ("stateReason" .= _caaStateReason),
+                  Just ("stateValue" .= _caaStateValue)])
+
+-- | Describes an action that captures a CloudWatch metric.
+--
+-- /See:/ 'cloudwatchMetricAction' smart constructor.
+data CloudwatchMetricAction = CloudwatchMetricAction'
+    { _cmaMetricTimestamp :: !(Maybe Text)
+    , _cmaRoleARN         :: !Text
+    , _cmaMetricNamespace :: !Text
+    , _cmaMetricName      :: !Text
+    , _cmaMetricValue     :: !Text
+    , _cmaMetricUnit      :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'CloudwatchMetricAction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'cmaMetricTimestamp'
+--
+-- * 'cmaRoleARN'
+--
+-- * 'cmaMetricNamespace'
+--
+-- * 'cmaMetricName'
+--
+-- * 'cmaMetricValue'
+--
+-- * 'cmaMetricUnit'
+cloudwatchMetricAction
+    :: Text -- ^ 'cmaRoleARN'
+    -> Text -- ^ 'cmaMetricNamespace'
+    -> Text -- ^ 'cmaMetricName'
+    -> Text -- ^ 'cmaMetricValue'
+    -> Text -- ^ 'cmaMetricUnit'
+    -> CloudwatchMetricAction
+cloudwatchMetricAction pRoleARN_ pMetricNamespace_ pMetricName_ pMetricValue_ pMetricUnit_ =
+    CloudwatchMetricAction'
+    { _cmaMetricTimestamp = Nothing
+    , _cmaRoleARN = pRoleARN_
+    , _cmaMetricNamespace = pMetricNamespace_
+    , _cmaMetricName = pMetricName_
+    , _cmaMetricValue = pMetricValue_
+    , _cmaMetricUnit = pMetricUnit_
+    }
+
+-- | An optional
+-- <http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp Unix timestamp>.
+cmaMetricTimestamp :: Lens' CloudwatchMetricAction (Maybe Text)
+cmaMetricTimestamp = lens _cmaMetricTimestamp (\ s a -> s{_cmaMetricTimestamp = a});
+
+-- | The IAM role that allows access to the CloudWatch metric.
+cmaRoleARN :: Lens' CloudwatchMetricAction Text
+cmaRoleARN = lens _cmaRoleARN (\ s a -> s{_cmaRoleARN = a});
+
+-- | The CloudWatch metric namespace name.
+cmaMetricNamespace :: Lens' CloudwatchMetricAction Text
+cmaMetricNamespace = lens _cmaMetricNamespace (\ s a -> s{_cmaMetricNamespace = a});
+
+-- | The CloudWatch metric name.
+cmaMetricName :: Lens' CloudwatchMetricAction Text
+cmaMetricName = lens _cmaMetricName (\ s a -> s{_cmaMetricName = a});
+
+-- | The CloudWatch metric value.
+cmaMetricValue :: Lens' CloudwatchMetricAction Text
+cmaMetricValue = lens _cmaMetricValue (\ s a -> s{_cmaMetricValue = a});
+
+-- | The
+-- <http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#Unit metric unit>
+-- supported by CloudWatch.
+cmaMetricUnit :: Lens' CloudwatchMetricAction Text
+cmaMetricUnit = lens _cmaMetricUnit (\ s a -> s{_cmaMetricUnit = a});
+
+instance FromJSON CloudwatchMetricAction where
+        parseJSON
+          = withObject "CloudwatchMetricAction"
+              (\ x ->
+                 CloudwatchMetricAction' <$>
+                   (x .:? "metricTimestamp") <*> (x .: "roleArn") <*>
+                     (x .: "metricNamespace")
+                     <*> (x .: "metricName")
+                     <*> (x .: "metricValue")
+                     <*> (x .: "metricUnit"))
+
+instance Hashable CloudwatchMetricAction
+
+instance ToJSON CloudwatchMetricAction where
+        toJSON CloudwatchMetricAction'{..}
+          = object
+              (catMaybes
+                 [("metricTimestamp" .=) <$> _cmaMetricTimestamp,
+                  Just ("roleArn" .= _cmaRoleARN),
+                  Just ("metricNamespace" .= _cmaMetricNamespace),
+                  Just ("metricName" .= _cmaMetricName),
+                  Just ("metricValue" .= _cmaMetricValue),
+                  Just ("metricUnit" .= _cmaMetricUnit)])
+
 -- | Describes an action to write to a DynamoDB table.
 --
 -- The 'tableName', 'hashKeyField', and 'rangeKeyField' values must match
@@ -306,10 +509,9 @@
 -- template syntax. These templates provide data at runtime. The syntax is
 -- as follows: ${/sql-expression/}.
 --
--- You can specify any expression that\'s valid in a WHERE or SELECT
--- clause, including JSON properties, comparisons, calculations, and
--- functions. For example, the following field uses the third level of the
--- topic:
+-- You can specify any valid expression in a WHERE or SELECT clause,
+-- including JSON properties, comparisons, calculations, and functions. For
+-- example, the following field uses the third level of the topic:
 --
 -- '\"hashKeyValue\": \"${topic(3)}\"'
 --
@@ -364,7 +566,7 @@
     , _ddaRangeKeyValue = pRangeKeyValue_
     }
 
--- | The action payload, this name can be customized.
+-- | The action payload. This name can be customized.
 ddaPayloadField :: Lens' DynamoDBAction (Maybe Text)
 ddaPayloadField = lens _ddaPayloadField (\ s a -> s{_ddaPayloadField = a});
 
@@ -372,7 +574,7 @@
 ddaTableName :: Lens' DynamoDBAction Text
 ddaTableName = lens _ddaTableName (\ s a -> s{_ddaTableName = a});
 
--- | The ARN of the IAM role that grants access.
+-- | The ARN of the IAM role that grants access to the DynamoDB table.
 ddaRoleARN :: Lens' DynamoDBAction Text
 ddaRoleARN = lens _ddaRoleARN (\ s a -> s{_ddaRoleARN = a});
 
@@ -404,6 +606,8 @@
                      <*> (x .: "rangeKeyField")
                      <*> (x .: "rangeKeyValue"))
 
+instance Hashable DynamoDBAction
+
 instance ToJSON DynamoDBAction where
         toJSON DynamoDBAction'{..}
           = object
@@ -416,7 +620,92 @@
                   Just ("rangeKeyField" .= _ddaRangeKeyField),
                   Just ("rangeKeyValue" .= _ddaRangeKeyValue)])
 
--- | /See:/ 'firehoseAction' smart constructor.
+-- | Describes an action that writes data to an Amazon Elasticsearch Service;
+-- domain.
+--
+-- /See:/ 'elasticsearchAction' smart constructor.
+data ElasticsearchAction = ElasticsearchAction'
+    { _eaRoleARN  :: !Text
+    , _eaEndpoint :: !Text
+    , _eaIndex    :: !Text
+    , _eaType     :: !Text
+    , _eaId       :: !Text
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ElasticsearchAction' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'eaRoleARN'
+--
+-- * 'eaEndpoint'
+--
+-- * 'eaIndex'
+--
+-- * 'eaType'
+--
+-- * 'eaId'
+elasticsearchAction
+    :: Text -- ^ 'eaRoleARN'
+    -> Text -- ^ 'eaEndpoint'
+    -> Text -- ^ 'eaIndex'
+    -> Text -- ^ 'eaType'
+    -> Text -- ^ 'eaId'
+    -> ElasticsearchAction
+elasticsearchAction pRoleARN_ pEndpoint_ pIndex_ pType_ pId_ =
+    ElasticsearchAction'
+    { _eaRoleARN = pRoleARN_
+    , _eaEndpoint = pEndpoint_
+    , _eaIndex = pIndex_
+    , _eaType = pType_
+    , _eaId = pId_
+    }
+
+-- | The IAM role ARN that has access to Elasticsearch.
+eaRoleARN :: Lens' ElasticsearchAction Text
+eaRoleARN = lens _eaRoleARN (\ s a -> s{_eaRoleARN = a});
+
+-- | The endpoint of your Elasticsearch domain.
+eaEndpoint :: Lens' ElasticsearchAction Text
+eaEndpoint = lens _eaEndpoint (\ s a -> s{_eaEndpoint = a});
+
+-- | The Elasticsearch index where you want to store your data.
+eaIndex :: Lens' ElasticsearchAction Text
+eaIndex = lens _eaIndex (\ s a -> s{_eaIndex = a});
+
+-- | The type of document you are storing.
+eaType :: Lens' ElasticsearchAction Text
+eaType = lens _eaType (\ s a -> s{_eaType = a});
+
+-- | The unique identifier for the document you are storing.
+eaId :: Lens' ElasticsearchAction Text
+eaId = lens _eaId (\ s a -> s{_eaId = a});
+
+instance FromJSON ElasticsearchAction where
+        parseJSON
+          = withObject "ElasticsearchAction"
+              (\ x ->
+                 ElasticsearchAction' <$>
+                   (x .: "roleArn") <*> (x .: "endpoint") <*>
+                     (x .: "index")
+                     <*> (x .: "type")
+                     <*> (x .: "id"))
+
+instance Hashable ElasticsearchAction
+
+instance ToJSON ElasticsearchAction where
+        toJSON ElasticsearchAction'{..}
+          = object
+              (catMaybes
+                 [Just ("roleArn" .= _eaRoleARN),
+                  Just ("endpoint" .= _eaEndpoint),
+                  Just ("index" .= _eaIndex), Just ("type" .= _eaType),
+                  Just ("id" .= _eaId)])
+
+-- | Describes an action that writes data to an Amazon Kinesis Firehose
+-- stream.
+--
+-- /See:/ 'firehoseAction' smart constructor.
 data FirehoseAction = FirehoseAction'
     { _faRoleARN            :: !Text
     , _faDeliveryStreamName :: !Text
@@ -439,11 +728,11 @@
     , _faDeliveryStreamName = pDeliveryStreamName_
     }
 
--- | Undocumented member.
+-- | The IAM role that grants access to the Amazon Kinesis Firehost stream.
 faRoleARN :: Lens' FirehoseAction Text
 faRoleARN = lens _faRoleARN (\ s a -> s{_faRoleARN = a});
 
--- | Undocumented member.
+-- | The delivery stream name.
 faDeliveryStreamName :: Lens' FirehoseAction Text
 faDeliveryStreamName = lens _faDeliveryStreamName (\ s a -> s{_faDeliveryStreamName = a});
 
@@ -454,6 +743,8 @@
                  FirehoseAction' <$>
                    (x .: "roleArn") <*> (x .: "deliveryStreamName"))
 
+instance Hashable FirehoseAction
+
 instance ToJSON FirehoseAction where
         toJSON FirehoseAction'{..}
           = object
@@ -500,6 +791,8 @@
                  KeyPair' <$>
                    (x .:? "PrivateKey") <*> (x .:? "PublicKey"))
 
+instance Hashable KeyPair
+
 -- | Describes an action to write data to an Amazon Kinesis stream.
 --
 -- /See:/ 'kinesisAction' smart constructor.
@@ -533,11 +826,11 @@
 kaPartitionKey :: Lens' KinesisAction (Maybe Text)
 kaPartitionKey = lens _kaPartitionKey (\ s a -> s{_kaPartitionKey = a});
 
--- | The ARN of the IAM role that grants access.
+-- | The ARN of the IAM role that grants access to the Amazon Kinesis stream.
 kaRoleARN :: Lens' KinesisAction Text
 kaRoleARN = lens _kaRoleARN (\ s a -> s{_kaRoleARN = a});
 
--- | The name of the Kinesis stream.
+-- | The name of the Amazon Kinesis stream.
 kaStreamName :: Lens' KinesisAction Text
 kaStreamName = lens _kaStreamName (\ s a -> s{_kaStreamName = a});
 
@@ -549,6 +842,8 @@
                    (x .:? "partitionKey") <*> (x .: "roleArn") <*>
                      (x .: "streamName"))
 
+instance Hashable KinesisAction
+
 instance ToJSON KinesisAction where
         toJSON KinesisAction'{..}
           = object
@@ -557,7 +852,7 @@
                   Just ("roleArn" .= _kaRoleARN),
                   Just ("streamName" .= _kaStreamName)])
 
--- | Describes an action to invoke a Lamdba function.
+-- | Describes an action to invoke a Lambda function.
 --
 -- /See:/ 'lambdaAction' smart constructor.
 newtype LambdaAction = LambdaAction'
@@ -586,6 +881,8 @@
           = withObject "LambdaAction"
               (\ x -> LambdaAction' <$> (x .: "functionArn"))
 
+instance Hashable LambdaAction
+
 instance ToJSON LambdaAction where
         toJSON LambdaAction'{..}
           = object
@@ -623,6 +920,8 @@
 lopRoleARN :: Lens' LoggingOptionsPayload Text
 lopRoleARN = lens _lopRoleARN (\ s a -> s{_lopRoleARN = a});
 
+instance Hashable LoggingOptionsPayload
+
 instance ToJSON LoggingOptionsPayload where
         toJSON LoggingOptionsPayload'{..}
           = object
@@ -668,6 +967,8 @@
                  Policy' <$>
                    (x .:? "policyName") <*> (x .:? "policyArn"))
 
+instance Hashable Policy
+
 -- | Describes a policy version.
 --
 -- /See:/ 'policyVersion' smart constructor.
@@ -715,6 +1016,8 @@
                    (x .:? "versionId") <*> (x .:? "createDate") <*>
                      (x .:? "isDefaultVersion"))
 
+instance Hashable PolicyVersion
+
 -- | Describes an action to republish to another topic.
 --
 -- /See:/ 'republishAction' smart constructor.
@@ -755,6 +1058,8 @@
                  RepublishAction' <$>
                    (x .: "roleArn") <*> (x .: "topic"))
 
+instance Hashable RepublishAction
+
 instance ToJSON RepublishAction where
         toJSON RepublishAction'{..}
           = object
@@ -796,7 +1101,7 @@
 sRoleARN :: Lens' S3Action Text
 sRoleARN = lens _sRoleARN (\ s a -> s{_sRoleARN = a});
 
--- | The S3 bucket.
+-- | The Amazon S3 bucket.
 sBucketName :: Lens' S3Action Text
 sBucketName = lens _sBucketName (\ s a -> s{_sBucketName = a});
 
@@ -812,6 +1117,8 @@
                    (x .: "roleArn") <*> (x .: "bucketName") <*>
                      (x .: "key"))
 
+instance Hashable S3Action
+
 instance ToJSON S3Action where
         toJSON S3Action'{..}
           = object
@@ -824,14 +1131,17 @@
 --
 -- /See:/ 'snsAction' smart constructor.
 data SNSAction = SNSAction'
-    { _snsaTargetARN :: !Text
-    , _snsaRoleARN   :: !Text
+    { _snsaMessageFormat :: !(Maybe MessageFormat)
+    , _snsaTargetARN     :: !Text
+    , _snsaRoleARN       :: !Text
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
 -- | Creates a value of 'SNSAction' with the minimum fields required to make a request.
 --
 -- Use one of the following lenses to modify other fields as desired:
 --
+-- * 'snsaMessageFormat'
+--
 -- * 'snsaTargetARN'
 --
 -- * 'snsaRoleARN'
@@ -841,10 +1151,21 @@
     -> SNSAction
 snsAction pTargetARN_ pRoleARN_ =
     SNSAction'
-    { _snsaTargetARN = pTargetARN_
+    { _snsaMessageFormat = Nothing
+    , _snsaTargetARN = pTargetARN_
     , _snsaRoleARN = pRoleARN_
     }
 
+-- | The message format of the message to publish. Optional. Accepted values
+-- are \"JSON\" and \"RAW\". The default value of the attribute is \"RAW\".
+-- SNS uses this setting to determine if the payload should be parsed and
+-- relevant platform-specific bits of the payload should be extracted. To
+-- read more about SNS message formats, see
+-- <http://docs.aws.amazon.com/sns/latest/dg/json-formats.html > refer to
+-- their official documentation.
+snsaMessageFormat :: Lens' SNSAction (Maybe MessageFormat)
+snsaMessageFormat = lens _snsaMessageFormat (\ s a -> s{_snsaMessageFormat = a});
+
 -- | The ARN of the SNS topic.
 snsaTargetARN :: Lens' SNSAction Text
 snsaTargetARN = lens _snsaTargetARN (\ s a -> s{_snsaTargetARN = a});
@@ -858,16 +1179,20 @@
           = withObject "SNSAction"
               (\ x ->
                  SNSAction' <$>
-                   (x .: "targetArn") <*> (x .: "roleArn"))
+                   (x .:? "messageFormat") <*> (x .: "targetArn") <*>
+                     (x .: "roleArn"))
 
+instance Hashable SNSAction
+
 instance ToJSON SNSAction where
         toJSON SNSAction'{..}
           = object
               (catMaybes
-                 [Just ("targetArn" .= _snsaTargetARN),
+                 [("messageFormat" .=) <$> _snsaMessageFormat,
+                  Just ("targetArn" .= _snsaTargetARN),
                   Just ("roleArn" .= _snsaRoleARN)])
 
--- | Describes an action to publish data to an SQS queue.
+-- | Describes an action to publish data to an Amazon SQS queue.
 --
 -- /See:/ 'sqsAction' smart constructor.
 data SqsAction = SqsAction'
@@ -916,6 +1241,8 @@
                    (x .:? "useBase64") <*> (x .: "roleArn") <*>
                      (x .: "queueUrl"))
 
+instance Hashable SqsAction
+
 instance ToJSON SqsAction where
         toJSON SqsAction'{..}
           = object
@@ -963,6 +1290,8 @@
                    (x .:? "attributes" .!= mempty) <*>
                      (x .:? "thingName"))
 
+instance Hashable ThingAttribute
+
 -- | Describes a rule.
 --
 -- /See:/ 'topicRule' smart constructor.
@@ -1019,7 +1348,7 @@
 trRuleName = lens _trRuleName (\ s a -> s{_trRuleName = a});
 
 -- | The SQL statement used to query the topic. When using a SQL query with
--- multiple lines, be sure to escape the newline characters properly.
+-- multiple lines, be sure to escape the newline characters.
 trSql :: Lens' TopicRule (Maybe Text)
 trSql = lens _trSql (\ s a -> s{_trSql = a});
 
@@ -1038,6 +1367,8 @@
                      <*> (x .:? "sql")
                      <*> (x .:? "description"))
 
+instance Hashable TopicRule
+
 -- | Describes a rule.
 --
 -- /See:/ 'topicRuleListItem' smart constructor.
@@ -1045,6 +1376,7 @@
     { _trliCreatedAt    :: !(Maybe POSIX)
     , _trliRuleDisabled :: !(Maybe Bool)
     , _trliRuleName     :: !(Maybe Text)
+    , _trliRuleARN      :: !(Maybe Text)
     , _trliTopicPattern :: !(Maybe Text)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
@@ -1058,6 +1390,8 @@
 --
 -- * 'trliRuleName'
 --
+-- * 'trliRuleARN'
+--
 -- * 'trliTopicPattern'
 topicRuleListItem
     :: TopicRuleListItem
@@ -1066,6 +1400,7 @@
     { _trliCreatedAt = Nothing
     , _trliRuleDisabled = Nothing
     , _trliRuleName = Nothing
+    , _trliRuleARN = Nothing
     , _trliTopicPattern = Nothing
     }
 
@@ -1081,6 +1416,10 @@
 trliRuleName :: Lens' TopicRuleListItem (Maybe Text)
 trliRuleName = lens _trliRuleName (\ s a -> s{_trliRuleName = a});
 
+-- | The rule ARN.
+trliRuleARN :: Lens' TopicRuleListItem (Maybe Text)
+trliRuleARN = lens _trliRuleARN (\ s a -> s{_trliRuleARN = a});
+
 -- | The pattern for the topic names that apply.
 trliTopicPattern :: Lens' TopicRuleListItem (Maybe Text)
 trliTopicPattern = lens _trliTopicPattern (\ s a -> s{_trliTopicPattern = a});
@@ -1092,8 +1431,11 @@
                  TopicRuleListItem' <$>
                    (x .:? "createdAt") <*> (x .:? "ruleDisabled") <*>
                      (x .:? "ruleName")
+                     <*> (x .:? "ruleArn")
                      <*> (x .:? "topicPattern"))
 
+instance Hashable TopicRuleListItem
+
 -- | Describes a rule.
 --
 -- /See:/ 'topicRulePayload' smart constructor.
@@ -1143,6 +1485,8 @@
 -- | The actions associated with the rule.
 trpActions :: Lens' TopicRulePayload [Action]
 trpActions = lens _trpActions (\ s a -> s{_trpActions = a}) . _Coerce;
+
+instance Hashable TopicRulePayload
 
 instance ToJSON TopicRulePayload where
         toJSON TopicRulePayload'{..}
diff --git a/gen/Network/AWS/IoT/Types/Sum.hs b/gen/Network/AWS/IoT/Types/Sum.hs
--- a/gen/Network/AWS/IoT/Types/Sum.hs
+++ b/gen/Network/AWS/IoT/Types/Sum.hs
@@ -9,7 +9,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.Types.Sum
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -89,3 +89,31 @@
 
 instance FromJSON LogLevel where
     parseJSON = parseJSONText "LogLevel"
+
+data MessageFormat
+    = JSON
+    | Raw
+    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+
+instance FromText MessageFormat where
+    parser = takeLowerText >>= \case
+        "json" -> pure JSON
+        "raw" -> pure Raw
+        e -> fromTextError $ "Failure parsing MessageFormat from value: '" <> e
+           <> "'. Accepted values: JSON, RAW"
+
+instance ToText MessageFormat where
+    toText = \case
+        JSON -> "JSON"
+        Raw -> "RAW"
+
+instance Hashable     MessageFormat
+instance ToByteString MessageFormat
+instance ToQuery      MessageFormat
+instance ToHeader     MessageFormat
+
+instance ToJSON MessageFormat where
+    toJSON = toJSONText
+
+instance FromJSON MessageFormat where
+    parseJSON = parseJSONText "MessageFormat"
diff --git a/gen/Network/AWS/IoT/UpdateCertificate.hs b/gen/Network/AWS/IoT/UpdateCertificate.hs
--- a/gen/Network/AWS/IoT/UpdateCertificate.hs
+++ b/gen/Network/AWS/IoT/UpdateCertificate.hs
@@ -12,7 +12,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.UpdateCertificate
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -21,14 +21,12 @@
 -- Updates the status of the specified certificate. This operation is
 -- idempotent.
 --
--- Moving a cert from the ACTIVE state (including REVOKED) will NOT
--- disconnect currently-connected devices, although these devices will be
--- unable to reconnect.
+-- Moving a certificate from the ACTIVE state (including REVOKED) will not
+-- disconnect currently connected devices, but these devices will be unable
+-- to reconnect.
 --
 -- The ACTIVE state is required to authenticate devices connecting to AWS
 -- IoT using a certificate.
---
--- /See:/ <https://aws.amazon.com/iot#UpdateCertificate.html AWS API Reference> for UpdateCertificate.
 module Network.AWS.IoT.UpdateCertificate
     (
     -- * Creating a Request
@@ -80,6 +78,10 @@
 ucCertificateId = lens _ucCertificateId (\ s a -> s{_ucCertificateId = a});
 
 -- | The new status.
+--
+-- __Note:__ Setting the status to PENDING_TRANSFER will result in an
+-- exception being thrown. PENDING_TRANSFER is a status used internally by
+-- AWS IoT. It is not intended for developer use.
 ucNewStatus :: Lens' UpdateCertificate CertificateStatus
 ucNewStatus = lens _ucNewStatus (\ s a -> s{_ucNewStatus = a});
 
@@ -87,6 +89,8 @@
         type Rs UpdateCertificate = UpdateCertificateResponse
         request = putJSON ioT
         response = receiveNull UpdateCertificateResponse'
+
+instance Hashable UpdateCertificate
 
 instance ToHeaders UpdateCertificate where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/UpdateThing.hs b/gen/Network/AWS/IoT/UpdateThing.hs
--- a/gen/Network/AWS/IoT/UpdateThing.hs
+++ b/gen/Network/AWS/IoT/UpdateThing.hs
@@ -12,15 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.IoT.UpdateThing
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
 -- Updates the data for a thing.
---
--- /See:/ <https://aws.amazon.com/iot#UpdateThing.html AWS API Reference> for UpdateThing.
 module Network.AWS.IoT.UpdateThing
     (
     -- * Creating a Request
@@ -74,9 +72,8 @@
 utThingName = lens _utThingName (\ s a -> s{_utThingName = a});
 
 -- | The attribute payload, a JSON string containing up to three key-value
--- pairs.
---
--- For example: {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}
+-- pairs (for example,
+-- {\\\"attributes\\\":{\\\"string1\\\":\\\"string2\\\"}}).
 utAttributePayload :: Lens' UpdateThing AttributePayload
 utAttributePayload = lens _utAttributePayload (\ s a -> s{_utAttributePayload = a});
 
@@ -87,6 +84,8 @@
           = receiveEmpty
               (\ s h x ->
                  UpdateThingResponse' <$> (pure (fromEnum s)))
+
+instance Hashable UpdateThing
 
 instance ToHeaders UpdateThing where
         toHeaders = const mempty
diff --git a/gen/Network/AWS/IoT/Waiters.hs b/gen/Network/AWS/IoT/Waiters.hs
--- a/gen/Network/AWS/IoT/Waiters.hs
+++ b/gen/Network/AWS/IoT/Waiters.hs
@@ -7,7 +7,7 @@
 
 -- |
 -- Module      : Network.AWS.IoT.Waiters
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,7 +2,7 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
diff --git a/test/Test/AWS/Gen/IoT.hs b/test/Test/AWS/Gen/IoT.hs
--- a/test/Test/AWS/Gen/IoT.hs
+++ b/test/Test/AWS/Gen/IoT.hs
@@ -5,7 +5,7 @@
 
 -- |
 -- Module      : Test.AWS.Gen.IoT
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
 -- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
 -- Stability   : auto-generated
@@ -58,6 +58,9 @@
 --         , testDeletePolicyVersion $
 --             deletePolicyVersion
 --
+--         , testDisableTopicRule $
+--             disableTopicRule
+--
 --         , testCreateTopicRule $
 --             createTopicRule
 --
@@ -124,6 +127,9 @@
 --         , testCreateKeysAndCertificate $
 --             createKeysAndCertificate
 --
+--         , testEnableTopicRule $
+--             enableTopicRule
+--
 --         , testAcceptCertificateTransfer $
 --             acceptCertificateTransfer
 --
@@ -178,6 +184,9 @@
 --         , testDeletePolicyVersionResponse $
 --             deletePolicyVersionResponse
 --
+--         , testDisableTopicRuleResponse $
+--             disableTopicRuleResponse
+--
 --         , testCreateTopicRuleResponse $
 --             createTopicRuleResponse
 --
@@ -244,6 +253,9 @@
 --         , testCreateKeysAndCertificateResponse $
 --             createKeysAndCertificateResponse
 --
+--         , testEnableTopicRuleResponse $
+--             enableTopicRuleResponse
+--
 --         , testAcceptCertificateTransferResponse $
 --             acceptCertificateTransferResponse
 --
@@ -320,6 +332,11 @@
     "DeletePolicyVersion"
     "fixture/DeletePolicyVersion.yaml"
 
+testDisableTopicRule :: DisableTopicRule -> TestTree
+testDisableTopicRule = req
+    "DisableTopicRule"
+    "fixture/DisableTopicRule.yaml"
+
 testCreateTopicRule :: CreateTopicRule -> TestTree
 testCreateTopicRule = req
     "CreateTopicRule"
@@ -430,6 +447,11 @@
     "CreateKeysAndCertificate"
     "fixture/CreateKeysAndCertificate.yaml"
 
+testEnableTopicRule :: EnableTopicRule -> TestTree
+testEnableTopicRule = req
+    "EnableTopicRule"
+    "fixture/EnableTopicRule.yaml"
+
 testAcceptCertificateTransfer :: AcceptCertificateTransfer -> TestTree
 testAcceptCertificateTransfer = req
     "AcceptCertificateTransfer"
@@ -537,6 +559,13 @@
     ioT
     (Proxy :: Proxy DeletePolicyVersion)
 
+testDisableTopicRuleResponse :: DisableTopicRuleResponse -> TestTree
+testDisableTopicRuleResponse = res
+    "DisableTopicRuleResponse"
+    "fixture/DisableTopicRuleResponse.proto"
+    ioT
+    (Proxy :: Proxy DisableTopicRule)
+
 testCreateTopicRuleResponse :: CreateTopicRuleResponse -> TestTree
 testCreateTopicRuleResponse = res
     "CreateTopicRuleResponse"
@@ -690,6 +719,13 @@
     "fixture/CreateKeysAndCertificateResponse.proto"
     ioT
     (Proxy :: Proxy CreateKeysAndCertificate)
+
+testEnableTopicRuleResponse :: EnableTopicRuleResponse -> TestTree
+testEnableTopicRuleResponse = res
+    "EnableTopicRuleResponse"
+    "fixture/EnableTopicRuleResponse.proto"
+    ioT
+    (Proxy :: Proxy EnableTopicRule)
 
 testAcceptCertificateTransferResponse :: AcceptCertificateTransferResponse -> TestTree
 testAcceptCertificateTransferResponse = res
diff --git a/test/Test/AWS/IoT.hs b/test/Test/AWS/IoT.hs
--- a/test/Test/AWS/IoT.hs
+++ b/test/Test/AWS/IoT.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 -- Module      : Test.AWS.IoT
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : This Source Code Form is subject to the terms of
 --               the Mozilla Public License, v. 2.0.
 --               A copy of the MPL can be found in the LICENSE file or
diff --git a/test/Test/AWS/IoT/Internal.hs b/test/Test/AWS/IoT/Internal.hs
--- a/test/Test/AWS/IoT/Internal.hs
+++ b/test/Test/AWS/IoT/Internal.hs
@@ -3,7 +3,7 @@
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
 -- Module      : Test.AWS.IoT.Internal
--- Copyright   : (c) 2013-2015 Brendan Hay
+-- Copyright   : (c) 2013-2016 Brendan Hay
 -- License     : This Source Code Form is subject to the terms of
 --               the Mozilla Public License, v. 2.0.
 --               A copy of the MPL can be found in the LICENSE file or
