diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,9 +7,8 @@
 
 
 ## Version
-
-`1.6.1`
-
+ 
+`2.0` - Derived from API version @2015-05-28@ of the AWS service descriptions, licensed under Apache 2.0.
 
 ## Description
 
@@ -26,7 +25,7 @@
 The provided lenses should be compatible with any of the major lens libraries
 [lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
 
-See [Network.AWS.IoTData](http://hackage.haskell.org/package/amazonka-iot-dataplane/docs/Network-AWS-IoTData.html)
+See [Amazonka.IoTData](http://hackage.haskell.org/package/amazonka-iot-dataplane/docs/Amazonka-IoTData.html)
 or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
 
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import           Distribution.Simple
-main = defaultMain
diff --git a/amazonka-iot-dataplane.cabal b/amazonka-iot-dataplane.cabal
--- a/amazonka-iot-dataplane.cabal
+++ b/amazonka-iot-dataplane.cabal
@@ -1,89 +1,92 @@
-name:                  amazonka-iot-dataplane
-version:               1.6.1
-synopsis:              Amazon IoT Data Plane SDK.
-homepage:              https://github.com/brendanhay/amazonka
-bug-reports:           https://github.com/brendanhay/amazonka/issues
-license:               MPL-2.0
-license-file:          LICENSE
-author:                Brendan Hay
-maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-copyright:             Copyright (c) 2013-2018 Brendan Hay
-category:              Network, AWS, Cloud, Distributed Computing
-build-type:            Simple
-cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+cabal-version:      2.2
+name:               amazonka-iot-dataplane
+version:            2.0
+synopsis:           Amazon IoT Data Plane SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
 description:
-    The types from this library are intended to be used with
-    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
-    mechanisms for specifying AuthN/AuthZ information, sending requests,
-    and receiving responses.
-    .
-    Lenses are used for constructing and manipulating types,
-    due to the depth of nesting of AWS types and transparency regarding
-    de/serialisation into more palatable Haskell values.
-    The provided lenses should be compatible with any of the major lens libraries
-    such as <http://hackage.haskell.org/package/lens lens> or
-    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
-    .
-    See "Network.AWS.IoTData" or <https://aws.amazon.com/documentation/ the AWS documentation>
-    to get started.
+  Derived from API version @2015-05-28@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.IoTData.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.IoTData" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
 
 source-repository head
-    type:              git
-    location:          git://github.com/brendanhay/amazonka.git
-    subdir:            amazonka-iot-dataplane
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-iot-dataplane
 
 library
-    default-language:  Haskell2010
-    hs-source-dirs:    src gen
-
-    ghc-options:
-        -Wall
-        -fwarn-incomplete-uni-patterns
-        -fwarn-incomplete-record-updates
-        -funbox-strict-fields
-
-    exposed-modules:
-          Network.AWS.IoTData
-        , Network.AWS.IoTData.DeleteThingShadow
-        , Network.AWS.IoTData.GetThingShadow
-        , Network.AWS.IoTData.Publish
-        , Network.AWS.IoTData.Types
-        , Network.AWS.IoTData.UpdateThingShadow
-        , Network.AWS.IoTData.Waiters
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
 
-    other-modules:
-          Network.AWS.IoTData.Types.Product
-        , Network.AWS.IoTData.Types.Sum
+  exposed-modules:
+    Amazonka.IoTData
+    Amazonka.IoTData.DeleteThingShadow
+    Amazonka.IoTData.GetRetainedMessage
+    Amazonka.IoTData.GetThingShadow
+    Amazonka.IoTData.Lens
+    Amazonka.IoTData.ListNamedShadowsForThing
+    Amazonka.IoTData.ListRetainedMessages
+    Amazonka.IoTData.Publish
+    Amazonka.IoTData.Types
+    Amazonka.IoTData.Types.PayloadFormatIndicator
+    Amazonka.IoTData.Types.RetainedMessageSummary
+    Amazonka.IoTData.UpdateThingShadow
+    Amazonka.IoTData.Waiters
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , base          >= 4.7     && < 5
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
 
 test-suite amazonka-iot-dataplane-test
-    type:              exitcode-stdio-1.0
-    default-language:  Haskell2010
-    hs-source-dirs:    test
-    main-is:           Main.hs
-
-    ghc-options:       -Wall -threaded
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
 
-    -- This section is encoded by the template and any modules added by
-    -- hand outside these namespaces will not correctly be added to the
-    -- distribution package.
-    other-modules:
-          Test.AWS.IoTData
-        , Test.AWS.Gen.IoTData
-        , Test.AWS.IoTData.Internal
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.IoTData
+    Test.Amazonka.IoTData
+    Test.Amazonka.IoTData.Internal
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , amazonka-test == 1.6.1.*
-        , amazonka-iot-dataplane
-        , base
-        , bytestring
-        , tasty
-        , tasty-hunit
-        , text
-        , time
-        , unordered-containers
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-iot-dataplane
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/DeleteThingShadow.yaml b/fixture/DeleteThingShadow.yaml
--- a/fixture/DeleteThingShadow.yaml
+++ b/fixture/DeleteThingShadow.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetRetainedMessage.yaml b/fixture/GetRetainedMessage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRetainedMessage.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetRetainedMessageResponse.proto b/fixture/GetRetainedMessageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRetainedMessageResponse.proto
diff --git a/fixture/GetThingShadow.yaml b/fixture/GetThingShadow.yaml
--- a/fixture/GetThingShadow.yaml
+++ b/fixture/GetThingShadow.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListNamedShadowsForThing.yaml b/fixture/ListNamedShadowsForThing.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListNamedShadowsForThing.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListNamedShadowsForThingResponse.proto b/fixture/ListNamedShadowsForThingResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListNamedShadowsForThingResponse.proto
diff --git a/fixture/ListRetainedMessages.yaml b/fixture/ListRetainedMessages.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRetainedMessages.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListRetainedMessagesResponse.proto b/fixture/ListRetainedMessagesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRetainedMessagesResponse.proto
diff --git a/fixture/Publish.yaml b/fixture/Publish.yaml
--- a/fixture/Publish.yaml
+++ b/fixture/Publish.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateThingShadow.yaml b/fixture/UpdateThingShadow.yaml
--- a/fixture/UpdateThingShadow.yaml
+++ b/fixture/UpdateThingShadow.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/data-ats.iot/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  data-ats.iot.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/gen/Amazonka/IoTData.hs b/gen/Amazonka/IoTData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData.hs
@@ -0,0 +1,164 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.IoTData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2015-05-28@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- IoT data
+--
+-- IoT data enables secure, bi-directional communication between
+-- Internet-connected things (such as sensors, actuators, embedded devices,
+-- or smart appliances) and the Amazon Web Services cloud. It implements a
+-- broker for applications and things to publish messages over HTTP
+-- (Publish) and retrieve, update, and delete shadows. A shadow is a
+-- persistent representation of your things and their state in the Amazon
+-- Web Services cloud.
+--
+-- Find the endpoint address for actions in IoT data by running this CLI
+-- command:
+--
+-- @aws iot describe-endpoint --endpoint-type iot:Data-ATS@
+--
+-- The service name used by
+-- <https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html Amazon Web ServicesSignature Version 4>
+-- to sign requests is: /iotdevicegateway/.
+module Amazonka.IoTData
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalFailureException
+    _InternalFailureException,
+
+    -- ** InvalidRequestException
+    _InvalidRequestException,
+
+    -- ** MethodNotAllowedException
+    _MethodNotAllowedException,
+
+    -- ** RequestEntityTooLargeException
+    _RequestEntityTooLargeException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceUnavailableException
+    _ServiceUnavailableException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** UnauthorizedException
+    _UnauthorizedException,
+
+    -- ** UnsupportedDocumentEncodingException
+    _UnsupportedDocumentEncodingException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** DeleteThingShadow
+    DeleteThingShadow (DeleteThingShadow'),
+    newDeleteThingShadow,
+    DeleteThingShadowResponse (DeleteThingShadowResponse'),
+    newDeleteThingShadowResponse,
+
+    -- ** GetRetainedMessage
+    GetRetainedMessage (GetRetainedMessage'),
+    newGetRetainedMessage,
+    GetRetainedMessageResponse (GetRetainedMessageResponse'),
+    newGetRetainedMessageResponse,
+
+    -- ** GetThingShadow
+    GetThingShadow (GetThingShadow'),
+    newGetThingShadow,
+    GetThingShadowResponse (GetThingShadowResponse'),
+    newGetThingShadowResponse,
+
+    -- ** ListNamedShadowsForThing
+    ListNamedShadowsForThing (ListNamedShadowsForThing'),
+    newListNamedShadowsForThing,
+    ListNamedShadowsForThingResponse (ListNamedShadowsForThingResponse'),
+    newListNamedShadowsForThingResponse,
+
+    -- ** ListRetainedMessages (Paginated)
+    ListRetainedMessages (ListRetainedMessages'),
+    newListRetainedMessages,
+    ListRetainedMessagesResponse (ListRetainedMessagesResponse'),
+    newListRetainedMessagesResponse,
+
+    -- ** Publish
+    Publish (Publish'),
+    newPublish,
+    PublishResponse (PublishResponse'),
+    newPublishResponse,
+
+    -- ** UpdateThingShadow
+    UpdateThingShadow (UpdateThingShadow'),
+    newUpdateThingShadow,
+    UpdateThingShadowResponse (UpdateThingShadowResponse'),
+    newUpdateThingShadowResponse,
+
+    -- * Types
+
+    -- ** PayloadFormatIndicator
+    PayloadFormatIndicator (..),
+
+    -- ** RetainedMessageSummary
+    RetainedMessageSummary (RetainedMessageSummary'),
+    newRetainedMessageSummary,
+  )
+where
+
+import Amazonka.IoTData.DeleteThingShadow
+import Amazonka.IoTData.GetRetainedMessage
+import Amazonka.IoTData.GetThingShadow
+import Amazonka.IoTData.Lens
+import Amazonka.IoTData.ListNamedShadowsForThing
+import Amazonka.IoTData.ListRetainedMessages
+import Amazonka.IoTData.Publish
+import Amazonka.IoTData.Types
+import Amazonka.IoTData.UpdateThingShadow
+import Amazonka.IoTData.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'IoTData'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/IoTData/DeleteThingShadow.hs b/gen/Amazonka/IoTData/DeleteThingShadow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/DeleteThingShadow.hs
@@ -0,0 +1,182 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.DeleteThingShadow
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the shadow for the specified thing.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions DeleteThingShadow>
+-- action.
+--
+-- For more information, see
+-- <http://docs.aws.amazon.com/iot/latest/developerguide/API_DeleteThingShadow.html DeleteThingShadow>
+-- in the IoT Developer Guide.
+module Amazonka.IoTData.DeleteThingShadow
+  ( -- * Creating a Request
+    DeleteThingShadow (..),
+    newDeleteThingShadow,
+
+    -- * Request Lenses
+    deleteThingShadow_shadowName,
+    deleteThingShadow_thingName,
+
+    -- * Destructuring the Response
+    DeleteThingShadowResponse (..),
+    newDeleteThingShadowResponse,
+
+    -- * Response Lenses
+    deleteThingShadowResponse_httpStatus,
+    deleteThingShadowResponse_payload,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The input for the DeleteThingShadow operation.
+--
+-- /See:/ 'newDeleteThingShadow' smart constructor.
+data DeleteThingShadow = DeleteThingShadow'
+  { -- | The name of the shadow.
+    shadowName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the thing.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteThingShadow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'shadowName', 'deleteThingShadow_shadowName' - The name of the shadow.
+--
+-- 'thingName', 'deleteThingShadow_thingName' - The name of the thing.
+newDeleteThingShadow ::
+  -- | 'thingName'
+  Prelude.Text ->
+  DeleteThingShadow
+newDeleteThingShadow pThingName_ =
+  DeleteThingShadow'
+    { shadowName = Prelude.Nothing,
+      thingName = pThingName_
+    }
+
+-- | The name of the shadow.
+deleteThingShadow_shadowName :: Lens.Lens' DeleteThingShadow (Prelude.Maybe Prelude.Text)
+deleteThingShadow_shadowName = Lens.lens (\DeleteThingShadow' {shadowName} -> shadowName) (\s@DeleteThingShadow' {} a -> s {shadowName = a} :: DeleteThingShadow)
+
+-- | The name of the thing.
+deleteThingShadow_thingName :: Lens.Lens' DeleteThingShadow Prelude.Text
+deleteThingShadow_thingName = Lens.lens (\DeleteThingShadow' {thingName} -> thingName) (\s@DeleteThingShadow' {} a -> s {thingName = a} :: DeleteThingShadow)
+
+instance Core.AWSRequest DeleteThingShadow where
+  type
+    AWSResponse DeleteThingShadow =
+      DeleteThingShadowResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveBytes
+      ( \s h x ->
+          DeleteThingShadowResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Prelude.pure x)
+      )
+
+instance Prelude.Hashable DeleteThingShadow where
+  hashWithSalt _salt DeleteThingShadow' {..} =
+    _salt
+      `Prelude.hashWithSalt` shadowName
+      `Prelude.hashWithSalt` thingName
+
+instance Prelude.NFData DeleteThingShadow where
+  rnf DeleteThingShadow' {..} =
+    Prelude.rnf shadowName
+      `Prelude.seq` Prelude.rnf thingName
+
+instance Data.ToHeaders DeleteThingShadow where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath DeleteThingShadow where
+  toPath DeleteThingShadow' {..} =
+    Prelude.mconcat
+      ["/things/", Data.toBS thingName, "/shadow"]
+
+instance Data.ToQuery DeleteThingShadow where
+  toQuery DeleteThingShadow' {..} =
+    Prelude.mconcat ["name" Data.=: shadowName]
+
+-- | The output from the DeleteThingShadow operation.
+--
+-- /See:/ 'newDeleteThingShadowResponse' smart constructor.
+data DeleteThingShadowResponse = DeleteThingShadowResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The state information, in JSON format.
+    payload :: Prelude.ByteString
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteThingShadowResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteThingShadowResponse_httpStatus' - The response's http status code.
+--
+-- 'payload', 'deleteThingShadowResponse_payload' - The state information, in JSON format.
+newDeleteThingShadowResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'payload'
+  Prelude.ByteString ->
+  DeleteThingShadowResponse
+newDeleteThingShadowResponse pHttpStatus_ pPayload_ =
+  DeleteThingShadowResponse'
+    { httpStatus =
+        pHttpStatus_,
+      payload = pPayload_
+    }
+
+-- | The response's http status code.
+deleteThingShadowResponse_httpStatus :: Lens.Lens' DeleteThingShadowResponse Prelude.Int
+deleteThingShadowResponse_httpStatus = Lens.lens (\DeleteThingShadowResponse' {httpStatus} -> httpStatus) (\s@DeleteThingShadowResponse' {} a -> s {httpStatus = a} :: DeleteThingShadowResponse)
+
+-- | The state information, in JSON format.
+deleteThingShadowResponse_payload :: Lens.Lens' DeleteThingShadowResponse Prelude.ByteString
+deleteThingShadowResponse_payload = Lens.lens (\DeleteThingShadowResponse' {payload} -> payload) (\s@DeleteThingShadowResponse' {} a -> s {payload = a} :: DeleteThingShadowResponse)
+
+instance Prelude.NFData DeleteThingShadowResponse where
+  rnf DeleteThingShadowResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf payload
diff --git a/gen/Amazonka/IoTData/GetRetainedMessage.hs b/gen/Amazonka/IoTData/GetRetainedMessage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/GetRetainedMessage.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.GetRetainedMessage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the details of a single retained message for the specified topic.
+--
+-- This action returns the message payload of the retained message, which
+-- can incur messaging costs. To list only the topic names of the retained
+-- messages, call
+-- </iot/latest/developerguide/API_iotdata_ListRetainedMessages.html ListRetainedMessages>.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotfleethubfordevicemanagement.html#awsiotfleethubfordevicemanagement-actions-as-permissions GetRetainedMessage>
+-- action.
+--
+-- For more information about messaging costs, see
+-- <http://aws.amazon.com/iot-core/pricing/#Messaging Amazon Web Services IoT Core pricing - Messaging>.
+module Amazonka.IoTData.GetRetainedMessage
+  ( -- * Creating a Request
+    GetRetainedMessage (..),
+    newGetRetainedMessage,
+
+    -- * Request Lenses
+    getRetainedMessage_topic,
+
+    -- * Destructuring the Response
+    GetRetainedMessageResponse (..),
+    newGetRetainedMessageResponse,
+
+    -- * Response Lenses
+    getRetainedMessageResponse_lastModifiedTime,
+    getRetainedMessageResponse_payload,
+    getRetainedMessageResponse_qos,
+    getRetainedMessageResponse_topic,
+    getRetainedMessageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The input for the GetRetainedMessage operation.
+--
+-- /See:/ 'newGetRetainedMessage' smart constructor.
+data GetRetainedMessage = GetRetainedMessage'
+  { -- | The topic name of the retained message to retrieve.
+    topic :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRetainedMessage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'topic', 'getRetainedMessage_topic' - The topic name of the retained message to retrieve.
+newGetRetainedMessage ::
+  -- | 'topic'
+  Prelude.Text ->
+  GetRetainedMessage
+newGetRetainedMessage pTopic_ =
+  GetRetainedMessage' {topic = pTopic_}
+
+-- | The topic name of the retained message to retrieve.
+getRetainedMessage_topic :: Lens.Lens' GetRetainedMessage Prelude.Text
+getRetainedMessage_topic = Lens.lens (\GetRetainedMessage' {topic} -> topic) (\s@GetRetainedMessage' {} a -> s {topic = a} :: GetRetainedMessage)
+
+instance Core.AWSRequest GetRetainedMessage where
+  type
+    AWSResponse GetRetainedMessage =
+      GetRetainedMessageResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRetainedMessageResponse'
+            Prelude.<$> (x Data..?> "lastModifiedTime")
+            Prelude.<*> (x Data..?> "payload")
+            Prelude.<*> (x Data..?> "qos")
+            Prelude.<*> (x Data..?> "topic")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRetainedMessage where
+  hashWithSalt _salt GetRetainedMessage' {..} =
+    _salt `Prelude.hashWithSalt` topic
+
+instance Prelude.NFData GetRetainedMessage where
+  rnf GetRetainedMessage' {..} = Prelude.rnf topic
+
+instance Data.ToHeaders GetRetainedMessage where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetRetainedMessage where
+  toPath GetRetainedMessage' {..} =
+    Prelude.mconcat
+      ["/retainedMessage/", Data.toBS topic]
+
+instance Data.ToQuery GetRetainedMessage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The output from the GetRetainedMessage operation.
+--
+-- /See:/ 'newGetRetainedMessageResponse' smart constructor.
+data GetRetainedMessageResponse = GetRetainedMessageResponse'
+  { -- | The Epoch date and time, in milliseconds, when the retained message was
+    -- stored by IoT.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | The Base64-encoded message payload of the retained message body.
+    payload :: Prelude.Maybe Data.Base64,
+    -- | The quality of service (QoS) level used to publish the retained message.
+    qos :: Prelude.Maybe Prelude.Natural,
+    -- | The topic name to which the retained message was published.
+    topic :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRetainedMessageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastModifiedTime', 'getRetainedMessageResponse_lastModifiedTime' - The Epoch date and time, in milliseconds, when the retained message was
+-- stored by IoT.
+--
+-- 'payload', 'getRetainedMessageResponse_payload' - The Base64-encoded message payload of the retained message body.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'qos', 'getRetainedMessageResponse_qos' - The quality of service (QoS) level used to publish the retained message.
+--
+-- 'topic', 'getRetainedMessageResponse_topic' - The topic name to which the retained message was published.
+--
+-- 'httpStatus', 'getRetainedMessageResponse_httpStatus' - The response's http status code.
+newGetRetainedMessageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRetainedMessageResponse
+newGetRetainedMessageResponse pHttpStatus_ =
+  GetRetainedMessageResponse'
+    { lastModifiedTime =
+        Prelude.Nothing,
+      payload = Prelude.Nothing,
+      qos = Prelude.Nothing,
+      topic = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Epoch date and time, in milliseconds, when the retained message was
+-- stored by IoT.
+getRetainedMessageResponse_lastModifiedTime :: Lens.Lens' GetRetainedMessageResponse (Prelude.Maybe Prelude.Integer)
+getRetainedMessageResponse_lastModifiedTime = Lens.lens (\GetRetainedMessageResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetRetainedMessageResponse' {} a -> s {lastModifiedTime = a} :: GetRetainedMessageResponse)
+
+-- | The Base64-encoded message payload of the retained message body.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+getRetainedMessageResponse_payload :: Lens.Lens' GetRetainedMessageResponse (Prelude.Maybe Prelude.ByteString)
+getRetainedMessageResponse_payload = Lens.lens (\GetRetainedMessageResponse' {payload} -> payload) (\s@GetRetainedMessageResponse' {} a -> s {payload = a} :: GetRetainedMessageResponse) Prelude.. Lens.mapping Data._Base64
+
+-- | The quality of service (QoS) level used to publish the retained message.
+getRetainedMessageResponse_qos :: Lens.Lens' GetRetainedMessageResponse (Prelude.Maybe Prelude.Natural)
+getRetainedMessageResponse_qos = Lens.lens (\GetRetainedMessageResponse' {qos} -> qos) (\s@GetRetainedMessageResponse' {} a -> s {qos = a} :: GetRetainedMessageResponse)
+
+-- | The topic name to which the retained message was published.
+getRetainedMessageResponse_topic :: Lens.Lens' GetRetainedMessageResponse (Prelude.Maybe Prelude.Text)
+getRetainedMessageResponse_topic = Lens.lens (\GetRetainedMessageResponse' {topic} -> topic) (\s@GetRetainedMessageResponse' {} a -> s {topic = a} :: GetRetainedMessageResponse)
+
+-- | The response's http status code.
+getRetainedMessageResponse_httpStatus :: Lens.Lens' GetRetainedMessageResponse Prelude.Int
+getRetainedMessageResponse_httpStatus = Lens.lens (\GetRetainedMessageResponse' {httpStatus} -> httpStatus) (\s@GetRetainedMessageResponse' {} a -> s {httpStatus = a} :: GetRetainedMessageResponse)
+
+instance Prelude.NFData GetRetainedMessageResponse where
+  rnf GetRetainedMessageResponse' {..} =
+    Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf payload
+      `Prelude.seq` Prelude.rnf qos
+      `Prelude.seq` Prelude.rnf topic
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTData/GetThingShadow.hs b/gen/Amazonka/IoTData/GetThingShadow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/GetThingShadow.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.GetThingShadow
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the shadow for the specified thing.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions GetThingShadow>
+-- action.
+--
+-- For more information, see
+-- <http://docs.aws.amazon.com/iot/latest/developerguide/API_GetThingShadow.html GetThingShadow>
+-- in the IoT Developer Guide.
+module Amazonka.IoTData.GetThingShadow
+  ( -- * Creating a Request
+    GetThingShadow (..),
+    newGetThingShadow,
+
+    -- * Request Lenses
+    getThingShadow_shadowName,
+    getThingShadow_thingName,
+
+    -- * Destructuring the Response
+    GetThingShadowResponse (..),
+    newGetThingShadowResponse,
+
+    -- * Response Lenses
+    getThingShadowResponse_payload,
+    getThingShadowResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The input for the GetThingShadow operation.
+--
+-- /See:/ 'newGetThingShadow' smart constructor.
+data GetThingShadow = GetThingShadow'
+  { -- | The name of the shadow.
+    shadowName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the thing.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetThingShadow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'shadowName', 'getThingShadow_shadowName' - The name of the shadow.
+--
+-- 'thingName', 'getThingShadow_thingName' - The name of the thing.
+newGetThingShadow ::
+  -- | 'thingName'
+  Prelude.Text ->
+  GetThingShadow
+newGetThingShadow pThingName_ =
+  GetThingShadow'
+    { shadowName = Prelude.Nothing,
+      thingName = pThingName_
+    }
+
+-- | The name of the shadow.
+getThingShadow_shadowName :: Lens.Lens' GetThingShadow (Prelude.Maybe Prelude.Text)
+getThingShadow_shadowName = Lens.lens (\GetThingShadow' {shadowName} -> shadowName) (\s@GetThingShadow' {} a -> s {shadowName = a} :: GetThingShadow)
+
+-- | The name of the thing.
+getThingShadow_thingName :: Lens.Lens' GetThingShadow Prelude.Text
+getThingShadow_thingName = Lens.lens (\GetThingShadow' {thingName} -> thingName) (\s@GetThingShadow' {} a -> s {thingName = a} :: GetThingShadow)
+
+instance Core.AWSRequest GetThingShadow where
+  type
+    AWSResponse GetThingShadow =
+      GetThingShadowResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveBytes
+      ( \s h x ->
+          GetThingShadowResponse'
+            Prelude.<$> (Prelude.pure (Prelude.Just (Prelude.coerce x)))
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetThingShadow where
+  hashWithSalt _salt GetThingShadow' {..} =
+    _salt
+      `Prelude.hashWithSalt` shadowName
+      `Prelude.hashWithSalt` thingName
+
+instance Prelude.NFData GetThingShadow where
+  rnf GetThingShadow' {..} =
+    Prelude.rnf shadowName
+      `Prelude.seq` Prelude.rnf thingName
+
+instance Data.ToHeaders GetThingShadow where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath GetThingShadow where
+  toPath GetThingShadow' {..} =
+    Prelude.mconcat
+      ["/things/", Data.toBS thingName, "/shadow"]
+
+instance Data.ToQuery GetThingShadow where
+  toQuery GetThingShadow' {..} =
+    Prelude.mconcat ["name" Data.=: shadowName]
+
+-- | The output from the GetThingShadow operation.
+--
+-- /See:/ 'newGetThingShadowResponse' smart constructor.
+data GetThingShadowResponse = GetThingShadowResponse'
+  { -- | The state information, in JSON format.
+    payload :: Prelude.Maybe Prelude.ByteString,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetThingShadowResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'payload', 'getThingShadowResponse_payload' - The state information, in JSON format.
+--
+-- 'httpStatus', 'getThingShadowResponse_httpStatus' - The response's http status code.
+newGetThingShadowResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetThingShadowResponse
+newGetThingShadowResponse pHttpStatus_ =
+  GetThingShadowResponse'
+    { payload = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The state information, in JSON format.
+getThingShadowResponse_payload :: Lens.Lens' GetThingShadowResponse (Prelude.Maybe Prelude.ByteString)
+getThingShadowResponse_payload = Lens.lens (\GetThingShadowResponse' {payload} -> payload) (\s@GetThingShadowResponse' {} a -> s {payload = a} :: GetThingShadowResponse)
+
+-- | The response's http status code.
+getThingShadowResponse_httpStatus :: Lens.Lens' GetThingShadowResponse Prelude.Int
+getThingShadowResponse_httpStatus = Lens.lens (\GetThingShadowResponse' {httpStatus} -> httpStatus) (\s@GetThingShadowResponse' {} a -> s {httpStatus = a} :: GetThingShadowResponse)
+
+instance Prelude.NFData GetThingShadowResponse where
+  rnf GetThingShadowResponse' {..} =
+    Prelude.rnf payload
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTData/Lens.hs b/gen/Amazonka/IoTData/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Lens.hs
@@ -0,0 +1,89 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTData.Lens
+  ( -- * Operations
+
+    -- ** DeleteThingShadow
+    deleteThingShadow_shadowName,
+    deleteThingShadow_thingName,
+    deleteThingShadowResponse_httpStatus,
+    deleteThingShadowResponse_payload,
+
+    -- ** GetRetainedMessage
+    getRetainedMessage_topic,
+    getRetainedMessageResponse_lastModifiedTime,
+    getRetainedMessageResponse_payload,
+    getRetainedMessageResponse_qos,
+    getRetainedMessageResponse_topic,
+    getRetainedMessageResponse_httpStatus,
+
+    -- ** GetThingShadow
+    getThingShadow_shadowName,
+    getThingShadow_thingName,
+    getThingShadowResponse_payload,
+    getThingShadowResponse_httpStatus,
+
+    -- ** ListNamedShadowsForThing
+    listNamedShadowsForThing_nextToken,
+    listNamedShadowsForThing_pageSize,
+    listNamedShadowsForThing_thingName,
+    listNamedShadowsForThingResponse_nextToken,
+    listNamedShadowsForThingResponse_results,
+    listNamedShadowsForThingResponse_timestamp,
+    listNamedShadowsForThingResponse_httpStatus,
+
+    -- ** ListRetainedMessages
+    listRetainedMessages_maxResults,
+    listRetainedMessages_nextToken,
+    listRetainedMessagesResponse_nextToken,
+    listRetainedMessagesResponse_retainedTopics,
+    listRetainedMessagesResponse_httpStatus,
+
+    -- ** Publish
+    publish_contentType,
+    publish_correlationData,
+    publish_messageExpiry,
+    publish_payload,
+    publish_payloadFormatIndicator,
+    publish_qos,
+    publish_responseTopic,
+    publish_retain,
+    publish_userProperties,
+    publish_topic,
+
+    -- ** UpdateThingShadow
+    updateThingShadow_shadowName,
+    updateThingShadow_thingName,
+    updateThingShadow_payload,
+    updateThingShadowResponse_payload,
+    updateThingShadowResponse_httpStatus,
+
+    -- * Types
+
+    -- ** RetainedMessageSummary
+    retainedMessageSummary_lastModifiedTime,
+    retainedMessageSummary_payloadSize,
+    retainedMessageSummary_qos,
+    retainedMessageSummary_topic,
+  )
+where
+
+import Amazonka.IoTData.DeleteThingShadow
+import Amazonka.IoTData.GetRetainedMessage
+import Amazonka.IoTData.GetThingShadow
+import Amazonka.IoTData.ListNamedShadowsForThing
+import Amazonka.IoTData.ListRetainedMessages
+import Amazonka.IoTData.Publish
+import Amazonka.IoTData.Types.RetainedMessageSummary
+import Amazonka.IoTData.UpdateThingShadow
diff --git a/gen/Amazonka/IoTData/ListNamedShadowsForThing.hs b/gen/Amazonka/IoTData/ListNamedShadowsForThing.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/ListNamedShadowsForThing.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.ListNamedShadowsForThing
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the shadows for the specified thing.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions ListNamedShadowsForThing>
+-- action.
+module Amazonka.IoTData.ListNamedShadowsForThing
+  ( -- * Creating a Request
+    ListNamedShadowsForThing (..),
+    newListNamedShadowsForThing,
+
+    -- * Request Lenses
+    listNamedShadowsForThing_nextToken,
+    listNamedShadowsForThing_pageSize,
+    listNamedShadowsForThing_thingName,
+
+    -- * Destructuring the Response
+    ListNamedShadowsForThingResponse (..),
+    newListNamedShadowsForThingResponse,
+
+    -- * Response Lenses
+    listNamedShadowsForThingResponse_nextToken,
+    listNamedShadowsForThingResponse_results,
+    listNamedShadowsForThingResponse_timestamp,
+    listNamedShadowsForThingResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListNamedShadowsForThing' smart constructor.
+data ListNamedShadowsForThing = ListNamedShadowsForThing'
+  { -- | The token to retrieve the next set of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The result page size.
+    pageSize :: Prelude.Maybe Prelude.Natural,
+    -- | The name of the thing.
+    thingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNamedShadowsForThing' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listNamedShadowsForThing_nextToken' - The token to retrieve the next set of results.
+--
+-- 'pageSize', 'listNamedShadowsForThing_pageSize' - The result page size.
+--
+-- 'thingName', 'listNamedShadowsForThing_thingName' - The name of the thing.
+newListNamedShadowsForThing ::
+  -- | 'thingName'
+  Prelude.Text ->
+  ListNamedShadowsForThing
+newListNamedShadowsForThing pThingName_ =
+  ListNamedShadowsForThing'
+    { nextToken =
+        Prelude.Nothing,
+      pageSize = Prelude.Nothing,
+      thingName = pThingName_
+    }
+
+-- | The token to retrieve the next set of results.
+listNamedShadowsForThing_nextToken :: Lens.Lens' ListNamedShadowsForThing (Prelude.Maybe Prelude.Text)
+listNamedShadowsForThing_nextToken = Lens.lens (\ListNamedShadowsForThing' {nextToken} -> nextToken) (\s@ListNamedShadowsForThing' {} a -> s {nextToken = a} :: ListNamedShadowsForThing)
+
+-- | The result page size.
+listNamedShadowsForThing_pageSize :: Lens.Lens' ListNamedShadowsForThing (Prelude.Maybe Prelude.Natural)
+listNamedShadowsForThing_pageSize = Lens.lens (\ListNamedShadowsForThing' {pageSize} -> pageSize) (\s@ListNamedShadowsForThing' {} a -> s {pageSize = a} :: ListNamedShadowsForThing)
+
+-- | The name of the thing.
+listNamedShadowsForThing_thingName :: Lens.Lens' ListNamedShadowsForThing Prelude.Text
+listNamedShadowsForThing_thingName = Lens.lens (\ListNamedShadowsForThing' {thingName} -> thingName) (\s@ListNamedShadowsForThing' {} a -> s {thingName = a} :: ListNamedShadowsForThing)
+
+instance Core.AWSRequest ListNamedShadowsForThing where
+  type
+    AWSResponse ListNamedShadowsForThing =
+      ListNamedShadowsForThingResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListNamedShadowsForThingResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "results" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "timestamp")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListNamedShadowsForThing where
+  hashWithSalt _salt ListNamedShadowsForThing' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` pageSize
+      `Prelude.hashWithSalt` thingName
+
+instance Prelude.NFData ListNamedShadowsForThing where
+  rnf ListNamedShadowsForThing' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf pageSize
+      `Prelude.seq` Prelude.rnf thingName
+
+instance Data.ToHeaders ListNamedShadowsForThing where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListNamedShadowsForThing where
+  toPath ListNamedShadowsForThing' {..} =
+    Prelude.mconcat
+      [ "/api/things/shadow/ListNamedShadowsForThing/",
+        Data.toBS thingName
+      ]
+
+instance Data.ToQuery ListNamedShadowsForThing where
+  toQuery ListNamedShadowsForThing' {..} =
+    Prelude.mconcat
+      [ "nextToken" Data.=: nextToken,
+        "pageSize" Data.=: pageSize
+      ]
+
+-- | /See:/ 'newListNamedShadowsForThingResponse' smart constructor.
+data ListNamedShadowsForThingResponse = ListNamedShadowsForThingResponse'
+  { -- | The token to use to get the next set of results, or __null__ if there
+    -- are no additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of shadows for the specified thing.
+    results :: Prelude.Maybe [Prelude.Text],
+    -- | The Epoch date and time the response was generated by IoT.
+    timestamp :: Prelude.Maybe Prelude.Integer,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNamedShadowsForThingResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listNamedShadowsForThingResponse_nextToken' - The token to use to get the next set of results, or __null__ if there
+-- are no additional results.
+--
+-- 'results', 'listNamedShadowsForThingResponse_results' - The list of shadows for the specified thing.
+--
+-- 'timestamp', 'listNamedShadowsForThingResponse_timestamp' - The Epoch date and time the response was generated by IoT.
+--
+-- 'httpStatus', 'listNamedShadowsForThingResponse_httpStatus' - The response's http status code.
+newListNamedShadowsForThingResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListNamedShadowsForThingResponse
+newListNamedShadowsForThingResponse pHttpStatus_ =
+  ListNamedShadowsForThingResponse'
+    { nextToken =
+        Prelude.Nothing,
+      results = Prelude.Nothing,
+      timestamp = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token to use to get the next set of results, or __null__ if there
+-- are no additional results.
+listNamedShadowsForThingResponse_nextToken :: Lens.Lens' ListNamedShadowsForThingResponse (Prelude.Maybe Prelude.Text)
+listNamedShadowsForThingResponse_nextToken = Lens.lens (\ListNamedShadowsForThingResponse' {nextToken} -> nextToken) (\s@ListNamedShadowsForThingResponse' {} a -> s {nextToken = a} :: ListNamedShadowsForThingResponse)
+
+-- | The list of shadows for the specified thing.
+listNamedShadowsForThingResponse_results :: Lens.Lens' ListNamedShadowsForThingResponse (Prelude.Maybe [Prelude.Text])
+listNamedShadowsForThingResponse_results = Lens.lens (\ListNamedShadowsForThingResponse' {results} -> results) (\s@ListNamedShadowsForThingResponse' {} a -> s {results = a} :: ListNamedShadowsForThingResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Epoch date and time the response was generated by IoT.
+listNamedShadowsForThingResponse_timestamp :: Lens.Lens' ListNamedShadowsForThingResponse (Prelude.Maybe Prelude.Integer)
+listNamedShadowsForThingResponse_timestamp = Lens.lens (\ListNamedShadowsForThingResponse' {timestamp} -> timestamp) (\s@ListNamedShadowsForThingResponse' {} a -> s {timestamp = a} :: ListNamedShadowsForThingResponse)
+
+-- | The response's http status code.
+listNamedShadowsForThingResponse_httpStatus :: Lens.Lens' ListNamedShadowsForThingResponse Prelude.Int
+listNamedShadowsForThingResponse_httpStatus = Lens.lens (\ListNamedShadowsForThingResponse' {httpStatus} -> httpStatus) (\s@ListNamedShadowsForThingResponse' {} a -> s {httpStatus = a} :: ListNamedShadowsForThingResponse)
+
+instance
+  Prelude.NFData
+    ListNamedShadowsForThingResponse
+  where
+  rnf ListNamedShadowsForThingResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf results
+      `Prelude.seq` Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTData/ListRetainedMessages.hs b/gen/Amazonka/IoTData/ListRetainedMessages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/ListRetainedMessages.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.ListRetainedMessages
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists summary information about the retained messages stored for the
+-- account.
+--
+-- This action returns only the topic names of the retained messages. It
+-- doesn\'t return any message payloads. Although this action doesn\'t
+-- return a message payload, it can still incur messaging costs.
+--
+-- To get the message payload of a retained message, call
+-- <https://docs.aws.amazon.com/iot/latest/developerguide/API_iotdata_GetRetainedMessage.html GetRetainedMessage>
+-- with the topic name of the retained message.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotfleethubfordevicemanagement.html#awsiotfleethubfordevicemanagement-actions-as-permissions ListRetainedMessages>
+-- action.
+--
+-- For more information about messaging costs, see
+-- <http://aws.amazon.com/iot-core/pricing/#Messaging Amazon Web Services IoT Core pricing - Messaging>.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTData.ListRetainedMessages
+  ( -- * Creating a Request
+    ListRetainedMessages (..),
+    newListRetainedMessages,
+
+    -- * Request Lenses
+    listRetainedMessages_maxResults,
+    listRetainedMessages_nextToken,
+
+    -- * Destructuring the Response
+    ListRetainedMessagesResponse (..),
+    newListRetainedMessagesResponse,
+
+    -- * Response Lenses
+    listRetainedMessagesResponse_nextToken,
+    listRetainedMessagesResponse_retainedTopics,
+    listRetainedMessagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListRetainedMessages' smart constructor.
+data ListRetainedMessages = ListRetainedMessages'
+  { -- | The maximum number of results to return at one time.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | To retrieve the next set of results, the @nextToken@ value from a
+    -- previous response; otherwise __null__ to receive the first set of
+    -- results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRetainedMessages' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listRetainedMessages_maxResults' - The maximum number of results to return at one time.
+--
+-- 'nextToken', 'listRetainedMessages_nextToken' - To retrieve the next set of results, the @nextToken@ value from a
+-- previous response; otherwise __null__ to receive the first set of
+-- results.
+newListRetainedMessages ::
+  ListRetainedMessages
+newListRetainedMessages =
+  ListRetainedMessages'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return at one time.
+listRetainedMessages_maxResults :: Lens.Lens' ListRetainedMessages (Prelude.Maybe Prelude.Natural)
+listRetainedMessages_maxResults = Lens.lens (\ListRetainedMessages' {maxResults} -> maxResults) (\s@ListRetainedMessages' {} a -> s {maxResults = a} :: ListRetainedMessages)
+
+-- | To retrieve the next set of results, the @nextToken@ value from a
+-- previous response; otherwise __null__ to receive the first set of
+-- results.
+listRetainedMessages_nextToken :: Lens.Lens' ListRetainedMessages (Prelude.Maybe Prelude.Text)
+listRetainedMessages_nextToken = Lens.lens (\ListRetainedMessages' {nextToken} -> nextToken) (\s@ListRetainedMessages' {} a -> s {nextToken = a} :: ListRetainedMessages)
+
+instance Core.AWSPager ListRetainedMessages where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRetainedMessagesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listRetainedMessagesResponse_retainedTopics
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRetainedMessages_nextToken
+          Lens..~ rs
+          Lens.^? listRetainedMessagesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRetainedMessages where
+  type
+    AWSResponse ListRetainedMessages =
+      ListRetainedMessagesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRetainedMessagesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "retainedTopics" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListRetainedMessages where
+  hashWithSalt _salt ListRetainedMessages' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListRetainedMessages where
+  rnf ListRetainedMessages' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListRetainedMessages where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath ListRetainedMessages where
+  toPath = Prelude.const "/retainedMessage"
+
+instance Data.ToQuery ListRetainedMessages where
+  toQuery ListRetainedMessages' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListRetainedMessagesResponse' smart constructor.
+data ListRetainedMessagesResponse = ListRetainedMessagesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A summary list the account\'s retained messages. The information
+    -- returned doesn\'t include the message payloads of the retained messages.
+    retainedTopics :: Prelude.Maybe [RetainedMessageSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRetainedMessagesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listRetainedMessagesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'retainedTopics', 'listRetainedMessagesResponse_retainedTopics' - A summary list the account\'s retained messages. The information
+-- returned doesn\'t include the message payloads of the retained messages.
+--
+-- 'httpStatus', 'listRetainedMessagesResponse_httpStatus' - The response's http status code.
+newListRetainedMessagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRetainedMessagesResponse
+newListRetainedMessagesResponse pHttpStatus_ =
+  ListRetainedMessagesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      retainedTopics = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listRetainedMessagesResponse_nextToken :: Lens.Lens' ListRetainedMessagesResponse (Prelude.Maybe Prelude.Text)
+listRetainedMessagesResponse_nextToken = Lens.lens (\ListRetainedMessagesResponse' {nextToken} -> nextToken) (\s@ListRetainedMessagesResponse' {} a -> s {nextToken = a} :: ListRetainedMessagesResponse)
+
+-- | A summary list the account\'s retained messages. The information
+-- returned doesn\'t include the message payloads of the retained messages.
+listRetainedMessagesResponse_retainedTopics :: Lens.Lens' ListRetainedMessagesResponse (Prelude.Maybe [RetainedMessageSummary])
+listRetainedMessagesResponse_retainedTopics = Lens.lens (\ListRetainedMessagesResponse' {retainedTopics} -> retainedTopics) (\s@ListRetainedMessagesResponse' {} a -> s {retainedTopics = a} :: ListRetainedMessagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listRetainedMessagesResponse_httpStatus :: Lens.Lens' ListRetainedMessagesResponse Prelude.Int
+listRetainedMessagesResponse_httpStatus = Lens.lens (\ListRetainedMessagesResponse' {httpStatus} -> httpStatus) (\s@ListRetainedMessagesResponse' {} a -> s {httpStatus = a} :: ListRetainedMessagesResponse)
+
+instance Prelude.NFData ListRetainedMessagesResponse where
+  rnf ListRetainedMessagesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf retainedTopics
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTData/Publish.hs b/gen/Amazonka/IoTData/Publish.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Publish.hs
@@ -0,0 +1,349 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Publish
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Publishes an MQTT message.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions Publish>
+-- action.
+--
+-- For more information about MQTT messages, see
+-- <http://docs.aws.amazon.com/iot/latest/developerguide/mqtt.html MQTT Protocol>
+-- in the IoT Developer Guide.
+--
+-- For more information about messaging costs, see
+-- <http://aws.amazon.com/iot-core/pricing/#Messaging Amazon Web Services IoT Core pricing - Messaging>.
+module Amazonka.IoTData.Publish
+  ( -- * Creating a Request
+    Publish (..),
+    newPublish,
+
+    -- * Request Lenses
+    publish_contentType,
+    publish_correlationData,
+    publish_messageExpiry,
+    publish_payload,
+    publish_payloadFormatIndicator,
+    publish_qos,
+    publish_responseTopic,
+    publish_retain,
+    publish_userProperties,
+    publish_topic,
+
+    -- * Destructuring the Response
+    PublishResponse (..),
+    newPublishResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The input for the Publish operation.
+--
+-- /See:/ 'newPublish' smart constructor.
+data Publish = Publish'
+  { -- | A UTF-8 encoded string that describes the content of the publishing
+    -- message.
+    contentType :: Prelude.Maybe Prelude.Text,
+    -- | The base64-encoded binary data used by the sender of the request message
+    -- to identify which request the response message is for when it\'s
+    -- received. @correlationData@ is an HTTP header value in the API.
+    correlationData :: Prelude.Maybe Prelude.Text,
+    -- | A user-defined integer value that represents the message expiry interval
+    -- in seconds. If absent, the message doesn\'t expire. For more information
+    -- about the limits of @messageExpiry@, see
+    -- <https://docs.aws.amazon.com/general/latest/gr/iot-core.html#message-broker-limits Amazon Web Services IoT Core message broker and protocol limits and quotas>
+    -- from the Amazon Web Services Reference Guide.
+    messageExpiry :: Prelude.Maybe Prelude.Integer,
+    -- | The message body. MQTT accepts text, binary, and empty (null) message
+    -- payloads.
+    --
+    -- Publishing an empty (null) payload with __retain__ = @true@ deletes the
+    -- retained message identified by __topic__ from Amazon Web Services IoT
+    -- Core.
+    payload :: Prelude.Maybe Prelude.ByteString,
+    -- | An @Enum@ string value that indicates whether the payload is formatted
+    -- as UTF-8. @payloadFormatIndicator@ is an HTTP header value in the API.
+    payloadFormatIndicator :: Prelude.Maybe PayloadFormatIndicator,
+    -- | The Quality of Service (QoS) level. The default QoS level is 0.
+    qos :: Prelude.Maybe Prelude.Natural,
+    -- | A UTF-8 encoded string that\'s used as the topic name for a response
+    -- message. The response topic is used to describe the topic which the
+    -- receiver should publish to as part of the request-response flow. The
+    -- topic must not contain wildcard characters.
+    responseTopic :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value that determines whether to set the RETAIN flag when the
+    -- message is published.
+    --
+    -- Setting the RETAIN flag causes the message to be retained and sent to
+    -- new subscribers to the topic.
+    --
+    -- Valid values: @true@ | @false@
+    --
+    -- Default value: @false@
+    retain :: Prelude.Maybe Prelude.Bool,
+    -- | A JSON string that contains an array of JSON objects. If you don’t use
+    -- Amazon Web Services SDK or CLI, you must encode the JSON string to
+    -- base64 format before adding it to the HTTP header. @userProperties@ is
+    -- an HTTP header value in the API.
+    --
+    -- The following example @userProperties@ parameter is a JSON string which
+    -- represents two User Properties. Note that it needs to be base64-encoded:
+    --
+    -- @[{\"deviceName\": \"alpha\"}, {\"deviceCnt\": \"45\"}]@
+    userProperties :: Prelude.Maybe Prelude.Text,
+    -- | The name of the MQTT topic.
+    topic :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Publish' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'contentType', 'publish_contentType' - A UTF-8 encoded string that describes the content of the publishing
+-- message.
+--
+-- 'correlationData', 'publish_correlationData' - The base64-encoded binary data used by the sender of the request message
+-- to identify which request the response message is for when it\'s
+-- received. @correlationData@ is an HTTP header value in the API.
+--
+-- 'messageExpiry', 'publish_messageExpiry' - A user-defined integer value that represents the message expiry interval
+-- in seconds. If absent, the message doesn\'t expire. For more information
+-- about the limits of @messageExpiry@, see
+-- <https://docs.aws.amazon.com/general/latest/gr/iot-core.html#message-broker-limits Amazon Web Services IoT Core message broker and protocol limits and quotas>
+-- from the Amazon Web Services Reference Guide.
+--
+-- 'payload', 'publish_payload' - The message body. MQTT accepts text, binary, and empty (null) message
+-- payloads.
+--
+-- Publishing an empty (null) payload with __retain__ = @true@ deletes the
+-- retained message identified by __topic__ from Amazon Web Services IoT
+-- Core.
+--
+-- 'payloadFormatIndicator', 'publish_payloadFormatIndicator' - An @Enum@ string value that indicates whether the payload is formatted
+-- as UTF-8. @payloadFormatIndicator@ is an HTTP header value in the API.
+--
+-- 'qos', 'publish_qos' - The Quality of Service (QoS) level. The default QoS level is 0.
+--
+-- 'responseTopic', 'publish_responseTopic' - A UTF-8 encoded string that\'s used as the topic name for a response
+-- message. The response topic is used to describe the topic which the
+-- receiver should publish to as part of the request-response flow. The
+-- topic must not contain wildcard characters.
+--
+-- 'retain', 'publish_retain' - A Boolean value that determines whether to set the RETAIN flag when the
+-- message is published.
+--
+-- Setting the RETAIN flag causes the message to be retained and sent to
+-- new subscribers to the topic.
+--
+-- Valid values: @true@ | @false@
+--
+-- Default value: @false@
+--
+-- 'userProperties', 'publish_userProperties' - A JSON string that contains an array of JSON objects. If you don’t use
+-- Amazon Web Services SDK or CLI, you must encode the JSON string to
+-- base64 format before adding it to the HTTP header. @userProperties@ is
+-- an HTTP header value in the API.
+--
+-- The following example @userProperties@ parameter is a JSON string which
+-- represents two User Properties. Note that it needs to be base64-encoded:
+--
+-- @[{\"deviceName\": \"alpha\"}, {\"deviceCnt\": \"45\"}]@
+--
+-- 'topic', 'publish_topic' - The name of the MQTT topic.
+newPublish ::
+  -- | 'topic'
+  Prelude.Text ->
+  Publish
+newPublish pTopic_ =
+  Publish'
+    { contentType = Prelude.Nothing,
+      correlationData = Prelude.Nothing,
+      messageExpiry = Prelude.Nothing,
+      payload = Prelude.Nothing,
+      payloadFormatIndicator = Prelude.Nothing,
+      qos = Prelude.Nothing,
+      responseTopic = Prelude.Nothing,
+      retain = Prelude.Nothing,
+      userProperties = Prelude.Nothing,
+      topic = pTopic_
+    }
+
+-- | A UTF-8 encoded string that describes the content of the publishing
+-- message.
+publish_contentType :: Lens.Lens' Publish (Prelude.Maybe Prelude.Text)
+publish_contentType = Lens.lens (\Publish' {contentType} -> contentType) (\s@Publish' {} a -> s {contentType = a} :: Publish)
+
+-- | The base64-encoded binary data used by the sender of the request message
+-- to identify which request the response message is for when it\'s
+-- received. @correlationData@ is an HTTP header value in the API.
+publish_correlationData :: Lens.Lens' Publish (Prelude.Maybe Prelude.Text)
+publish_correlationData = Lens.lens (\Publish' {correlationData} -> correlationData) (\s@Publish' {} a -> s {correlationData = a} :: Publish)
+
+-- | A user-defined integer value that represents the message expiry interval
+-- in seconds. If absent, the message doesn\'t expire. For more information
+-- about the limits of @messageExpiry@, see
+-- <https://docs.aws.amazon.com/general/latest/gr/iot-core.html#message-broker-limits Amazon Web Services IoT Core message broker and protocol limits and quotas>
+-- from the Amazon Web Services Reference Guide.
+publish_messageExpiry :: Lens.Lens' Publish (Prelude.Maybe Prelude.Integer)
+publish_messageExpiry = Lens.lens (\Publish' {messageExpiry} -> messageExpiry) (\s@Publish' {} a -> s {messageExpiry = a} :: Publish)
+
+-- | The message body. MQTT accepts text, binary, and empty (null) message
+-- payloads.
+--
+-- Publishing an empty (null) payload with __retain__ = @true@ deletes the
+-- retained message identified by __topic__ from Amazon Web Services IoT
+-- Core.
+publish_payload :: Lens.Lens' Publish (Prelude.Maybe Prelude.ByteString)
+publish_payload = Lens.lens (\Publish' {payload} -> payload) (\s@Publish' {} a -> s {payload = a} :: Publish)
+
+-- | An @Enum@ string value that indicates whether the payload is formatted
+-- as UTF-8. @payloadFormatIndicator@ is an HTTP header value in the API.
+publish_payloadFormatIndicator :: Lens.Lens' Publish (Prelude.Maybe PayloadFormatIndicator)
+publish_payloadFormatIndicator = Lens.lens (\Publish' {payloadFormatIndicator} -> payloadFormatIndicator) (\s@Publish' {} a -> s {payloadFormatIndicator = a} :: Publish)
+
+-- | The Quality of Service (QoS) level. The default QoS level is 0.
+publish_qos :: Lens.Lens' Publish (Prelude.Maybe Prelude.Natural)
+publish_qos = Lens.lens (\Publish' {qos} -> qos) (\s@Publish' {} a -> s {qos = a} :: Publish)
+
+-- | A UTF-8 encoded string that\'s used as the topic name for a response
+-- message. The response topic is used to describe the topic which the
+-- receiver should publish to as part of the request-response flow. The
+-- topic must not contain wildcard characters.
+publish_responseTopic :: Lens.Lens' Publish (Prelude.Maybe Prelude.Text)
+publish_responseTopic = Lens.lens (\Publish' {responseTopic} -> responseTopic) (\s@Publish' {} a -> s {responseTopic = a} :: Publish)
+
+-- | A Boolean value that determines whether to set the RETAIN flag when the
+-- message is published.
+--
+-- Setting the RETAIN flag causes the message to be retained and sent to
+-- new subscribers to the topic.
+--
+-- Valid values: @true@ | @false@
+--
+-- Default value: @false@
+publish_retain :: Lens.Lens' Publish (Prelude.Maybe Prelude.Bool)
+publish_retain = Lens.lens (\Publish' {retain} -> retain) (\s@Publish' {} a -> s {retain = a} :: Publish)
+
+-- | A JSON string that contains an array of JSON objects. If you don’t use
+-- Amazon Web Services SDK or CLI, you must encode the JSON string to
+-- base64 format before adding it to the HTTP header. @userProperties@ is
+-- an HTTP header value in the API.
+--
+-- The following example @userProperties@ parameter is a JSON string which
+-- represents two User Properties. Note that it needs to be base64-encoded:
+--
+-- @[{\"deviceName\": \"alpha\"}, {\"deviceCnt\": \"45\"}]@
+publish_userProperties :: Lens.Lens' Publish (Prelude.Maybe Prelude.Text)
+publish_userProperties = Lens.lens (\Publish' {userProperties} -> userProperties) (\s@Publish' {} a -> s {userProperties = a} :: Publish)
+
+-- | The name of the MQTT topic.
+publish_topic :: Lens.Lens' Publish Prelude.Text
+publish_topic = Lens.lens (\Publish' {topic} -> topic) (\s@Publish' {} a -> s {topic = a} :: Publish)
+
+instance Core.AWSRequest Publish where
+  type AWSResponse Publish = PublishResponse
+  request overrides =
+    Request.postBody (overrides defaultService)
+  response = Response.receiveNull PublishResponse'
+
+instance Prelude.Hashable Publish where
+  hashWithSalt _salt Publish' {..} =
+    _salt
+      `Prelude.hashWithSalt` contentType
+      `Prelude.hashWithSalt` correlationData
+      `Prelude.hashWithSalt` messageExpiry
+      `Prelude.hashWithSalt` payload
+      `Prelude.hashWithSalt` payloadFormatIndicator
+      `Prelude.hashWithSalt` qos
+      `Prelude.hashWithSalt` responseTopic
+      `Prelude.hashWithSalt` retain
+      `Prelude.hashWithSalt` userProperties
+      `Prelude.hashWithSalt` topic
+
+instance Prelude.NFData Publish where
+  rnf Publish' {..} =
+    Prelude.rnf contentType
+      `Prelude.seq` Prelude.rnf correlationData
+      `Prelude.seq` Prelude.rnf messageExpiry
+      `Prelude.seq` Prelude.rnf payload
+      `Prelude.seq` Prelude.rnf payloadFormatIndicator
+      `Prelude.seq` Prelude.rnf qos
+      `Prelude.seq` Prelude.rnf responseTopic
+      `Prelude.seq` Prelude.rnf retain
+      `Prelude.seq` Prelude.rnf userProperties
+      `Prelude.seq` Prelude.rnf topic
+
+instance Data.ToBody Publish where
+  toBody Publish' {..} = Data.toBody payload
+
+instance Data.ToHeaders Publish where
+  toHeaders Publish' {..} =
+    Prelude.mconcat
+      [ "x-amz-mqtt5-correlation-data"
+          Data.=# correlationData,
+        "x-amz-mqtt5-payload-format-indicator"
+          Data.=# payloadFormatIndicator,
+        "x-amz-mqtt5-user-properties" Data.=# userProperties
+      ]
+
+instance Data.ToPath Publish where
+  toPath Publish' {..} =
+    Prelude.mconcat ["/topics/", Data.toBS topic]
+
+instance Data.ToQuery Publish where
+  toQuery Publish' {..} =
+    Prelude.mconcat
+      [ "contentType" Data.=: contentType,
+        "messageExpiry" Data.=: messageExpiry,
+        "qos" Data.=: qos,
+        "responseTopic" Data.=: responseTopic,
+        "retain" Data.=: retain
+      ]
+
+-- | /See:/ 'newPublishResponse' smart constructor.
+data PublishResponse = PublishResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PublishResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newPublishResponse ::
+  PublishResponse
+newPublishResponse = PublishResponse'
+
+instance Prelude.NFData PublishResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTData/Types.hs b/gen/Amazonka/IoTData/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Types.hs
@@ -0,0 +1,200 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTData.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ConflictException,
+    _InternalFailureException,
+    _InvalidRequestException,
+    _MethodNotAllowedException,
+    _RequestEntityTooLargeException,
+    _ResourceNotFoundException,
+    _ServiceUnavailableException,
+    _ThrottlingException,
+    _UnauthorizedException,
+    _UnsupportedDocumentEncodingException,
+
+    -- * PayloadFormatIndicator
+    PayloadFormatIndicator (..),
+
+    -- * RetainedMessageSummary
+    RetainedMessageSummary (..),
+    newRetainedMessageSummary,
+    retainedMessageSummary_lastModifiedTime,
+    retainedMessageSummary_payloadSize,
+    retainedMessageSummary_qos,
+    retainedMessageSummary_topic,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.IoTData.Types.PayloadFormatIndicator
+import Amazonka.IoTData.Types.RetainedMessageSummary
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2015-05-28@ of the Amazon IoT Data Plane SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "IoTData",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "data-ats.iot",
+      Core.signingName = "iotdata",
+      Core.version = "2015-05-28",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "IoTData",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The specified version does not match the version of the document.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | An unexpected error has occurred.
+_InternalFailureException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalFailureException =
+  Core._MatchServiceError
+    defaultService
+    "InternalFailureException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request is not valid.
+_InvalidRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidRequestException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidRequestException"
+    Prelude.. Core.hasStatus 400
+
+-- | The specified combination of HTTP verb and URI is not supported.
+_MethodNotAllowedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_MethodNotAllowedException =
+  Core._MatchServiceError
+    defaultService
+    "MethodNotAllowedException"
+    Prelude.. Core.hasStatus 405
+
+-- | The payload exceeds the maximum size allowed.
+_RequestEntityTooLargeException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RequestEntityTooLargeException =
+  Core._MatchServiceError
+    defaultService
+    "RequestEntityTooLargeException"
+    Prelude.. Core.hasStatus 413
+
+-- | The specified resource does not exist.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The service is temporarily unavailable.
+_ServiceUnavailableException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUnavailableException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUnavailableException"
+    Prelude.. Core.hasStatus 503
+
+-- | The rate exceeds the limit.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | You are not authorized to perform this operation.
+_UnauthorizedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnauthorizedException =
+  Core._MatchServiceError
+    defaultService
+    "UnauthorizedException"
+    Prelude.. Core.hasStatus 401
+
+-- | The document encoding is not supported.
+_UnsupportedDocumentEncodingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnsupportedDocumentEncodingException =
+  Core._MatchServiceError
+    defaultService
+    "UnsupportedDocumentEncodingException"
+    Prelude.. Core.hasStatus 415
diff --git a/gen/Amazonka/IoTData/Types/PayloadFormatIndicator.hs b/gen/Amazonka/IoTData/Types/PayloadFormatIndicator.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Types/PayloadFormatIndicator.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Types.PayloadFormatIndicator
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTData.Types.PayloadFormatIndicator
+  ( PayloadFormatIndicator
+      ( ..,
+        PayloadFormatIndicator_UNSPECIFIED_BYTES,
+        PayloadFormatIndicator_UTF8_DATA
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PayloadFormatIndicator = PayloadFormatIndicator'
+  { fromPayloadFormatIndicator ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PayloadFormatIndicator_UNSPECIFIED_BYTES :: PayloadFormatIndicator
+pattern PayloadFormatIndicator_UNSPECIFIED_BYTES = PayloadFormatIndicator' "UNSPECIFIED_BYTES"
+
+pattern PayloadFormatIndicator_UTF8_DATA :: PayloadFormatIndicator
+pattern PayloadFormatIndicator_UTF8_DATA = PayloadFormatIndicator' "UTF8_DATA"
+
+{-# COMPLETE
+  PayloadFormatIndicator_UNSPECIFIED_BYTES,
+  PayloadFormatIndicator_UTF8_DATA,
+  PayloadFormatIndicator'
+  #-}
diff --git a/gen/Amazonka/IoTData/Types/RetainedMessageSummary.hs b/gen/Amazonka/IoTData/Types/RetainedMessageSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Types/RetainedMessageSummary.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Types.RetainedMessageSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTData.Types.RetainedMessageSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a single retained message.
+--
+-- /See:/ 'newRetainedMessageSummary' smart constructor.
+data RetainedMessageSummary = RetainedMessageSummary'
+  { -- | The Epoch date and time, in milliseconds, when the retained message was
+    -- stored by IoT.
+    lastModifiedTime :: Prelude.Maybe Prelude.Integer,
+    -- | The size of the retained message\'s payload in bytes.
+    payloadSize :: Prelude.Maybe Prelude.Integer,
+    -- | The quality of service (QoS) level used to publish the retained message.
+    qos :: Prelude.Maybe Prelude.Natural,
+    -- | The topic name to which the retained message was published.
+    topic :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RetainedMessageSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastModifiedTime', 'retainedMessageSummary_lastModifiedTime' - The Epoch date and time, in milliseconds, when the retained message was
+-- stored by IoT.
+--
+-- 'payloadSize', 'retainedMessageSummary_payloadSize' - The size of the retained message\'s payload in bytes.
+--
+-- 'qos', 'retainedMessageSummary_qos' - The quality of service (QoS) level used to publish the retained message.
+--
+-- 'topic', 'retainedMessageSummary_topic' - The topic name to which the retained message was published.
+newRetainedMessageSummary ::
+  RetainedMessageSummary
+newRetainedMessageSummary =
+  RetainedMessageSummary'
+    { lastModifiedTime =
+        Prelude.Nothing,
+      payloadSize = Prelude.Nothing,
+      qos = Prelude.Nothing,
+      topic = Prelude.Nothing
+    }
+
+-- | The Epoch date and time, in milliseconds, when the retained message was
+-- stored by IoT.
+retainedMessageSummary_lastModifiedTime :: Lens.Lens' RetainedMessageSummary (Prelude.Maybe Prelude.Integer)
+retainedMessageSummary_lastModifiedTime = Lens.lens (\RetainedMessageSummary' {lastModifiedTime} -> lastModifiedTime) (\s@RetainedMessageSummary' {} a -> s {lastModifiedTime = a} :: RetainedMessageSummary)
+
+-- | The size of the retained message\'s payload in bytes.
+retainedMessageSummary_payloadSize :: Lens.Lens' RetainedMessageSummary (Prelude.Maybe Prelude.Integer)
+retainedMessageSummary_payloadSize = Lens.lens (\RetainedMessageSummary' {payloadSize} -> payloadSize) (\s@RetainedMessageSummary' {} a -> s {payloadSize = a} :: RetainedMessageSummary)
+
+-- | The quality of service (QoS) level used to publish the retained message.
+retainedMessageSummary_qos :: Lens.Lens' RetainedMessageSummary (Prelude.Maybe Prelude.Natural)
+retainedMessageSummary_qos = Lens.lens (\RetainedMessageSummary' {qos} -> qos) (\s@RetainedMessageSummary' {} a -> s {qos = a} :: RetainedMessageSummary)
+
+-- | The topic name to which the retained message was published.
+retainedMessageSummary_topic :: Lens.Lens' RetainedMessageSummary (Prelude.Maybe Prelude.Text)
+retainedMessageSummary_topic = Lens.lens (\RetainedMessageSummary' {topic} -> topic) (\s@RetainedMessageSummary' {} a -> s {topic = a} :: RetainedMessageSummary)
+
+instance Data.FromJSON RetainedMessageSummary where
+  parseJSON =
+    Data.withObject
+      "RetainedMessageSummary"
+      ( \x ->
+          RetainedMessageSummary'
+            Prelude.<$> (x Data..:? "lastModifiedTime")
+            Prelude.<*> (x Data..:? "payloadSize")
+            Prelude.<*> (x Data..:? "qos")
+            Prelude.<*> (x Data..:? "topic")
+      )
+
+instance Prelude.Hashable RetainedMessageSummary where
+  hashWithSalt _salt RetainedMessageSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` payloadSize
+      `Prelude.hashWithSalt` qos
+      `Prelude.hashWithSalt` topic
+
+instance Prelude.NFData RetainedMessageSummary where
+  rnf RetainedMessageSummary' {..} =
+    Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf payloadSize
+      `Prelude.seq` Prelude.rnf qos
+      `Prelude.seq` Prelude.rnf topic
diff --git a/gen/Amazonka/IoTData/UpdateThingShadow.hs b/gen/Amazonka/IoTData/UpdateThingShadow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/UpdateThingShadow.hs
@@ -0,0 +1,197 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.UpdateThingShadow
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the shadow for the specified thing.
+--
+-- Requires permission to access the
+-- <https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions UpdateThingShadow>
+-- action.
+--
+-- For more information, see
+-- <http://docs.aws.amazon.com/iot/latest/developerguide/API_UpdateThingShadow.html UpdateThingShadow>
+-- in the IoT Developer Guide.
+module Amazonka.IoTData.UpdateThingShadow
+  ( -- * Creating a Request
+    UpdateThingShadow (..),
+    newUpdateThingShadow,
+
+    -- * Request Lenses
+    updateThingShadow_shadowName,
+    updateThingShadow_thingName,
+    updateThingShadow_payload,
+
+    -- * Destructuring the Response
+    UpdateThingShadowResponse (..),
+    newUpdateThingShadowResponse,
+
+    -- * Response Lenses
+    updateThingShadowResponse_payload,
+    updateThingShadowResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The input for the UpdateThingShadow operation.
+--
+-- /See:/ 'newUpdateThingShadow' smart constructor.
+data UpdateThingShadow = UpdateThingShadow'
+  { -- | The name of the shadow.
+    shadowName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the thing.
+    thingName :: Prelude.Text,
+    -- | The state information, in JSON format.
+    payload :: Prelude.ByteString
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateThingShadow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'shadowName', 'updateThingShadow_shadowName' - The name of the shadow.
+--
+-- 'thingName', 'updateThingShadow_thingName' - The name of the thing.
+--
+-- 'payload', 'updateThingShadow_payload' - The state information, in JSON format.
+newUpdateThingShadow ::
+  -- | 'thingName'
+  Prelude.Text ->
+  -- | 'payload'
+  Prelude.ByteString ->
+  UpdateThingShadow
+newUpdateThingShadow pThingName_ pPayload_ =
+  UpdateThingShadow'
+    { shadowName = Prelude.Nothing,
+      thingName = pThingName_,
+      payload = pPayload_
+    }
+
+-- | The name of the shadow.
+updateThingShadow_shadowName :: Lens.Lens' UpdateThingShadow (Prelude.Maybe Prelude.Text)
+updateThingShadow_shadowName = Lens.lens (\UpdateThingShadow' {shadowName} -> shadowName) (\s@UpdateThingShadow' {} a -> s {shadowName = a} :: UpdateThingShadow)
+
+-- | The name of the thing.
+updateThingShadow_thingName :: Lens.Lens' UpdateThingShadow Prelude.Text
+updateThingShadow_thingName = Lens.lens (\UpdateThingShadow' {thingName} -> thingName) (\s@UpdateThingShadow' {} a -> s {thingName = a} :: UpdateThingShadow)
+
+-- | The state information, in JSON format.
+updateThingShadow_payload :: Lens.Lens' UpdateThingShadow Prelude.ByteString
+updateThingShadow_payload = Lens.lens (\UpdateThingShadow' {payload} -> payload) (\s@UpdateThingShadow' {} a -> s {payload = a} :: UpdateThingShadow)
+
+instance Core.AWSRequest UpdateThingShadow where
+  type
+    AWSResponse UpdateThingShadow =
+      UpdateThingShadowResponse
+  request overrides =
+    Request.postBody (overrides defaultService)
+  response =
+    Response.receiveBytes
+      ( \s h x ->
+          UpdateThingShadowResponse'
+            Prelude.<$> (Prelude.pure (Prelude.Just (Prelude.coerce x)))
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateThingShadow where
+  hashWithSalt _salt UpdateThingShadow' {..} =
+    _salt
+      `Prelude.hashWithSalt` shadowName
+      `Prelude.hashWithSalt` thingName
+      `Prelude.hashWithSalt` payload
+
+instance Prelude.NFData UpdateThingShadow where
+  rnf UpdateThingShadow' {..} =
+    Prelude.rnf shadowName
+      `Prelude.seq` Prelude.rnf thingName
+      `Prelude.seq` Prelude.rnf payload
+
+instance Data.ToBody UpdateThingShadow where
+  toBody UpdateThingShadow' {..} = Data.toBody payload
+
+instance Data.ToHeaders UpdateThingShadow where
+  toHeaders = Prelude.const Prelude.mempty
+
+instance Data.ToPath UpdateThingShadow where
+  toPath UpdateThingShadow' {..} =
+    Prelude.mconcat
+      ["/things/", Data.toBS thingName, "/shadow"]
+
+instance Data.ToQuery UpdateThingShadow where
+  toQuery UpdateThingShadow' {..} =
+    Prelude.mconcat ["name" Data.=: shadowName]
+
+-- | The output from the UpdateThingShadow operation.
+--
+-- /See:/ 'newUpdateThingShadowResponse' smart constructor.
+data UpdateThingShadowResponse = UpdateThingShadowResponse'
+  { -- | The state information, in JSON format.
+    payload :: Prelude.Maybe Prelude.ByteString,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateThingShadowResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'payload', 'updateThingShadowResponse_payload' - The state information, in JSON format.
+--
+-- 'httpStatus', 'updateThingShadowResponse_httpStatus' - The response's http status code.
+newUpdateThingShadowResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateThingShadowResponse
+newUpdateThingShadowResponse pHttpStatus_ =
+  UpdateThingShadowResponse'
+    { payload =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The state information, in JSON format.
+updateThingShadowResponse_payload :: Lens.Lens' UpdateThingShadowResponse (Prelude.Maybe Prelude.ByteString)
+updateThingShadowResponse_payload = Lens.lens (\UpdateThingShadowResponse' {payload} -> payload) (\s@UpdateThingShadowResponse' {} a -> s {payload = a} :: UpdateThingShadowResponse)
+
+-- | The response's http status code.
+updateThingShadowResponse_httpStatus :: Lens.Lens' UpdateThingShadowResponse Prelude.Int
+updateThingShadowResponse_httpStatus = Lens.lens (\UpdateThingShadowResponse' {httpStatus} -> httpStatus) (\s@UpdateThingShadowResponse' {} a -> s {httpStatus = a} :: UpdateThingShadowResponse)
+
+instance Prelude.NFData UpdateThingShadowResponse where
+  rnf UpdateThingShadowResponse' {..} =
+    Prelude.rnf payload
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTData/Waiters.hs b/gen/Amazonka/IoTData/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTData/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTData.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTData.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTData.Lens
+import Amazonka.IoTData.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/gen/Network/AWS/IoTData.hs b/gen/Network/AWS/IoTData.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData.hs
+++ /dev/null
@@ -1,112 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.IoTData
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- __AWS IoT__
---
--- AWS IoT-Data enables secure, bi-directional communication between Internet-connected things (such as sensors, actuators, embedded devices, or smart appliances) and the AWS cloud. It implements a broker for applications and things to publish messages over HTTP (Publish) and retrieve, update, and delete thing shadows. A thing shadow is a persistent representation of your things and their state in the AWS cloud.
---
-module Network.AWS.IoTData
-    (
-    -- * Service Configuration
-      ioTData
-
-    -- * Errors
-    -- $errors
-
-    -- ** InvalidRequestException
-    , _InvalidRequestException
-
-    -- ** ConflictException
-    , _ConflictException
-
-    -- ** RequestEntityTooLargeException
-    , _RequestEntityTooLargeException
-
-    -- ** ThrottlingException
-    , _ThrottlingException
-
-    -- ** MethodNotAllowedException
-    , _MethodNotAllowedException
-
-    -- ** InternalFailureException
-    , _InternalFailureException
-
-    -- ** ServiceUnavailableException
-    , _ServiceUnavailableException
-
-    -- ** UnauthorizedException
-    , _UnauthorizedException
-
-    -- ** ResourceNotFoundException
-    , _ResourceNotFoundException
-
-    -- ** UnsupportedDocumentEncodingException
-    , _UnsupportedDocumentEncodingException
-
-    -- * Waiters
-    -- $waiters
-
-    -- * Operations
-    -- $operations
-
-    -- ** GetThingShadow
-    , module Network.AWS.IoTData.GetThingShadow
-
-    -- ** DeleteThingShadow
-    , module Network.AWS.IoTData.DeleteThingShadow
-
-    -- ** UpdateThingShadow
-    , module Network.AWS.IoTData.UpdateThingShadow
-
-    -- ** Publish
-    , module Network.AWS.IoTData.Publish
-
-    -- * Types
-    ) where
-
-import Network.AWS.IoTData.DeleteThingShadow
-import Network.AWS.IoTData.GetThingShadow
-import Network.AWS.IoTData.Publish
-import Network.AWS.IoTData.Types
-import Network.AWS.IoTData.UpdateThingShadow
-import Network.AWS.IoTData.Waiters
-
-{- $errors
-Error matchers are designed for use with the functions provided by
-<http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
-This allows catching (and rethrowing) service specific errors returned
-by 'IoTData'.
--}
-
-{- $operations
-Some AWS operations return results that are incomplete and require subsequent
-requests in order to obtain the entire result set. The process of sending
-subsequent requests to continue where a previous request left off is called
-pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
-1000 objects at a time, and you must send subsequent requests with the
-appropriate Marker in order to retrieve the next page of results.
-
-Operations that have an 'AWSPager' instance can transparently perform subsequent
-requests, correctly setting Markers and other request facets to iterate through
-the entire result set of a truncated API operation. Operations which support
-this have an additional note in the documentation.
-
-Many operations have the ability to filter results on the server side. See the
-individual operation parameters for details.
--}
-
-{- $waiters
-Waiters poll by repeatedly sending a request until some remote success condition
-configured by the 'Wait' specification is fulfilled. The 'Wait' specification
-determines how many attempts should be made, in addition to delay and retry strategies.
--}
diff --git a/gen/Network/AWS/IoTData/DeleteThingShadow.hs b/gen/Network/AWS/IoTData/DeleteThingShadow.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/DeleteThingShadow.hs
+++ /dev/null
@@ -1,132 +0,0 @@
-{-# 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.IoTData.DeleteThingShadow
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes the thing shadow for the specified thing.
---
---
--- For more information, see <http://docs.aws.amazon.com/iot/latest/developerguide/API_DeleteThingShadow.html DeleteThingShadow> in the /AWS IoT Developer Guide/ .
---
-module Network.AWS.IoTData.DeleteThingShadow
-    (
-    -- * Creating a Request
-      deleteThingShadow
-    , DeleteThingShadow
-    -- * Request Lenses
-    , dtsThingName
-
-    -- * Destructuring the Response
-    , deleteThingShadowResponse
-    , DeleteThingShadowResponse
-    -- * Response Lenses
-    , dtsrsResponseStatus
-    , dtsrsPayload
-    ) where
-
-import Network.AWS.IoTData.Types
-import Network.AWS.IoTData.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | The input for the DeleteThingShadow operation.
---
---
---
--- /See:/ 'deleteThingShadow' smart constructor.
-newtype DeleteThingShadow = DeleteThingShadow'
-  { _dtsThingName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteThingShadow' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dtsThingName' - The name of the thing.
-deleteThingShadow
-    :: Text -- ^ 'dtsThingName'
-    -> DeleteThingShadow
-deleteThingShadow pThingName_ = DeleteThingShadow' {_dtsThingName = pThingName_}
-
-
--- | The name of the thing.
-dtsThingName :: Lens' DeleteThingShadow Text
-dtsThingName = lens _dtsThingName (\ s a -> s{_dtsThingName = a})
-
-instance AWSRequest DeleteThingShadow where
-        type Rs DeleteThingShadow = DeleteThingShadowResponse
-        request = delete ioTData
-        response
-          = receiveBytes
-              (\ s h x ->
-                 DeleteThingShadowResponse' <$>
-                   (pure (fromEnum s)) <*> (pure x))
-
-instance Hashable DeleteThingShadow where
-
-instance NFData DeleteThingShadow where
-
-instance ToHeaders DeleteThingShadow where
-        toHeaders = const mempty
-
-instance ToPath DeleteThingShadow where
-        toPath DeleteThingShadow'{..}
-          = mconcat ["/things/", toBS _dtsThingName, "/shadow"]
-
-instance ToQuery DeleteThingShadow where
-        toQuery = const mempty
-
--- | The output from the DeleteThingShadow operation.
---
---
---
--- /See:/ 'deleteThingShadowResponse' smart constructor.
-data DeleteThingShadowResponse = DeleteThingShadowResponse'
-  { _dtsrsResponseStatus :: !Int
-  , _dtsrsPayload        :: !ByteString
-  } deriving (Eq, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteThingShadowResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dtsrsResponseStatus' - -- | The response status code.
---
--- * 'dtsrsPayload' - The state information, in JSON format.
-deleteThingShadowResponse
-    :: Int -- ^ 'dtsrsResponseStatus'
-    -> ByteString -- ^ 'dtsrsPayload'
-    -> DeleteThingShadowResponse
-deleteThingShadowResponse pResponseStatus_ pPayload_ =
-  DeleteThingShadowResponse'
-    {_dtsrsResponseStatus = pResponseStatus_, _dtsrsPayload = pPayload_}
-
-
--- | -- | The response status code.
-dtsrsResponseStatus :: Lens' DeleteThingShadowResponse Int
-dtsrsResponseStatus = lens _dtsrsResponseStatus (\ s a -> s{_dtsrsResponseStatus = a})
-
--- | The state information, in JSON format.
-dtsrsPayload :: Lens' DeleteThingShadowResponse ByteString
-dtsrsPayload = lens _dtsrsPayload (\ s a -> s{_dtsrsPayload = a})
-
-instance NFData DeleteThingShadowResponse where
diff --git a/gen/Network/AWS/IoTData/GetThingShadow.hs b/gen/Network/AWS/IoTData/GetThingShadow.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/GetThingShadow.hs
+++ /dev/null
@@ -1,131 +0,0 @@
-{-# 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.IoTData.GetThingShadow
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Gets the thing shadow for the specified thing.
---
---
--- For more information, see <http://docs.aws.amazon.com/iot/latest/developerguide/API_GetThingShadow.html GetThingShadow> in the /AWS IoT Developer Guide/ .
---
-module Network.AWS.IoTData.GetThingShadow
-    (
-    -- * Creating a Request
-      getThingShadow
-    , GetThingShadow
-    -- * Request Lenses
-    , gtsThingName
-
-    -- * Destructuring the Response
-    , getThingShadowResponse
-    , GetThingShadowResponse
-    -- * Response Lenses
-    , gtsrsPayload
-    , gtsrsResponseStatus
-    ) where
-
-import Network.AWS.IoTData.Types
-import Network.AWS.IoTData.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | The input for the GetThingShadow operation.
---
---
---
--- /See:/ 'getThingShadow' smart constructor.
-newtype GetThingShadow = GetThingShadow'
-  { _gtsThingName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetThingShadow' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gtsThingName' - The name of the thing.
-getThingShadow
-    :: Text -- ^ 'gtsThingName'
-    -> GetThingShadow
-getThingShadow pThingName_ = GetThingShadow' {_gtsThingName = pThingName_}
-
-
--- | The name of the thing.
-gtsThingName :: Lens' GetThingShadow Text
-gtsThingName = lens _gtsThingName (\ s a -> s{_gtsThingName = a})
-
-instance AWSRequest GetThingShadow where
-        type Rs GetThingShadow = GetThingShadowResponse
-        request = get ioTData
-        response
-          = receiveBytes
-              (\ s h x ->
-                 GetThingShadowResponse' <$>
-                   (pure (Just x)) <*> (pure (fromEnum s)))
-
-instance Hashable GetThingShadow where
-
-instance NFData GetThingShadow where
-
-instance ToHeaders GetThingShadow where
-        toHeaders = const mempty
-
-instance ToPath GetThingShadow where
-        toPath GetThingShadow'{..}
-          = mconcat ["/things/", toBS _gtsThingName, "/shadow"]
-
-instance ToQuery GetThingShadow where
-        toQuery = const mempty
-
--- | The output from the GetThingShadow operation.
---
---
---
--- /See:/ 'getThingShadowResponse' smart constructor.
-data GetThingShadowResponse = GetThingShadowResponse'
-  { _gtsrsPayload        :: !(Maybe ByteString)
-  , _gtsrsResponseStatus :: !Int
-  } deriving (Eq, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetThingShadowResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gtsrsPayload' - The state information, in JSON format.
---
--- * 'gtsrsResponseStatus' - -- | The response status code.
-getThingShadowResponse
-    :: Int -- ^ 'gtsrsResponseStatus'
-    -> GetThingShadowResponse
-getThingShadowResponse pResponseStatus_ =
-  GetThingShadowResponse'
-    {_gtsrsPayload = Nothing, _gtsrsResponseStatus = pResponseStatus_}
-
-
--- | The state information, in JSON format.
-gtsrsPayload :: Lens' GetThingShadowResponse (Maybe ByteString)
-gtsrsPayload = lens _gtsrsPayload (\ s a -> s{_gtsrsPayload = a})
-
--- | -- | The response status code.
-gtsrsResponseStatus :: Lens' GetThingShadowResponse Int
-gtsrsResponseStatus = lens _gtsrsResponseStatus (\ s a -> s{_gtsrsResponseStatus = a})
-
-instance NFData GetThingShadowResponse where
diff --git a/gen/Network/AWS/IoTData/Publish.hs b/gen/Network/AWS/IoTData/Publish.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/Publish.hs
+++ /dev/null
@@ -1,123 +0,0 @@
-{-# 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.IoTData.Publish
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Publishes state information.
---
---
--- For more information, see <http://docs.aws.amazon.com/iot/latest/developerguide/protocols.html#http HTTP Protocol> in the /AWS IoT Developer Guide/ .
---
-module Network.AWS.IoTData.Publish
-    (
-    -- * Creating a Request
-      publish
-    , Publish
-    -- * Request Lenses
-    , pPayload
-    , pQos
-    , pTopic
-
-    -- * Destructuring the Response
-    , publishResponse
-    , PublishResponse
-    ) where
-
-import Network.AWS.IoTData.Types
-import Network.AWS.IoTData.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | The input for the Publish operation.
---
---
---
--- /See:/ 'publish' smart constructor.
-data Publish = Publish'
-  { _pPayload :: !(Maybe ByteString)
-  , _pQos     :: !(Maybe Nat)
-  , _pTopic   :: !Text
-  } deriving (Eq, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Publish' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'pPayload' - The state information, in JSON format.
---
--- * 'pQos' - The Quality of Service (QoS) level.
---
--- * 'pTopic' - The name of the MQTT topic.
-publish
-    :: Text -- ^ 'pTopic'
-    -> Publish
-publish pTopic_ =
-  Publish' {_pPayload = Nothing, _pQos = Nothing, _pTopic = pTopic_}
-
-
--- | The state information, in JSON format.
-pPayload :: Lens' Publish (Maybe ByteString)
-pPayload = lens _pPayload (\ s a -> s{_pPayload = a})
-
--- | The Quality of Service (QoS) level.
-pQos :: Lens' Publish (Maybe Natural)
-pQos = lens _pQos (\ s a -> s{_pQos = a}) . mapping _Nat
-
--- | The name of the MQTT topic.
-pTopic :: Lens' Publish Text
-pTopic = lens _pTopic (\ s a -> s{_pTopic = a})
-
-instance AWSRequest Publish where
-        type Rs Publish = PublishResponse
-        request = postBody ioTData
-        response = receiveNull PublishResponse'
-
-instance Hashable Publish where
-
-instance NFData Publish where
-
-instance ToBody Publish where
-        toBody = toBody . _pPayload
-
-instance ToHeaders Publish where
-        toHeaders = const mempty
-
-instance ToPath Publish where
-        toPath Publish'{..}
-          = mconcat ["/topics/", toBS _pTopic]
-
-instance ToQuery Publish where
-        toQuery Publish'{..} = mconcat ["qos" =: _pQos]
-
--- | /See:/ 'publishResponse' smart constructor.
-data PublishResponse =
-  PublishResponse'
-  deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'PublishResponse' with the minimum fields required to make a request.
---
-publishResponse
-    :: PublishResponse
-publishResponse = PublishResponse'
-
-
-instance NFData PublishResponse where
diff --git a/gen/Network/AWS/IoTData/Types.hs b/gen/Network/AWS/IoTData/Types.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/Types.hs
+++ /dev/null
@@ -1,155 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.IoTData.Types
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.IoTData.Types
-    (
-    -- * Service Configuration
-      ioTData
-
-    -- * Errors
-    , _InvalidRequestException
-    , _ConflictException
-    , _RequestEntityTooLargeException
-    , _ThrottlingException
-    , _MethodNotAllowedException
-    , _InternalFailureException
-    , _ServiceUnavailableException
-    , _UnauthorizedException
-    , _ResourceNotFoundException
-    , _UnsupportedDocumentEncodingException
-    ) where
-
-import Network.AWS.IoTData.Types.Product
-import Network.AWS.IoTData.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Sign.V4
-
--- | API version @2015-05-28@ of the Amazon IoT Data Plane SDK configuration.
-ioTData :: Service
-ioTData =
-  Service
-    { _svcAbbrev = "IoTData"
-    , _svcSigner = v4
-    , _svcPrefix = "data.iot"
-    , _svcVersion = "2015-05-28"
-    , _svcEndpoint = defaultEndpoint ioTData
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "IoTData"
-    , _svcRetry = retry
-    }
-  where
-    retry =
-      Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
-    check e
-      | has (hasCode "ThrottledException" . hasStatus 400) e =
-        Just "throttled_exception"
-      | has (hasStatus 429) e = Just "too_many_requests"
-      | has (hasCode "ThrottlingException" . hasStatus 400) e =
-        Just "throttling_exception"
-      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-      | has (hasStatus 504) e = Just "gateway_timeout"
-      | has (hasCode "RequestThrottledException" . hasStatus 400) e =
-        Just "request_throttled_exception"
-      | has (hasStatus 502) e = Just "bad_gateway"
-      | has (hasStatus 503) e = Just "service_unavailable"
-      | has (hasStatus 500) e = Just "general_server_error"
-      | has (hasStatus 509) e = Just "limit_exceeded"
-      | otherwise = Nothing
-
-
--- | The request is not valid.
---
---
-_InvalidRequestException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidRequestException =
-  _MatchServiceError ioTData "InvalidRequestException" . hasStatus 400
-
-
--- | The specified version does not match the version of the document.
---
---
-_ConflictException :: AsError a => Getting (First ServiceError) a ServiceError
-_ConflictException =
-  _MatchServiceError ioTData "ConflictException" . hasStatus 409
-
-
--- | The payload exceeds the maximum size allowed.
---
---
-_RequestEntityTooLargeException :: AsError a => Getting (First ServiceError) a ServiceError
-_RequestEntityTooLargeException =
-  _MatchServiceError ioTData "RequestEntityTooLargeException" . hasStatus 413
-
-
--- | The rate exceeds the limit.
---
---
-_ThrottlingException :: AsError a => Getting (First ServiceError) a ServiceError
-_ThrottlingException =
-  _MatchServiceError ioTData "ThrottlingException" . hasStatus 429
-
-
--- | The specified combination of HTTP verb and URI is not supported.
---
---
-_MethodNotAllowedException :: AsError a => Getting (First ServiceError) a ServiceError
-_MethodNotAllowedException =
-  _MatchServiceError ioTData "MethodNotAllowedException" . hasStatus 405
-
-
--- | An unexpected error has occurred.
---
---
-_InternalFailureException :: AsError a => Getting (First ServiceError) a ServiceError
-_InternalFailureException =
-  _MatchServiceError ioTData "InternalFailureException" . hasStatus 500
-
-
--- | The service is temporarily unavailable.
---
---
-_ServiceUnavailableException :: AsError a => Getting (First ServiceError) a ServiceError
-_ServiceUnavailableException =
-  _MatchServiceError ioTData "ServiceUnavailableException" . hasStatus 503
-
-
--- | You are not authorized to perform this operation.
---
---
-_UnauthorizedException :: AsError a => Getting (First ServiceError) a ServiceError
-_UnauthorizedException =
-  _MatchServiceError ioTData "UnauthorizedException" . hasStatus 401
-
-
--- | The specified resource does not exist.
---
---
-_ResourceNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_ResourceNotFoundException =
-  _MatchServiceError ioTData "ResourceNotFoundException" . hasStatus 404
-
-
--- | The document encoding is not supported.
---
---
-_UnsupportedDocumentEncodingException :: AsError a => Getting (First ServiceError) a ServiceError
-_UnsupportedDocumentEncodingException =
-  _MatchServiceError ioTData "UnsupportedDocumentEncodingException" .
-  hasStatus 415
-
diff --git a/gen/Network/AWS/IoTData/Types/Product.hs b/gen/Network/AWS/IoTData/Types/Product.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/Types/Product.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.IoTData.Types.Product
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.IoTData.Types.Product where
-
-import Network.AWS.IoTData.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
diff --git a/gen/Network/AWS/IoTData/Types/Sum.hs b/gen/Network/AWS/IoTData/Types/Sum.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/Types/Sum.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.IoTData.Types.Sum
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.IoTData.Types.Sum where
-
-import Network.AWS.Prelude
diff --git a/gen/Network/AWS/IoTData/UpdateThingShadow.hs b/gen/Network/AWS/IoTData/UpdateThingShadow.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/UpdateThingShadow.hs
+++ /dev/null
@@ -1,144 +0,0 @@
-{-# 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.IoTData.UpdateThingShadow
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Updates the thing shadow for the specified thing.
---
---
--- For more information, see <http://docs.aws.amazon.com/iot/latest/developerguide/API_UpdateThingShadow.html UpdateThingShadow> in the /AWS IoT Developer Guide/ .
---
-module Network.AWS.IoTData.UpdateThingShadow
-    (
-    -- * Creating a Request
-      updateThingShadow
-    , UpdateThingShadow
-    -- * Request Lenses
-    , utsThingName
-    , utsPayload
-
-    -- * Destructuring the Response
-    , updateThingShadowResponse
-    , UpdateThingShadowResponse
-    -- * Response Lenses
-    , utsrsPayload
-    , utsrsResponseStatus
-    ) where
-
-import Network.AWS.IoTData.Types
-import Network.AWS.IoTData.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | The input for the UpdateThingShadow operation.
---
---
---
--- /See:/ 'updateThingShadow' smart constructor.
-data UpdateThingShadow = UpdateThingShadow'
-  { _utsThingName :: !Text
-  , _utsPayload   :: !ByteString
-  } deriving (Eq, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UpdateThingShadow' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'utsThingName' - The name of the thing.
---
--- * 'utsPayload' - The state information, in JSON format.
-updateThingShadow
-    :: Text -- ^ 'utsThingName'
-    -> ByteString -- ^ 'utsPayload'
-    -> UpdateThingShadow
-updateThingShadow pThingName_ pPayload_ =
-  UpdateThingShadow' {_utsThingName = pThingName_, _utsPayload = pPayload_}
-
-
--- | The name of the thing.
-utsThingName :: Lens' UpdateThingShadow Text
-utsThingName = lens _utsThingName (\ s a -> s{_utsThingName = a})
-
--- | The state information, in JSON format.
-utsPayload :: Lens' UpdateThingShadow ByteString
-utsPayload = lens _utsPayload (\ s a -> s{_utsPayload = a})
-
-instance AWSRequest UpdateThingShadow where
-        type Rs UpdateThingShadow = UpdateThingShadowResponse
-        request = postBody ioTData
-        response
-          = receiveBytes
-              (\ s h x ->
-                 UpdateThingShadowResponse' <$>
-                   (pure (Just x)) <*> (pure (fromEnum s)))
-
-instance Hashable UpdateThingShadow where
-
-instance NFData UpdateThingShadow where
-
-instance ToBody UpdateThingShadow where
-        toBody = toBody . _utsPayload
-
-instance ToHeaders UpdateThingShadow where
-        toHeaders = const mempty
-
-instance ToPath UpdateThingShadow where
-        toPath UpdateThingShadow'{..}
-          = mconcat ["/things/", toBS _utsThingName, "/shadow"]
-
-instance ToQuery UpdateThingShadow where
-        toQuery = const mempty
-
--- | The output from the UpdateThingShadow operation.
---
---
---
--- /See:/ 'updateThingShadowResponse' smart constructor.
-data UpdateThingShadowResponse = UpdateThingShadowResponse'
-  { _utsrsPayload        :: !(Maybe ByteString)
-  , _utsrsResponseStatus :: !Int
-  } deriving (Eq, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UpdateThingShadowResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'utsrsPayload' - The state information, in JSON format.
---
--- * 'utsrsResponseStatus' - -- | The response status code.
-updateThingShadowResponse
-    :: Int -- ^ 'utsrsResponseStatus'
-    -> UpdateThingShadowResponse
-updateThingShadowResponse pResponseStatus_ =
-  UpdateThingShadowResponse'
-    {_utsrsPayload = Nothing, _utsrsResponseStatus = pResponseStatus_}
-
-
--- | The state information, in JSON format.
-utsrsPayload :: Lens' UpdateThingShadowResponse (Maybe ByteString)
-utsrsPayload = lens _utsrsPayload (\ s a -> s{_utsrsPayload = a})
-
--- | -- | The response status code.
-utsrsResponseStatus :: Lens' UpdateThingShadowResponse Int
-utsrsResponseStatus = lens _utsrsResponseStatus (\ s a -> s{_utsrsResponseStatus = a})
-
-instance NFData UpdateThingShadowResponse where
diff --git a/gen/Network/AWS/IoTData/Waiters.hs b/gen/Network/AWS/IoTData/Waiters.hs
deleted file mode 100644
--- a/gen/Network/AWS/IoTData/Waiters.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.IoTData.Waiters
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.IoTData.Waiters where
-
-import Network.AWS.IoTData.Types
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,20 +2,22 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2018 Brendan Hay
+-- Copyright   : (c) 2013-2023 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Maintainer  : Brendan Hay
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
---
 module Main (main) where
 
+import Test.Amazonka.IoTData
+import Test.Amazonka.IoTData.Internal
 import Test.Tasty
-import Test.AWS.IoTData
-import Test.AWS.IoTData.Internal
 
 main :: IO ()
-main = defaultMain $ testGroup "IoTData"
-    [ testGroup "tests"    tests
-    , testGroup "fixtures" fixtures
-    ]
+main =
+  defaultMain $
+    testGroup
+      "IoTData"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/AWS/Gen/IoTData.hs b/test/Test/AWS/Gen/IoTData.hs
deleted file mode 100644
--- a/test/Test/AWS/Gen/IoTData.hs
+++ /dev/null
@@ -1,111 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-orphans        #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Test.AWS.Gen.IoTData
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Gen.IoTData where
-
-import Data.Proxy
-import Network.AWS.IoTData
-import Test.AWS.Fixture
-import Test.AWS.IoTData.Internal
-import Test.AWS.Prelude
-import Test.Tasty
-
--- Auto-generated: the actual test selection needs to be manually placed into
--- the top-level so that real test data can be incrementally added.
---
--- This commented snippet is what the entire set should look like:
-
--- fixtures :: TestTree
--- fixtures =
---     [ testGroup "request"
---         [ requestGetThingShadow $
---             getThingShadow
---
---         , requestDeleteThingShadow $
---             deleteThingShadow
---
---         , requestUpdateThingShadow $
---             updateThingShadow
---
---         , requestPublish $
---             publish
---
---           ]
-
---     , testGroup "response"
---         [ responseGetThingShadow $
---             getThingShadowResponse
---
---         , responseDeleteThingShadow $
---             deleteThingShadowResponse
---
---         , responseUpdateThingShadow $
---             updateThingShadowResponse
---
---         , responsePublish $
---             publishResponse
---
---           ]
---     ]
-
--- Requests
-
-requestGetThingShadow :: GetThingShadow -> TestTree
-requestGetThingShadow = req
-    "GetThingShadow"
-    "fixture/GetThingShadow.yaml"
-
-requestDeleteThingShadow :: DeleteThingShadow -> TestTree
-requestDeleteThingShadow = req
-    "DeleteThingShadow"
-    "fixture/DeleteThingShadow.yaml"
-
-requestUpdateThingShadow :: UpdateThingShadow -> TestTree
-requestUpdateThingShadow = req
-    "UpdateThingShadow"
-    "fixture/UpdateThingShadow.yaml"
-
-requestPublish :: Publish -> TestTree
-requestPublish = req
-    "Publish"
-    "fixture/Publish.yaml"
-
--- Responses
-
-responseGetThingShadow :: GetThingShadowResponse -> TestTree
-responseGetThingShadow = res
-    "GetThingShadowResponse"
-    "fixture/GetThingShadowResponse.proto"
-    ioTData
-    (Proxy :: Proxy GetThingShadow)
-
-responseDeleteThingShadow :: DeleteThingShadowResponse -> TestTree
-responseDeleteThingShadow = res
-    "DeleteThingShadowResponse"
-    "fixture/DeleteThingShadowResponse.proto"
-    ioTData
-    (Proxy :: Proxy DeleteThingShadow)
-
-responseUpdateThingShadow :: UpdateThingShadowResponse -> TestTree
-responseUpdateThingShadow = res
-    "UpdateThingShadowResponse"
-    "fixture/UpdateThingShadowResponse.proto"
-    ioTData
-    (Proxy :: Proxy UpdateThingShadow)
-
-responsePublish :: PublishResponse -> TestTree
-responsePublish = res
-    "PublishResponse"
-    "fixture/PublishResponse.proto"
-    ioTData
-    (Proxy :: Proxy Publish)
diff --git a/test/Test/AWS/IoTData.hs b/test/Test/AWS/IoTData.hs
deleted file mode 100644
--- a/test/Test/AWS/IoTData.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- |
--- Module      : Test.AWS.IoTData
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.IoTData
-    ( tests
-    , fixtures
-    ) where
-
-import Test.Tasty (TestTree)
-
-tests :: [TestTree]
-tests = []
-
-fixtures :: [TestTree]
-fixtures = []
diff --git a/test/Test/AWS/IoTData/Internal.hs b/test/Test/AWS/IoTData/Internal.hs
deleted file mode 100644
--- a/test/Test/AWS/IoTData/Internal.hs
+++ /dev/null
@@ -1,9 +0,0 @@
--- |
--- Module      : Test.AWS.IoTData.Internal
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.IoTData.Internal where
diff --git a/test/Test/Amazonka/Gen/IoTData.hs b/test/Test/Amazonka/Gen/IoTData.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/IoTData.hs
@@ -0,0 +1,178 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.IoTData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.IoTData where
+
+import Amazonka.IoTData
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.IoTData.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestDeleteThingShadow $
+--             newDeleteThingShadow
+--
+--         , requestGetRetainedMessage $
+--             newGetRetainedMessage
+--
+--         , requestGetThingShadow $
+--             newGetThingShadow
+--
+--         , requestListNamedShadowsForThing $
+--             newListNamedShadowsForThing
+--
+--         , requestListRetainedMessages $
+--             newListRetainedMessages
+--
+--         , requestPublish $
+--             newPublish
+--
+--         , requestUpdateThingShadow $
+--             newUpdateThingShadow
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseDeleteThingShadow $
+--             newDeleteThingShadowResponse
+--
+--         , responseGetRetainedMessage $
+--             newGetRetainedMessageResponse
+--
+--         , responseGetThingShadow $
+--             newGetThingShadowResponse
+--
+--         , responseListNamedShadowsForThing $
+--             newListNamedShadowsForThingResponse
+--
+--         , responseListRetainedMessages $
+--             newListRetainedMessagesResponse
+--
+--         , responsePublish $
+--             newPublishResponse
+--
+--         , responseUpdateThingShadow $
+--             newUpdateThingShadowResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestDeleteThingShadow :: DeleteThingShadow -> TestTree
+requestDeleteThingShadow =
+  req
+    "DeleteThingShadow"
+    "fixture/DeleteThingShadow.yaml"
+
+requestGetRetainedMessage :: GetRetainedMessage -> TestTree
+requestGetRetainedMessage =
+  req
+    "GetRetainedMessage"
+    "fixture/GetRetainedMessage.yaml"
+
+requestGetThingShadow :: GetThingShadow -> TestTree
+requestGetThingShadow =
+  req
+    "GetThingShadow"
+    "fixture/GetThingShadow.yaml"
+
+requestListNamedShadowsForThing :: ListNamedShadowsForThing -> TestTree
+requestListNamedShadowsForThing =
+  req
+    "ListNamedShadowsForThing"
+    "fixture/ListNamedShadowsForThing.yaml"
+
+requestListRetainedMessages :: ListRetainedMessages -> TestTree
+requestListRetainedMessages =
+  req
+    "ListRetainedMessages"
+    "fixture/ListRetainedMessages.yaml"
+
+requestPublish :: Publish -> TestTree
+requestPublish =
+  req
+    "Publish"
+    "fixture/Publish.yaml"
+
+requestUpdateThingShadow :: UpdateThingShadow -> TestTree
+requestUpdateThingShadow =
+  req
+    "UpdateThingShadow"
+    "fixture/UpdateThingShadow.yaml"
+
+-- Responses
+
+responseDeleteThingShadow :: DeleteThingShadowResponse -> TestTree
+responseDeleteThingShadow =
+  res
+    "DeleteThingShadowResponse"
+    "fixture/DeleteThingShadowResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteThingShadow)
+
+responseGetRetainedMessage :: GetRetainedMessageResponse -> TestTree
+responseGetRetainedMessage =
+  res
+    "GetRetainedMessageResponse"
+    "fixture/GetRetainedMessageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRetainedMessage)
+
+responseGetThingShadow :: GetThingShadowResponse -> TestTree
+responseGetThingShadow =
+  res
+    "GetThingShadowResponse"
+    "fixture/GetThingShadowResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetThingShadow)
+
+responseListNamedShadowsForThing :: ListNamedShadowsForThingResponse -> TestTree
+responseListNamedShadowsForThing =
+  res
+    "ListNamedShadowsForThingResponse"
+    "fixture/ListNamedShadowsForThingResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListNamedShadowsForThing)
+
+responseListRetainedMessages :: ListRetainedMessagesResponse -> TestTree
+responseListRetainedMessages =
+  res
+    "ListRetainedMessagesResponse"
+    "fixture/ListRetainedMessagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRetainedMessages)
+
+responsePublish :: PublishResponse -> TestTree
+responsePublish =
+  res
+    "PublishResponse"
+    "fixture/PublishResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy Publish)
+
+responseUpdateThingShadow :: UpdateThingShadowResponse -> TestTree
+responseUpdateThingShadow =
+  res
+    "UpdateThingShadowResponse"
+    "fixture/UpdateThingShadowResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateThingShadow)
diff --git a/test/Test/Amazonka/IoTData.hs b/test/Test/Amazonka/IoTData.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IoTData.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.IoTData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.IoTData
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/IoTData/Internal.hs b/test/Test/Amazonka/IoTData/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IoTData/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.IoTData.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.IoTData.Internal where
