diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon IoT TwinMaker SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-11-29@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-iottwinmaker)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, 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
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.IotTwinMaker](http://hackage.haskell.org/package/amazonka-iottwinmaker/docs/Amazonka-IotTwinMaker.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-iottwinmaker` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-iottwinmaker.cabal b/amazonka-iottwinmaker.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-iottwinmaker.cabal
@@ -0,0 +1,185 @@
+cabal-version:      2.2
+name:               amazonka-iottwinmaker
+version:            2.0
+synopsis:           Amazon IoT TwinMaker 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:
+  Derived from API version @2021-11-29@ 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.IotTwinMaker.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.IotTwinMaker" 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-iottwinmaker
+
+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:
+    Amazonka.IotTwinMaker
+    Amazonka.IotTwinMaker.BatchPutPropertyValues
+    Amazonka.IotTwinMaker.CreateComponentType
+    Amazonka.IotTwinMaker.CreateEntity
+    Amazonka.IotTwinMaker.CreateScene
+    Amazonka.IotTwinMaker.CreateSyncJob
+    Amazonka.IotTwinMaker.CreateWorkspace
+    Amazonka.IotTwinMaker.DeleteComponentType
+    Amazonka.IotTwinMaker.DeleteEntity
+    Amazonka.IotTwinMaker.DeleteScene
+    Amazonka.IotTwinMaker.DeleteSyncJob
+    Amazonka.IotTwinMaker.DeleteWorkspace
+    Amazonka.IotTwinMaker.ExecuteQuery
+    Amazonka.IotTwinMaker.GetComponentType
+    Amazonka.IotTwinMaker.GetEntity
+    Amazonka.IotTwinMaker.GetPricingPlan
+    Amazonka.IotTwinMaker.GetPropertyValue
+    Amazonka.IotTwinMaker.GetPropertyValueHistory
+    Amazonka.IotTwinMaker.GetScene
+    Amazonka.IotTwinMaker.GetSyncJob
+    Amazonka.IotTwinMaker.GetWorkspace
+    Amazonka.IotTwinMaker.Lens
+    Amazonka.IotTwinMaker.ListComponentTypes
+    Amazonka.IotTwinMaker.ListEntities
+    Amazonka.IotTwinMaker.ListScenes
+    Amazonka.IotTwinMaker.ListSyncJobs
+    Amazonka.IotTwinMaker.ListSyncResources
+    Amazonka.IotTwinMaker.ListTagsForResource
+    Amazonka.IotTwinMaker.ListWorkspaces
+    Amazonka.IotTwinMaker.TagResource
+    Amazonka.IotTwinMaker.Types
+    Amazonka.IotTwinMaker.Types.BatchPutPropertyError
+    Amazonka.IotTwinMaker.Types.BatchPutPropertyErrorEntry
+    Amazonka.IotTwinMaker.Types.BundleInformation
+    Amazonka.IotTwinMaker.Types.ColumnDescription
+    Amazonka.IotTwinMaker.Types.ColumnType
+    Amazonka.IotTwinMaker.Types.ComponentPropertyGroupRequest
+    Amazonka.IotTwinMaker.Types.ComponentPropertyGroupResponse
+    Amazonka.IotTwinMaker.Types.ComponentRequest
+    Amazonka.IotTwinMaker.Types.ComponentResponse
+    Amazonka.IotTwinMaker.Types.ComponentTypeSummary
+    Amazonka.IotTwinMaker.Types.ComponentUpdateRequest
+    Amazonka.IotTwinMaker.Types.ComponentUpdateType
+    Amazonka.IotTwinMaker.Types.DataConnector
+    Amazonka.IotTwinMaker.Types.DataType
+    Amazonka.IotTwinMaker.Types.DataValue
+    Amazonka.IotTwinMaker.Types.EntityPropertyReference
+    Amazonka.IotTwinMaker.Types.EntitySummary
+    Amazonka.IotTwinMaker.Types.ErrorCode
+    Amazonka.IotTwinMaker.Types.ErrorDetails
+    Amazonka.IotTwinMaker.Types.FunctionRequest
+    Amazonka.IotTwinMaker.Types.FunctionResponse
+    Amazonka.IotTwinMaker.Types.GroupType
+    Amazonka.IotTwinMaker.Types.InterpolationParameters
+    Amazonka.IotTwinMaker.Types.InterpolationType
+    Amazonka.IotTwinMaker.Types.LambdaFunction
+    Amazonka.IotTwinMaker.Types.ListComponentTypesFilter
+    Amazonka.IotTwinMaker.Types.ListEntitiesFilter
+    Amazonka.IotTwinMaker.Types.Order
+    Amazonka.IotTwinMaker.Types.OrderBy
+    Amazonka.IotTwinMaker.Types.OrderByTime
+    Amazonka.IotTwinMaker.Types.ParentEntityUpdateRequest
+    Amazonka.IotTwinMaker.Types.ParentEntityUpdateType
+    Amazonka.IotTwinMaker.Types.PricingMode
+    Amazonka.IotTwinMaker.Types.PricingPlan
+    Amazonka.IotTwinMaker.Types.PricingTier
+    Amazonka.IotTwinMaker.Types.PropertyDefinitionRequest
+    Amazonka.IotTwinMaker.Types.PropertyDefinitionResponse
+    Amazonka.IotTwinMaker.Types.PropertyFilter
+    Amazonka.IotTwinMaker.Types.PropertyGroupRequest
+    Amazonka.IotTwinMaker.Types.PropertyGroupResponse
+    Amazonka.IotTwinMaker.Types.PropertyGroupUpdateType
+    Amazonka.IotTwinMaker.Types.PropertyLatestValue
+    Amazonka.IotTwinMaker.Types.PropertyRequest
+    Amazonka.IotTwinMaker.Types.PropertyResponse
+    Amazonka.IotTwinMaker.Types.PropertyUpdateType
+    Amazonka.IotTwinMaker.Types.PropertyValue
+    Amazonka.IotTwinMaker.Types.PropertyValueEntry
+    Amazonka.IotTwinMaker.Types.PropertyValueHistory
+    Amazonka.IotTwinMaker.Types.QueryResultValue
+    Amazonka.IotTwinMaker.Types.Relationship
+    Amazonka.IotTwinMaker.Types.RelationshipValue
+    Amazonka.IotTwinMaker.Types.Row
+    Amazonka.IotTwinMaker.Types.SceneSummary
+    Amazonka.IotTwinMaker.Types.Scope
+    Amazonka.IotTwinMaker.Types.State
+    Amazonka.IotTwinMaker.Types.Status
+    Amazonka.IotTwinMaker.Types.SyncJobState
+    Amazonka.IotTwinMaker.Types.SyncJobStatus
+    Amazonka.IotTwinMaker.Types.SyncJobSummary
+    Amazonka.IotTwinMaker.Types.SyncResourceFilter
+    Amazonka.IotTwinMaker.Types.SyncResourceState
+    Amazonka.IotTwinMaker.Types.SyncResourceStatus
+    Amazonka.IotTwinMaker.Types.SyncResourceSummary
+    Amazonka.IotTwinMaker.Types.SyncResourceType
+    Amazonka.IotTwinMaker.Types.TabularConditions
+    Amazonka.IotTwinMaker.Types.Type
+    Amazonka.IotTwinMaker.Types.UpdateReason
+    Amazonka.IotTwinMaker.Types.WorkspaceSummary
+    Amazonka.IotTwinMaker.UntagResource
+    Amazonka.IotTwinMaker.UpdateComponentType
+    Amazonka.IotTwinMaker.UpdateEntity
+    Amazonka.IotTwinMaker.UpdatePricingPlan
+    Amazonka.IotTwinMaker.UpdateScene
+    Amazonka.IotTwinMaker.UpdateWorkspace
+    Amazonka.IotTwinMaker.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-iottwinmaker-test
+  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.Amazonka.Gen.IotTwinMaker
+    Test.Amazonka.IotTwinMaker
+    Test.Amazonka.IotTwinMaker.Internal
+
+  build-depends:
+    , amazonka-core          >=2.0 && <2.1
+    , amazonka-iottwinmaker
+    , amazonka-test          >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchPutPropertyValues.yaml b/fixture/BatchPutPropertyValues.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchPutPropertyValues.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/BatchPutPropertyValuesResponse.proto b/fixture/BatchPutPropertyValuesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchPutPropertyValuesResponse.proto
diff --git a/fixture/CreateComponentType.yaml b/fixture/CreateComponentType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateComponentType.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/CreateComponentTypeResponse.proto b/fixture/CreateComponentTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateComponentTypeResponse.proto
diff --git a/fixture/CreateEntity.yaml b/fixture/CreateEntity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEntity.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/CreateEntityResponse.proto b/fixture/CreateEntityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEntityResponse.proto
diff --git a/fixture/CreateScene.yaml b/fixture/CreateScene.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateScene.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/CreateSceneResponse.proto b/fixture/CreateSceneResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSceneResponse.proto
diff --git a/fixture/CreateSyncJob.yaml b/fixture/CreateSyncJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSyncJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/CreateSyncJobResponse.proto b/fixture/CreateSyncJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSyncJobResponse.proto
diff --git a/fixture/CreateWorkspace.yaml b/fixture/CreateWorkspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateWorkspace.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/CreateWorkspaceResponse.proto b/fixture/CreateWorkspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateWorkspaceResponse.proto
diff --git a/fixture/DeleteComponentType.yaml b/fixture/DeleteComponentType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteComponentType.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/DeleteComponentTypeResponse.proto b/fixture/DeleteComponentTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteComponentTypeResponse.proto
diff --git a/fixture/DeleteEntity.yaml b/fixture/DeleteEntity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEntity.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/DeleteEntityResponse.proto b/fixture/DeleteEntityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEntityResponse.proto
diff --git a/fixture/DeleteScene.yaml b/fixture/DeleteScene.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteScene.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/DeleteSceneResponse.proto b/fixture/DeleteSceneResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSceneResponse.proto
diff --git a/fixture/DeleteSyncJob.yaml b/fixture/DeleteSyncJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSyncJob.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/DeleteSyncJobResponse.proto b/fixture/DeleteSyncJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSyncJobResponse.proto
diff --git a/fixture/DeleteWorkspace.yaml b/fixture/DeleteWorkspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteWorkspace.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/DeleteWorkspaceResponse.proto b/fixture/DeleteWorkspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteWorkspaceResponse.proto
diff --git a/fixture/ExecuteQuery.yaml b/fixture/ExecuteQuery.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ExecuteQuery.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ExecuteQueryResponse.proto b/fixture/ExecuteQueryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ExecuteQueryResponse.proto
diff --git a/fixture/GetComponentType.yaml b/fixture/GetComponentType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponentType.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetComponentTypeResponse.proto b/fixture/GetComponentTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetComponentTypeResponse.proto
diff --git a/fixture/GetEntity.yaml b/fixture/GetEntity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetEntity.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetEntityResponse.proto b/fixture/GetEntityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetEntityResponse.proto
diff --git a/fixture/GetPricingPlan.yaml b/fixture/GetPricingPlan.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPricingPlan.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetPricingPlanResponse.proto b/fixture/GetPricingPlanResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPricingPlanResponse.proto
diff --git a/fixture/GetPropertyValue.yaml b/fixture/GetPropertyValue.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPropertyValue.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetPropertyValueHistory.yaml b/fixture/GetPropertyValueHistory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPropertyValueHistory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetPropertyValueHistoryResponse.proto b/fixture/GetPropertyValueHistoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPropertyValueHistoryResponse.proto
diff --git a/fixture/GetPropertyValueResponse.proto b/fixture/GetPropertyValueResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPropertyValueResponse.proto
diff --git a/fixture/GetScene.yaml b/fixture/GetScene.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetScene.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetSceneResponse.proto b/fixture/GetSceneResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSceneResponse.proto
diff --git a/fixture/GetSyncJob.yaml b/fixture/GetSyncJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSyncJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetSyncJobResponse.proto b/fixture/GetSyncJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSyncJobResponse.proto
diff --git a/fixture/GetWorkspace.yaml b/fixture/GetWorkspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkspace.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/GetWorkspaceResponse.proto b/fixture/GetWorkspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetWorkspaceResponse.proto
diff --git a/fixture/ListComponentTypes.yaml b/fixture/ListComponentTypes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponentTypes.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListComponentTypesResponse.proto b/fixture/ListComponentTypesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListComponentTypesResponse.proto
diff --git a/fixture/ListEntities.yaml b/fixture/ListEntities.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEntities.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListEntitiesResponse.proto b/fixture/ListEntitiesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEntitiesResponse.proto
diff --git a/fixture/ListScenes.yaml b/fixture/ListScenes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListScenes.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListScenesResponse.proto b/fixture/ListScenesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListScenesResponse.proto
diff --git a/fixture/ListSyncJobs.yaml b/fixture/ListSyncJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSyncJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListSyncJobsResponse.proto b/fixture/ListSyncJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSyncJobsResponse.proto
diff --git a/fixture/ListSyncResources.yaml b/fixture/ListSyncResources.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSyncResources.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListSyncResourcesResponse.proto b/fixture/ListSyncResourcesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSyncResourcesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/ListWorkspaces.yaml b/fixture/ListWorkspaces.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListWorkspaces.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/ListWorkspacesResponse.proto b/fixture/ListWorkspacesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListWorkspacesResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateComponentType.yaml b/fixture/UpdateComponentType.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateComponentType.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UpdateComponentTypeResponse.proto b/fixture/UpdateComponentTypeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateComponentTypeResponse.proto
diff --git a/fixture/UpdateEntity.yaml b/fixture/UpdateEntity.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEntity.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UpdateEntityResponse.proto b/fixture/UpdateEntityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEntityResponse.proto
diff --git a/fixture/UpdatePricingPlan.yaml b/fixture/UpdatePricingPlan.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePricingPlan.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UpdatePricingPlanResponse.proto b/fixture/UpdatePricingPlanResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePricingPlanResponse.proto
diff --git a/fixture/UpdateScene.yaml b/fixture/UpdateScene.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateScene.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UpdateSceneResponse.proto b/fixture/UpdateSceneResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSceneResponse.proto
diff --git a/fixture/UpdateWorkspace.yaml b/fixture/UpdateWorkspace.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateWorkspace.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iottwinmaker/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iottwinmaker.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/UpdateWorkspaceResponse.proto b/fixture/UpdateWorkspaceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateWorkspaceResponse.proto
diff --git a/gen/Amazonka/IotTwinMaker.hs b/gen/Amazonka/IotTwinMaker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker.hs
@@ -0,0 +1,590 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.IotTwinMaker
+-- 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 @2021-11-29@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- IoT TwinMaker is a service that enables you to build operational digital
+-- twins of physical systems. IoT TwinMaker overlays measurements and
+-- analysis from real-world sensors, cameras, and enterprise applications
+-- so you can create data visualizations to monitor your physical factory,
+-- building, or industrial plant. You can use this real-world data to
+-- monitor operations and diagnose and repair errors.
+module Amazonka.IotTwinMaker
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** ConnectorFailureException
+    _ConnectorFailureException,
+
+    -- ** ConnectorTimeoutException
+    _ConnectorTimeoutException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** QueryTimeoutException
+    _QueryTimeoutException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchPutPropertyValues
+    BatchPutPropertyValues (BatchPutPropertyValues'),
+    newBatchPutPropertyValues,
+    BatchPutPropertyValuesResponse (BatchPutPropertyValuesResponse'),
+    newBatchPutPropertyValuesResponse,
+
+    -- ** CreateComponentType
+    CreateComponentType (CreateComponentType'),
+    newCreateComponentType,
+    CreateComponentTypeResponse (CreateComponentTypeResponse'),
+    newCreateComponentTypeResponse,
+
+    -- ** CreateEntity
+    CreateEntity (CreateEntity'),
+    newCreateEntity,
+    CreateEntityResponse (CreateEntityResponse'),
+    newCreateEntityResponse,
+
+    -- ** CreateScene
+    CreateScene (CreateScene'),
+    newCreateScene,
+    CreateSceneResponse (CreateSceneResponse'),
+    newCreateSceneResponse,
+
+    -- ** CreateSyncJob
+    CreateSyncJob (CreateSyncJob'),
+    newCreateSyncJob,
+    CreateSyncJobResponse (CreateSyncJobResponse'),
+    newCreateSyncJobResponse,
+
+    -- ** CreateWorkspace
+    CreateWorkspace (CreateWorkspace'),
+    newCreateWorkspace,
+    CreateWorkspaceResponse (CreateWorkspaceResponse'),
+    newCreateWorkspaceResponse,
+
+    -- ** DeleteComponentType
+    DeleteComponentType (DeleteComponentType'),
+    newDeleteComponentType,
+    DeleteComponentTypeResponse (DeleteComponentTypeResponse'),
+    newDeleteComponentTypeResponse,
+
+    -- ** DeleteEntity
+    DeleteEntity (DeleteEntity'),
+    newDeleteEntity,
+    DeleteEntityResponse (DeleteEntityResponse'),
+    newDeleteEntityResponse,
+
+    -- ** DeleteScene
+    DeleteScene (DeleteScene'),
+    newDeleteScene,
+    DeleteSceneResponse (DeleteSceneResponse'),
+    newDeleteSceneResponse,
+
+    -- ** DeleteSyncJob
+    DeleteSyncJob (DeleteSyncJob'),
+    newDeleteSyncJob,
+    DeleteSyncJobResponse (DeleteSyncJobResponse'),
+    newDeleteSyncJobResponse,
+
+    -- ** DeleteWorkspace
+    DeleteWorkspace (DeleteWorkspace'),
+    newDeleteWorkspace,
+    DeleteWorkspaceResponse (DeleteWorkspaceResponse'),
+    newDeleteWorkspaceResponse,
+
+    -- ** ExecuteQuery
+    ExecuteQuery (ExecuteQuery'),
+    newExecuteQuery,
+    ExecuteQueryResponse (ExecuteQueryResponse'),
+    newExecuteQueryResponse,
+
+    -- ** GetComponentType
+    GetComponentType (GetComponentType'),
+    newGetComponentType,
+    GetComponentTypeResponse (GetComponentTypeResponse'),
+    newGetComponentTypeResponse,
+
+    -- ** GetEntity
+    GetEntity (GetEntity'),
+    newGetEntity,
+    GetEntityResponse (GetEntityResponse'),
+    newGetEntityResponse,
+
+    -- ** GetPricingPlan
+    GetPricingPlan (GetPricingPlan'),
+    newGetPricingPlan,
+    GetPricingPlanResponse (GetPricingPlanResponse'),
+    newGetPricingPlanResponse,
+
+    -- ** GetPropertyValue
+    GetPropertyValue (GetPropertyValue'),
+    newGetPropertyValue,
+    GetPropertyValueResponse (GetPropertyValueResponse'),
+    newGetPropertyValueResponse,
+
+    -- ** GetPropertyValueHistory
+    GetPropertyValueHistory (GetPropertyValueHistory'),
+    newGetPropertyValueHistory,
+    GetPropertyValueHistoryResponse (GetPropertyValueHistoryResponse'),
+    newGetPropertyValueHistoryResponse,
+
+    -- ** GetScene
+    GetScene (GetScene'),
+    newGetScene,
+    GetSceneResponse (GetSceneResponse'),
+    newGetSceneResponse,
+
+    -- ** GetSyncJob
+    GetSyncJob (GetSyncJob'),
+    newGetSyncJob,
+    GetSyncJobResponse (GetSyncJobResponse'),
+    newGetSyncJobResponse,
+
+    -- ** GetWorkspace
+    GetWorkspace (GetWorkspace'),
+    newGetWorkspace,
+    GetWorkspaceResponse (GetWorkspaceResponse'),
+    newGetWorkspaceResponse,
+
+    -- ** ListComponentTypes
+    ListComponentTypes (ListComponentTypes'),
+    newListComponentTypes,
+    ListComponentTypesResponse (ListComponentTypesResponse'),
+    newListComponentTypesResponse,
+
+    -- ** ListEntities
+    ListEntities (ListEntities'),
+    newListEntities,
+    ListEntitiesResponse (ListEntitiesResponse'),
+    newListEntitiesResponse,
+
+    -- ** ListScenes
+    ListScenes (ListScenes'),
+    newListScenes,
+    ListScenesResponse (ListScenesResponse'),
+    newListScenesResponse,
+
+    -- ** ListSyncJobs
+    ListSyncJobs (ListSyncJobs'),
+    newListSyncJobs,
+    ListSyncJobsResponse (ListSyncJobsResponse'),
+    newListSyncJobsResponse,
+
+    -- ** ListSyncResources
+    ListSyncResources (ListSyncResources'),
+    newListSyncResources,
+    ListSyncResourcesResponse (ListSyncResourcesResponse'),
+    newListSyncResourcesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListWorkspaces
+    ListWorkspaces (ListWorkspaces'),
+    newListWorkspaces,
+    ListWorkspacesResponse (ListWorkspacesResponse'),
+    newListWorkspacesResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateComponentType
+    UpdateComponentType (UpdateComponentType'),
+    newUpdateComponentType,
+    UpdateComponentTypeResponse (UpdateComponentTypeResponse'),
+    newUpdateComponentTypeResponse,
+
+    -- ** UpdateEntity
+    UpdateEntity (UpdateEntity'),
+    newUpdateEntity,
+    UpdateEntityResponse (UpdateEntityResponse'),
+    newUpdateEntityResponse,
+
+    -- ** UpdatePricingPlan
+    UpdatePricingPlan (UpdatePricingPlan'),
+    newUpdatePricingPlan,
+    UpdatePricingPlanResponse (UpdatePricingPlanResponse'),
+    newUpdatePricingPlanResponse,
+
+    -- ** UpdateScene
+    UpdateScene (UpdateScene'),
+    newUpdateScene,
+    UpdateSceneResponse (UpdateSceneResponse'),
+    newUpdateSceneResponse,
+
+    -- ** UpdateWorkspace
+    UpdateWorkspace (UpdateWorkspace'),
+    newUpdateWorkspace,
+    UpdateWorkspaceResponse (UpdateWorkspaceResponse'),
+    newUpdateWorkspaceResponse,
+
+    -- * Types
+
+    -- ** ColumnType
+    ColumnType (..),
+
+    -- ** ComponentUpdateType
+    ComponentUpdateType (..),
+
+    -- ** ErrorCode
+    ErrorCode (..),
+
+    -- ** GroupType
+    GroupType (..),
+
+    -- ** InterpolationType
+    InterpolationType (..),
+
+    -- ** Order
+    Order (..),
+
+    -- ** OrderByTime
+    OrderByTime (..),
+
+    -- ** ParentEntityUpdateType
+    ParentEntityUpdateType (..),
+
+    -- ** PricingMode
+    PricingMode (..),
+
+    -- ** PricingTier
+    PricingTier (..),
+
+    -- ** PropertyGroupUpdateType
+    PropertyGroupUpdateType (..),
+
+    -- ** PropertyUpdateType
+    PropertyUpdateType (..),
+
+    -- ** Scope
+    Scope (..),
+
+    -- ** State
+    State (..),
+
+    -- ** SyncJobState
+    SyncJobState (..),
+
+    -- ** SyncResourceState
+    SyncResourceState (..),
+
+    -- ** SyncResourceType
+    SyncResourceType (..),
+
+    -- ** Type
+    Type (..),
+
+    -- ** UpdateReason
+    UpdateReason (..),
+
+    -- ** BatchPutPropertyError
+    BatchPutPropertyError (BatchPutPropertyError'),
+    newBatchPutPropertyError,
+
+    -- ** BatchPutPropertyErrorEntry
+    BatchPutPropertyErrorEntry (BatchPutPropertyErrorEntry'),
+    newBatchPutPropertyErrorEntry,
+
+    -- ** BundleInformation
+    BundleInformation (BundleInformation'),
+    newBundleInformation,
+
+    -- ** ColumnDescription
+    ColumnDescription (ColumnDescription'),
+    newColumnDescription,
+
+    -- ** ComponentPropertyGroupRequest
+    ComponentPropertyGroupRequest (ComponentPropertyGroupRequest'),
+    newComponentPropertyGroupRequest,
+
+    -- ** ComponentPropertyGroupResponse
+    ComponentPropertyGroupResponse (ComponentPropertyGroupResponse'),
+    newComponentPropertyGroupResponse,
+
+    -- ** ComponentRequest
+    ComponentRequest (ComponentRequest'),
+    newComponentRequest,
+
+    -- ** ComponentResponse
+    ComponentResponse (ComponentResponse'),
+    newComponentResponse,
+
+    -- ** ComponentTypeSummary
+    ComponentTypeSummary (ComponentTypeSummary'),
+    newComponentTypeSummary,
+
+    -- ** ComponentUpdateRequest
+    ComponentUpdateRequest (ComponentUpdateRequest'),
+    newComponentUpdateRequest,
+
+    -- ** DataConnector
+    DataConnector (DataConnector'),
+    newDataConnector,
+
+    -- ** DataType
+    DataType (DataType'),
+    newDataType,
+
+    -- ** DataValue
+    DataValue (DataValue'),
+    newDataValue,
+
+    -- ** EntityPropertyReference
+    EntityPropertyReference (EntityPropertyReference'),
+    newEntityPropertyReference,
+
+    -- ** EntitySummary
+    EntitySummary (EntitySummary'),
+    newEntitySummary,
+
+    -- ** ErrorDetails
+    ErrorDetails (ErrorDetails'),
+    newErrorDetails,
+
+    -- ** FunctionRequest
+    FunctionRequest (FunctionRequest'),
+    newFunctionRequest,
+
+    -- ** FunctionResponse
+    FunctionResponse (FunctionResponse'),
+    newFunctionResponse,
+
+    -- ** InterpolationParameters
+    InterpolationParameters (InterpolationParameters'),
+    newInterpolationParameters,
+
+    -- ** LambdaFunction
+    LambdaFunction (LambdaFunction'),
+    newLambdaFunction,
+
+    -- ** ListComponentTypesFilter
+    ListComponentTypesFilter (ListComponentTypesFilter'),
+    newListComponentTypesFilter,
+
+    -- ** ListEntitiesFilter
+    ListEntitiesFilter (ListEntitiesFilter'),
+    newListEntitiesFilter,
+
+    -- ** OrderBy
+    OrderBy (OrderBy'),
+    newOrderBy,
+
+    -- ** ParentEntityUpdateRequest
+    ParentEntityUpdateRequest (ParentEntityUpdateRequest'),
+    newParentEntityUpdateRequest,
+
+    -- ** PricingPlan
+    PricingPlan (PricingPlan'),
+    newPricingPlan,
+
+    -- ** PropertyDefinitionRequest
+    PropertyDefinitionRequest (PropertyDefinitionRequest'),
+    newPropertyDefinitionRequest,
+
+    -- ** PropertyDefinitionResponse
+    PropertyDefinitionResponse (PropertyDefinitionResponse'),
+    newPropertyDefinitionResponse,
+
+    -- ** PropertyFilter
+    PropertyFilter (PropertyFilter'),
+    newPropertyFilter,
+
+    -- ** PropertyGroupRequest
+    PropertyGroupRequest (PropertyGroupRequest'),
+    newPropertyGroupRequest,
+
+    -- ** PropertyGroupResponse
+    PropertyGroupResponse (PropertyGroupResponse'),
+    newPropertyGroupResponse,
+
+    -- ** PropertyLatestValue
+    PropertyLatestValue (PropertyLatestValue'),
+    newPropertyLatestValue,
+
+    -- ** PropertyRequest
+    PropertyRequest (PropertyRequest'),
+    newPropertyRequest,
+
+    -- ** PropertyResponse
+    PropertyResponse (PropertyResponse'),
+    newPropertyResponse,
+
+    -- ** PropertyValue
+    PropertyValue (PropertyValue'),
+    newPropertyValue,
+
+    -- ** PropertyValueEntry
+    PropertyValueEntry (PropertyValueEntry'),
+    newPropertyValueEntry,
+
+    -- ** PropertyValueHistory
+    PropertyValueHistory (PropertyValueHistory'),
+    newPropertyValueHistory,
+
+    -- ** QueryResultValue
+    QueryResultValue (QueryResultValue'),
+    newQueryResultValue,
+
+    -- ** Relationship
+    Relationship (Relationship'),
+    newRelationship,
+
+    -- ** RelationshipValue
+    RelationshipValue (RelationshipValue'),
+    newRelationshipValue,
+
+    -- ** Row
+    Row (Row'),
+    newRow,
+
+    -- ** SceneSummary
+    SceneSummary (SceneSummary'),
+    newSceneSummary,
+
+    -- ** Status
+    Status (Status'),
+    newStatus,
+
+    -- ** SyncJobStatus
+    SyncJobStatus (SyncJobStatus'),
+    newSyncJobStatus,
+
+    -- ** SyncJobSummary
+    SyncJobSummary (SyncJobSummary'),
+    newSyncJobSummary,
+
+    -- ** SyncResourceFilter
+    SyncResourceFilter (SyncResourceFilter'),
+    newSyncResourceFilter,
+
+    -- ** SyncResourceStatus
+    SyncResourceStatus (SyncResourceStatus'),
+    newSyncResourceStatus,
+
+    -- ** SyncResourceSummary
+    SyncResourceSummary (SyncResourceSummary'),
+    newSyncResourceSummary,
+
+    -- ** TabularConditions
+    TabularConditions (TabularConditions'),
+    newTabularConditions,
+
+    -- ** WorkspaceSummary
+    WorkspaceSummary (WorkspaceSummary'),
+    newWorkspaceSummary,
+  )
+where
+
+import Amazonka.IotTwinMaker.BatchPutPropertyValues
+import Amazonka.IotTwinMaker.CreateComponentType
+import Amazonka.IotTwinMaker.CreateEntity
+import Amazonka.IotTwinMaker.CreateScene
+import Amazonka.IotTwinMaker.CreateSyncJob
+import Amazonka.IotTwinMaker.CreateWorkspace
+import Amazonka.IotTwinMaker.DeleteComponentType
+import Amazonka.IotTwinMaker.DeleteEntity
+import Amazonka.IotTwinMaker.DeleteScene
+import Amazonka.IotTwinMaker.DeleteSyncJob
+import Amazonka.IotTwinMaker.DeleteWorkspace
+import Amazonka.IotTwinMaker.ExecuteQuery
+import Amazonka.IotTwinMaker.GetComponentType
+import Amazonka.IotTwinMaker.GetEntity
+import Amazonka.IotTwinMaker.GetPricingPlan
+import Amazonka.IotTwinMaker.GetPropertyValue
+import Amazonka.IotTwinMaker.GetPropertyValueHistory
+import Amazonka.IotTwinMaker.GetScene
+import Amazonka.IotTwinMaker.GetSyncJob
+import Amazonka.IotTwinMaker.GetWorkspace
+import Amazonka.IotTwinMaker.Lens
+import Amazonka.IotTwinMaker.ListComponentTypes
+import Amazonka.IotTwinMaker.ListEntities
+import Amazonka.IotTwinMaker.ListScenes
+import Amazonka.IotTwinMaker.ListSyncJobs
+import Amazonka.IotTwinMaker.ListSyncResources
+import Amazonka.IotTwinMaker.ListTagsForResource
+import Amazonka.IotTwinMaker.ListWorkspaces
+import Amazonka.IotTwinMaker.TagResource
+import Amazonka.IotTwinMaker.Types
+import Amazonka.IotTwinMaker.UntagResource
+import Amazonka.IotTwinMaker.UpdateComponentType
+import Amazonka.IotTwinMaker.UpdateEntity
+import Amazonka.IotTwinMaker.UpdatePricingPlan
+import Amazonka.IotTwinMaker.UpdateScene
+import Amazonka.IotTwinMaker.UpdateWorkspace
+import Amazonka.IotTwinMaker.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 'IotTwinMaker'.
+
+-- $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/IotTwinMaker/BatchPutPropertyValues.hs b/gen/Amazonka/IotTwinMaker/BatchPutPropertyValues.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/BatchPutPropertyValues.hs
@@ -0,0 +1,199 @@
+{-# 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.IotTwinMaker.BatchPutPropertyValues
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets values for multiple time series properties.
+module Amazonka.IotTwinMaker.BatchPutPropertyValues
+  ( -- * Creating a Request
+    BatchPutPropertyValues (..),
+    newBatchPutPropertyValues,
+
+    -- * Request Lenses
+    batchPutPropertyValues_workspaceId,
+    batchPutPropertyValues_entries,
+
+    -- * Destructuring the Response
+    BatchPutPropertyValuesResponse (..),
+    newBatchPutPropertyValuesResponse,
+
+    -- * Response Lenses
+    batchPutPropertyValuesResponse_httpStatus,
+    batchPutPropertyValuesResponse_errorEntries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchPutPropertyValues' smart constructor.
+data BatchPutPropertyValues = BatchPutPropertyValues'
+  { -- | The ID of the workspace that contains the properties to set.
+    workspaceId :: Prelude.Text,
+    -- | An object that maps strings to the property value entries to set. Each
+    -- string in the mapping must be unique to this object.
+    entries :: Prelude.NonEmpty PropertyValueEntry
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutPropertyValues' 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:
+--
+-- 'workspaceId', 'batchPutPropertyValues_workspaceId' - The ID of the workspace that contains the properties to set.
+--
+-- 'entries', 'batchPutPropertyValues_entries' - An object that maps strings to the property value entries to set. Each
+-- string in the mapping must be unique to this object.
+newBatchPutPropertyValues ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'entries'
+  Prelude.NonEmpty PropertyValueEntry ->
+  BatchPutPropertyValues
+newBatchPutPropertyValues pWorkspaceId_ pEntries_ =
+  BatchPutPropertyValues'
+    { workspaceId =
+        pWorkspaceId_,
+      entries = Lens.coerced Lens.# pEntries_
+    }
+
+-- | The ID of the workspace that contains the properties to set.
+batchPutPropertyValues_workspaceId :: Lens.Lens' BatchPutPropertyValues Prelude.Text
+batchPutPropertyValues_workspaceId = Lens.lens (\BatchPutPropertyValues' {workspaceId} -> workspaceId) (\s@BatchPutPropertyValues' {} a -> s {workspaceId = a} :: BatchPutPropertyValues)
+
+-- | An object that maps strings to the property value entries to set. Each
+-- string in the mapping must be unique to this object.
+batchPutPropertyValues_entries :: Lens.Lens' BatchPutPropertyValues (Prelude.NonEmpty PropertyValueEntry)
+batchPutPropertyValues_entries = Lens.lens (\BatchPutPropertyValues' {entries} -> entries) (\s@BatchPutPropertyValues' {} a -> s {entries = a} :: BatchPutPropertyValues) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchPutPropertyValues where
+  type
+    AWSResponse BatchPutPropertyValues =
+      BatchPutPropertyValuesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchPutPropertyValuesResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "errorEntries")
+      )
+
+instance Prelude.Hashable BatchPutPropertyValues where
+  hashWithSalt _salt BatchPutPropertyValues' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` entries
+
+instance Prelude.NFData BatchPutPropertyValues where
+  rnf BatchPutPropertyValues' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf entries
+
+instance Data.ToHeaders BatchPutPropertyValues where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchPutPropertyValues where
+  toJSON BatchPutPropertyValues' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("entries" Data..= entries)]
+      )
+
+instance Data.ToPath BatchPutPropertyValues where
+  toPath BatchPutPropertyValues' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entity-properties"
+      ]
+
+instance Data.ToQuery BatchPutPropertyValues where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchPutPropertyValuesResponse' smart constructor.
+data BatchPutPropertyValuesResponse = BatchPutPropertyValuesResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Entries that caused errors in the batch put operation.
+    errorEntries :: Prelude.NonEmpty BatchPutPropertyErrorEntry
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutPropertyValuesResponse' 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', 'batchPutPropertyValuesResponse_httpStatus' - The response's http status code.
+--
+-- 'errorEntries', 'batchPutPropertyValuesResponse_errorEntries' - Entries that caused errors in the batch put operation.
+newBatchPutPropertyValuesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'errorEntries'
+  Prelude.NonEmpty BatchPutPropertyErrorEntry ->
+  BatchPutPropertyValuesResponse
+newBatchPutPropertyValuesResponse
+  pHttpStatus_
+  pErrorEntries_ =
+    BatchPutPropertyValuesResponse'
+      { httpStatus =
+          pHttpStatus_,
+        errorEntries =
+          Lens.coerced Lens.# pErrorEntries_
+      }
+
+-- | The response's http status code.
+batchPutPropertyValuesResponse_httpStatus :: Lens.Lens' BatchPutPropertyValuesResponse Prelude.Int
+batchPutPropertyValuesResponse_httpStatus = Lens.lens (\BatchPutPropertyValuesResponse' {httpStatus} -> httpStatus) (\s@BatchPutPropertyValuesResponse' {} a -> s {httpStatus = a} :: BatchPutPropertyValuesResponse)
+
+-- | Entries that caused errors in the batch put operation.
+batchPutPropertyValuesResponse_errorEntries :: Lens.Lens' BatchPutPropertyValuesResponse (Prelude.NonEmpty BatchPutPropertyErrorEntry)
+batchPutPropertyValuesResponse_errorEntries = Lens.lens (\BatchPutPropertyValuesResponse' {errorEntries} -> errorEntries) (\s@BatchPutPropertyValuesResponse' {} a -> s {errorEntries = a} :: BatchPutPropertyValuesResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchPutPropertyValuesResponse
+  where
+  rnf BatchPutPropertyValuesResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errorEntries
diff --git a/gen/Amazonka/IotTwinMaker/CreateComponentType.hs b/gen/Amazonka/IotTwinMaker/CreateComponentType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/CreateComponentType.hs
@@ -0,0 +1,340 @@
+{-# 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.IotTwinMaker.CreateComponentType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a component type.
+module Amazonka.IotTwinMaker.CreateComponentType
+  ( -- * Creating a Request
+    CreateComponentType (..),
+    newCreateComponentType,
+
+    -- * Request Lenses
+    createComponentType_componentTypeName,
+    createComponentType_description,
+    createComponentType_extendsFrom,
+    createComponentType_functions,
+    createComponentType_isSingleton,
+    createComponentType_propertyDefinitions,
+    createComponentType_propertyGroups,
+    createComponentType_tags,
+    createComponentType_workspaceId,
+    createComponentType_componentTypeId,
+
+    -- * Destructuring the Response
+    CreateComponentTypeResponse (..),
+    newCreateComponentTypeResponse,
+
+    -- * Response Lenses
+    createComponentTypeResponse_httpStatus,
+    createComponentTypeResponse_arn,
+    createComponentTypeResponse_creationDateTime,
+    createComponentTypeResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateComponentType' smart constructor.
+data CreateComponentType = CreateComponentType'
+  { -- | A friendly name for the component type.
+    componentTypeName :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the parent component type to extend.
+    extendsFrom :: Prelude.Maybe [Prelude.Text],
+    -- | An object that maps strings to the functions in the component type. Each
+    -- string in the mapping must be unique to this object.
+    functions :: Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionRequest),
+    -- | A Boolean value that specifies whether an entity can have more than one
+    -- component of this type.
+    isSingleton :: Prelude.Maybe Prelude.Bool,
+    -- | An object that maps strings to the property definitions in the component
+    -- type. Each string in the mapping must be unique to this object.
+    propertyDefinitions :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionRequest),
+    propertyGroups :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupRequest),
+    -- | Metadata that you can use to manage the component type.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the workspace that contains the component type.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateComponentType' 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:
+--
+-- 'componentTypeName', 'createComponentType_componentTypeName' - A friendly name for the component type.
+--
+-- 'description', 'createComponentType_description' - The description of the component type.
+--
+-- 'extendsFrom', 'createComponentType_extendsFrom' - Specifies the parent component type to extend.
+--
+-- 'functions', 'createComponentType_functions' - An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+--
+-- 'isSingleton', 'createComponentType_isSingleton' - A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+--
+-- 'propertyDefinitions', 'createComponentType_propertyDefinitions' - An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+--
+-- 'propertyGroups', 'createComponentType_propertyGroups' -
+--
+-- 'tags', 'createComponentType_tags' - Metadata that you can use to manage the component type.
+--
+-- 'workspaceId', 'createComponentType_workspaceId' - The ID of the workspace that contains the component type.
+--
+-- 'componentTypeId', 'createComponentType_componentTypeId' - The ID of the component type.
+newCreateComponentType ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  CreateComponentType
+newCreateComponentType
+  pWorkspaceId_
+  pComponentTypeId_ =
+    CreateComponentType'
+      { componentTypeName =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        extendsFrom = Prelude.Nothing,
+        functions = Prelude.Nothing,
+        isSingleton = Prelude.Nothing,
+        propertyDefinitions = Prelude.Nothing,
+        propertyGroups = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        componentTypeId = pComponentTypeId_
+      }
+
+-- | A friendly name for the component type.
+createComponentType_componentTypeName :: Lens.Lens' CreateComponentType (Prelude.Maybe Prelude.Text)
+createComponentType_componentTypeName = Lens.lens (\CreateComponentType' {componentTypeName} -> componentTypeName) (\s@CreateComponentType' {} a -> s {componentTypeName = a} :: CreateComponentType)
+
+-- | The description of the component type.
+createComponentType_description :: Lens.Lens' CreateComponentType (Prelude.Maybe Prelude.Text)
+createComponentType_description = Lens.lens (\CreateComponentType' {description} -> description) (\s@CreateComponentType' {} a -> s {description = a} :: CreateComponentType)
+
+-- | Specifies the parent component type to extend.
+createComponentType_extendsFrom :: Lens.Lens' CreateComponentType (Prelude.Maybe [Prelude.Text])
+createComponentType_extendsFrom = Lens.lens (\CreateComponentType' {extendsFrom} -> extendsFrom) (\s@CreateComponentType' {} a -> s {extendsFrom = a} :: CreateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+createComponentType_functions :: Lens.Lens' CreateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionRequest))
+createComponentType_functions = Lens.lens (\CreateComponentType' {functions} -> functions) (\s@CreateComponentType' {} a -> s {functions = a} :: CreateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+createComponentType_isSingleton :: Lens.Lens' CreateComponentType (Prelude.Maybe Prelude.Bool)
+createComponentType_isSingleton = Lens.lens (\CreateComponentType' {isSingleton} -> isSingleton) (\s@CreateComponentType' {} a -> s {isSingleton = a} :: CreateComponentType)
+
+-- | An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+createComponentType_propertyDefinitions :: Lens.Lens' CreateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionRequest))
+createComponentType_propertyDefinitions = Lens.lens (\CreateComponentType' {propertyDefinitions} -> propertyDefinitions) (\s@CreateComponentType' {} a -> s {propertyDefinitions = a} :: CreateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+createComponentType_propertyGroups :: Lens.Lens' CreateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupRequest))
+createComponentType_propertyGroups = Lens.lens (\CreateComponentType' {propertyGroups} -> propertyGroups) (\s@CreateComponentType' {} a -> s {propertyGroups = a} :: CreateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | Metadata that you can use to manage the component type.
+createComponentType_tags :: Lens.Lens' CreateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createComponentType_tags = Lens.lens (\CreateComponentType' {tags} -> tags) (\s@CreateComponentType' {} a -> s {tags = a} :: CreateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workspace that contains the component type.
+createComponentType_workspaceId :: Lens.Lens' CreateComponentType Prelude.Text
+createComponentType_workspaceId = Lens.lens (\CreateComponentType' {workspaceId} -> workspaceId) (\s@CreateComponentType' {} a -> s {workspaceId = a} :: CreateComponentType)
+
+-- | The ID of the component type.
+createComponentType_componentTypeId :: Lens.Lens' CreateComponentType Prelude.Text
+createComponentType_componentTypeId = Lens.lens (\CreateComponentType' {componentTypeId} -> componentTypeId) (\s@CreateComponentType' {} a -> s {componentTypeId = a} :: CreateComponentType)
+
+instance Core.AWSRequest CreateComponentType where
+  type
+    AWSResponse CreateComponentType =
+      CreateComponentTypeResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateComponentTypeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable CreateComponentType where
+  hashWithSalt _salt CreateComponentType' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` extendsFrom
+      `Prelude.hashWithSalt` functions
+      `Prelude.hashWithSalt` isSingleton
+      `Prelude.hashWithSalt` propertyDefinitions
+      `Prelude.hashWithSalt` propertyGroups
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` componentTypeId
+
+instance Prelude.NFData CreateComponentType where
+  rnf CreateComponentType' {..} =
+    Prelude.rnf componentTypeName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf extendsFrom
+      `Prelude.seq` Prelude.rnf functions
+      `Prelude.seq` Prelude.rnf isSingleton
+      `Prelude.seq` Prelude.rnf propertyDefinitions
+      `Prelude.seq` Prelude.rnf propertyGroups
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeId
+
+instance Data.ToHeaders CreateComponentType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateComponentType where
+  toJSON CreateComponentType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentTypeName" Data..=)
+              Prelude.<$> componentTypeName,
+            ("description" Data..=) Prelude.<$> description,
+            ("extendsFrom" Data..=) Prelude.<$> extendsFrom,
+            ("functions" Data..=) Prelude.<$> functions,
+            ("isSingleton" Data..=) Prelude.<$> isSingleton,
+            ("propertyDefinitions" Data..=)
+              Prelude.<$> propertyDefinitions,
+            ("propertyGroups" Data..=)
+              Prelude.<$> propertyGroups,
+            ("tags" Data..=) Prelude.<$> tags
+          ]
+      )
+
+instance Data.ToPath CreateComponentType where
+  toPath CreateComponentType' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/component-types/",
+        Data.toBS componentTypeId
+      ]
+
+instance Data.ToQuery CreateComponentType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateComponentTypeResponse' smart constructor.
+data CreateComponentTypeResponse = CreateComponentTypeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the component type.
+    arn :: Prelude.Text,
+    -- | The date and time when the entity was created.
+    creationDateTime :: Data.POSIX,
+    -- | The current state of the component type.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateComponentTypeResponse' 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', 'createComponentTypeResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'createComponentTypeResponse_arn' - The ARN of the component type.
+--
+-- 'creationDateTime', 'createComponentTypeResponse_creationDateTime' - The date and time when the entity was created.
+--
+-- 'state', 'createComponentTypeResponse_state' - The current state of the component type.
+newCreateComponentTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'state'
+  State ->
+  CreateComponentTypeResponse
+newCreateComponentTypeResponse
+  pHttpStatus_
+  pArn_
+  pCreationDateTime_
+  pState_ =
+    CreateComponentTypeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        state = pState_
+      }
+
+-- | The response's http status code.
+createComponentTypeResponse_httpStatus :: Lens.Lens' CreateComponentTypeResponse Prelude.Int
+createComponentTypeResponse_httpStatus = Lens.lens (\CreateComponentTypeResponse' {httpStatus} -> httpStatus) (\s@CreateComponentTypeResponse' {} a -> s {httpStatus = a} :: CreateComponentTypeResponse)
+
+-- | The ARN of the component type.
+createComponentTypeResponse_arn :: Lens.Lens' CreateComponentTypeResponse Prelude.Text
+createComponentTypeResponse_arn = Lens.lens (\CreateComponentTypeResponse' {arn} -> arn) (\s@CreateComponentTypeResponse' {} a -> s {arn = a} :: CreateComponentTypeResponse)
+
+-- | The date and time when the entity was created.
+createComponentTypeResponse_creationDateTime :: Lens.Lens' CreateComponentTypeResponse Prelude.UTCTime
+createComponentTypeResponse_creationDateTime = Lens.lens (\CreateComponentTypeResponse' {creationDateTime} -> creationDateTime) (\s@CreateComponentTypeResponse' {} a -> s {creationDateTime = a} :: CreateComponentTypeResponse) Prelude.. Data._Time
+
+-- | The current state of the component type.
+createComponentTypeResponse_state :: Lens.Lens' CreateComponentTypeResponse State
+createComponentTypeResponse_state = Lens.lens (\CreateComponentTypeResponse' {state} -> state) (\s@CreateComponentTypeResponse' {} a -> s {state = a} :: CreateComponentTypeResponse)
+
+instance Prelude.NFData CreateComponentTypeResponse where
+  rnf CreateComponentTypeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/CreateEntity.hs b/gen/Amazonka/IotTwinMaker/CreateEntity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/CreateEntity.hs
@@ -0,0 +1,301 @@
+{-# 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.IotTwinMaker.CreateEntity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an entity.
+module Amazonka.IotTwinMaker.CreateEntity
+  ( -- * Creating a Request
+    CreateEntity (..),
+    newCreateEntity,
+
+    -- * Request Lenses
+    createEntity_components,
+    createEntity_description,
+    createEntity_entityId,
+    createEntity_parentEntityId,
+    createEntity_tags,
+    createEntity_workspaceId,
+    createEntity_entityName,
+
+    -- * Destructuring the Response
+    CreateEntityResponse (..),
+    newCreateEntityResponse,
+
+    -- * Response Lenses
+    createEntityResponse_httpStatus,
+    createEntityResponse_entityId,
+    createEntityResponse_arn,
+    createEntityResponse_creationDateTime,
+    createEntityResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateEntity' smart constructor.
+data CreateEntity = CreateEntity'
+  { -- | An object that maps strings to the components in the entity. Each string
+    -- in the mapping must be unique to this object.
+    components :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentRequest),
+    -- | The description of the entity.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity\'s parent entity.
+    parentEntityId :: Prelude.Maybe Prelude.Text,
+    -- | Metadata that you can use to manage the entity.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the workspace that contains the entity.
+    workspaceId :: Prelude.Text,
+    -- | The name of the entity.
+    entityName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEntity' 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:
+--
+-- 'components', 'createEntity_components' - An object that maps strings to the components in the entity. Each string
+-- in the mapping must be unique to this object.
+--
+-- 'description', 'createEntity_description' - The description of the entity.
+--
+-- 'entityId', 'createEntity_entityId' - The ID of the entity.
+--
+-- 'parentEntityId', 'createEntity_parentEntityId' - The ID of the entity\'s parent entity.
+--
+-- 'tags', 'createEntity_tags' - Metadata that you can use to manage the entity.
+--
+-- 'workspaceId', 'createEntity_workspaceId' - The ID of the workspace that contains the entity.
+--
+-- 'entityName', 'createEntity_entityName' - The name of the entity.
+newCreateEntity ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'entityName'
+  Prelude.Text ->
+  CreateEntity
+newCreateEntity pWorkspaceId_ pEntityName_ =
+  CreateEntity'
+    { components = Prelude.Nothing,
+      description = Prelude.Nothing,
+      entityId = Prelude.Nothing,
+      parentEntityId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      entityName = pEntityName_
+    }
+
+-- | An object that maps strings to the components in the entity. Each string
+-- in the mapping must be unique to this object.
+createEntity_components :: Lens.Lens' CreateEntity (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentRequest))
+createEntity_components = Lens.lens (\CreateEntity' {components} -> components) (\s@CreateEntity' {} a -> s {components = a} :: CreateEntity) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the entity.
+createEntity_description :: Lens.Lens' CreateEntity (Prelude.Maybe Prelude.Text)
+createEntity_description = Lens.lens (\CreateEntity' {description} -> description) (\s@CreateEntity' {} a -> s {description = a} :: CreateEntity)
+
+-- | The ID of the entity.
+createEntity_entityId :: Lens.Lens' CreateEntity (Prelude.Maybe Prelude.Text)
+createEntity_entityId = Lens.lens (\CreateEntity' {entityId} -> entityId) (\s@CreateEntity' {} a -> s {entityId = a} :: CreateEntity)
+
+-- | The ID of the entity\'s parent entity.
+createEntity_parentEntityId :: Lens.Lens' CreateEntity (Prelude.Maybe Prelude.Text)
+createEntity_parentEntityId = Lens.lens (\CreateEntity' {parentEntityId} -> parentEntityId) (\s@CreateEntity' {} a -> s {parentEntityId = a} :: CreateEntity)
+
+-- | Metadata that you can use to manage the entity.
+createEntity_tags :: Lens.Lens' CreateEntity (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createEntity_tags = Lens.lens (\CreateEntity' {tags} -> tags) (\s@CreateEntity' {} a -> s {tags = a} :: CreateEntity) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workspace that contains the entity.
+createEntity_workspaceId :: Lens.Lens' CreateEntity Prelude.Text
+createEntity_workspaceId = Lens.lens (\CreateEntity' {workspaceId} -> workspaceId) (\s@CreateEntity' {} a -> s {workspaceId = a} :: CreateEntity)
+
+-- | The name of the entity.
+createEntity_entityName :: Lens.Lens' CreateEntity Prelude.Text
+createEntity_entityName = Lens.lens (\CreateEntity' {entityName} -> entityName) (\s@CreateEntity' {} a -> s {entityName = a} :: CreateEntity)
+
+instance Core.AWSRequest CreateEntity where
+  type AWSResponse CreateEntity = CreateEntityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateEntityResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "entityId")
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable CreateEntity where
+  hashWithSalt _salt CreateEntity' {..} =
+    _salt
+      `Prelude.hashWithSalt` components
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` entityId
+      `Prelude.hashWithSalt` parentEntityId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` entityName
+
+instance Prelude.NFData CreateEntity where
+  rnf CreateEntity' {..} =
+    Prelude.rnf components
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf parentEntityId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf entityName
+
+instance Data.ToHeaders CreateEntity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateEntity where
+  toJSON CreateEntity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("components" Data..=) Prelude.<$> components,
+            ("description" Data..=) Prelude.<$> description,
+            ("entityId" Data..=) Prelude.<$> entityId,
+            ("parentEntityId" Data..=)
+              Prelude.<$> parentEntityId,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("entityName" Data..= entityName)
+          ]
+      )
+
+instance Data.ToPath CreateEntity where
+  toPath CreateEntity' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId, "/entities"]
+
+instance Data.ToQuery CreateEntity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateEntityResponse' smart constructor.
+data CreateEntityResponse = CreateEntityResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the entity.
+    entityId :: Prelude.Text,
+    -- | The ARN of the entity.
+    arn :: Prelude.Text,
+    -- | The date and time when the entity was created.
+    creationDateTime :: Data.POSIX,
+    -- | The current state of the entity.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEntityResponse' 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', 'createEntityResponse_httpStatus' - The response's http status code.
+--
+-- 'entityId', 'createEntityResponse_entityId' - The ID of the entity.
+--
+-- 'arn', 'createEntityResponse_arn' - The ARN of the entity.
+--
+-- 'creationDateTime', 'createEntityResponse_creationDateTime' - The date and time when the entity was created.
+--
+-- 'state', 'createEntityResponse_state' - The current state of the entity.
+newCreateEntityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'entityId'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'state'
+  State ->
+  CreateEntityResponse
+newCreateEntityResponse
+  pHttpStatus_
+  pEntityId_
+  pArn_
+  pCreationDateTime_
+  pState_ =
+    CreateEntityResponse'
+      { httpStatus = pHttpStatus_,
+        entityId = pEntityId_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        state = pState_
+      }
+
+-- | The response's http status code.
+createEntityResponse_httpStatus :: Lens.Lens' CreateEntityResponse Prelude.Int
+createEntityResponse_httpStatus = Lens.lens (\CreateEntityResponse' {httpStatus} -> httpStatus) (\s@CreateEntityResponse' {} a -> s {httpStatus = a} :: CreateEntityResponse)
+
+-- | The ID of the entity.
+createEntityResponse_entityId :: Lens.Lens' CreateEntityResponse Prelude.Text
+createEntityResponse_entityId = Lens.lens (\CreateEntityResponse' {entityId} -> entityId) (\s@CreateEntityResponse' {} a -> s {entityId = a} :: CreateEntityResponse)
+
+-- | The ARN of the entity.
+createEntityResponse_arn :: Lens.Lens' CreateEntityResponse Prelude.Text
+createEntityResponse_arn = Lens.lens (\CreateEntityResponse' {arn} -> arn) (\s@CreateEntityResponse' {} a -> s {arn = a} :: CreateEntityResponse)
+
+-- | The date and time when the entity was created.
+createEntityResponse_creationDateTime :: Lens.Lens' CreateEntityResponse Prelude.UTCTime
+createEntityResponse_creationDateTime = Lens.lens (\CreateEntityResponse' {creationDateTime} -> creationDateTime) (\s@CreateEntityResponse' {} a -> s {creationDateTime = a} :: CreateEntityResponse) Prelude.. Data._Time
+
+-- | The current state of the entity.
+createEntityResponse_state :: Lens.Lens' CreateEntityResponse State
+createEntityResponse_state = Lens.lens (\CreateEntityResponse' {state} -> state) (\s@CreateEntityResponse' {} a -> s {state = a} :: CreateEntityResponse)
+
+instance Prelude.NFData CreateEntityResponse where
+  rnf CreateEntityResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/CreateScene.hs b/gen/Amazonka/IotTwinMaker/CreateScene.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/CreateScene.hs
@@ -0,0 +1,263 @@
+{-# 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.IotTwinMaker.CreateScene
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a scene.
+module Amazonka.IotTwinMaker.CreateScene
+  ( -- * Creating a Request
+    CreateScene (..),
+    newCreateScene,
+
+    -- * Request Lenses
+    createScene_capabilities,
+    createScene_description,
+    createScene_tags,
+    createScene_workspaceId,
+    createScene_sceneId,
+    createScene_contentLocation,
+
+    -- * Destructuring the Response
+    CreateSceneResponse (..),
+    newCreateSceneResponse,
+
+    -- * Response Lenses
+    createSceneResponse_httpStatus,
+    createSceneResponse_arn,
+    createSceneResponse_creationDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateScene' smart constructor.
+data CreateScene = CreateScene'
+  { -- | A list of capabilities that the scene uses to render itself.
+    capabilities :: Prelude.Maybe [Prelude.Text],
+    -- | The description for this scene.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Metadata that you can use to manage the scene.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the workspace that contains the scene.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the scene.
+    sceneId :: Prelude.Text,
+    -- | The relative path that specifies the location of the content definition
+    -- file.
+    contentLocation :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateScene' 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:
+--
+-- 'capabilities', 'createScene_capabilities' - A list of capabilities that the scene uses to render itself.
+--
+-- 'description', 'createScene_description' - The description for this scene.
+--
+-- 'tags', 'createScene_tags' - Metadata that you can use to manage the scene.
+--
+-- 'workspaceId', 'createScene_workspaceId' - The ID of the workspace that contains the scene.
+--
+-- 'sceneId', 'createScene_sceneId' - The ID of the scene.
+--
+-- 'contentLocation', 'createScene_contentLocation' - The relative path that specifies the location of the content definition
+-- file.
+newCreateScene ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'sceneId'
+  Prelude.Text ->
+  -- | 'contentLocation'
+  Prelude.Text ->
+  CreateScene
+newCreateScene
+  pWorkspaceId_
+  pSceneId_
+  pContentLocation_ =
+    CreateScene'
+      { capabilities = Prelude.Nothing,
+        description = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        sceneId = pSceneId_,
+        contentLocation = pContentLocation_
+      }
+
+-- | A list of capabilities that the scene uses to render itself.
+createScene_capabilities :: Lens.Lens' CreateScene (Prelude.Maybe [Prelude.Text])
+createScene_capabilities = Lens.lens (\CreateScene' {capabilities} -> capabilities) (\s@CreateScene' {} a -> s {capabilities = a} :: CreateScene) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description for this scene.
+createScene_description :: Lens.Lens' CreateScene (Prelude.Maybe Prelude.Text)
+createScene_description = Lens.lens (\CreateScene' {description} -> description) (\s@CreateScene' {} a -> s {description = a} :: CreateScene)
+
+-- | Metadata that you can use to manage the scene.
+createScene_tags :: Lens.Lens' CreateScene (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createScene_tags = Lens.lens (\CreateScene' {tags} -> tags) (\s@CreateScene' {} a -> s {tags = a} :: CreateScene) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workspace that contains the scene.
+createScene_workspaceId :: Lens.Lens' CreateScene Prelude.Text
+createScene_workspaceId = Lens.lens (\CreateScene' {workspaceId} -> workspaceId) (\s@CreateScene' {} a -> s {workspaceId = a} :: CreateScene)
+
+-- | The ID of the scene.
+createScene_sceneId :: Lens.Lens' CreateScene Prelude.Text
+createScene_sceneId = Lens.lens (\CreateScene' {sceneId} -> sceneId) (\s@CreateScene' {} a -> s {sceneId = a} :: CreateScene)
+
+-- | The relative path that specifies the location of the content definition
+-- file.
+createScene_contentLocation :: Lens.Lens' CreateScene Prelude.Text
+createScene_contentLocation = Lens.lens (\CreateScene' {contentLocation} -> contentLocation) (\s@CreateScene' {} a -> s {contentLocation = a} :: CreateScene)
+
+instance Core.AWSRequest CreateScene where
+  type AWSResponse CreateScene = CreateSceneResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSceneResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+      )
+
+instance Prelude.Hashable CreateScene where
+  hashWithSalt _salt CreateScene' {..} =
+    _salt
+      `Prelude.hashWithSalt` capabilities
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` sceneId
+      `Prelude.hashWithSalt` contentLocation
+
+instance Prelude.NFData CreateScene where
+  rnf CreateScene' {..} =
+    Prelude.rnf capabilities
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf sceneId
+      `Prelude.seq` Prelude.rnf contentLocation
+
+instance Data.ToHeaders CreateScene where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateScene where
+  toJSON CreateScene' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("capabilities" Data..=) Prelude.<$> capabilities,
+            ("description" Data..=) Prelude.<$> description,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("sceneId" Data..= sceneId),
+            Prelude.Just
+              ("contentLocation" Data..= contentLocation)
+          ]
+      )
+
+instance Data.ToPath CreateScene where
+  toPath CreateScene' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId, "/scenes"]
+
+instance Data.ToQuery CreateScene where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSceneResponse' smart constructor.
+data CreateSceneResponse = CreateSceneResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the scene.
+    arn :: Prelude.Text,
+    -- | The date and time when the scene was created.
+    creationDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSceneResponse' 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', 'createSceneResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'createSceneResponse_arn' - The ARN of the scene.
+--
+-- 'creationDateTime', 'createSceneResponse_creationDateTime' - The date and time when the scene was created.
+newCreateSceneResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  CreateSceneResponse
+newCreateSceneResponse
+  pHttpStatus_
+  pArn_
+  pCreationDateTime_ =
+    CreateSceneResponse'
+      { httpStatus = pHttpStatus_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_
+      }
+
+-- | The response's http status code.
+createSceneResponse_httpStatus :: Lens.Lens' CreateSceneResponse Prelude.Int
+createSceneResponse_httpStatus = Lens.lens (\CreateSceneResponse' {httpStatus} -> httpStatus) (\s@CreateSceneResponse' {} a -> s {httpStatus = a} :: CreateSceneResponse)
+
+-- | The ARN of the scene.
+createSceneResponse_arn :: Lens.Lens' CreateSceneResponse Prelude.Text
+createSceneResponse_arn = Lens.lens (\CreateSceneResponse' {arn} -> arn) (\s@CreateSceneResponse' {} a -> s {arn = a} :: CreateSceneResponse)
+
+-- | The date and time when the scene was created.
+createSceneResponse_creationDateTime :: Lens.Lens' CreateSceneResponse Prelude.UTCTime
+createSceneResponse_creationDateTime = Lens.lens (\CreateSceneResponse' {creationDateTime} -> creationDateTime) (\s@CreateSceneResponse' {} a -> s {creationDateTime = a} :: CreateSceneResponse) Prelude.. Data._Time
+
+instance Prelude.NFData CreateSceneResponse where
+  rnf CreateSceneResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
diff --git a/gen/Amazonka/IotTwinMaker/CreateSyncJob.hs b/gen/Amazonka/IotTwinMaker/CreateSyncJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/CreateSyncJob.hs
@@ -0,0 +1,265 @@
+{-# 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.IotTwinMaker.CreateSyncJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- This action creates a SyncJob.
+module Amazonka.IotTwinMaker.CreateSyncJob
+  ( -- * Creating a Request
+    CreateSyncJob (..),
+    newCreateSyncJob,
+
+    -- * Request Lenses
+    createSyncJob_tags,
+    createSyncJob_workspaceId,
+    createSyncJob_syncSource,
+    createSyncJob_syncRole,
+
+    -- * Destructuring the Response
+    CreateSyncJobResponse (..),
+    newCreateSyncJobResponse,
+
+    -- * Response Lenses
+    createSyncJobResponse_httpStatus,
+    createSyncJobResponse_arn,
+    createSyncJobResponse_creationDateTime,
+    createSyncJobResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSyncJob' smart constructor.
+data CreateSyncJob = CreateSyncJob'
+  { -- | The SyncJob tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The workspace Id.
+    workspaceId :: Prelude.Text,
+    -- | The sync source.
+    --
+    -- Currently the only supported syncSoucre is @SITEWISE @.
+    syncSource :: Prelude.Text,
+    -- | The SyncJob IAM role. This IAM role is used by the sync job to read from
+    -- the syncSource, and create, update or delete the corresponding
+    -- resources.
+    syncRole :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSyncJob' 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:
+--
+-- 'tags', 'createSyncJob_tags' - The SyncJob tags.
+--
+-- 'workspaceId', 'createSyncJob_workspaceId' - The workspace Id.
+--
+-- 'syncSource', 'createSyncJob_syncSource' - The sync source.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+--
+-- 'syncRole', 'createSyncJob_syncRole' - The SyncJob IAM role. This IAM role is used by the sync job to read from
+-- the syncSource, and create, update or delete the corresponding
+-- resources.
+newCreateSyncJob ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'syncSource'
+  Prelude.Text ->
+  -- | 'syncRole'
+  Prelude.Text ->
+  CreateSyncJob
+newCreateSyncJob
+  pWorkspaceId_
+  pSyncSource_
+  pSyncRole_ =
+    CreateSyncJob'
+      { tags = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        syncSource = pSyncSource_,
+        syncRole = pSyncRole_
+      }
+
+-- | The SyncJob tags.
+createSyncJob_tags :: Lens.Lens' CreateSyncJob (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createSyncJob_tags = Lens.lens (\CreateSyncJob' {tags} -> tags) (\s@CreateSyncJob' {} a -> s {tags = a} :: CreateSyncJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The workspace Id.
+createSyncJob_workspaceId :: Lens.Lens' CreateSyncJob Prelude.Text
+createSyncJob_workspaceId = Lens.lens (\CreateSyncJob' {workspaceId} -> workspaceId) (\s@CreateSyncJob' {} a -> s {workspaceId = a} :: CreateSyncJob)
+
+-- | The sync source.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+createSyncJob_syncSource :: Lens.Lens' CreateSyncJob Prelude.Text
+createSyncJob_syncSource = Lens.lens (\CreateSyncJob' {syncSource} -> syncSource) (\s@CreateSyncJob' {} a -> s {syncSource = a} :: CreateSyncJob)
+
+-- | The SyncJob IAM role. This IAM role is used by the sync job to read from
+-- the syncSource, and create, update or delete the corresponding
+-- resources.
+createSyncJob_syncRole :: Lens.Lens' CreateSyncJob Prelude.Text
+createSyncJob_syncRole = Lens.lens (\CreateSyncJob' {syncRole} -> syncRole) (\s@CreateSyncJob' {} a -> s {syncRole = a} :: CreateSyncJob)
+
+instance Core.AWSRequest CreateSyncJob where
+  type
+    AWSResponse CreateSyncJob =
+      CreateSyncJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSyncJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable CreateSyncJob where
+  hashWithSalt _salt CreateSyncJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` syncSource
+      `Prelude.hashWithSalt` syncRole
+
+instance Prelude.NFData CreateSyncJob where
+  rnf CreateSyncJob' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf syncSource
+      `Prelude.seq` Prelude.rnf syncRole
+
+instance Data.ToHeaders CreateSyncJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSyncJob where
+  toJSON CreateSyncJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("syncRole" Data..= syncRole)
+          ]
+      )
+
+instance Data.ToPath CreateSyncJob where
+  toPath CreateSyncJob' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/sync-jobs/",
+        Data.toBS syncSource
+      ]
+
+instance Data.ToQuery CreateSyncJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSyncJobResponse' smart constructor.
+data CreateSyncJobResponse = CreateSyncJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The SyncJob ARN.
+    arn :: Prelude.Text,
+    -- | The date and time for the SyncJob creation.
+    creationDateTime :: Data.POSIX,
+    -- | The SyncJob response state.
+    state :: SyncJobState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSyncJobResponse' 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', 'createSyncJobResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'createSyncJobResponse_arn' - The SyncJob ARN.
+--
+-- 'creationDateTime', 'createSyncJobResponse_creationDateTime' - The date and time for the SyncJob creation.
+--
+-- 'state', 'createSyncJobResponse_state' - The SyncJob response state.
+newCreateSyncJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'state'
+  SyncJobState ->
+  CreateSyncJobResponse
+newCreateSyncJobResponse
+  pHttpStatus_
+  pArn_
+  pCreationDateTime_
+  pState_ =
+    CreateSyncJobResponse'
+      { httpStatus = pHttpStatus_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        state = pState_
+      }
+
+-- | The response's http status code.
+createSyncJobResponse_httpStatus :: Lens.Lens' CreateSyncJobResponse Prelude.Int
+createSyncJobResponse_httpStatus = Lens.lens (\CreateSyncJobResponse' {httpStatus} -> httpStatus) (\s@CreateSyncJobResponse' {} a -> s {httpStatus = a} :: CreateSyncJobResponse)
+
+-- | The SyncJob ARN.
+createSyncJobResponse_arn :: Lens.Lens' CreateSyncJobResponse Prelude.Text
+createSyncJobResponse_arn = Lens.lens (\CreateSyncJobResponse' {arn} -> arn) (\s@CreateSyncJobResponse' {} a -> s {arn = a} :: CreateSyncJobResponse)
+
+-- | The date and time for the SyncJob creation.
+createSyncJobResponse_creationDateTime :: Lens.Lens' CreateSyncJobResponse Prelude.UTCTime
+createSyncJobResponse_creationDateTime = Lens.lens (\CreateSyncJobResponse' {creationDateTime} -> creationDateTime) (\s@CreateSyncJobResponse' {} a -> s {creationDateTime = a} :: CreateSyncJobResponse) Prelude.. Data._Time
+
+-- | The SyncJob response state.
+createSyncJobResponse_state :: Lens.Lens' CreateSyncJobResponse SyncJobState
+createSyncJobResponse_state = Lens.lens (\CreateSyncJobResponse' {state} -> state) (\s@CreateSyncJobResponse' {} a -> s {state = a} :: CreateSyncJobResponse)
+
+instance Prelude.NFData CreateSyncJobResponse where
+  rnf CreateSyncJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/CreateWorkspace.hs b/gen/Amazonka/IotTwinMaker/CreateWorkspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/CreateWorkspace.hs
@@ -0,0 +1,248 @@
+{-# 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.IotTwinMaker.CreateWorkspace
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a workplace.
+module Amazonka.IotTwinMaker.CreateWorkspace
+  ( -- * Creating a Request
+    CreateWorkspace (..),
+    newCreateWorkspace,
+
+    -- * Request Lenses
+    createWorkspace_description,
+    createWorkspace_tags,
+    createWorkspace_workspaceId,
+    createWorkspace_s3Location,
+    createWorkspace_role,
+
+    -- * Destructuring the Response
+    CreateWorkspaceResponse (..),
+    newCreateWorkspaceResponse,
+
+    -- * Response Lenses
+    createWorkspaceResponse_httpStatus,
+    createWorkspaceResponse_arn,
+    createWorkspaceResponse_creationDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateWorkspace' smart constructor.
+data CreateWorkspace = CreateWorkspace'
+  { -- | The description of the workspace.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Metadata that you can use to manage the workspace
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ARN of the S3 bucket where resources associated with the workspace
+    -- are stored.
+    s3Location :: Prelude.Text,
+    -- | The ARN of the execution role associated with the workspace.
+    role' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateWorkspace' 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:
+--
+-- 'description', 'createWorkspace_description' - The description of the workspace.
+--
+-- 'tags', 'createWorkspace_tags' - Metadata that you can use to manage the workspace
+--
+-- 'workspaceId', 'createWorkspace_workspaceId' - The ID of the workspace.
+--
+-- 's3Location', 'createWorkspace_s3Location' - The ARN of the S3 bucket where resources associated with the workspace
+-- are stored.
+--
+-- 'role'', 'createWorkspace_role' - The ARN of the execution role associated with the workspace.
+newCreateWorkspace ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 's3Location'
+  Prelude.Text ->
+  -- | 'role''
+  Prelude.Text ->
+  CreateWorkspace
+newCreateWorkspace pWorkspaceId_ pS3Location_ pRole_ =
+  CreateWorkspace'
+    { description = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      s3Location = pS3Location_,
+      role' = pRole_
+    }
+
+-- | The description of the workspace.
+createWorkspace_description :: Lens.Lens' CreateWorkspace (Prelude.Maybe Prelude.Text)
+createWorkspace_description = Lens.lens (\CreateWorkspace' {description} -> description) (\s@CreateWorkspace' {} a -> s {description = a} :: CreateWorkspace)
+
+-- | Metadata that you can use to manage the workspace
+createWorkspace_tags :: Lens.Lens' CreateWorkspace (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createWorkspace_tags = Lens.lens (\CreateWorkspace' {tags} -> tags) (\s@CreateWorkspace' {} a -> s {tags = a} :: CreateWorkspace) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workspace.
+createWorkspace_workspaceId :: Lens.Lens' CreateWorkspace Prelude.Text
+createWorkspace_workspaceId = Lens.lens (\CreateWorkspace' {workspaceId} -> workspaceId) (\s@CreateWorkspace' {} a -> s {workspaceId = a} :: CreateWorkspace)
+
+-- | The ARN of the S3 bucket where resources associated with the workspace
+-- are stored.
+createWorkspace_s3Location :: Lens.Lens' CreateWorkspace Prelude.Text
+createWorkspace_s3Location = Lens.lens (\CreateWorkspace' {s3Location} -> s3Location) (\s@CreateWorkspace' {} a -> s {s3Location = a} :: CreateWorkspace)
+
+-- | The ARN of the execution role associated with the workspace.
+createWorkspace_role :: Lens.Lens' CreateWorkspace Prelude.Text
+createWorkspace_role = Lens.lens (\CreateWorkspace' {role'} -> role') (\s@CreateWorkspace' {} a -> s {role' = a} :: CreateWorkspace)
+
+instance Core.AWSRequest CreateWorkspace where
+  type
+    AWSResponse CreateWorkspace =
+      CreateWorkspaceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateWorkspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+      )
+
+instance Prelude.Hashable CreateWorkspace where
+  hashWithSalt _salt CreateWorkspace' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` s3Location
+      `Prelude.hashWithSalt` role'
+
+instance Prelude.NFData CreateWorkspace where
+  rnf CreateWorkspace' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf s3Location
+      `Prelude.seq` Prelude.rnf role'
+
+instance Data.ToHeaders CreateWorkspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateWorkspace where
+  toJSON CreateWorkspace' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("s3Location" Data..= s3Location),
+            Prelude.Just ("role" Data..= role')
+          ]
+      )
+
+instance Data.ToPath CreateWorkspace where
+  toPath CreateWorkspace' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId]
+
+instance Data.ToQuery CreateWorkspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateWorkspaceResponse' smart constructor.
+data CreateWorkspaceResponse = CreateWorkspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the workspace.
+    arn :: Prelude.Text,
+    -- | The date and time when the workspace was created.
+    creationDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateWorkspaceResponse' 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', 'createWorkspaceResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'createWorkspaceResponse_arn' - The ARN of the workspace.
+--
+-- 'creationDateTime', 'createWorkspaceResponse_creationDateTime' - The date and time when the workspace was created.
+newCreateWorkspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  CreateWorkspaceResponse
+newCreateWorkspaceResponse
+  pHttpStatus_
+  pArn_
+  pCreationDateTime_ =
+    CreateWorkspaceResponse'
+      { httpStatus = pHttpStatus_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_
+      }
+
+-- | The response's http status code.
+createWorkspaceResponse_httpStatus :: Lens.Lens' CreateWorkspaceResponse Prelude.Int
+createWorkspaceResponse_httpStatus = Lens.lens (\CreateWorkspaceResponse' {httpStatus} -> httpStatus) (\s@CreateWorkspaceResponse' {} a -> s {httpStatus = a} :: CreateWorkspaceResponse)
+
+-- | The ARN of the workspace.
+createWorkspaceResponse_arn :: Lens.Lens' CreateWorkspaceResponse Prelude.Text
+createWorkspaceResponse_arn = Lens.lens (\CreateWorkspaceResponse' {arn} -> arn) (\s@CreateWorkspaceResponse' {} a -> s {arn = a} :: CreateWorkspaceResponse)
+
+-- | The date and time when the workspace was created.
+createWorkspaceResponse_creationDateTime :: Lens.Lens' CreateWorkspaceResponse Prelude.UTCTime
+createWorkspaceResponse_creationDateTime = Lens.lens (\CreateWorkspaceResponse' {creationDateTime} -> creationDateTime) (\s@CreateWorkspaceResponse' {} a -> s {creationDateTime = a} :: CreateWorkspaceResponse) Prelude.. Data._Time
+
+instance Prelude.NFData CreateWorkspaceResponse where
+  rnf CreateWorkspaceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
diff --git a/gen/Amazonka/IotTwinMaker/DeleteComponentType.hs b/gen/Amazonka/IotTwinMaker/DeleteComponentType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/DeleteComponentType.hs
@@ -0,0 +1,185 @@
+{-# 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.IotTwinMaker.DeleteComponentType
+-- 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 a component type.
+module Amazonka.IotTwinMaker.DeleteComponentType
+  ( -- * Creating a Request
+    DeleteComponentType (..),
+    newDeleteComponentType,
+
+    -- * Request Lenses
+    deleteComponentType_workspaceId,
+    deleteComponentType_componentTypeId,
+
+    -- * Destructuring the Response
+    DeleteComponentTypeResponse (..),
+    newDeleteComponentTypeResponse,
+
+    -- * Response Lenses
+    deleteComponentTypeResponse_httpStatus,
+    deleteComponentTypeResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteComponentType' smart constructor.
+data DeleteComponentType = DeleteComponentType'
+  { -- | The ID of the workspace that contains the component type.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the component type to delete.
+    componentTypeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteComponentType' 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:
+--
+-- 'workspaceId', 'deleteComponentType_workspaceId' - The ID of the workspace that contains the component type.
+--
+-- 'componentTypeId', 'deleteComponentType_componentTypeId' - The ID of the component type to delete.
+newDeleteComponentType ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  DeleteComponentType
+newDeleteComponentType
+  pWorkspaceId_
+  pComponentTypeId_ =
+    DeleteComponentType'
+      { workspaceId = pWorkspaceId_,
+        componentTypeId = pComponentTypeId_
+      }
+
+-- | The ID of the workspace that contains the component type.
+deleteComponentType_workspaceId :: Lens.Lens' DeleteComponentType Prelude.Text
+deleteComponentType_workspaceId = Lens.lens (\DeleteComponentType' {workspaceId} -> workspaceId) (\s@DeleteComponentType' {} a -> s {workspaceId = a} :: DeleteComponentType)
+
+-- | The ID of the component type to delete.
+deleteComponentType_componentTypeId :: Lens.Lens' DeleteComponentType Prelude.Text
+deleteComponentType_componentTypeId = Lens.lens (\DeleteComponentType' {componentTypeId} -> componentTypeId) (\s@DeleteComponentType' {} a -> s {componentTypeId = a} :: DeleteComponentType)
+
+instance Core.AWSRequest DeleteComponentType where
+  type
+    AWSResponse DeleteComponentType =
+      DeleteComponentTypeResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteComponentTypeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable DeleteComponentType where
+  hashWithSalt _salt DeleteComponentType' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` componentTypeId
+
+instance Prelude.NFData DeleteComponentType where
+  rnf DeleteComponentType' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeId
+
+instance Data.ToHeaders DeleteComponentType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteComponentType where
+  toPath DeleteComponentType' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/component-types/",
+        Data.toBS componentTypeId
+      ]
+
+instance Data.ToQuery DeleteComponentType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteComponentTypeResponse' smart constructor.
+data DeleteComponentTypeResponse = DeleteComponentTypeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The current state of the component type to be deleted.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteComponentTypeResponse' 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', 'deleteComponentTypeResponse_httpStatus' - The response's http status code.
+--
+-- 'state', 'deleteComponentTypeResponse_state' - The current state of the component type to be deleted.
+newDeleteComponentTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'state'
+  State ->
+  DeleteComponentTypeResponse
+newDeleteComponentTypeResponse pHttpStatus_ pState_ =
+  DeleteComponentTypeResponse'
+    { httpStatus =
+        pHttpStatus_,
+      state = pState_
+    }
+
+-- | The response's http status code.
+deleteComponentTypeResponse_httpStatus :: Lens.Lens' DeleteComponentTypeResponse Prelude.Int
+deleteComponentTypeResponse_httpStatus = Lens.lens (\DeleteComponentTypeResponse' {httpStatus} -> httpStatus) (\s@DeleteComponentTypeResponse' {} a -> s {httpStatus = a} :: DeleteComponentTypeResponse)
+
+-- | The current state of the component type to be deleted.
+deleteComponentTypeResponse_state :: Lens.Lens' DeleteComponentTypeResponse State
+deleteComponentTypeResponse_state = Lens.lens (\DeleteComponentTypeResponse' {state} -> state) (\s@DeleteComponentTypeResponse' {} a -> s {state = a} :: DeleteComponentTypeResponse)
+
+instance Prelude.NFData DeleteComponentTypeResponse where
+  rnf DeleteComponentTypeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/DeleteEntity.hs b/gen/Amazonka/IotTwinMaker/DeleteEntity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/DeleteEntity.hs
@@ -0,0 +1,196 @@
+{-# 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.IotTwinMaker.DeleteEntity
+-- 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 an entity.
+module Amazonka.IotTwinMaker.DeleteEntity
+  ( -- * Creating a Request
+    DeleteEntity (..),
+    newDeleteEntity,
+
+    -- * Request Lenses
+    deleteEntity_isRecursive,
+    deleteEntity_workspaceId,
+    deleteEntity_entityId,
+
+    -- * Destructuring the Response
+    DeleteEntityResponse (..),
+    newDeleteEntityResponse,
+
+    -- * Response Lenses
+    deleteEntityResponse_httpStatus,
+    deleteEntityResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteEntity' smart constructor.
+data DeleteEntity = DeleteEntity'
+  { -- | A Boolean value that specifies whether the operation deletes child
+    -- entities.
+    isRecursive :: Prelude.Maybe Prelude.Bool,
+    -- | The ID of the workspace that contains the entity to delete.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the entity to delete.
+    entityId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEntity' 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:
+--
+-- 'isRecursive', 'deleteEntity_isRecursive' - A Boolean value that specifies whether the operation deletes child
+-- entities.
+--
+-- 'workspaceId', 'deleteEntity_workspaceId' - The ID of the workspace that contains the entity to delete.
+--
+-- 'entityId', 'deleteEntity_entityId' - The ID of the entity to delete.
+newDeleteEntity ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'entityId'
+  Prelude.Text ->
+  DeleteEntity
+newDeleteEntity pWorkspaceId_ pEntityId_ =
+  DeleteEntity'
+    { isRecursive = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      entityId = pEntityId_
+    }
+
+-- | A Boolean value that specifies whether the operation deletes child
+-- entities.
+deleteEntity_isRecursive :: Lens.Lens' DeleteEntity (Prelude.Maybe Prelude.Bool)
+deleteEntity_isRecursive = Lens.lens (\DeleteEntity' {isRecursive} -> isRecursive) (\s@DeleteEntity' {} a -> s {isRecursive = a} :: DeleteEntity)
+
+-- | The ID of the workspace that contains the entity to delete.
+deleteEntity_workspaceId :: Lens.Lens' DeleteEntity Prelude.Text
+deleteEntity_workspaceId = Lens.lens (\DeleteEntity' {workspaceId} -> workspaceId) (\s@DeleteEntity' {} a -> s {workspaceId = a} :: DeleteEntity)
+
+-- | The ID of the entity to delete.
+deleteEntity_entityId :: Lens.Lens' DeleteEntity Prelude.Text
+deleteEntity_entityId = Lens.lens (\DeleteEntity' {entityId} -> entityId) (\s@DeleteEntity' {} a -> s {entityId = a} :: DeleteEntity)
+
+instance Core.AWSRequest DeleteEntity where
+  type AWSResponse DeleteEntity = DeleteEntityResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteEntityResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable DeleteEntity where
+  hashWithSalt _salt DeleteEntity' {..} =
+    _salt
+      `Prelude.hashWithSalt` isRecursive
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` entityId
+
+instance Prelude.NFData DeleteEntity where
+  rnf DeleteEntity' {..} =
+    Prelude.rnf isRecursive
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf entityId
+
+instance Data.ToHeaders DeleteEntity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteEntity where
+  toPath DeleteEntity' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entities/",
+        Data.toBS entityId
+      ]
+
+instance Data.ToQuery DeleteEntity where
+  toQuery DeleteEntity' {..} =
+    Prelude.mconcat ["isRecursive" Data.=: isRecursive]
+
+-- | /See:/ 'newDeleteEntityResponse' smart constructor.
+data DeleteEntityResponse = DeleteEntityResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The current state of the deleted entity.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEntityResponse' 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', 'deleteEntityResponse_httpStatus' - The response's http status code.
+--
+-- 'state', 'deleteEntityResponse_state' - The current state of the deleted entity.
+newDeleteEntityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'state'
+  State ->
+  DeleteEntityResponse
+newDeleteEntityResponse pHttpStatus_ pState_ =
+  DeleteEntityResponse'
+    { httpStatus = pHttpStatus_,
+      state = pState_
+    }
+
+-- | The response's http status code.
+deleteEntityResponse_httpStatus :: Lens.Lens' DeleteEntityResponse Prelude.Int
+deleteEntityResponse_httpStatus = Lens.lens (\DeleteEntityResponse' {httpStatus} -> httpStatus) (\s@DeleteEntityResponse' {} a -> s {httpStatus = a} :: DeleteEntityResponse)
+
+-- | The current state of the deleted entity.
+deleteEntityResponse_state :: Lens.Lens' DeleteEntityResponse State
+deleteEntityResponse_state = Lens.lens (\DeleteEntityResponse' {state} -> state) (\s@DeleteEntityResponse' {} a -> s {state = a} :: DeleteEntityResponse)
+
+instance Prelude.NFData DeleteEntityResponse where
+  rnf DeleteEntityResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/DeleteScene.hs b/gen/Amazonka/IotTwinMaker/DeleteScene.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/DeleteScene.hs
@@ -0,0 +1,163 @@
+{-# 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.IotTwinMaker.DeleteScene
+-- 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 a scene.
+module Amazonka.IotTwinMaker.DeleteScene
+  ( -- * Creating a Request
+    DeleteScene (..),
+    newDeleteScene,
+
+    -- * Request Lenses
+    deleteScene_workspaceId,
+    deleteScene_sceneId,
+
+    -- * Destructuring the Response
+    DeleteSceneResponse (..),
+    newDeleteSceneResponse,
+
+    -- * Response Lenses
+    deleteSceneResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteScene' smart constructor.
+data DeleteScene = DeleteScene'
+  { -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the scene to delete.
+    sceneId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteScene' 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:
+--
+-- 'workspaceId', 'deleteScene_workspaceId' - The ID of the workspace.
+--
+-- 'sceneId', 'deleteScene_sceneId' - The ID of the scene to delete.
+newDeleteScene ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'sceneId'
+  Prelude.Text ->
+  DeleteScene
+newDeleteScene pWorkspaceId_ pSceneId_ =
+  DeleteScene'
+    { workspaceId = pWorkspaceId_,
+      sceneId = pSceneId_
+    }
+
+-- | The ID of the workspace.
+deleteScene_workspaceId :: Lens.Lens' DeleteScene Prelude.Text
+deleteScene_workspaceId = Lens.lens (\DeleteScene' {workspaceId} -> workspaceId) (\s@DeleteScene' {} a -> s {workspaceId = a} :: DeleteScene)
+
+-- | The ID of the scene to delete.
+deleteScene_sceneId :: Lens.Lens' DeleteScene Prelude.Text
+deleteScene_sceneId = Lens.lens (\DeleteScene' {sceneId} -> sceneId) (\s@DeleteScene' {} a -> s {sceneId = a} :: DeleteScene)
+
+instance Core.AWSRequest DeleteScene where
+  type AWSResponse DeleteScene = DeleteSceneResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteSceneResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteScene where
+  hashWithSalt _salt DeleteScene' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` sceneId
+
+instance Prelude.NFData DeleteScene where
+  rnf DeleteScene' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf sceneId
+
+instance Data.ToHeaders DeleteScene where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteScene where
+  toPath DeleteScene' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/scenes/",
+        Data.toBS sceneId
+      ]
+
+instance Data.ToQuery DeleteScene where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSceneResponse' smart constructor.
+data DeleteSceneResponse = DeleteSceneResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSceneResponse' 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', 'deleteSceneResponse_httpStatus' - The response's http status code.
+newDeleteSceneResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteSceneResponse
+newDeleteSceneResponse pHttpStatus_ =
+  DeleteSceneResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteSceneResponse_httpStatus :: Lens.Lens' DeleteSceneResponse Prelude.Int
+deleteSceneResponse_httpStatus = Lens.lens (\DeleteSceneResponse' {httpStatus} -> httpStatus) (\s@DeleteSceneResponse' {} a -> s {httpStatus = a} :: DeleteSceneResponse)
+
+instance Prelude.NFData DeleteSceneResponse where
+  rnf DeleteSceneResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/DeleteSyncJob.hs b/gen/Amazonka/IotTwinMaker/DeleteSyncJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/DeleteSyncJob.hs
@@ -0,0 +1,188 @@
+{-# 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.IotTwinMaker.DeleteSyncJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Delete the SyncJob.
+module Amazonka.IotTwinMaker.DeleteSyncJob
+  ( -- * Creating a Request
+    DeleteSyncJob (..),
+    newDeleteSyncJob,
+
+    -- * Request Lenses
+    deleteSyncJob_workspaceId,
+    deleteSyncJob_syncSource,
+
+    -- * Destructuring the Response
+    DeleteSyncJobResponse (..),
+    newDeleteSyncJobResponse,
+
+    -- * Response Lenses
+    deleteSyncJobResponse_httpStatus,
+    deleteSyncJobResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteSyncJob' smart constructor.
+data DeleteSyncJob = DeleteSyncJob'
+  { -- | The workspace Id.
+    workspaceId :: Prelude.Text,
+    -- | The sync source.
+    --
+    -- Currently the only supported syncSoucre is @SITEWISE @.
+    syncSource :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSyncJob' 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:
+--
+-- 'workspaceId', 'deleteSyncJob_workspaceId' - The workspace Id.
+--
+-- 'syncSource', 'deleteSyncJob_syncSource' - The sync source.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+newDeleteSyncJob ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'syncSource'
+  Prelude.Text ->
+  DeleteSyncJob
+newDeleteSyncJob pWorkspaceId_ pSyncSource_ =
+  DeleteSyncJob'
+    { workspaceId = pWorkspaceId_,
+      syncSource = pSyncSource_
+    }
+
+-- | The workspace Id.
+deleteSyncJob_workspaceId :: Lens.Lens' DeleteSyncJob Prelude.Text
+deleteSyncJob_workspaceId = Lens.lens (\DeleteSyncJob' {workspaceId} -> workspaceId) (\s@DeleteSyncJob' {} a -> s {workspaceId = a} :: DeleteSyncJob)
+
+-- | The sync source.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+deleteSyncJob_syncSource :: Lens.Lens' DeleteSyncJob Prelude.Text
+deleteSyncJob_syncSource = Lens.lens (\DeleteSyncJob' {syncSource} -> syncSource) (\s@DeleteSyncJob' {} a -> s {syncSource = a} :: DeleteSyncJob)
+
+instance Core.AWSRequest DeleteSyncJob where
+  type
+    AWSResponse DeleteSyncJob =
+      DeleteSyncJobResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteSyncJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable DeleteSyncJob where
+  hashWithSalt _salt DeleteSyncJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` syncSource
+
+instance Prelude.NFData DeleteSyncJob where
+  rnf DeleteSyncJob' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf syncSource
+
+instance Data.ToHeaders DeleteSyncJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteSyncJob where
+  toPath DeleteSyncJob' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/sync-jobs/",
+        Data.toBS syncSource
+      ]
+
+instance Data.ToQuery DeleteSyncJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSyncJobResponse' smart constructor.
+data DeleteSyncJobResponse = DeleteSyncJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The SyncJob response state.
+    state :: SyncJobState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSyncJobResponse' 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', 'deleteSyncJobResponse_httpStatus' - The response's http status code.
+--
+-- 'state', 'deleteSyncJobResponse_state' - The SyncJob response state.
+newDeleteSyncJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'state'
+  SyncJobState ->
+  DeleteSyncJobResponse
+newDeleteSyncJobResponse pHttpStatus_ pState_ =
+  DeleteSyncJobResponse'
+    { httpStatus = pHttpStatus_,
+      state = pState_
+    }
+
+-- | The response's http status code.
+deleteSyncJobResponse_httpStatus :: Lens.Lens' DeleteSyncJobResponse Prelude.Int
+deleteSyncJobResponse_httpStatus = Lens.lens (\DeleteSyncJobResponse' {httpStatus} -> httpStatus) (\s@DeleteSyncJobResponse' {} a -> s {httpStatus = a} :: DeleteSyncJobResponse)
+
+-- | The SyncJob response state.
+deleteSyncJobResponse_state :: Lens.Lens' DeleteSyncJobResponse SyncJobState
+deleteSyncJobResponse_state = Lens.lens (\DeleteSyncJobResponse' {state} -> state) (\s@DeleteSyncJobResponse' {} a -> s {state = a} :: DeleteSyncJobResponse)
+
+instance Prelude.NFData DeleteSyncJobResponse where
+  rnf DeleteSyncJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/DeleteWorkspace.hs b/gen/Amazonka/IotTwinMaker/DeleteWorkspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/DeleteWorkspace.hs
@@ -0,0 +1,144 @@
+{-# 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.IotTwinMaker.DeleteWorkspace
+-- 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 a workspace.
+module Amazonka.IotTwinMaker.DeleteWorkspace
+  ( -- * Creating a Request
+    DeleteWorkspace (..),
+    newDeleteWorkspace,
+
+    -- * Request Lenses
+    deleteWorkspace_workspaceId,
+
+    -- * Destructuring the Response
+    DeleteWorkspaceResponse (..),
+    newDeleteWorkspaceResponse,
+
+    -- * Response Lenses
+    deleteWorkspaceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteWorkspace' smart constructor.
+data DeleteWorkspace = DeleteWorkspace'
+  { -- | The ID of the workspace to delete.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteWorkspace' 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:
+--
+-- 'workspaceId', 'deleteWorkspace_workspaceId' - The ID of the workspace to delete.
+newDeleteWorkspace ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  DeleteWorkspace
+newDeleteWorkspace pWorkspaceId_ =
+  DeleteWorkspace' {workspaceId = pWorkspaceId_}
+
+-- | The ID of the workspace to delete.
+deleteWorkspace_workspaceId :: Lens.Lens' DeleteWorkspace Prelude.Text
+deleteWorkspace_workspaceId = Lens.lens (\DeleteWorkspace' {workspaceId} -> workspaceId) (\s@DeleteWorkspace' {} a -> s {workspaceId = a} :: DeleteWorkspace)
+
+instance Core.AWSRequest DeleteWorkspace where
+  type
+    AWSResponse DeleteWorkspace =
+      DeleteWorkspaceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteWorkspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteWorkspace where
+  hashWithSalt _salt DeleteWorkspace' {..} =
+    _salt `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData DeleteWorkspace where
+  rnf DeleteWorkspace' {..} = Prelude.rnf workspaceId
+
+instance Data.ToHeaders DeleteWorkspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteWorkspace where
+  toPath DeleteWorkspace' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId]
+
+instance Data.ToQuery DeleteWorkspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteWorkspaceResponse' smart constructor.
+data DeleteWorkspaceResponse = DeleteWorkspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteWorkspaceResponse' 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', 'deleteWorkspaceResponse_httpStatus' - The response's http status code.
+newDeleteWorkspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteWorkspaceResponse
+newDeleteWorkspaceResponse pHttpStatus_ =
+  DeleteWorkspaceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteWorkspaceResponse_httpStatus :: Lens.Lens' DeleteWorkspaceResponse Prelude.Int
+deleteWorkspaceResponse_httpStatus = Lens.lens (\DeleteWorkspaceResponse' {httpStatus} -> httpStatus) (\s@DeleteWorkspaceResponse' {} a -> s {httpStatus = a} :: DeleteWorkspaceResponse)
+
+instance Prelude.NFData DeleteWorkspaceResponse where
+  rnf DeleteWorkspaceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ExecuteQuery.hs b/gen/Amazonka/IotTwinMaker/ExecuteQuery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ExecuteQuery.hs
@@ -0,0 +1,243 @@
+{-# 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.IotTwinMaker.ExecuteQuery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Run queries to access information from your knowledge graph of entities
+-- within individual workspaces.
+module Amazonka.IotTwinMaker.ExecuteQuery
+  ( -- * Creating a Request
+    ExecuteQuery (..),
+    newExecuteQuery,
+
+    -- * Request Lenses
+    executeQuery_maxResults,
+    executeQuery_nextToken,
+    executeQuery_workspaceId,
+    executeQuery_queryStatement,
+
+    -- * Destructuring the Response
+    ExecuteQueryResponse (..),
+    newExecuteQueryResponse,
+
+    -- * Response Lenses
+    executeQueryResponse_columnDescriptions,
+    executeQueryResponse_nextToken,
+    executeQueryResponse_rows,
+    executeQueryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newExecuteQuery' smart constructor.
+data ExecuteQuery = ExecuteQuery'
+  { -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The query statement.
+    queryStatement :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExecuteQuery' 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', 'executeQuery_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'executeQuery_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'executeQuery_workspaceId' - The ID of the workspace.
+--
+-- 'queryStatement', 'executeQuery_queryStatement' - The query statement.
+newExecuteQuery ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'queryStatement'
+  Prelude.Text ->
+  ExecuteQuery
+newExecuteQuery pWorkspaceId_ pQueryStatement_ =
+  ExecuteQuery'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      queryStatement = pQueryStatement_
+    }
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+executeQuery_maxResults :: Lens.Lens' ExecuteQuery (Prelude.Maybe Prelude.Natural)
+executeQuery_maxResults = Lens.lens (\ExecuteQuery' {maxResults} -> maxResults) (\s@ExecuteQuery' {} a -> s {maxResults = a} :: ExecuteQuery)
+
+-- | The string that specifies the next page of results.
+executeQuery_nextToken :: Lens.Lens' ExecuteQuery (Prelude.Maybe Prelude.Text)
+executeQuery_nextToken = Lens.lens (\ExecuteQuery' {nextToken} -> nextToken) (\s@ExecuteQuery' {} a -> s {nextToken = a} :: ExecuteQuery)
+
+-- | The ID of the workspace.
+executeQuery_workspaceId :: Lens.Lens' ExecuteQuery Prelude.Text
+executeQuery_workspaceId = Lens.lens (\ExecuteQuery' {workspaceId} -> workspaceId) (\s@ExecuteQuery' {} a -> s {workspaceId = a} :: ExecuteQuery)
+
+-- | The query statement.
+executeQuery_queryStatement :: Lens.Lens' ExecuteQuery Prelude.Text
+executeQuery_queryStatement = Lens.lens (\ExecuteQuery' {queryStatement} -> queryStatement) (\s@ExecuteQuery' {} a -> s {queryStatement = a} :: ExecuteQuery)
+
+instance Core.AWSRequest ExecuteQuery where
+  type AWSResponse ExecuteQuery = ExecuteQueryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ExecuteQueryResponse'
+            Prelude.<$> ( x
+                            Data..?> "columnDescriptions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "rows" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ExecuteQuery where
+  hashWithSalt _salt ExecuteQuery' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` queryStatement
+
+instance Prelude.NFData ExecuteQuery where
+  rnf ExecuteQuery' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf queryStatement
+
+instance Data.ToHeaders ExecuteQuery where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ExecuteQuery where
+  toJSON ExecuteQuery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("workspaceId" Data..= workspaceId),
+            Prelude.Just
+              ("queryStatement" Data..= queryStatement)
+          ]
+      )
+
+instance Data.ToPath ExecuteQuery where
+  toPath = Prelude.const "/queries/execution"
+
+instance Data.ToQuery ExecuteQuery where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newExecuteQueryResponse' smart constructor.
+data ExecuteQueryResponse = ExecuteQueryResponse'
+  { -- | A list of ColumnDescription objects.
+    columnDescriptions :: Prelude.Maybe [ColumnDescription],
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Represents a single row in the query results.
+    rows :: Prelude.Maybe [Row],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExecuteQueryResponse' 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:
+--
+-- 'columnDescriptions', 'executeQueryResponse_columnDescriptions' - A list of ColumnDescription objects.
+--
+-- 'nextToken', 'executeQueryResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'rows', 'executeQueryResponse_rows' - Represents a single row in the query results.
+--
+-- 'httpStatus', 'executeQueryResponse_httpStatus' - The response's http status code.
+newExecuteQueryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ExecuteQueryResponse
+newExecuteQueryResponse pHttpStatus_ =
+  ExecuteQueryResponse'
+    { columnDescriptions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      rows = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of ColumnDescription objects.
+executeQueryResponse_columnDescriptions :: Lens.Lens' ExecuteQueryResponse (Prelude.Maybe [ColumnDescription])
+executeQueryResponse_columnDescriptions = Lens.lens (\ExecuteQueryResponse' {columnDescriptions} -> columnDescriptions) (\s@ExecuteQueryResponse' {} a -> s {columnDescriptions = a} :: ExecuteQueryResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The string that specifies the next page of results.
+executeQueryResponse_nextToken :: Lens.Lens' ExecuteQueryResponse (Prelude.Maybe Prelude.Text)
+executeQueryResponse_nextToken = Lens.lens (\ExecuteQueryResponse' {nextToken} -> nextToken) (\s@ExecuteQueryResponse' {} a -> s {nextToken = a} :: ExecuteQueryResponse)
+
+-- | Represents a single row in the query results.
+executeQueryResponse_rows :: Lens.Lens' ExecuteQueryResponse (Prelude.Maybe [Row])
+executeQueryResponse_rows = Lens.lens (\ExecuteQueryResponse' {rows} -> rows) (\s@ExecuteQueryResponse' {} a -> s {rows = a} :: ExecuteQueryResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+executeQueryResponse_httpStatus :: Lens.Lens' ExecuteQueryResponse Prelude.Int
+executeQueryResponse_httpStatus = Lens.lens (\ExecuteQueryResponse' {httpStatus} -> httpStatus) (\s@ExecuteQueryResponse' {} a -> s {httpStatus = a} :: ExecuteQueryResponse)
+
+instance Prelude.NFData ExecuteQueryResponse where
+  rnf ExecuteQueryResponse' {..} =
+    Prelude.rnf columnDescriptions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf rows
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/GetComponentType.hs b/gen/Amazonka/IotTwinMaker/GetComponentType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetComponentType.hs
@@ -0,0 +1,403 @@
+{-# 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.IotTwinMaker.GetComponentType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a component type.
+module Amazonka.IotTwinMaker.GetComponentType
+  ( -- * Creating a Request
+    GetComponentType (..),
+    newGetComponentType,
+
+    -- * Request Lenses
+    getComponentType_workspaceId,
+    getComponentType_componentTypeId,
+
+    -- * Destructuring the Response
+    GetComponentTypeResponse (..),
+    newGetComponentTypeResponse,
+
+    -- * Response Lenses
+    getComponentTypeResponse_componentTypeName,
+    getComponentTypeResponse_description,
+    getComponentTypeResponse_extendsFrom,
+    getComponentTypeResponse_functions,
+    getComponentTypeResponse_isAbstract,
+    getComponentTypeResponse_isSchemaInitialized,
+    getComponentTypeResponse_isSingleton,
+    getComponentTypeResponse_propertyDefinitions,
+    getComponentTypeResponse_propertyGroups,
+    getComponentTypeResponse_status,
+    getComponentTypeResponse_syncSource,
+    getComponentTypeResponse_httpStatus,
+    getComponentTypeResponse_workspaceId,
+    getComponentTypeResponse_componentTypeId,
+    getComponentTypeResponse_creationDateTime,
+    getComponentTypeResponse_updateDateTime,
+    getComponentTypeResponse_arn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetComponentType' smart constructor.
+data GetComponentType = GetComponentType'
+  { -- | The ID of the workspace that contains the component type.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponentType' 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:
+--
+-- 'workspaceId', 'getComponentType_workspaceId' - The ID of the workspace that contains the component type.
+--
+-- 'componentTypeId', 'getComponentType_componentTypeId' - The ID of the component type.
+newGetComponentType ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  GetComponentType
+newGetComponentType pWorkspaceId_ pComponentTypeId_ =
+  GetComponentType'
+    { workspaceId = pWorkspaceId_,
+      componentTypeId = pComponentTypeId_
+    }
+
+-- | The ID of the workspace that contains the component type.
+getComponentType_workspaceId :: Lens.Lens' GetComponentType Prelude.Text
+getComponentType_workspaceId = Lens.lens (\GetComponentType' {workspaceId} -> workspaceId) (\s@GetComponentType' {} a -> s {workspaceId = a} :: GetComponentType)
+
+-- | The ID of the component type.
+getComponentType_componentTypeId :: Lens.Lens' GetComponentType Prelude.Text
+getComponentType_componentTypeId = Lens.lens (\GetComponentType' {componentTypeId} -> componentTypeId) (\s@GetComponentType' {} a -> s {componentTypeId = a} :: GetComponentType)
+
+instance Core.AWSRequest GetComponentType where
+  type
+    AWSResponse GetComponentType =
+      GetComponentTypeResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetComponentTypeResponse'
+            Prelude.<$> (x Data..?> "componentTypeName")
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (x Data..?> "extendsFrom" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "functions" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "isAbstract")
+            Prelude.<*> (x Data..?> "isSchemaInitialized")
+            Prelude.<*> (x Data..?> "isSingleton")
+            Prelude.<*> ( x
+                            Data..?> "propertyDefinitions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "propertyGroups" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "syncSource")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "componentTypeId")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "updateDateTime")
+            Prelude.<*> (x Data..:> "arn")
+      )
+
+instance Prelude.Hashable GetComponentType where
+  hashWithSalt _salt GetComponentType' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` componentTypeId
+
+instance Prelude.NFData GetComponentType where
+  rnf GetComponentType' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeId
+
+instance Data.ToHeaders GetComponentType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetComponentType where
+  toPath GetComponentType' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/component-types/",
+        Data.toBS componentTypeId
+      ]
+
+instance Data.ToQuery GetComponentType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetComponentTypeResponse' smart constructor.
+data GetComponentTypeResponse = GetComponentTypeResponse'
+  { -- | The component type name.
+    componentTypeName :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The name of the parent component type that this component type extends.
+    extendsFrom :: Prelude.Maybe [Prelude.Text],
+    -- | An object that maps strings to the functions in the component type. Each
+    -- string in the mapping must be unique to this object.
+    functions :: Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionResponse),
+    -- | A Boolean value that specifies whether the component type is abstract.
+    isAbstract :: Prelude.Maybe Prelude.Bool,
+    -- | A Boolean value that specifies whether the component type has a schema
+    -- initializer and that the schema initializer has run.
+    isSchemaInitialized :: Prelude.Maybe Prelude.Bool,
+    -- | A Boolean value that specifies whether an entity can have more than one
+    -- component of this type.
+    isSingleton :: Prelude.Maybe Prelude.Bool,
+    -- | An object that maps strings to the property definitions in the component
+    -- type. Each string in the mapping must be unique to this object.
+    propertyDefinitions :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionResponse),
+    -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    propertyGroups :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupResponse),
+    -- | The current status of the component type.
+    status :: Prelude.Maybe Status,
+    -- | The syncSource of the sync job, if this entity was created by a sync
+    -- job.
+    syncSource :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the workspace that contains the component type.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text,
+    -- | The date and time when the component type was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the component was last updated.
+    updateDateTime :: Data.POSIX,
+    -- | The ARN of the component type.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetComponentTypeResponse' 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:
+--
+-- 'componentTypeName', 'getComponentTypeResponse_componentTypeName' - The component type name.
+--
+-- 'description', 'getComponentTypeResponse_description' - The description of the component type.
+--
+-- 'extendsFrom', 'getComponentTypeResponse_extendsFrom' - The name of the parent component type that this component type extends.
+--
+-- 'functions', 'getComponentTypeResponse_functions' - An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+--
+-- 'isAbstract', 'getComponentTypeResponse_isAbstract' - A Boolean value that specifies whether the component type is abstract.
+--
+-- 'isSchemaInitialized', 'getComponentTypeResponse_isSchemaInitialized' - A Boolean value that specifies whether the component type has a schema
+-- initializer and that the schema initializer has run.
+--
+-- 'isSingleton', 'getComponentTypeResponse_isSingleton' - A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+--
+-- 'propertyDefinitions', 'getComponentTypeResponse_propertyDefinitions' - An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+--
+-- 'propertyGroups', 'getComponentTypeResponse_propertyGroups' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'status', 'getComponentTypeResponse_status' - The current status of the component type.
+--
+-- 'syncSource', 'getComponentTypeResponse_syncSource' - The syncSource of the sync job, if this entity was created by a sync
+-- job.
+--
+-- 'httpStatus', 'getComponentTypeResponse_httpStatus' - The response's http status code.
+--
+-- 'workspaceId', 'getComponentTypeResponse_workspaceId' - The ID of the workspace that contains the component type.
+--
+-- 'componentTypeId', 'getComponentTypeResponse_componentTypeId' - The ID of the component type.
+--
+-- 'creationDateTime', 'getComponentTypeResponse_creationDateTime' - The date and time when the component type was created.
+--
+-- 'updateDateTime', 'getComponentTypeResponse_updateDateTime' - The date and time when the component was last updated.
+--
+-- 'arn', 'getComponentTypeResponse_arn' - The ARN of the component type.
+newGetComponentTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  -- | 'arn'
+  Prelude.Text ->
+  GetComponentTypeResponse
+newGetComponentTypeResponse
+  pHttpStatus_
+  pWorkspaceId_
+  pComponentTypeId_
+  pCreationDateTime_
+  pUpdateDateTime_
+  pArn_ =
+    GetComponentTypeResponse'
+      { componentTypeName =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        extendsFrom = Prelude.Nothing,
+        functions = Prelude.Nothing,
+        isAbstract = Prelude.Nothing,
+        isSchemaInitialized = Prelude.Nothing,
+        isSingleton = Prelude.Nothing,
+        propertyDefinitions = Prelude.Nothing,
+        propertyGroups = Prelude.Nothing,
+        status = Prelude.Nothing,
+        syncSource = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workspaceId = pWorkspaceId_,
+        componentTypeId = pComponentTypeId_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime =
+          Data._Time Lens.# pUpdateDateTime_,
+        arn = pArn_
+      }
+
+-- | The component type name.
+getComponentTypeResponse_componentTypeName :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Text)
+getComponentTypeResponse_componentTypeName = Lens.lens (\GetComponentTypeResponse' {componentTypeName} -> componentTypeName) (\s@GetComponentTypeResponse' {} a -> s {componentTypeName = a} :: GetComponentTypeResponse)
+
+-- | The description of the component type.
+getComponentTypeResponse_description :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Text)
+getComponentTypeResponse_description = Lens.lens (\GetComponentTypeResponse' {description} -> description) (\s@GetComponentTypeResponse' {} a -> s {description = a} :: GetComponentTypeResponse)
+
+-- | The name of the parent component type that this component type extends.
+getComponentTypeResponse_extendsFrom :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe [Prelude.Text])
+getComponentTypeResponse_extendsFrom = Lens.lens (\GetComponentTypeResponse' {extendsFrom} -> extendsFrom) (\s@GetComponentTypeResponse' {} a -> s {extendsFrom = a} :: GetComponentTypeResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+getComponentTypeResponse_functions :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionResponse))
+getComponentTypeResponse_functions = Lens.lens (\GetComponentTypeResponse' {functions} -> functions) (\s@GetComponentTypeResponse' {} a -> s {functions = a} :: GetComponentTypeResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A Boolean value that specifies whether the component type is abstract.
+getComponentTypeResponse_isAbstract :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Bool)
+getComponentTypeResponse_isAbstract = Lens.lens (\GetComponentTypeResponse' {isAbstract} -> isAbstract) (\s@GetComponentTypeResponse' {} a -> s {isAbstract = a} :: GetComponentTypeResponse)
+
+-- | A Boolean value that specifies whether the component type has a schema
+-- initializer and that the schema initializer has run.
+getComponentTypeResponse_isSchemaInitialized :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Bool)
+getComponentTypeResponse_isSchemaInitialized = Lens.lens (\GetComponentTypeResponse' {isSchemaInitialized} -> isSchemaInitialized) (\s@GetComponentTypeResponse' {} a -> s {isSchemaInitialized = a} :: GetComponentTypeResponse)
+
+-- | A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+getComponentTypeResponse_isSingleton :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Bool)
+getComponentTypeResponse_isSingleton = Lens.lens (\GetComponentTypeResponse' {isSingleton} -> isSingleton) (\s@GetComponentTypeResponse' {} a -> s {isSingleton = a} :: GetComponentTypeResponse)
+
+-- | An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+getComponentTypeResponse_propertyDefinitions :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionResponse))
+getComponentTypeResponse_propertyDefinitions = Lens.lens (\GetComponentTypeResponse' {propertyDefinitions} -> propertyDefinitions) (\s@GetComponentTypeResponse' {} a -> s {propertyDefinitions = a} :: GetComponentTypeResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+getComponentTypeResponse_propertyGroups :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupResponse))
+getComponentTypeResponse_propertyGroups = Lens.lens (\GetComponentTypeResponse' {propertyGroups} -> propertyGroups) (\s@GetComponentTypeResponse' {} a -> s {propertyGroups = a} :: GetComponentTypeResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The current status of the component type.
+getComponentTypeResponse_status :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Status)
+getComponentTypeResponse_status = Lens.lens (\GetComponentTypeResponse' {status} -> status) (\s@GetComponentTypeResponse' {} a -> s {status = a} :: GetComponentTypeResponse)
+
+-- | The syncSource of the sync job, if this entity was created by a sync
+-- job.
+getComponentTypeResponse_syncSource :: Lens.Lens' GetComponentTypeResponse (Prelude.Maybe Prelude.Text)
+getComponentTypeResponse_syncSource = Lens.lens (\GetComponentTypeResponse' {syncSource} -> syncSource) (\s@GetComponentTypeResponse' {} a -> s {syncSource = a} :: GetComponentTypeResponse)
+
+-- | The response's http status code.
+getComponentTypeResponse_httpStatus :: Lens.Lens' GetComponentTypeResponse Prelude.Int
+getComponentTypeResponse_httpStatus = Lens.lens (\GetComponentTypeResponse' {httpStatus} -> httpStatus) (\s@GetComponentTypeResponse' {} a -> s {httpStatus = a} :: GetComponentTypeResponse)
+
+-- | The ID of the workspace that contains the component type.
+getComponentTypeResponse_workspaceId :: Lens.Lens' GetComponentTypeResponse Prelude.Text
+getComponentTypeResponse_workspaceId = Lens.lens (\GetComponentTypeResponse' {workspaceId} -> workspaceId) (\s@GetComponentTypeResponse' {} a -> s {workspaceId = a} :: GetComponentTypeResponse)
+
+-- | The ID of the component type.
+getComponentTypeResponse_componentTypeId :: Lens.Lens' GetComponentTypeResponse Prelude.Text
+getComponentTypeResponse_componentTypeId = Lens.lens (\GetComponentTypeResponse' {componentTypeId} -> componentTypeId) (\s@GetComponentTypeResponse' {} a -> s {componentTypeId = a} :: GetComponentTypeResponse)
+
+-- | The date and time when the component type was created.
+getComponentTypeResponse_creationDateTime :: Lens.Lens' GetComponentTypeResponse Prelude.UTCTime
+getComponentTypeResponse_creationDateTime = Lens.lens (\GetComponentTypeResponse' {creationDateTime} -> creationDateTime) (\s@GetComponentTypeResponse' {} a -> s {creationDateTime = a} :: GetComponentTypeResponse) Prelude.. Data._Time
+
+-- | The date and time when the component was last updated.
+getComponentTypeResponse_updateDateTime :: Lens.Lens' GetComponentTypeResponse Prelude.UTCTime
+getComponentTypeResponse_updateDateTime = Lens.lens (\GetComponentTypeResponse' {updateDateTime} -> updateDateTime) (\s@GetComponentTypeResponse' {} a -> s {updateDateTime = a} :: GetComponentTypeResponse) Prelude.. Data._Time
+
+-- | The ARN of the component type.
+getComponentTypeResponse_arn :: Lens.Lens' GetComponentTypeResponse Prelude.Text
+getComponentTypeResponse_arn = Lens.lens (\GetComponentTypeResponse' {arn} -> arn) (\s@GetComponentTypeResponse' {} a -> s {arn = a} :: GetComponentTypeResponse)
+
+instance Prelude.NFData GetComponentTypeResponse where
+  rnf GetComponentTypeResponse' {..} =
+    Prelude.rnf componentTypeName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf extendsFrom
+      `Prelude.seq` Prelude.rnf functions
+      `Prelude.seq` Prelude.rnf isAbstract
+      `Prelude.seq` Prelude.rnf isSchemaInitialized
+      `Prelude.seq` Prelude.rnf isSingleton
+      `Prelude.seq` Prelude.rnf propertyDefinitions
+      `Prelude.seq` Prelude.rnf propertyGroups
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf syncSource
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
+      `Prelude.seq` Prelude.rnf arn
diff --git a/gen/Amazonka/IotTwinMaker/GetEntity.hs b/gen/Amazonka/IotTwinMaker/GetEntity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetEntity.hs
@@ -0,0 +1,348 @@
+{-# 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.IotTwinMaker.GetEntity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about an entity.
+module Amazonka.IotTwinMaker.GetEntity
+  ( -- * Creating a Request
+    GetEntity (..),
+    newGetEntity,
+
+    -- * Request Lenses
+    getEntity_workspaceId,
+    getEntity_entityId,
+
+    -- * Destructuring the Response
+    GetEntityResponse (..),
+    newGetEntityResponse,
+
+    -- * Response Lenses
+    getEntityResponse_components,
+    getEntityResponse_description,
+    getEntityResponse_syncSource,
+    getEntityResponse_httpStatus,
+    getEntityResponse_entityId,
+    getEntityResponse_entityName,
+    getEntityResponse_arn,
+    getEntityResponse_status,
+    getEntityResponse_workspaceId,
+    getEntityResponse_parentEntityId,
+    getEntityResponse_hasChildEntities,
+    getEntityResponse_creationDateTime,
+    getEntityResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetEntity' smart constructor.
+data GetEntity = GetEntity'
+  { -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEntity' 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:
+--
+-- 'workspaceId', 'getEntity_workspaceId' - The ID of the workspace.
+--
+-- 'entityId', 'getEntity_entityId' - The ID of the entity.
+newGetEntity ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'entityId'
+  Prelude.Text ->
+  GetEntity
+newGetEntity pWorkspaceId_ pEntityId_ =
+  GetEntity'
+    { workspaceId = pWorkspaceId_,
+      entityId = pEntityId_
+    }
+
+-- | The ID of the workspace.
+getEntity_workspaceId :: Lens.Lens' GetEntity Prelude.Text
+getEntity_workspaceId = Lens.lens (\GetEntity' {workspaceId} -> workspaceId) (\s@GetEntity' {} a -> s {workspaceId = a} :: GetEntity)
+
+-- | The ID of the entity.
+getEntity_entityId :: Lens.Lens' GetEntity Prelude.Text
+getEntity_entityId = Lens.lens (\GetEntity' {entityId} -> entityId) (\s@GetEntity' {} a -> s {entityId = a} :: GetEntity)
+
+instance Core.AWSRequest GetEntity where
+  type AWSResponse GetEntity = GetEntityResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetEntityResponse'
+            Prelude.<$> (x Data..?> "components" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (x Data..?> "syncSource")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "entityId")
+            Prelude.<*> (x Data..:> "entityName")
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "status")
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "parentEntityId")
+            Prelude.<*> (x Data..:> "hasChildEntities")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable GetEntity where
+  hashWithSalt _salt GetEntity' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` entityId
+
+instance Prelude.NFData GetEntity where
+  rnf GetEntity' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf entityId
+
+instance Data.ToHeaders GetEntity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetEntity where
+  toPath GetEntity' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entities/",
+        Data.toBS entityId
+      ]
+
+instance Data.ToQuery GetEntity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetEntityResponse' smart constructor.
+data GetEntityResponse = GetEntityResponse'
+  { -- | An object that maps strings to the components in the entity. Each string
+    -- in the mapping must be unique to this object.
+    components :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentResponse),
+    -- | The description of the entity.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The syncSource of the sync job, if this entity was created by a sync
+    -- job.
+    syncSource :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the entity.
+    entityId :: Prelude.Text,
+    -- | The name of the entity.
+    entityName :: Prelude.Text,
+    -- | The ARN of the entity.
+    arn :: Prelude.Text,
+    -- | The current status of the entity.
+    status :: Status,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the parent entity for this entity.
+    parentEntityId :: Prelude.Text,
+    -- | A Boolean value that specifies whether the entity has associated child
+    -- entities.
+    hasChildEntities :: Prelude.Bool,
+    -- | The date and time when the entity was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the entity was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetEntityResponse' 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:
+--
+-- 'components', 'getEntityResponse_components' - An object that maps strings to the components in the entity. Each string
+-- in the mapping must be unique to this object.
+--
+-- 'description', 'getEntityResponse_description' - The description of the entity.
+--
+-- 'syncSource', 'getEntityResponse_syncSource' - The syncSource of the sync job, if this entity was created by a sync
+-- job.
+--
+-- 'httpStatus', 'getEntityResponse_httpStatus' - The response's http status code.
+--
+-- 'entityId', 'getEntityResponse_entityId' - The ID of the entity.
+--
+-- 'entityName', 'getEntityResponse_entityName' - The name of the entity.
+--
+-- 'arn', 'getEntityResponse_arn' - The ARN of the entity.
+--
+-- 'status', 'getEntityResponse_status' - The current status of the entity.
+--
+-- 'workspaceId', 'getEntityResponse_workspaceId' - The ID of the workspace.
+--
+-- 'parentEntityId', 'getEntityResponse_parentEntityId' - The ID of the parent entity for this entity.
+--
+-- 'hasChildEntities', 'getEntityResponse_hasChildEntities' - A Boolean value that specifies whether the entity has associated child
+-- entities.
+--
+-- 'creationDateTime', 'getEntityResponse_creationDateTime' - The date and time when the entity was created.
+--
+-- 'updateDateTime', 'getEntityResponse_updateDateTime' - The date and time when the entity was last updated.
+newGetEntityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'entityId'
+  Prelude.Text ->
+  -- | 'entityName'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'status'
+  Status ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'parentEntityId'
+  Prelude.Text ->
+  -- | 'hasChildEntities'
+  Prelude.Bool ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  GetEntityResponse
+newGetEntityResponse
+  pHttpStatus_
+  pEntityId_
+  pEntityName_
+  pArn_
+  pStatus_
+  pWorkspaceId_
+  pParentEntityId_
+  pHasChildEntities_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    GetEntityResponse'
+      { components = Prelude.Nothing,
+        description = Prelude.Nothing,
+        syncSource = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        entityId = pEntityId_,
+        entityName = pEntityName_,
+        arn = pArn_,
+        status = pStatus_,
+        workspaceId = pWorkspaceId_,
+        parentEntityId = pParentEntityId_,
+        hasChildEntities = pHasChildEntities_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | An object that maps strings to the components in the entity. Each string
+-- in the mapping must be unique to this object.
+getEntityResponse_components :: Lens.Lens' GetEntityResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentResponse))
+getEntityResponse_components = Lens.lens (\GetEntityResponse' {components} -> components) (\s@GetEntityResponse' {} a -> s {components = a} :: GetEntityResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the entity.
+getEntityResponse_description :: Lens.Lens' GetEntityResponse (Prelude.Maybe Prelude.Text)
+getEntityResponse_description = Lens.lens (\GetEntityResponse' {description} -> description) (\s@GetEntityResponse' {} a -> s {description = a} :: GetEntityResponse)
+
+-- | The syncSource of the sync job, if this entity was created by a sync
+-- job.
+getEntityResponse_syncSource :: Lens.Lens' GetEntityResponse (Prelude.Maybe Prelude.Text)
+getEntityResponse_syncSource = Lens.lens (\GetEntityResponse' {syncSource} -> syncSource) (\s@GetEntityResponse' {} a -> s {syncSource = a} :: GetEntityResponse)
+
+-- | The response's http status code.
+getEntityResponse_httpStatus :: Lens.Lens' GetEntityResponse Prelude.Int
+getEntityResponse_httpStatus = Lens.lens (\GetEntityResponse' {httpStatus} -> httpStatus) (\s@GetEntityResponse' {} a -> s {httpStatus = a} :: GetEntityResponse)
+
+-- | The ID of the entity.
+getEntityResponse_entityId :: Lens.Lens' GetEntityResponse Prelude.Text
+getEntityResponse_entityId = Lens.lens (\GetEntityResponse' {entityId} -> entityId) (\s@GetEntityResponse' {} a -> s {entityId = a} :: GetEntityResponse)
+
+-- | The name of the entity.
+getEntityResponse_entityName :: Lens.Lens' GetEntityResponse Prelude.Text
+getEntityResponse_entityName = Lens.lens (\GetEntityResponse' {entityName} -> entityName) (\s@GetEntityResponse' {} a -> s {entityName = a} :: GetEntityResponse)
+
+-- | The ARN of the entity.
+getEntityResponse_arn :: Lens.Lens' GetEntityResponse Prelude.Text
+getEntityResponse_arn = Lens.lens (\GetEntityResponse' {arn} -> arn) (\s@GetEntityResponse' {} a -> s {arn = a} :: GetEntityResponse)
+
+-- | The current status of the entity.
+getEntityResponse_status :: Lens.Lens' GetEntityResponse Status
+getEntityResponse_status = Lens.lens (\GetEntityResponse' {status} -> status) (\s@GetEntityResponse' {} a -> s {status = a} :: GetEntityResponse)
+
+-- | The ID of the workspace.
+getEntityResponse_workspaceId :: Lens.Lens' GetEntityResponse Prelude.Text
+getEntityResponse_workspaceId = Lens.lens (\GetEntityResponse' {workspaceId} -> workspaceId) (\s@GetEntityResponse' {} a -> s {workspaceId = a} :: GetEntityResponse)
+
+-- | The ID of the parent entity for this entity.
+getEntityResponse_parentEntityId :: Lens.Lens' GetEntityResponse Prelude.Text
+getEntityResponse_parentEntityId = Lens.lens (\GetEntityResponse' {parentEntityId} -> parentEntityId) (\s@GetEntityResponse' {} a -> s {parentEntityId = a} :: GetEntityResponse)
+
+-- | A Boolean value that specifies whether the entity has associated child
+-- entities.
+getEntityResponse_hasChildEntities :: Lens.Lens' GetEntityResponse Prelude.Bool
+getEntityResponse_hasChildEntities = Lens.lens (\GetEntityResponse' {hasChildEntities} -> hasChildEntities) (\s@GetEntityResponse' {} a -> s {hasChildEntities = a} :: GetEntityResponse)
+
+-- | The date and time when the entity was created.
+getEntityResponse_creationDateTime :: Lens.Lens' GetEntityResponse Prelude.UTCTime
+getEntityResponse_creationDateTime = Lens.lens (\GetEntityResponse' {creationDateTime} -> creationDateTime) (\s@GetEntityResponse' {} a -> s {creationDateTime = a} :: GetEntityResponse) Prelude.. Data._Time
+
+-- | The date and time when the entity was last updated.
+getEntityResponse_updateDateTime :: Lens.Lens' GetEntityResponse Prelude.UTCTime
+getEntityResponse_updateDateTime = Lens.lens (\GetEntityResponse' {updateDateTime} -> updateDateTime) (\s@GetEntityResponse' {} a -> s {updateDateTime = a} :: GetEntityResponse) Prelude.. Data._Time
+
+instance Prelude.NFData GetEntityResponse where
+  rnf GetEntityResponse' {..} =
+    Prelude.rnf components
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf syncSource
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf entityName
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf parentEntityId
+      `Prelude.seq` Prelude.rnf hasChildEntities
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/GetPricingPlan.hs b/gen/Amazonka/IotTwinMaker/GetPricingPlan.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetPricingPlan.hs
@@ -0,0 +1,157 @@
+{-# 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.IotTwinMaker.GetPricingPlan
+-- 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 pricing plan.
+module Amazonka.IotTwinMaker.GetPricingPlan
+  ( -- * Creating a Request
+    GetPricingPlan (..),
+    newGetPricingPlan,
+
+    -- * Destructuring the Response
+    GetPricingPlanResponse (..),
+    newGetPricingPlanResponse,
+
+    -- * Response Lenses
+    getPricingPlanResponse_pendingPricingPlan,
+    getPricingPlanResponse_httpStatus,
+    getPricingPlanResponse_currentPricingPlan,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetPricingPlan' smart constructor.
+data GetPricingPlan = GetPricingPlan'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPricingPlan' 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.
+newGetPricingPlan ::
+  GetPricingPlan
+newGetPricingPlan = GetPricingPlan'
+
+instance Core.AWSRequest GetPricingPlan where
+  type
+    AWSResponse GetPricingPlan =
+      GetPricingPlanResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPricingPlanResponse'
+            Prelude.<$> (x Data..?> "pendingPricingPlan")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "currentPricingPlan")
+      )
+
+instance Prelude.Hashable GetPricingPlan where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData GetPricingPlan where
+  rnf _ = ()
+
+instance Data.ToHeaders GetPricingPlan where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetPricingPlan where
+  toPath = Prelude.const "/pricingplan"
+
+instance Data.ToQuery GetPricingPlan where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetPricingPlanResponse' smart constructor.
+data GetPricingPlanResponse = GetPricingPlanResponse'
+  { -- | The pending pricing plan.
+    pendingPricingPlan :: Prelude.Maybe PricingPlan,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The chosen pricing plan for the current billing cycle.
+    currentPricingPlan :: PricingPlan
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPricingPlanResponse' 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:
+--
+-- 'pendingPricingPlan', 'getPricingPlanResponse_pendingPricingPlan' - The pending pricing plan.
+--
+-- 'httpStatus', 'getPricingPlanResponse_httpStatus' - The response's http status code.
+--
+-- 'currentPricingPlan', 'getPricingPlanResponse_currentPricingPlan' - The chosen pricing plan for the current billing cycle.
+newGetPricingPlanResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'currentPricingPlan'
+  PricingPlan ->
+  GetPricingPlanResponse
+newGetPricingPlanResponse
+  pHttpStatus_
+  pCurrentPricingPlan_ =
+    GetPricingPlanResponse'
+      { pendingPricingPlan =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        currentPricingPlan = pCurrentPricingPlan_
+      }
+
+-- | The pending pricing plan.
+getPricingPlanResponse_pendingPricingPlan :: Lens.Lens' GetPricingPlanResponse (Prelude.Maybe PricingPlan)
+getPricingPlanResponse_pendingPricingPlan = Lens.lens (\GetPricingPlanResponse' {pendingPricingPlan} -> pendingPricingPlan) (\s@GetPricingPlanResponse' {} a -> s {pendingPricingPlan = a} :: GetPricingPlanResponse)
+
+-- | The response's http status code.
+getPricingPlanResponse_httpStatus :: Lens.Lens' GetPricingPlanResponse Prelude.Int
+getPricingPlanResponse_httpStatus = Lens.lens (\GetPricingPlanResponse' {httpStatus} -> httpStatus) (\s@GetPricingPlanResponse' {} a -> s {httpStatus = a} :: GetPricingPlanResponse)
+
+-- | The chosen pricing plan for the current billing cycle.
+getPricingPlanResponse_currentPricingPlan :: Lens.Lens' GetPricingPlanResponse PricingPlan
+getPricingPlanResponse_currentPricingPlan = Lens.lens (\GetPricingPlanResponse' {currentPricingPlan} -> currentPricingPlan) (\s@GetPricingPlanResponse' {} a -> s {currentPricingPlan = a} :: GetPricingPlanResponse)
+
+instance Prelude.NFData GetPricingPlanResponse where
+  rnf GetPricingPlanResponse' {..} =
+    Prelude.rnf pendingPricingPlan
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf currentPricingPlan
diff --git a/gen/Amazonka/IotTwinMaker/GetPropertyValue.hs b/gen/Amazonka/IotTwinMaker/GetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetPropertyValue.hs
@@ -0,0 +1,332 @@
+{-# 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.IotTwinMaker.GetPropertyValue
+-- 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 property values for a component, component type, entity, or
+-- workspace.
+--
+-- You must specify a value for either @componentName@, @componentTypeId@,
+-- @entityId@, or @workspaceId@.
+module Amazonka.IotTwinMaker.GetPropertyValue
+  ( -- * Creating a Request
+    GetPropertyValue (..),
+    newGetPropertyValue,
+
+    -- * Request Lenses
+    getPropertyValue_componentName,
+    getPropertyValue_componentTypeId,
+    getPropertyValue_entityId,
+    getPropertyValue_maxResults,
+    getPropertyValue_nextToken,
+    getPropertyValue_propertyGroupName,
+    getPropertyValue_tabularConditions,
+    getPropertyValue_selectedProperties,
+    getPropertyValue_workspaceId,
+
+    -- * Destructuring the Response
+    GetPropertyValueResponse (..),
+    newGetPropertyValueResponse,
+
+    -- * Response Lenses
+    getPropertyValueResponse_nextToken,
+    getPropertyValueResponse_propertyValues,
+    getPropertyValueResponse_tabularPropertyValues,
+    getPropertyValueResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetPropertyValue' smart constructor.
+data GetPropertyValue = GetPropertyValue'
+  { -- | The name of the component whose property values the operation returns.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the component type whose property values the operation
+    -- returns.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity whose property values the operation returns.
+    entityId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The property group name.
+    propertyGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The tabular conditions.
+    tabularConditions :: Prelude.Maybe TabularConditions,
+    -- | The properties whose values the operation returns.
+    selectedProperties :: Prelude.NonEmpty Prelude.Text,
+    -- | The ID of the workspace whose values the operation returns.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPropertyValue' 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:
+--
+-- 'componentName', 'getPropertyValue_componentName' - The name of the component whose property values the operation returns.
+--
+-- 'componentTypeId', 'getPropertyValue_componentTypeId' - The ID of the component type whose property values the operation
+-- returns.
+--
+-- 'entityId', 'getPropertyValue_entityId' - The ID of the entity whose property values the operation returns.
+--
+-- 'maxResults', 'getPropertyValue_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'getPropertyValue_nextToken' - The string that specifies the next page of results.
+--
+-- 'propertyGroupName', 'getPropertyValue_propertyGroupName' - The property group name.
+--
+-- 'tabularConditions', 'getPropertyValue_tabularConditions' - The tabular conditions.
+--
+-- 'selectedProperties', 'getPropertyValue_selectedProperties' - The properties whose values the operation returns.
+--
+-- 'workspaceId', 'getPropertyValue_workspaceId' - The ID of the workspace whose values the operation returns.
+newGetPropertyValue ::
+  -- | 'selectedProperties'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  GetPropertyValue
+newGetPropertyValue
+  pSelectedProperties_
+  pWorkspaceId_ =
+    GetPropertyValue'
+      { componentName = Prelude.Nothing,
+        componentTypeId = Prelude.Nothing,
+        entityId = Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        propertyGroupName = Prelude.Nothing,
+        tabularConditions = Prelude.Nothing,
+        selectedProperties =
+          Lens.coerced Lens.# pSelectedProperties_,
+        workspaceId = pWorkspaceId_
+      }
+
+-- | The name of the component whose property values the operation returns.
+getPropertyValue_componentName :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Text)
+getPropertyValue_componentName = Lens.lens (\GetPropertyValue' {componentName} -> componentName) (\s@GetPropertyValue' {} a -> s {componentName = a} :: GetPropertyValue)
+
+-- | The ID of the component type whose property values the operation
+-- returns.
+getPropertyValue_componentTypeId :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Text)
+getPropertyValue_componentTypeId = Lens.lens (\GetPropertyValue' {componentTypeId} -> componentTypeId) (\s@GetPropertyValue' {} a -> s {componentTypeId = a} :: GetPropertyValue)
+
+-- | The ID of the entity whose property values the operation returns.
+getPropertyValue_entityId :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Text)
+getPropertyValue_entityId = Lens.lens (\GetPropertyValue' {entityId} -> entityId) (\s@GetPropertyValue' {} a -> s {entityId = a} :: GetPropertyValue)
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+getPropertyValue_maxResults :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Natural)
+getPropertyValue_maxResults = Lens.lens (\GetPropertyValue' {maxResults} -> maxResults) (\s@GetPropertyValue' {} a -> s {maxResults = a} :: GetPropertyValue)
+
+-- | The string that specifies the next page of results.
+getPropertyValue_nextToken :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Text)
+getPropertyValue_nextToken = Lens.lens (\GetPropertyValue' {nextToken} -> nextToken) (\s@GetPropertyValue' {} a -> s {nextToken = a} :: GetPropertyValue)
+
+-- | The property group name.
+getPropertyValue_propertyGroupName :: Lens.Lens' GetPropertyValue (Prelude.Maybe Prelude.Text)
+getPropertyValue_propertyGroupName = Lens.lens (\GetPropertyValue' {propertyGroupName} -> propertyGroupName) (\s@GetPropertyValue' {} a -> s {propertyGroupName = a} :: GetPropertyValue)
+
+-- | The tabular conditions.
+getPropertyValue_tabularConditions :: Lens.Lens' GetPropertyValue (Prelude.Maybe TabularConditions)
+getPropertyValue_tabularConditions = Lens.lens (\GetPropertyValue' {tabularConditions} -> tabularConditions) (\s@GetPropertyValue' {} a -> s {tabularConditions = a} :: GetPropertyValue)
+
+-- | The properties whose values the operation returns.
+getPropertyValue_selectedProperties :: Lens.Lens' GetPropertyValue (Prelude.NonEmpty Prelude.Text)
+getPropertyValue_selectedProperties = Lens.lens (\GetPropertyValue' {selectedProperties} -> selectedProperties) (\s@GetPropertyValue' {} a -> s {selectedProperties = a} :: GetPropertyValue) Prelude.. Lens.coerced
+
+-- | The ID of the workspace whose values the operation returns.
+getPropertyValue_workspaceId :: Lens.Lens' GetPropertyValue Prelude.Text
+getPropertyValue_workspaceId = Lens.lens (\GetPropertyValue' {workspaceId} -> workspaceId) (\s@GetPropertyValue' {} a -> s {workspaceId = a} :: GetPropertyValue)
+
+instance Core.AWSRequest GetPropertyValue where
+  type
+    AWSResponse GetPropertyValue =
+      GetPropertyValueResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPropertyValueResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "propertyValues" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "tabularPropertyValues"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetPropertyValue where
+  hashWithSalt _salt GetPropertyValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` entityId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` propertyGroupName
+      `Prelude.hashWithSalt` tabularConditions
+      `Prelude.hashWithSalt` selectedProperties
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData GetPropertyValue where
+  rnf GetPropertyValue' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf propertyGroupName
+      `Prelude.seq` Prelude.rnf tabularConditions
+      `Prelude.seq` Prelude.rnf selectedProperties
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders GetPropertyValue where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetPropertyValue where
+  toJSON GetPropertyValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentName" Data..=) Prelude.<$> componentName,
+            ("componentTypeId" Data..=)
+              Prelude.<$> componentTypeId,
+            ("entityId" Data..=) Prelude.<$> entityId,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("propertyGroupName" Data..=)
+              Prelude.<$> propertyGroupName,
+            ("tabularConditions" Data..=)
+              Prelude.<$> tabularConditions,
+            Prelude.Just
+              ("selectedProperties" Data..= selectedProperties)
+          ]
+      )
+
+instance Data.ToPath GetPropertyValue where
+  toPath GetPropertyValue' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entity-properties/value"
+      ]
+
+instance Data.ToQuery GetPropertyValue where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetPropertyValueResponse' smart constructor.
+data GetPropertyValueResponse = GetPropertyValueResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An object that maps strings to the properties and latest property values
+    -- in the response. Each string in the mapping must be unique to this
+    -- object.
+    propertyValues :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyLatestValue),
+    -- | A table of property values.
+    tabularPropertyValues :: Prelude.Maybe [[Prelude.HashMap Prelude.Text DataValue]],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPropertyValueResponse' 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', 'getPropertyValueResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'propertyValues', 'getPropertyValueResponse_propertyValues' - An object that maps strings to the properties and latest property values
+-- in the response. Each string in the mapping must be unique to this
+-- object.
+--
+-- 'tabularPropertyValues', 'getPropertyValueResponse_tabularPropertyValues' - A table of property values.
+--
+-- 'httpStatus', 'getPropertyValueResponse_httpStatus' - The response's http status code.
+newGetPropertyValueResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetPropertyValueResponse
+newGetPropertyValueResponse pHttpStatus_ =
+  GetPropertyValueResponse'
+    { nextToken =
+        Prelude.Nothing,
+      propertyValues = Prelude.Nothing,
+      tabularPropertyValues = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+getPropertyValueResponse_nextToken :: Lens.Lens' GetPropertyValueResponse (Prelude.Maybe Prelude.Text)
+getPropertyValueResponse_nextToken = Lens.lens (\GetPropertyValueResponse' {nextToken} -> nextToken) (\s@GetPropertyValueResponse' {} a -> s {nextToken = a} :: GetPropertyValueResponse)
+
+-- | An object that maps strings to the properties and latest property values
+-- in the response. Each string in the mapping must be unique to this
+-- object.
+getPropertyValueResponse_propertyValues :: Lens.Lens' GetPropertyValueResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyLatestValue))
+getPropertyValueResponse_propertyValues = Lens.lens (\GetPropertyValueResponse' {propertyValues} -> propertyValues) (\s@GetPropertyValueResponse' {} a -> s {propertyValues = a} :: GetPropertyValueResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A table of property values.
+getPropertyValueResponse_tabularPropertyValues :: Lens.Lens' GetPropertyValueResponse (Prelude.Maybe [[Prelude.HashMap Prelude.Text DataValue]])
+getPropertyValueResponse_tabularPropertyValues = Lens.lens (\GetPropertyValueResponse' {tabularPropertyValues} -> tabularPropertyValues) (\s@GetPropertyValueResponse' {} a -> s {tabularPropertyValues = a} :: GetPropertyValueResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getPropertyValueResponse_httpStatus :: Lens.Lens' GetPropertyValueResponse Prelude.Int
+getPropertyValueResponse_httpStatus = Lens.lens (\GetPropertyValueResponse' {httpStatus} -> httpStatus) (\s@GetPropertyValueResponse' {} a -> s {httpStatus = a} :: GetPropertyValueResponse)
+
+instance Prelude.NFData GetPropertyValueResponse where
+  rnf GetPropertyValueResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf propertyValues
+      `Prelude.seq` Prelude.rnf tabularPropertyValues
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/GetPropertyValueHistory.hs b/gen/Amazonka/IotTwinMaker/GetPropertyValueHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetPropertyValueHistory.hs
@@ -0,0 +1,410 @@
+{-# 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.IotTwinMaker.GetPropertyValueHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about the history of a time series property value
+-- for a component, component type, entity, or workspace.
+--
+-- You must specify a value for @workspaceId@. For entity-specific queries,
+-- specify values for @componentName@ and @entityId@. For cross-entity
+-- quries, specify a value for @componentTypeId@.
+module Amazonka.IotTwinMaker.GetPropertyValueHistory
+  ( -- * Creating a Request
+    GetPropertyValueHistory (..),
+    newGetPropertyValueHistory,
+
+    -- * Request Lenses
+    getPropertyValueHistory_componentName,
+    getPropertyValueHistory_componentTypeId,
+    getPropertyValueHistory_endDateTime,
+    getPropertyValueHistory_endTime,
+    getPropertyValueHistory_entityId,
+    getPropertyValueHistory_interpolation,
+    getPropertyValueHistory_maxResults,
+    getPropertyValueHistory_nextToken,
+    getPropertyValueHistory_orderByTime,
+    getPropertyValueHistory_propertyFilters,
+    getPropertyValueHistory_startDateTime,
+    getPropertyValueHistory_startTime,
+    getPropertyValueHistory_workspaceId,
+    getPropertyValueHistory_selectedProperties,
+
+    -- * Destructuring the Response
+    GetPropertyValueHistoryResponse (..),
+    newGetPropertyValueHistoryResponse,
+
+    -- * Response Lenses
+    getPropertyValueHistoryResponse_nextToken,
+    getPropertyValueHistoryResponse_httpStatus,
+    getPropertyValueHistoryResponse_propertyValues,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetPropertyValueHistory' smart constructor.
+data GetPropertyValueHistory = GetPropertyValueHistory'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time of the latest property value to return.
+    endDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ISO8601 DateTime of the latest property value to return.
+    --
+    -- For more information about the ISO8601 DateTime format, see the data
+    -- type
+    -- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+    endTime :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Maybe Prelude.Text,
+    -- | An object that specifies the interpolation type and the interval over
+    -- which to interpolate data.
+    interpolation :: Prelude.Maybe InterpolationParameters,
+    -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The time direction to use in the result order.
+    orderByTime :: Prelude.Maybe OrderByTime,
+    -- | A list of objects that filter the property value history request.
+    propertyFilters :: Prelude.Maybe (Prelude.NonEmpty PropertyFilter),
+    -- | The date and time of the earliest property value to return.
+    startDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ISO8601 DateTime of the earliest property value to return.
+    --
+    -- For more information about the ISO8601 DateTime format, see the data
+    -- type
+    -- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+    startTime :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | A list of properties whose value histories the request retrieves.
+    selectedProperties :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPropertyValueHistory' 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:
+--
+-- 'componentName', 'getPropertyValueHistory_componentName' - The name of the component.
+--
+-- 'componentTypeId', 'getPropertyValueHistory_componentTypeId' - The ID of the component type.
+--
+-- 'endDateTime', 'getPropertyValueHistory_endDateTime' - The date and time of the latest property value to return.
+--
+-- 'endTime', 'getPropertyValueHistory_endTime' - The ISO8601 DateTime of the latest property value to return.
+--
+-- For more information about the ISO8601 DateTime format, see the data
+-- type
+-- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+--
+-- 'entityId', 'getPropertyValueHistory_entityId' - The ID of the entity.
+--
+-- 'interpolation', 'getPropertyValueHistory_interpolation' - An object that specifies the interpolation type and the interval over
+-- which to interpolate data.
+--
+-- 'maxResults', 'getPropertyValueHistory_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'getPropertyValueHistory_nextToken' - The string that specifies the next page of results.
+--
+-- 'orderByTime', 'getPropertyValueHistory_orderByTime' - The time direction to use in the result order.
+--
+-- 'propertyFilters', 'getPropertyValueHistory_propertyFilters' - A list of objects that filter the property value history request.
+--
+-- 'startDateTime', 'getPropertyValueHistory_startDateTime' - The date and time of the earliest property value to return.
+--
+-- 'startTime', 'getPropertyValueHistory_startTime' - The ISO8601 DateTime of the earliest property value to return.
+--
+-- For more information about the ISO8601 DateTime format, see the data
+-- type
+-- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+--
+-- 'workspaceId', 'getPropertyValueHistory_workspaceId' - The ID of the workspace.
+--
+-- 'selectedProperties', 'getPropertyValueHistory_selectedProperties' - A list of properties whose value histories the request retrieves.
+newGetPropertyValueHistory ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'selectedProperties'
+  Prelude.NonEmpty Prelude.Text ->
+  GetPropertyValueHistory
+newGetPropertyValueHistory
+  pWorkspaceId_
+  pSelectedProperties_ =
+    GetPropertyValueHistory'
+      { componentName =
+          Prelude.Nothing,
+        componentTypeId = Prelude.Nothing,
+        endDateTime = Prelude.Nothing,
+        endTime = Prelude.Nothing,
+        entityId = Prelude.Nothing,
+        interpolation = Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        orderByTime = Prelude.Nothing,
+        propertyFilters = Prelude.Nothing,
+        startDateTime = Prelude.Nothing,
+        startTime = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        selectedProperties =
+          Lens.coerced Lens.# pSelectedProperties_
+      }
+
+-- | The name of the component.
+getPropertyValueHistory_componentName :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_componentName = Lens.lens (\GetPropertyValueHistory' {componentName} -> componentName) (\s@GetPropertyValueHistory' {} a -> s {componentName = a} :: GetPropertyValueHistory)
+
+-- | The ID of the component type.
+getPropertyValueHistory_componentTypeId :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_componentTypeId = Lens.lens (\GetPropertyValueHistory' {componentTypeId} -> componentTypeId) (\s@GetPropertyValueHistory' {} a -> s {componentTypeId = a} :: GetPropertyValueHistory)
+
+-- | The date and time of the latest property value to return.
+getPropertyValueHistory_endDateTime :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.UTCTime)
+getPropertyValueHistory_endDateTime = Lens.lens (\GetPropertyValueHistory' {endDateTime} -> endDateTime) (\s@GetPropertyValueHistory' {} a -> s {endDateTime = a} :: GetPropertyValueHistory) Prelude.. Lens.mapping Data._Time
+
+-- | The ISO8601 DateTime of the latest property value to return.
+--
+-- For more information about the ISO8601 DateTime format, see the data
+-- type
+-- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+getPropertyValueHistory_endTime :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_endTime = Lens.lens (\GetPropertyValueHistory' {endTime} -> endTime) (\s@GetPropertyValueHistory' {} a -> s {endTime = a} :: GetPropertyValueHistory)
+
+-- | The ID of the entity.
+getPropertyValueHistory_entityId :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_entityId = Lens.lens (\GetPropertyValueHistory' {entityId} -> entityId) (\s@GetPropertyValueHistory' {} a -> s {entityId = a} :: GetPropertyValueHistory)
+
+-- | An object that specifies the interpolation type and the interval over
+-- which to interpolate data.
+getPropertyValueHistory_interpolation :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe InterpolationParameters)
+getPropertyValueHistory_interpolation = Lens.lens (\GetPropertyValueHistory' {interpolation} -> interpolation) (\s@GetPropertyValueHistory' {} a -> s {interpolation = a} :: GetPropertyValueHistory)
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+getPropertyValueHistory_maxResults :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Natural)
+getPropertyValueHistory_maxResults = Lens.lens (\GetPropertyValueHistory' {maxResults} -> maxResults) (\s@GetPropertyValueHistory' {} a -> s {maxResults = a} :: GetPropertyValueHistory)
+
+-- | The string that specifies the next page of results.
+getPropertyValueHistory_nextToken :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_nextToken = Lens.lens (\GetPropertyValueHistory' {nextToken} -> nextToken) (\s@GetPropertyValueHistory' {} a -> s {nextToken = a} :: GetPropertyValueHistory)
+
+-- | The time direction to use in the result order.
+getPropertyValueHistory_orderByTime :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe OrderByTime)
+getPropertyValueHistory_orderByTime = Lens.lens (\GetPropertyValueHistory' {orderByTime} -> orderByTime) (\s@GetPropertyValueHistory' {} a -> s {orderByTime = a} :: GetPropertyValueHistory)
+
+-- | A list of objects that filter the property value history request.
+getPropertyValueHistory_propertyFilters :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe (Prelude.NonEmpty PropertyFilter))
+getPropertyValueHistory_propertyFilters = Lens.lens (\GetPropertyValueHistory' {propertyFilters} -> propertyFilters) (\s@GetPropertyValueHistory' {} a -> s {propertyFilters = a} :: GetPropertyValueHistory) Prelude.. Lens.mapping Lens.coerced
+
+-- | The date and time of the earliest property value to return.
+getPropertyValueHistory_startDateTime :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.UTCTime)
+getPropertyValueHistory_startDateTime = Lens.lens (\GetPropertyValueHistory' {startDateTime} -> startDateTime) (\s@GetPropertyValueHistory' {} a -> s {startDateTime = a} :: GetPropertyValueHistory) Prelude.. Lens.mapping Data._Time
+
+-- | The ISO8601 DateTime of the earliest property value to return.
+--
+-- For more information about the ISO8601 DateTime format, see the data
+-- type
+-- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_PropertyValue.html PropertyValue>.
+getPropertyValueHistory_startTime :: Lens.Lens' GetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getPropertyValueHistory_startTime = Lens.lens (\GetPropertyValueHistory' {startTime} -> startTime) (\s@GetPropertyValueHistory' {} a -> s {startTime = a} :: GetPropertyValueHistory)
+
+-- | The ID of the workspace.
+getPropertyValueHistory_workspaceId :: Lens.Lens' GetPropertyValueHistory Prelude.Text
+getPropertyValueHistory_workspaceId = Lens.lens (\GetPropertyValueHistory' {workspaceId} -> workspaceId) (\s@GetPropertyValueHistory' {} a -> s {workspaceId = a} :: GetPropertyValueHistory)
+
+-- | A list of properties whose value histories the request retrieves.
+getPropertyValueHistory_selectedProperties :: Lens.Lens' GetPropertyValueHistory (Prelude.NonEmpty Prelude.Text)
+getPropertyValueHistory_selectedProperties = Lens.lens (\GetPropertyValueHistory' {selectedProperties} -> selectedProperties) (\s@GetPropertyValueHistory' {} a -> s {selectedProperties = a} :: GetPropertyValueHistory) Prelude.. Lens.coerced
+
+instance Core.AWSRequest GetPropertyValueHistory where
+  type
+    AWSResponse GetPropertyValueHistory =
+      GetPropertyValueHistoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPropertyValueHistoryResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "propertyValues"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable GetPropertyValueHistory where
+  hashWithSalt _salt GetPropertyValueHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` endDateTime
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` entityId
+      `Prelude.hashWithSalt` interpolation
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` orderByTime
+      `Prelude.hashWithSalt` propertyFilters
+      `Prelude.hashWithSalt` startDateTime
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` selectedProperties
+
+instance Prelude.NFData GetPropertyValueHistory where
+  rnf GetPropertyValueHistory' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf endDateTime
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf interpolation
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf orderByTime
+      `Prelude.seq` Prelude.rnf propertyFilters
+      `Prelude.seq` Prelude.rnf startDateTime
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf selectedProperties
+
+instance Data.ToHeaders GetPropertyValueHistory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetPropertyValueHistory where
+  toJSON GetPropertyValueHistory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentName" Data..=) Prelude.<$> componentName,
+            ("componentTypeId" Data..=)
+              Prelude.<$> componentTypeId,
+            ("endDateTime" Data..=) Prelude.<$> endDateTime,
+            ("endTime" Data..=) Prelude.<$> endTime,
+            ("entityId" Data..=) Prelude.<$> entityId,
+            ("interpolation" Data..=) Prelude.<$> interpolation,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("orderByTime" Data..=) Prelude.<$> orderByTime,
+            ("propertyFilters" Data..=)
+              Prelude.<$> propertyFilters,
+            ("startDateTime" Data..=) Prelude.<$> startDateTime,
+            ("startTime" Data..=) Prelude.<$> startTime,
+            Prelude.Just
+              ("selectedProperties" Data..= selectedProperties)
+          ]
+      )
+
+instance Data.ToPath GetPropertyValueHistory where
+  toPath GetPropertyValueHistory' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entity-properties/history"
+      ]
+
+instance Data.ToQuery GetPropertyValueHistory where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetPropertyValueHistoryResponse' smart constructor.
+data GetPropertyValueHistoryResponse = GetPropertyValueHistoryResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An object that maps strings to the property definitions in the component
+    -- type. Each string in the mapping must be unique to this object.
+    propertyValues :: [PropertyValueHistory]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPropertyValueHistoryResponse' 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', 'getPropertyValueHistoryResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'httpStatus', 'getPropertyValueHistoryResponse_httpStatus' - The response's http status code.
+--
+-- 'propertyValues', 'getPropertyValueHistoryResponse_propertyValues' - An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+newGetPropertyValueHistoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetPropertyValueHistoryResponse
+newGetPropertyValueHistoryResponse pHttpStatus_ =
+  GetPropertyValueHistoryResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      propertyValues = Prelude.mempty
+    }
+
+-- | The string that specifies the next page of results.
+getPropertyValueHistoryResponse_nextToken :: Lens.Lens' GetPropertyValueHistoryResponse (Prelude.Maybe Prelude.Text)
+getPropertyValueHistoryResponse_nextToken = Lens.lens (\GetPropertyValueHistoryResponse' {nextToken} -> nextToken) (\s@GetPropertyValueHistoryResponse' {} a -> s {nextToken = a} :: GetPropertyValueHistoryResponse)
+
+-- | The response's http status code.
+getPropertyValueHistoryResponse_httpStatus :: Lens.Lens' GetPropertyValueHistoryResponse Prelude.Int
+getPropertyValueHistoryResponse_httpStatus = Lens.lens (\GetPropertyValueHistoryResponse' {httpStatus} -> httpStatus) (\s@GetPropertyValueHistoryResponse' {} a -> s {httpStatus = a} :: GetPropertyValueHistoryResponse)
+
+-- | An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+getPropertyValueHistoryResponse_propertyValues :: Lens.Lens' GetPropertyValueHistoryResponse [PropertyValueHistory]
+getPropertyValueHistoryResponse_propertyValues = Lens.lens (\GetPropertyValueHistoryResponse' {propertyValues} -> propertyValues) (\s@GetPropertyValueHistoryResponse' {} a -> s {propertyValues = a} :: GetPropertyValueHistoryResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    GetPropertyValueHistoryResponse
+  where
+  rnf GetPropertyValueHistoryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf propertyValues
diff --git a/gen/Amazonka/IotTwinMaker/GetScene.hs b/gen/Amazonka/IotTwinMaker/GetScene.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetScene.hs
@@ -0,0 +1,285 @@
+{-# 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.IotTwinMaker.GetScene
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a scene.
+module Amazonka.IotTwinMaker.GetScene
+  ( -- * Creating a Request
+    GetScene (..),
+    newGetScene,
+
+    -- * Request Lenses
+    getScene_workspaceId,
+    getScene_sceneId,
+
+    -- * Destructuring the Response
+    GetSceneResponse (..),
+    newGetSceneResponse,
+
+    -- * Response Lenses
+    getSceneResponse_capabilities,
+    getSceneResponse_description,
+    getSceneResponse_httpStatus,
+    getSceneResponse_workspaceId,
+    getSceneResponse_sceneId,
+    getSceneResponse_contentLocation,
+    getSceneResponse_arn,
+    getSceneResponse_creationDateTime,
+    getSceneResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetScene' smart constructor.
+data GetScene = GetScene'
+  { -- | The ID of the workspace that contains the scene.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the scene.
+    sceneId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetScene' 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:
+--
+-- 'workspaceId', 'getScene_workspaceId' - The ID of the workspace that contains the scene.
+--
+-- 'sceneId', 'getScene_sceneId' - The ID of the scene.
+newGetScene ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'sceneId'
+  Prelude.Text ->
+  GetScene
+newGetScene pWorkspaceId_ pSceneId_ =
+  GetScene'
+    { workspaceId = pWorkspaceId_,
+      sceneId = pSceneId_
+    }
+
+-- | The ID of the workspace that contains the scene.
+getScene_workspaceId :: Lens.Lens' GetScene Prelude.Text
+getScene_workspaceId = Lens.lens (\GetScene' {workspaceId} -> workspaceId) (\s@GetScene' {} a -> s {workspaceId = a} :: GetScene)
+
+-- | The ID of the scene.
+getScene_sceneId :: Lens.Lens' GetScene Prelude.Text
+getScene_sceneId = Lens.lens (\GetScene' {sceneId} -> sceneId) (\s@GetScene' {} a -> s {sceneId = a} :: GetScene)
+
+instance Core.AWSRequest GetScene where
+  type AWSResponse GetScene = GetSceneResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetSceneResponse'
+            Prelude.<$> (x Data..?> "capabilities" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "description")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "sceneId")
+            Prelude.<*> (x Data..:> "contentLocation")
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable GetScene where
+  hashWithSalt _salt GetScene' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` sceneId
+
+instance Prelude.NFData GetScene where
+  rnf GetScene' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf sceneId
+
+instance Data.ToHeaders GetScene where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetScene where
+  toPath GetScene' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/scenes/",
+        Data.toBS sceneId
+      ]
+
+instance Data.ToQuery GetScene where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetSceneResponse' smart constructor.
+data GetSceneResponse = GetSceneResponse'
+  { -- | A list of capabilities that the scene uses to render.
+    capabilities :: Prelude.Maybe [Prelude.Text],
+    -- | The description of the scene.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the workspace that contains the scene.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the scene.
+    sceneId :: Prelude.Text,
+    -- | The relative path that specifies the location of the content definition
+    -- file.
+    contentLocation :: Prelude.Text,
+    -- | The ARN of the scene.
+    arn :: Prelude.Text,
+    -- | The date and time when the scene was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the scene was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSceneResponse' 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:
+--
+-- 'capabilities', 'getSceneResponse_capabilities' - A list of capabilities that the scene uses to render.
+--
+-- 'description', 'getSceneResponse_description' - The description of the scene.
+--
+-- 'httpStatus', 'getSceneResponse_httpStatus' - The response's http status code.
+--
+-- 'workspaceId', 'getSceneResponse_workspaceId' - The ID of the workspace that contains the scene.
+--
+-- 'sceneId', 'getSceneResponse_sceneId' - The ID of the scene.
+--
+-- 'contentLocation', 'getSceneResponse_contentLocation' - The relative path that specifies the location of the content definition
+-- file.
+--
+-- 'arn', 'getSceneResponse_arn' - The ARN of the scene.
+--
+-- 'creationDateTime', 'getSceneResponse_creationDateTime' - The date and time when the scene was created.
+--
+-- 'updateDateTime', 'getSceneResponse_updateDateTime' - The date and time when the scene was last updated.
+newGetSceneResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'sceneId'
+  Prelude.Text ->
+  -- | 'contentLocation'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  GetSceneResponse
+newGetSceneResponse
+  pHttpStatus_
+  pWorkspaceId_
+  pSceneId_
+  pContentLocation_
+  pArn_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    GetSceneResponse'
+      { capabilities = Prelude.Nothing,
+        description = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workspaceId = pWorkspaceId_,
+        sceneId = pSceneId_,
+        contentLocation = pContentLocation_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | A list of capabilities that the scene uses to render.
+getSceneResponse_capabilities :: Lens.Lens' GetSceneResponse (Prelude.Maybe [Prelude.Text])
+getSceneResponse_capabilities = Lens.lens (\GetSceneResponse' {capabilities} -> capabilities) (\s@GetSceneResponse' {} a -> s {capabilities = a} :: GetSceneResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the scene.
+getSceneResponse_description :: Lens.Lens' GetSceneResponse (Prelude.Maybe Prelude.Text)
+getSceneResponse_description = Lens.lens (\GetSceneResponse' {description} -> description) (\s@GetSceneResponse' {} a -> s {description = a} :: GetSceneResponse)
+
+-- | The response's http status code.
+getSceneResponse_httpStatus :: Lens.Lens' GetSceneResponse Prelude.Int
+getSceneResponse_httpStatus = Lens.lens (\GetSceneResponse' {httpStatus} -> httpStatus) (\s@GetSceneResponse' {} a -> s {httpStatus = a} :: GetSceneResponse)
+
+-- | The ID of the workspace that contains the scene.
+getSceneResponse_workspaceId :: Lens.Lens' GetSceneResponse Prelude.Text
+getSceneResponse_workspaceId = Lens.lens (\GetSceneResponse' {workspaceId} -> workspaceId) (\s@GetSceneResponse' {} a -> s {workspaceId = a} :: GetSceneResponse)
+
+-- | The ID of the scene.
+getSceneResponse_sceneId :: Lens.Lens' GetSceneResponse Prelude.Text
+getSceneResponse_sceneId = Lens.lens (\GetSceneResponse' {sceneId} -> sceneId) (\s@GetSceneResponse' {} a -> s {sceneId = a} :: GetSceneResponse)
+
+-- | The relative path that specifies the location of the content definition
+-- file.
+getSceneResponse_contentLocation :: Lens.Lens' GetSceneResponse Prelude.Text
+getSceneResponse_contentLocation = Lens.lens (\GetSceneResponse' {contentLocation} -> contentLocation) (\s@GetSceneResponse' {} a -> s {contentLocation = a} :: GetSceneResponse)
+
+-- | The ARN of the scene.
+getSceneResponse_arn :: Lens.Lens' GetSceneResponse Prelude.Text
+getSceneResponse_arn = Lens.lens (\GetSceneResponse' {arn} -> arn) (\s@GetSceneResponse' {} a -> s {arn = a} :: GetSceneResponse)
+
+-- | The date and time when the scene was created.
+getSceneResponse_creationDateTime :: Lens.Lens' GetSceneResponse Prelude.UTCTime
+getSceneResponse_creationDateTime = Lens.lens (\GetSceneResponse' {creationDateTime} -> creationDateTime) (\s@GetSceneResponse' {} a -> s {creationDateTime = a} :: GetSceneResponse) Prelude.. Data._Time
+
+-- | The date and time when the scene was last updated.
+getSceneResponse_updateDateTime :: Lens.Lens' GetSceneResponse Prelude.UTCTime
+getSceneResponse_updateDateTime = Lens.lens (\GetSceneResponse' {updateDateTime} -> updateDateTime) (\s@GetSceneResponse' {} a -> s {updateDateTime = a} :: GetSceneResponse) Prelude.. Data._Time
+
+instance Prelude.NFData GetSceneResponse where
+  rnf GetSceneResponse' {..} =
+    Prelude.rnf capabilities
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf sceneId
+      `Prelude.seq` Prelude.rnf contentLocation
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/GetSyncJob.hs b/gen/Amazonka/IotTwinMaker/GetSyncJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetSyncJob.hs
@@ -0,0 +1,280 @@
+{-# 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.IotTwinMaker.GetSyncJob
+-- 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 SyncJob.
+module Amazonka.IotTwinMaker.GetSyncJob
+  ( -- * Creating a Request
+    GetSyncJob (..),
+    newGetSyncJob,
+
+    -- * Request Lenses
+    getSyncJob_workspaceId,
+    getSyncJob_syncSource,
+
+    -- * Destructuring the Response
+    GetSyncJobResponse (..),
+    newGetSyncJobResponse,
+
+    -- * Response Lenses
+    getSyncJobResponse_httpStatus,
+    getSyncJobResponse_arn,
+    getSyncJobResponse_workspaceId,
+    getSyncJobResponse_syncSource,
+    getSyncJobResponse_syncRole,
+    getSyncJobResponse_status,
+    getSyncJobResponse_creationDateTime,
+    getSyncJobResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetSyncJob' smart constructor.
+data GetSyncJob = GetSyncJob'
+  { -- | The workspace Id.
+    workspaceId :: Prelude.Maybe Prelude.Text,
+    -- | The sync soucre.
+    --
+    -- Currently the only supported syncSoucre is @SITEWISE @.
+    syncSource :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSyncJob' 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:
+--
+-- 'workspaceId', 'getSyncJob_workspaceId' - The workspace Id.
+--
+-- 'syncSource', 'getSyncJob_syncSource' - The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+newGetSyncJob ::
+  -- | 'syncSource'
+  Prelude.Text ->
+  GetSyncJob
+newGetSyncJob pSyncSource_ =
+  GetSyncJob'
+    { workspaceId = Prelude.Nothing,
+      syncSource = pSyncSource_
+    }
+
+-- | The workspace Id.
+getSyncJob_workspaceId :: Lens.Lens' GetSyncJob (Prelude.Maybe Prelude.Text)
+getSyncJob_workspaceId = Lens.lens (\GetSyncJob' {workspaceId} -> workspaceId) (\s@GetSyncJob' {} a -> s {workspaceId = a} :: GetSyncJob)
+
+-- | The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+getSyncJob_syncSource :: Lens.Lens' GetSyncJob Prelude.Text
+getSyncJob_syncSource = Lens.lens (\GetSyncJob' {syncSource} -> syncSource) (\s@GetSyncJob' {} a -> s {syncSource = a} :: GetSyncJob)
+
+instance Core.AWSRequest GetSyncJob where
+  type AWSResponse GetSyncJob = GetSyncJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetSyncJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "syncSource")
+            Prelude.<*> (x Data..:> "syncRole")
+            Prelude.<*> (x Data..:> "status")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable GetSyncJob where
+  hashWithSalt _salt GetSyncJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` syncSource
+
+instance Prelude.NFData GetSyncJob where
+  rnf GetSyncJob' {..} =
+    Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf syncSource
+
+instance Data.ToHeaders GetSyncJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetSyncJob where
+  toPath GetSyncJob' {..} =
+    Prelude.mconcat
+      ["/sync-jobs/", Data.toBS syncSource]
+
+instance Data.ToQuery GetSyncJob where
+  toQuery GetSyncJob' {..} =
+    Prelude.mconcat ["workspace" Data.=: workspaceId]
+
+-- | /See:/ 'newGetSyncJobResponse' smart constructor.
+data GetSyncJobResponse = GetSyncJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The sync job ARN.
+    arn :: Prelude.Text,
+    -- | The ID of the workspace that contains the sync job.
+    workspaceId :: Prelude.Text,
+    -- | The sync soucre.
+    --
+    -- Currently the only supported syncSoucre is @SITEWISE @.
+    syncSource :: Prelude.Text,
+    -- | The sync IAM role.
+    syncRole :: Prelude.Text,
+    -- | The SyncJob response status.
+    status :: SyncJobStatus,
+    -- | The creation date and time.
+    creationDateTime :: Data.POSIX,
+    -- | The update date and time.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSyncJobResponse' 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', 'getSyncJobResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'getSyncJobResponse_arn' - The sync job ARN.
+--
+-- 'workspaceId', 'getSyncJobResponse_workspaceId' - The ID of the workspace that contains the sync job.
+--
+-- 'syncSource', 'getSyncJobResponse_syncSource' - The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+--
+-- 'syncRole', 'getSyncJobResponse_syncRole' - The sync IAM role.
+--
+-- 'status', 'getSyncJobResponse_status' - The SyncJob response status.
+--
+-- 'creationDateTime', 'getSyncJobResponse_creationDateTime' - The creation date and time.
+--
+-- 'updateDateTime', 'getSyncJobResponse_updateDateTime' - The update date and time.
+newGetSyncJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'syncSource'
+  Prelude.Text ->
+  -- | 'syncRole'
+  Prelude.Text ->
+  -- | 'status'
+  SyncJobStatus ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  GetSyncJobResponse
+newGetSyncJobResponse
+  pHttpStatus_
+  pArn_
+  pWorkspaceId_
+  pSyncSource_
+  pSyncRole_
+  pStatus_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    GetSyncJobResponse'
+      { httpStatus = pHttpStatus_,
+        arn = pArn_,
+        workspaceId = pWorkspaceId_,
+        syncSource = pSyncSource_,
+        syncRole = pSyncRole_,
+        status = pStatus_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The response's http status code.
+getSyncJobResponse_httpStatus :: Lens.Lens' GetSyncJobResponse Prelude.Int
+getSyncJobResponse_httpStatus = Lens.lens (\GetSyncJobResponse' {httpStatus} -> httpStatus) (\s@GetSyncJobResponse' {} a -> s {httpStatus = a} :: GetSyncJobResponse)
+
+-- | The sync job ARN.
+getSyncJobResponse_arn :: Lens.Lens' GetSyncJobResponse Prelude.Text
+getSyncJobResponse_arn = Lens.lens (\GetSyncJobResponse' {arn} -> arn) (\s@GetSyncJobResponse' {} a -> s {arn = a} :: GetSyncJobResponse)
+
+-- | The ID of the workspace that contains the sync job.
+getSyncJobResponse_workspaceId :: Lens.Lens' GetSyncJobResponse Prelude.Text
+getSyncJobResponse_workspaceId = Lens.lens (\GetSyncJobResponse' {workspaceId} -> workspaceId) (\s@GetSyncJobResponse' {} a -> s {workspaceId = a} :: GetSyncJobResponse)
+
+-- | The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+getSyncJobResponse_syncSource :: Lens.Lens' GetSyncJobResponse Prelude.Text
+getSyncJobResponse_syncSource = Lens.lens (\GetSyncJobResponse' {syncSource} -> syncSource) (\s@GetSyncJobResponse' {} a -> s {syncSource = a} :: GetSyncJobResponse)
+
+-- | The sync IAM role.
+getSyncJobResponse_syncRole :: Lens.Lens' GetSyncJobResponse Prelude.Text
+getSyncJobResponse_syncRole = Lens.lens (\GetSyncJobResponse' {syncRole} -> syncRole) (\s@GetSyncJobResponse' {} a -> s {syncRole = a} :: GetSyncJobResponse)
+
+-- | The SyncJob response status.
+getSyncJobResponse_status :: Lens.Lens' GetSyncJobResponse SyncJobStatus
+getSyncJobResponse_status = Lens.lens (\GetSyncJobResponse' {status} -> status) (\s@GetSyncJobResponse' {} a -> s {status = a} :: GetSyncJobResponse)
+
+-- | The creation date and time.
+getSyncJobResponse_creationDateTime :: Lens.Lens' GetSyncJobResponse Prelude.UTCTime
+getSyncJobResponse_creationDateTime = Lens.lens (\GetSyncJobResponse' {creationDateTime} -> creationDateTime) (\s@GetSyncJobResponse' {} a -> s {creationDateTime = a} :: GetSyncJobResponse) Prelude.. Data._Time
+
+-- | The update date and time.
+getSyncJobResponse_updateDateTime :: Lens.Lens' GetSyncJobResponse Prelude.UTCTime
+getSyncJobResponse_updateDateTime = Lens.lens (\GetSyncJobResponse' {updateDateTime} -> updateDateTime) (\s@GetSyncJobResponse' {} a -> s {updateDateTime = a} :: GetSyncJobResponse) Prelude.. Data._Time
+
+instance Prelude.NFData GetSyncJobResponse where
+  rnf GetSyncJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf syncSource
+      `Prelude.seq` Prelude.rnf syncRole
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/GetWorkspace.hs b/gen/Amazonka/IotTwinMaker/GetWorkspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/GetWorkspace.hs
@@ -0,0 +1,252 @@
+{-# 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.IotTwinMaker.GetWorkspace
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a workspace.
+module Amazonka.IotTwinMaker.GetWorkspace
+  ( -- * Creating a Request
+    GetWorkspace (..),
+    newGetWorkspace,
+
+    -- * Request Lenses
+    getWorkspace_workspaceId,
+
+    -- * Destructuring the Response
+    GetWorkspaceResponse (..),
+    newGetWorkspaceResponse,
+
+    -- * Response Lenses
+    getWorkspaceResponse_description,
+    getWorkspaceResponse_httpStatus,
+    getWorkspaceResponse_workspaceId,
+    getWorkspaceResponse_arn,
+    getWorkspaceResponse_s3Location,
+    getWorkspaceResponse_role,
+    getWorkspaceResponse_creationDateTime,
+    getWorkspaceResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetWorkspace' smart constructor.
+data GetWorkspace = GetWorkspace'
+  { -- | The ID of the workspace.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkspace' 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:
+--
+-- 'workspaceId', 'getWorkspace_workspaceId' - The ID of the workspace.
+newGetWorkspace ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  GetWorkspace
+newGetWorkspace pWorkspaceId_ =
+  GetWorkspace' {workspaceId = pWorkspaceId_}
+
+-- | The ID of the workspace.
+getWorkspace_workspaceId :: Lens.Lens' GetWorkspace Prelude.Text
+getWorkspace_workspaceId = Lens.lens (\GetWorkspace' {workspaceId} -> workspaceId) (\s@GetWorkspace' {} a -> s {workspaceId = a} :: GetWorkspace)
+
+instance Core.AWSRequest GetWorkspace where
+  type AWSResponse GetWorkspace = GetWorkspaceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetWorkspaceResponse'
+            Prelude.<$> (x Data..?> "description")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "s3Location")
+            Prelude.<*> (x Data..:> "role")
+            Prelude.<*> (x Data..:> "creationDateTime")
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable GetWorkspace where
+  hashWithSalt _salt GetWorkspace' {..} =
+    _salt `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData GetWorkspace where
+  rnf GetWorkspace' {..} = Prelude.rnf workspaceId
+
+instance Data.ToHeaders GetWorkspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetWorkspace where
+  toPath GetWorkspace' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId]
+
+instance Data.ToQuery GetWorkspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetWorkspaceResponse' smart constructor.
+data GetWorkspaceResponse = GetWorkspaceResponse'
+  { -- | The description of the workspace.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ARN of the workspace.
+    arn :: Prelude.Text,
+    -- | The ARN of the S3 bucket where resources associated with the workspace
+    -- are stored.
+    s3Location :: Prelude.Text,
+    -- | The ARN of the execution role associated with the workspace.
+    role' :: Prelude.Text,
+    -- | The date and time when the workspace was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the workspace was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetWorkspaceResponse' 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:
+--
+-- 'description', 'getWorkspaceResponse_description' - The description of the workspace.
+--
+-- 'httpStatus', 'getWorkspaceResponse_httpStatus' - The response's http status code.
+--
+-- 'workspaceId', 'getWorkspaceResponse_workspaceId' - The ID of the workspace.
+--
+-- 'arn', 'getWorkspaceResponse_arn' - The ARN of the workspace.
+--
+-- 's3Location', 'getWorkspaceResponse_s3Location' - The ARN of the S3 bucket where resources associated with the workspace
+-- are stored.
+--
+-- 'role'', 'getWorkspaceResponse_role' - The ARN of the execution role associated with the workspace.
+--
+-- 'creationDateTime', 'getWorkspaceResponse_creationDateTime' - The date and time when the workspace was created.
+--
+-- 'updateDateTime', 'getWorkspaceResponse_updateDateTime' - The date and time when the workspace was last updated.
+newGetWorkspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 's3Location'
+  Prelude.Text ->
+  -- | 'role''
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  GetWorkspaceResponse
+newGetWorkspaceResponse
+  pHttpStatus_
+  pWorkspaceId_
+  pArn_
+  pS3Location_
+  pRole_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    GetWorkspaceResponse'
+      { description =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workspaceId = pWorkspaceId_,
+        arn = pArn_,
+        s3Location = pS3Location_,
+        role' = pRole_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The description of the workspace.
+getWorkspaceResponse_description :: Lens.Lens' GetWorkspaceResponse (Prelude.Maybe Prelude.Text)
+getWorkspaceResponse_description = Lens.lens (\GetWorkspaceResponse' {description} -> description) (\s@GetWorkspaceResponse' {} a -> s {description = a} :: GetWorkspaceResponse)
+
+-- | The response's http status code.
+getWorkspaceResponse_httpStatus :: Lens.Lens' GetWorkspaceResponse Prelude.Int
+getWorkspaceResponse_httpStatus = Lens.lens (\GetWorkspaceResponse' {httpStatus} -> httpStatus) (\s@GetWorkspaceResponse' {} a -> s {httpStatus = a} :: GetWorkspaceResponse)
+
+-- | The ID of the workspace.
+getWorkspaceResponse_workspaceId :: Lens.Lens' GetWorkspaceResponse Prelude.Text
+getWorkspaceResponse_workspaceId = Lens.lens (\GetWorkspaceResponse' {workspaceId} -> workspaceId) (\s@GetWorkspaceResponse' {} a -> s {workspaceId = a} :: GetWorkspaceResponse)
+
+-- | The ARN of the workspace.
+getWorkspaceResponse_arn :: Lens.Lens' GetWorkspaceResponse Prelude.Text
+getWorkspaceResponse_arn = Lens.lens (\GetWorkspaceResponse' {arn} -> arn) (\s@GetWorkspaceResponse' {} a -> s {arn = a} :: GetWorkspaceResponse)
+
+-- | The ARN of the S3 bucket where resources associated with the workspace
+-- are stored.
+getWorkspaceResponse_s3Location :: Lens.Lens' GetWorkspaceResponse Prelude.Text
+getWorkspaceResponse_s3Location = Lens.lens (\GetWorkspaceResponse' {s3Location} -> s3Location) (\s@GetWorkspaceResponse' {} a -> s {s3Location = a} :: GetWorkspaceResponse)
+
+-- | The ARN of the execution role associated with the workspace.
+getWorkspaceResponse_role :: Lens.Lens' GetWorkspaceResponse Prelude.Text
+getWorkspaceResponse_role = Lens.lens (\GetWorkspaceResponse' {role'} -> role') (\s@GetWorkspaceResponse' {} a -> s {role' = a} :: GetWorkspaceResponse)
+
+-- | The date and time when the workspace was created.
+getWorkspaceResponse_creationDateTime :: Lens.Lens' GetWorkspaceResponse Prelude.UTCTime
+getWorkspaceResponse_creationDateTime = Lens.lens (\GetWorkspaceResponse' {creationDateTime} -> creationDateTime) (\s@GetWorkspaceResponse' {} a -> s {creationDateTime = a} :: GetWorkspaceResponse) Prelude.. Data._Time
+
+-- | The date and time when the workspace was last updated.
+getWorkspaceResponse_updateDateTime :: Lens.Lens' GetWorkspaceResponse Prelude.UTCTime
+getWorkspaceResponse_updateDateTime = Lens.lens (\GetWorkspaceResponse' {updateDateTime} -> updateDateTime) (\s@GetWorkspaceResponse' {} a -> s {updateDateTime = a} :: GetWorkspaceResponse) Prelude.. Data._Time
+
+instance Prelude.NFData GetWorkspaceResponse where
+  rnf GetWorkspaceResponse' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf s3Location
+      `Prelude.seq` Prelude.rnf role'
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Lens.hs b/gen/Amazonka/IotTwinMaker/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Lens.hs
@@ -0,0 +1,715 @@
+{-# 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.IotTwinMaker.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.IotTwinMaker.Lens
+  ( -- * Operations
+
+    -- ** BatchPutPropertyValues
+    batchPutPropertyValues_workspaceId,
+    batchPutPropertyValues_entries,
+    batchPutPropertyValuesResponse_httpStatus,
+    batchPutPropertyValuesResponse_errorEntries,
+
+    -- ** CreateComponentType
+    createComponentType_componentTypeName,
+    createComponentType_description,
+    createComponentType_extendsFrom,
+    createComponentType_functions,
+    createComponentType_isSingleton,
+    createComponentType_propertyDefinitions,
+    createComponentType_propertyGroups,
+    createComponentType_tags,
+    createComponentType_workspaceId,
+    createComponentType_componentTypeId,
+    createComponentTypeResponse_httpStatus,
+    createComponentTypeResponse_arn,
+    createComponentTypeResponse_creationDateTime,
+    createComponentTypeResponse_state,
+
+    -- ** CreateEntity
+    createEntity_components,
+    createEntity_description,
+    createEntity_entityId,
+    createEntity_parentEntityId,
+    createEntity_tags,
+    createEntity_workspaceId,
+    createEntity_entityName,
+    createEntityResponse_httpStatus,
+    createEntityResponse_entityId,
+    createEntityResponse_arn,
+    createEntityResponse_creationDateTime,
+    createEntityResponse_state,
+
+    -- ** CreateScene
+    createScene_capabilities,
+    createScene_description,
+    createScene_tags,
+    createScene_workspaceId,
+    createScene_sceneId,
+    createScene_contentLocation,
+    createSceneResponse_httpStatus,
+    createSceneResponse_arn,
+    createSceneResponse_creationDateTime,
+
+    -- ** CreateSyncJob
+    createSyncJob_tags,
+    createSyncJob_workspaceId,
+    createSyncJob_syncSource,
+    createSyncJob_syncRole,
+    createSyncJobResponse_httpStatus,
+    createSyncJobResponse_arn,
+    createSyncJobResponse_creationDateTime,
+    createSyncJobResponse_state,
+
+    -- ** CreateWorkspace
+    createWorkspace_description,
+    createWorkspace_tags,
+    createWorkspace_workspaceId,
+    createWorkspace_s3Location,
+    createWorkspace_role,
+    createWorkspaceResponse_httpStatus,
+    createWorkspaceResponse_arn,
+    createWorkspaceResponse_creationDateTime,
+
+    -- ** DeleteComponentType
+    deleteComponentType_workspaceId,
+    deleteComponentType_componentTypeId,
+    deleteComponentTypeResponse_httpStatus,
+    deleteComponentTypeResponse_state,
+
+    -- ** DeleteEntity
+    deleteEntity_isRecursive,
+    deleteEntity_workspaceId,
+    deleteEntity_entityId,
+    deleteEntityResponse_httpStatus,
+    deleteEntityResponse_state,
+
+    -- ** DeleteScene
+    deleteScene_workspaceId,
+    deleteScene_sceneId,
+    deleteSceneResponse_httpStatus,
+
+    -- ** DeleteSyncJob
+    deleteSyncJob_workspaceId,
+    deleteSyncJob_syncSource,
+    deleteSyncJobResponse_httpStatus,
+    deleteSyncJobResponse_state,
+
+    -- ** DeleteWorkspace
+    deleteWorkspace_workspaceId,
+    deleteWorkspaceResponse_httpStatus,
+
+    -- ** ExecuteQuery
+    executeQuery_maxResults,
+    executeQuery_nextToken,
+    executeQuery_workspaceId,
+    executeQuery_queryStatement,
+    executeQueryResponse_columnDescriptions,
+    executeQueryResponse_nextToken,
+    executeQueryResponse_rows,
+    executeQueryResponse_httpStatus,
+
+    -- ** GetComponentType
+    getComponentType_workspaceId,
+    getComponentType_componentTypeId,
+    getComponentTypeResponse_componentTypeName,
+    getComponentTypeResponse_description,
+    getComponentTypeResponse_extendsFrom,
+    getComponentTypeResponse_functions,
+    getComponentTypeResponse_isAbstract,
+    getComponentTypeResponse_isSchemaInitialized,
+    getComponentTypeResponse_isSingleton,
+    getComponentTypeResponse_propertyDefinitions,
+    getComponentTypeResponse_propertyGroups,
+    getComponentTypeResponse_status,
+    getComponentTypeResponse_syncSource,
+    getComponentTypeResponse_httpStatus,
+    getComponentTypeResponse_workspaceId,
+    getComponentTypeResponse_componentTypeId,
+    getComponentTypeResponse_creationDateTime,
+    getComponentTypeResponse_updateDateTime,
+    getComponentTypeResponse_arn,
+
+    -- ** GetEntity
+    getEntity_workspaceId,
+    getEntity_entityId,
+    getEntityResponse_components,
+    getEntityResponse_description,
+    getEntityResponse_syncSource,
+    getEntityResponse_httpStatus,
+    getEntityResponse_entityId,
+    getEntityResponse_entityName,
+    getEntityResponse_arn,
+    getEntityResponse_status,
+    getEntityResponse_workspaceId,
+    getEntityResponse_parentEntityId,
+    getEntityResponse_hasChildEntities,
+    getEntityResponse_creationDateTime,
+    getEntityResponse_updateDateTime,
+
+    -- ** GetPricingPlan
+    getPricingPlanResponse_pendingPricingPlan,
+    getPricingPlanResponse_httpStatus,
+    getPricingPlanResponse_currentPricingPlan,
+
+    -- ** GetPropertyValue
+    getPropertyValue_componentName,
+    getPropertyValue_componentTypeId,
+    getPropertyValue_entityId,
+    getPropertyValue_maxResults,
+    getPropertyValue_nextToken,
+    getPropertyValue_propertyGroupName,
+    getPropertyValue_tabularConditions,
+    getPropertyValue_selectedProperties,
+    getPropertyValue_workspaceId,
+    getPropertyValueResponse_nextToken,
+    getPropertyValueResponse_propertyValues,
+    getPropertyValueResponse_tabularPropertyValues,
+    getPropertyValueResponse_httpStatus,
+
+    -- ** GetPropertyValueHistory
+    getPropertyValueHistory_componentName,
+    getPropertyValueHistory_componentTypeId,
+    getPropertyValueHistory_endDateTime,
+    getPropertyValueHistory_endTime,
+    getPropertyValueHistory_entityId,
+    getPropertyValueHistory_interpolation,
+    getPropertyValueHistory_maxResults,
+    getPropertyValueHistory_nextToken,
+    getPropertyValueHistory_orderByTime,
+    getPropertyValueHistory_propertyFilters,
+    getPropertyValueHistory_startDateTime,
+    getPropertyValueHistory_startTime,
+    getPropertyValueHistory_workspaceId,
+    getPropertyValueHistory_selectedProperties,
+    getPropertyValueHistoryResponse_nextToken,
+    getPropertyValueHistoryResponse_httpStatus,
+    getPropertyValueHistoryResponse_propertyValues,
+
+    -- ** GetScene
+    getScene_workspaceId,
+    getScene_sceneId,
+    getSceneResponse_capabilities,
+    getSceneResponse_description,
+    getSceneResponse_httpStatus,
+    getSceneResponse_workspaceId,
+    getSceneResponse_sceneId,
+    getSceneResponse_contentLocation,
+    getSceneResponse_arn,
+    getSceneResponse_creationDateTime,
+    getSceneResponse_updateDateTime,
+
+    -- ** GetSyncJob
+    getSyncJob_workspaceId,
+    getSyncJob_syncSource,
+    getSyncJobResponse_httpStatus,
+    getSyncJobResponse_arn,
+    getSyncJobResponse_workspaceId,
+    getSyncJobResponse_syncSource,
+    getSyncJobResponse_syncRole,
+    getSyncJobResponse_status,
+    getSyncJobResponse_creationDateTime,
+    getSyncJobResponse_updateDateTime,
+
+    -- ** GetWorkspace
+    getWorkspace_workspaceId,
+    getWorkspaceResponse_description,
+    getWorkspaceResponse_httpStatus,
+    getWorkspaceResponse_workspaceId,
+    getWorkspaceResponse_arn,
+    getWorkspaceResponse_s3Location,
+    getWorkspaceResponse_role,
+    getWorkspaceResponse_creationDateTime,
+    getWorkspaceResponse_updateDateTime,
+
+    -- ** ListComponentTypes
+    listComponentTypes_filters,
+    listComponentTypes_maxResults,
+    listComponentTypes_nextToken,
+    listComponentTypes_workspaceId,
+    listComponentTypesResponse_maxResults,
+    listComponentTypesResponse_nextToken,
+    listComponentTypesResponse_httpStatus,
+    listComponentTypesResponse_workspaceId,
+    listComponentTypesResponse_componentTypeSummaries,
+
+    -- ** ListEntities
+    listEntities_filters,
+    listEntities_maxResults,
+    listEntities_nextToken,
+    listEntities_workspaceId,
+    listEntitiesResponse_entitySummaries,
+    listEntitiesResponse_nextToken,
+    listEntitiesResponse_httpStatus,
+
+    -- ** ListScenes
+    listScenes_maxResults,
+    listScenes_nextToken,
+    listScenes_workspaceId,
+    listScenesResponse_nextToken,
+    listScenesResponse_sceneSummaries,
+    listScenesResponse_httpStatus,
+
+    -- ** ListSyncJobs
+    listSyncJobs_maxResults,
+    listSyncJobs_nextToken,
+    listSyncJobs_workspaceId,
+    listSyncJobsResponse_nextToken,
+    listSyncJobsResponse_syncJobSummaries,
+    listSyncJobsResponse_httpStatus,
+
+    -- ** ListSyncResources
+    listSyncResources_filters,
+    listSyncResources_maxResults,
+    listSyncResources_nextToken,
+    listSyncResources_workspaceId,
+    listSyncResources_syncSource,
+    listSyncResourcesResponse_nextToken,
+    listSyncResourcesResponse_syncResources,
+    listSyncResourcesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_maxResults,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceARN,
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ListWorkspaces
+    listWorkspaces_maxResults,
+    listWorkspaces_nextToken,
+    listWorkspacesResponse_nextToken,
+    listWorkspacesResponse_workspaceSummaries,
+    listWorkspacesResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceARN,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceARN,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateComponentType
+    updateComponentType_componentTypeName,
+    updateComponentType_description,
+    updateComponentType_extendsFrom,
+    updateComponentType_functions,
+    updateComponentType_isSingleton,
+    updateComponentType_propertyDefinitions,
+    updateComponentType_propertyGroups,
+    updateComponentType_workspaceId,
+    updateComponentType_componentTypeId,
+    updateComponentTypeResponse_httpStatus,
+    updateComponentTypeResponse_workspaceId,
+    updateComponentTypeResponse_arn,
+    updateComponentTypeResponse_componentTypeId,
+    updateComponentTypeResponse_state,
+
+    -- ** UpdateEntity
+    updateEntity_componentUpdates,
+    updateEntity_description,
+    updateEntity_entityName,
+    updateEntity_parentEntityUpdate,
+    updateEntity_workspaceId,
+    updateEntity_entityId,
+    updateEntityResponse_httpStatus,
+    updateEntityResponse_updateDateTime,
+    updateEntityResponse_state,
+
+    -- ** UpdatePricingPlan
+    updatePricingPlan_bundleNames,
+    updatePricingPlan_pricingMode,
+    updatePricingPlanResponse_pendingPricingPlan,
+    updatePricingPlanResponse_httpStatus,
+    updatePricingPlanResponse_currentPricingPlan,
+
+    -- ** UpdateScene
+    updateScene_capabilities,
+    updateScene_contentLocation,
+    updateScene_description,
+    updateScene_workspaceId,
+    updateScene_sceneId,
+    updateSceneResponse_httpStatus,
+    updateSceneResponse_updateDateTime,
+
+    -- ** UpdateWorkspace
+    updateWorkspace_description,
+    updateWorkspace_role,
+    updateWorkspace_workspaceId,
+    updateWorkspaceResponse_httpStatus,
+    updateWorkspaceResponse_updateDateTime,
+
+    -- * Types
+
+    -- ** BatchPutPropertyError
+    batchPutPropertyError_errorCode,
+    batchPutPropertyError_errorMessage,
+    batchPutPropertyError_entry,
+
+    -- ** BatchPutPropertyErrorEntry
+    batchPutPropertyErrorEntry_errors,
+
+    -- ** BundleInformation
+    bundleInformation_pricingTier,
+    bundleInformation_bundleNames,
+
+    -- ** ColumnDescription
+    columnDescription_name,
+    columnDescription_type,
+
+    -- ** ComponentPropertyGroupRequest
+    componentPropertyGroupRequest_groupType,
+    componentPropertyGroupRequest_propertyNames,
+    componentPropertyGroupRequest_updateType,
+
+    -- ** ComponentPropertyGroupResponse
+    componentPropertyGroupResponse_groupType,
+    componentPropertyGroupResponse_propertyNames,
+    componentPropertyGroupResponse_isInherited,
+
+    -- ** ComponentRequest
+    componentRequest_componentTypeId,
+    componentRequest_description,
+    componentRequest_properties,
+    componentRequest_propertyGroups,
+
+    -- ** ComponentResponse
+    componentResponse_componentName,
+    componentResponse_componentTypeId,
+    componentResponse_definedIn,
+    componentResponse_description,
+    componentResponse_properties,
+    componentResponse_propertyGroups,
+    componentResponse_status,
+    componentResponse_syncSource,
+
+    -- ** ComponentTypeSummary
+    componentTypeSummary_componentTypeName,
+    componentTypeSummary_description,
+    componentTypeSummary_status,
+    componentTypeSummary_arn,
+    componentTypeSummary_componentTypeId,
+    componentTypeSummary_creationDateTime,
+    componentTypeSummary_updateDateTime,
+
+    -- ** ComponentUpdateRequest
+    componentUpdateRequest_componentTypeId,
+    componentUpdateRequest_description,
+    componentUpdateRequest_propertyGroupUpdates,
+    componentUpdateRequest_propertyUpdates,
+    componentUpdateRequest_updateType,
+
+    -- ** DataConnector
+    dataConnector_isNative,
+    dataConnector_lambda,
+
+    -- ** DataType
+    dataType_allowedValues,
+    dataType_nestedType,
+    dataType_relationship,
+    dataType_unitOfMeasure,
+    dataType_type,
+
+    -- ** DataValue
+    dataValue_booleanValue,
+    dataValue_doubleValue,
+    dataValue_expression,
+    dataValue_integerValue,
+    dataValue_listValue,
+    dataValue_longValue,
+    dataValue_mapValue,
+    dataValue_relationshipValue,
+    dataValue_stringValue,
+
+    -- ** EntityPropertyReference
+    entityPropertyReference_componentName,
+    entityPropertyReference_entityId,
+    entityPropertyReference_externalIdProperty,
+    entityPropertyReference_propertyName,
+
+    -- ** EntitySummary
+    entitySummary_description,
+    entitySummary_hasChildEntities,
+    entitySummary_parentEntityId,
+    entitySummary_entityId,
+    entitySummary_entityName,
+    entitySummary_arn,
+    entitySummary_status,
+    entitySummary_creationDateTime,
+    entitySummary_updateDateTime,
+
+    -- ** ErrorDetails
+    errorDetails_code,
+    errorDetails_message,
+
+    -- ** FunctionRequest
+    functionRequest_implementedBy,
+    functionRequest_requiredProperties,
+    functionRequest_scope,
+
+    -- ** FunctionResponse
+    functionResponse_implementedBy,
+    functionResponse_isInherited,
+    functionResponse_requiredProperties,
+    functionResponse_scope,
+
+    -- ** InterpolationParameters
+    interpolationParameters_interpolationType,
+    interpolationParameters_intervalInSeconds,
+
+    -- ** LambdaFunction
+    lambdaFunction_arn,
+
+    -- ** ListComponentTypesFilter
+    listComponentTypesFilter_extendsFrom,
+    listComponentTypesFilter_isAbstract,
+    listComponentTypesFilter_namespace,
+
+    -- ** ListEntitiesFilter
+    listEntitiesFilter_componentTypeId,
+    listEntitiesFilter_externalId,
+    listEntitiesFilter_parentEntityId,
+
+    -- ** OrderBy
+    orderBy_order,
+    orderBy_propertyName,
+
+    -- ** ParentEntityUpdateRequest
+    parentEntityUpdateRequest_parentEntityId,
+    parentEntityUpdateRequest_updateType,
+
+    -- ** PricingPlan
+    pricingPlan_billableEntityCount,
+    pricingPlan_bundleInformation,
+    pricingPlan_effectiveDateTime,
+    pricingPlan_pricingMode,
+    pricingPlan_updateDateTime,
+    pricingPlan_updateReason,
+
+    -- ** PropertyDefinitionRequest
+    propertyDefinitionRequest_configuration,
+    propertyDefinitionRequest_dataType,
+    propertyDefinitionRequest_defaultValue,
+    propertyDefinitionRequest_displayName,
+    propertyDefinitionRequest_isExternalId,
+    propertyDefinitionRequest_isRequiredInEntity,
+    propertyDefinitionRequest_isStoredExternally,
+    propertyDefinitionRequest_isTimeSeries,
+
+    -- ** PropertyDefinitionResponse
+    propertyDefinitionResponse_configuration,
+    propertyDefinitionResponse_defaultValue,
+    propertyDefinitionResponse_displayName,
+    propertyDefinitionResponse_dataType,
+    propertyDefinitionResponse_isTimeSeries,
+    propertyDefinitionResponse_isRequiredInEntity,
+    propertyDefinitionResponse_isExternalId,
+    propertyDefinitionResponse_isStoredExternally,
+    propertyDefinitionResponse_isImported,
+    propertyDefinitionResponse_isFinal,
+    propertyDefinitionResponse_isInherited,
+
+    -- ** PropertyFilter
+    propertyFilter_operator,
+    propertyFilter_propertyName,
+    propertyFilter_value,
+
+    -- ** PropertyGroupRequest
+    propertyGroupRequest_groupType,
+    propertyGroupRequest_propertyNames,
+
+    -- ** PropertyGroupResponse
+    propertyGroupResponse_groupType,
+    propertyGroupResponse_propertyNames,
+    propertyGroupResponse_isInherited,
+
+    -- ** PropertyLatestValue
+    propertyLatestValue_propertyValue,
+    propertyLatestValue_propertyReference,
+
+    -- ** PropertyRequest
+    propertyRequest_definition,
+    propertyRequest_updateType,
+    propertyRequest_value,
+
+    -- ** PropertyResponse
+    propertyResponse_definition,
+    propertyResponse_value,
+
+    -- ** PropertyValue
+    propertyValue_time,
+    propertyValue_timestamp,
+    propertyValue_value,
+
+    -- ** PropertyValueEntry
+    propertyValueEntry_propertyValues,
+    propertyValueEntry_entityPropertyReference,
+
+    -- ** PropertyValueHistory
+    propertyValueHistory_values,
+    propertyValueHistory_entityPropertyReference,
+
+    -- ** QueryResultValue
+
+    -- ** Relationship
+    relationship_relationshipType,
+    relationship_targetComponentTypeId,
+
+    -- ** RelationshipValue
+    relationshipValue_targetComponentName,
+    relationshipValue_targetEntityId,
+
+    -- ** Row
+    row_rowData,
+
+    -- ** SceneSummary
+    sceneSummary_description,
+    sceneSummary_sceneId,
+    sceneSummary_contentLocation,
+    sceneSummary_arn,
+    sceneSummary_creationDateTime,
+    sceneSummary_updateDateTime,
+
+    -- ** Status
+    status_error,
+    status_state,
+
+    -- ** SyncJobStatus
+    syncJobStatus_error,
+    syncJobStatus_state,
+
+    -- ** SyncJobSummary
+    syncJobSummary_arn,
+    syncJobSummary_creationDateTime,
+    syncJobSummary_status,
+    syncJobSummary_syncSource,
+    syncJobSummary_updateDateTime,
+    syncJobSummary_workspaceId,
+
+    -- ** SyncResourceFilter
+    syncResourceFilter_externalId,
+    syncResourceFilter_resourceId,
+    syncResourceFilter_resourceType,
+    syncResourceFilter_state,
+
+    -- ** SyncResourceStatus
+    syncResourceStatus_error,
+    syncResourceStatus_state,
+
+    -- ** SyncResourceSummary
+    syncResourceSummary_externalId,
+    syncResourceSummary_resourceId,
+    syncResourceSummary_resourceType,
+    syncResourceSummary_status,
+    syncResourceSummary_updateDateTime,
+
+    -- ** TabularConditions
+    tabularConditions_orderBy,
+    tabularConditions_propertyFilters,
+
+    -- ** WorkspaceSummary
+    workspaceSummary_description,
+    workspaceSummary_workspaceId,
+    workspaceSummary_arn,
+    workspaceSummary_creationDateTime,
+    workspaceSummary_updateDateTime,
+  )
+where
+
+import Amazonka.IotTwinMaker.BatchPutPropertyValues
+import Amazonka.IotTwinMaker.CreateComponentType
+import Amazonka.IotTwinMaker.CreateEntity
+import Amazonka.IotTwinMaker.CreateScene
+import Amazonka.IotTwinMaker.CreateSyncJob
+import Amazonka.IotTwinMaker.CreateWorkspace
+import Amazonka.IotTwinMaker.DeleteComponentType
+import Amazonka.IotTwinMaker.DeleteEntity
+import Amazonka.IotTwinMaker.DeleteScene
+import Amazonka.IotTwinMaker.DeleteSyncJob
+import Amazonka.IotTwinMaker.DeleteWorkspace
+import Amazonka.IotTwinMaker.ExecuteQuery
+import Amazonka.IotTwinMaker.GetComponentType
+import Amazonka.IotTwinMaker.GetEntity
+import Amazonka.IotTwinMaker.GetPricingPlan
+import Amazonka.IotTwinMaker.GetPropertyValue
+import Amazonka.IotTwinMaker.GetPropertyValueHistory
+import Amazonka.IotTwinMaker.GetScene
+import Amazonka.IotTwinMaker.GetSyncJob
+import Amazonka.IotTwinMaker.GetWorkspace
+import Amazonka.IotTwinMaker.ListComponentTypes
+import Amazonka.IotTwinMaker.ListEntities
+import Amazonka.IotTwinMaker.ListScenes
+import Amazonka.IotTwinMaker.ListSyncJobs
+import Amazonka.IotTwinMaker.ListSyncResources
+import Amazonka.IotTwinMaker.ListTagsForResource
+import Amazonka.IotTwinMaker.ListWorkspaces
+import Amazonka.IotTwinMaker.TagResource
+import Amazonka.IotTwinMaker.Types.BatchPutPropertyError
+import Amazonka.IotTwinMaker.Types.BatchPutPropertyErrorEntry
+import Amazonka.IotTwinMaker.Types.BundleInformation
+import Amazonka.IotTwinMaker.Types.ColumnDescription
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupResponse
+import Amazonka.IotTwinMaker.Types.ComponentRequest
+import Amazonka.IotTwinMaker.Types.ComponentResponse
+import Amazonka.IotTwinMaker.Types.ComponentTypeSummary
+import Amazonka.IotTwinMaker.Types.ComponentUpdateRequest
+import Amazonka.IotTwinMaker.Types.DataConnector
+import Amazonka.IotTwinMaker.Types.DataType
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.EntityPropertyReference
+import Amazonka.IotTwinMaker.Types.EntitySummary
+import Amazonka.IotTwinMaker.Types.ErrorDetails
+import Amazonka.IotTwinMaker.Types.FunctionRequest
+import Amazonka.IotTwinMaker.Types.FunctionResponse
+import Amazonka.IotTwinMaker.Types.InterpolationParameters
+import Amazonka.IotTwinMaker.Types.LambdaFunction
+import Amazonka.IotTwinMaker.Types.ListComponentTypesFilter
+import Amazonka.IotTwinMaker.Types.ListEntitiesFilter
+import Amazonka.IotTwinMaker.Types.OrderBy
+import Amazonka.IotTwinMaker.Types.ParentEntityUpdateRequest
+import Amazonka.IotTwinMaker.Types.PricingPlan
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionRequest
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionResponse
+import Amazonka.IotTwinMaker.Types.PropertyFilter
+import Amazonka.IotTwinMaker.Types.PropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.PropertyGroupResponse
+import Amazonka.IotTwinMaker.Types.PropertyLatestValue
+import Amazonka.IotTwinMaker.Types.PropertyRequest
+import Amazonka.IotTwinMaker.Types.PropertyResponse
+import Amazonka.IotTwinMaker.Types.PropertyValue
+import Amazonka.IotTwinMaker.Types.PropertyValueEntry
+import Amazonka.IotTwinMaker.Types.PropertyValueHistory
+import Amazonka.IotTwinMaker.Types.QueryResultValue
+import Amazonka.IotTwinMaker.Types.Relationship
+import Amazonka.IotTwinMaker.Types.RelationshipValue
+import Amazonka.IotTwinMaker.Types.Row
+import Amazonka.IotTwinMaker.Types.SceneSummary
+import Amazonka.IotTwinMaker.Types.Status
+import Amazonka.IotTwinMaker.Types.SyncJobStatus
+import Amazonka.IotTwinMaker.Types.SyncJobSummary
+import Amazonka.IotTwinMaker.Types.SyncResourceFilter
+import Amazonka.IotTwinMaker.Types.SyncResourceStatus
+import Amazonka.IotTwinMaker.Types.SyncResourceSummary
+import Amazonka.IotTwinMaker.Types.TabularConditions
+import Amazonka.IotTwinMaker.Types.WorkspaceSummary
+import Amazonka.IotTwinMaker.UntagResource
+import Amazonka.IotTwinMaker.UpdateComponentType
+import Amazonka.IotTwinMaker.UpdateEntity
+import Amazonka.IotTwinMaker.UpdatePricingPlan
+import Amazonka.IotTwinMaker.UpdateScene
+import Amazonka.IotTwinMaker.UpdateWorkspace
diff --git a/gen/Amazonka/IotTwinMaker/ListComponentTypes.hs b/gen/Amazonka/IotTwinMaker/ListComponentTypes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListComponentTypes.hs
@@ -0,0 +1,261 @@
+{-# 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.IotTwinMaker.ListComponentTypes
+-- 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 all component types in a workspace.
+module Amazonka.IotTwinMaker.ListComponentTypes
+  ( -- * Creating a Request
+    ListComponentTypes (..),
+    newListComponentTypes,
+
+    -- * Request Lenses
+    listComponentTypes_filters,
+    listComponentTypes_maxResults,
+    listComponentTypes_nextToken,
+    listComponentTypes_workspaceId,
+
+    -- * Destructuring the Response
+    ListComponentTypesResponse (..),
+    newListComponentTypesResponse,
+
+    -- * Response Lenses
+    listComponentTypesResponse_maxResults,
+    listComponentTypesResponse_nextToken,
+    listComponentTypesResponse_httpStatus,
+    listComponentTypesResponse_workspaceId,
+    listComponentTypesResponse_componentTypeSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListComponentTypes' smart constructor.
+data ListComponentTypes = ListComponentTypes'
+  { -- | A list of objects that filter the request.
+    filters :: Prelude.Maybe [ListComponentTypesFilter],
+    -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListComponentTypes' 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:
+--
+-- 'filters', 'listComponentTypes_filters' - A list of objects that filter the request.
+--
+-- 'maxResults', 'listComponentTypes_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'listComponentTypes_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'listComponentTypes_workspaceId' - The ID of the workspace.
+newListComponentTypes ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  ListComponentTypes
+newListComponentTypes pWorkspaceId_ =
+  ListComponentTypes'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_
+    }
+
+-- | A list of objects that filter the request.
+listComponentTypes_filters :: Lens.Lens' ListComponentTypes (Prelude.Maybe [ListComponentTypesFilter])
+listComponentTypes_filters = Lens.lens (\ListComponentTypes' {filters} -> filters) (\s@ListComponentTypes' {} a -> s {filters = a} :: ListComponentTypes) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+listComponentTypes_maxResults :: Lens.Lens' ListComponentTypes (Prelude.Maybe Prelude.Natural)
+listComponentTypes_maxResults = Lens.lens (\ListComponentTypes' {maxResults} -> maxResults) (\s@ListComponentTypes' {} a -> s {maxResults = a} :: ListComponentTypes)
+
+-- | The string that specifies the next page of results.
+listComponentTypes_nextToken :: Lens.Lens' ListComponentTypes (Prelude.Maybe Prelude.Text)
+listComponentTypes_nextToken = Lens.lens (\ListComponentTypes' {nextToken} -> nextToken) (\s@ListComponentTypes' {} a -> s {nextToken = a} :: ListComponentTypes)
+
+-- | The ID of the workspace.
+listComponentTypes_workspaceId :: Lens.Lens' ListComponentTypes Prelude.Text
+listComponentTypes_workspaceId = Lens.lens (\ListComponentTypes' {workspaceId} -> workspaceId) (\s@ListComponentTypes' {} a -> s {workspaceId = a} :: ListComponentTypes)
+
+instance Core.AWSRequest ListComponentTypes where
+  type
+    AWSResponse ListComponentTypes =
+      ListComponentTypesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListComponentTypesResponse'
+            Prelude.<$> (x Data..?> "maxResults")
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> ( x
+                            Data..?> "componentTypeSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListComponentTypes where
+  hashWithSalt _salt ListComponentTypes' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData ListComponentTypes where
+  rnf ListComponentTypes' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders ListComponentTypes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListComponentTypes where
+  toJSON ListComponentTypes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filters" Data..=) Prelude.<$> filters,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListComponentTypes where
+  toPath ListComponentTypes' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/component-types-list"
+      ]
+
+instance Data.ToQuery ListComponentTypes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListComponentTypesResponse' smart constructor.
+data ListComponentTypesResponse = ListComponentTypesResponse'
+  { -- | Specifies the maximum number of results to display.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | A list of objects that contain information about the component types.
+    componentTypeSummaries :: [ComponentTypeSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListComponentTypesResponse' 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', 'listComponentTypesResponse_maxResults' - Specifies the maximum number of results to display.
+--
+-- 'nextToken', 'listComponentTypesResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'httpStatus', 'listComponentTypesResponse_httpStatus' - The response's http status code.
+--
+-- 'workspaceId', 'listComponentTypesResponse_workspaceId' - The ID of the workspace.
+--
+-- 'componentTypeSummaries', 'listComponentTypesResponse_componentTypeSummaries' - A list of objects that contain information about the component types.
+newListComponentTypesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  ListComponentTypesResponse
+newListComponentTypesResponse
+  pHttpStatus_
+  pWorkspaceId_ =
+    ListComponentTypesResponse'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        workspaceId = pWorkspaceId_,
+        componentTypeSummaries = Prelude.mempty
+      }
+
+-- | Specifies the maximum number of results to display.
+listComponentTypesResponse_maxResults :: Lens.Lens' ListComponentTypesResponse (Prelude.Maybe Prelude.Natural)
+listComponentTypesResponse_maxResults = Lens.lens (\ListComponentTypesResponse' {maxResults} -> maxResults) (\s@ListComponentTypesResponse' {} a -> s {maxResults = a} :: ListComponentTypesResponse)
+
+-- | The string that specifies the next page of results.
+listComponentTypesResponse_nextToken :: Lens.Lens' ListComponentTypesResponse (Prelude.Maybe Prelude.Text)
+listComponentTypesResponse_nextToken = Lens.lens (\ListComponentTypesResponse' {nextToken} -> nextToken) (\s@ListComponentTypesResponse' {} a -> s {nextToken = a} :: ListComponentTypesResponse)
+
+-- | The response's http status code.
+listComponentTypesResponse_httpStatus :: Lens.Lens' ListComponentTypesResponse Prelude.Int
+listComponentTypesResponse_httpStatus = Lens.lens (\ListComponentTypesResponse' {httpStatus} -> httpStatus) (\s@ListComponentTypesResponse' {} a -> s {httpStatus = a} :: ListComponentTypesResponse)
+
+-- | The ID of the workspace.
+listComponentTypesResponse_workspaceId :: Lens.Lens' ListComponentTypesResponse Prelude.Text
+listComponentTypesResponse_workspaceId = Lens.lens (\ListComponentTypesResponse' {workspaceId} -> workspaceId) (\s@ListComponentTypesResponse' {} a -> s {workspaceId = a} :: ListComponentTypesResponse)
+
+-- | A list of objects that contain information about the component types.
+listComponentTypesResponse_componentTypeSummaries :: Lens.Lens' ListComponentTypesResponse [ComponentTypeSummary]
+listComponentTypesResponse_componentTypeSummaries = Lens.lens (\ListComponentTypesResponse' {componentTypeSummaries} -> componentTypeSummaries) (\s@ListComponentTypesResponse' {} a -> s {componentTypeSummaries = a} :: ListComponentTypesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListComponentTypesResponse where
+  rnf ListComponentTypesResponse' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeSummaries
diff --git a/gen/Amazonka/IotTwinMaker/ListEntities.hs b/gen/Amazonka/IotTwinMaker/ListEntities.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListEntities.hs
@@ -0,0 +1,237 @@
+{-# 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.IotTwinMaker.ListEntities
+-- 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 all entities in a workspace.
+module Amazonka.IotTwinMaker.ListEntities
+  ( -- * Creating a Request
+    ListEntities (..),
+    newListEntities,
+
+    -- * Request Lenses
+    listEntities_filters,
+    listEntities_maxResults,
+    listEntities_nextToken,
+    listEntities_workspaceId,
+
+    -- * Destructuring the Response
+    ListEntitiesResponse (..),
+    newListEntitiesResponse,
+
+    -- * Response Lenses
+    listEntitiesResponse_entitySummaries,
+    listEntitiesResponse_nextToken,
+    listEntitiesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListEntities' smart constructor.
+data ListEntities = ListEntities'
+  { -- | A list of objects that filter the request.
+    --
+    -- Only one object is accepted as a valid input.
+    filters :: Prelude.Maybe [ListEntitiesFilter],
+    -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEntities' 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:
+--
+-- 'filters', 'listEntities_filters' - A list of objects that filter the request.
+--
+-- Only one object is accepted as a valid input.
+--
+-- 'maxResults', 'listEntities_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'listEntities_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'listEntities_workspaceId' - The ID of the workspace.
+newListEntities ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  ListEntities
+newListEntities pWorkspaceId_ =
+  ListEntities'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_
+    }
+
+-- | A list of objects that filter the request.
+--
+-- Only one object is accepted as a valid input.
+listEntities_filters :: Lens.Lens' ListEntities (Prelude.Maybe [ListEntitiesFilter])
+listEntities_filters = Lens.lens (\ListEntities' {filters} -> filters) (\s@ListEntities' {} a -> s {filters = a} :: ListEntities) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+listEntities_maxResults :: Lens.Lens' ListEntities (Prelude.Maybe Prelude.Natural)
+listEntities_maxResults = Lens.lens (\ListEntities' {maxResults} -> maxResults) (\s@ListEntities' {} a -> s {maxResults = a} :: ListEntities)
+
+-- | The string that specifies the next page of results.
+listEntities_nextToken :: Lens.Lens' ListEntities (Prelude.Maybe Prelude.Text)
+listEntities_nextToken = Lens.lens (\ListEntities' {nextToken} -> nextToken) (\s@ListEntities' {} a -> s {nextToken = a} :: ListEntities)
+
+-- | The ID of the workspace.
+listEntities_workspaceId :: Lens.Lens' ListEntities Prelude.Text
+listEntities_workspaceId = Lens.lens (\ListEntities' {workspaceId} -> workspaceId) (\s@ListEntities' {} a -> s {workspaceId = a} :: ListEntities)
+
+instance Core.AWSRequest ListEntities where
+  type AWSResponse ListEntities = ListEntitiesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEntitiesResponse'
+            Prelude.<$> ( x
+                            Data..?> "entitySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListEntities where
+  hashWithSalt _salt ListEntities' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData ListEntities where
+  rnf ListEntities' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders ListEntities where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListEntities where
+  toJSON ListEntities' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filters" Data..=) Prelude.<$> filters,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListEntities where
+  toPath ListEntities' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entities-list"
+      ]
+
+instance Data.ToQuery ListEntities where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListEntitiesResponse' smart constructor.
+data ListEntitiesResponse = ListEntitiesResponse'
+  { -- | A list of objects that contain information about the entities.
+    entitySummaries :: Prelude.Maybe [EntitySummary],
+    -- | The string that specifies the next page of results.
+    nextToken :: 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 'ListEntitiesResponse' 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:
+--
+-- 'entitySummaries', 'listEntitiesResponse_entitySummaries' - A list of objects that contain information about the entities.
+--
+-- 'nextToken', 'listEntitiesResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'httpStatus', 'listEntitiesResponse_httpStatus' - The response's http status code.
+newListEntitiesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEntitiesResponse
+newListEntitiesResponse pHttpStatus_ =
+  ListEntitiesResponse'
+    { entitySummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of objects that contain information about the entities.
+listEntitiesResponse_entitySummaries :: Lens.Lens' ListEntitiesResponse (Prelude.Maybe [EntitySummary])
+listEntitiesResponse_entitySummaries = Lens.lens (\ListEntitiesResponse' {entitySummaries} -> entitySummaries) (\s@ListEntitiesResponse' {} a -> s {entitySummaries = a} :: ListEntitiesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The string that specifies the next page of results.
+listEntitiesResponse_nextToken :: Lens.Lens' ListEntitiesResponse (Prelude.Maybe Prelude.Text)
+listEntitiesResponse_nextToken = Lens.lens (\ListEntitiesResponse' {nextToken} -> nextToken) (\s@ListEntitiesResponse' {} a -> s {nextToken = a} :: ListEntitiesResponse)
+
+-- | The response's http status code.
+listEntitiesResponse_httpStatus :: Lens.Lens' ListEntitiesResponse Prelude.Int
+listEntitiesResponse_httpStatus = Lens.lens (\ListEntitiesResponse' {httpStatus} -> httpStatus) (\s@ListEntitiesResponse' {} a -> s {httpStatus = a} :: ListEntitiesResponse)
+
+instance Prelude.NFData ListEntitiesResponse where
+  rnf ListEntitiesResponse' {..} =
+    Prelude.rnf entitySummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ListScenes.hs b/gen/Amazonka/IotTwinMaker/ListScenes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListScenes.hs
@@ -0,0 +1,208 @@
+{-# 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.IotTwinMaker.ListScenes
+-- 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 all scenes in a workspace.
+module Amazonka.IotTwinMaker.ListScenes
+  ( -- * Creating a Request
+    ListScenes (..),
+    newListScenes,
+
+    -- * Request Lenses
+    listScenes_maxResults,
+    listScenes_nextToken,
+    listScenes_workspaceId,
+
+    -- * Destructuring the Response
+    ListScenesResponse (..),
+    newListScenesResponse,
+
+    -- * Response Lenses
+    listScenesResponse_nextToken,
+    listScenesResponse_sceneSummaries,
+    listScenesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListScenes' smart constructor.
+data ListScenes = ListScenes'
+  { -- | Specifies the maximum number of results to display.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace that contains the scenes.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListScenes' 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', 'listScenes_maxResults' - Specifies the maximum number of results to display.
+--
+-- 'nextToken', 'listScenes_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'listScenes_workspaceId' - The ID of the workspace that contains the scenes.
+newListScenes ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  ListScenes
+newListScenes pWorkspaceId_ =
+  ListScenes'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_
+    }
+
+-- | Specifies the maximum number of results to display.
+listScenes_maxResults :: Lens.Lens' ListScenes (Prelude.Maybe Prelude.Natural)
+listScenes_maxResults = Lens.lens (\ListScenes' {maxResults} -> maxResults) (\s@ListScenes' {} a -> s {maxResults = a} :: ListScenes)
+
+-- | The string that specifies the next page of results.
+listScenes_nextToken :: Lens.Lens' ListScenes (Prelude.Maybe Prelude.Text)
+listScenes_nextToken = Lens.lens (\ListScenes' {nextToken} -> nextToken) (\s@ListScenes' {} a -> s {nextToken = a} :: ListScenes)
+
+-- | The ID of the workspace that contains the scenes.
+listScenes_workspaceId :: Lens.Lens' ListScenes Prelude.Text
+listScenes_workspaceId = Lens.lens (\ListScenes' {workspaceId} -> workspaceId) (\s@ListScenes' {} a -> s {workspaceId = a} :: ListScenes)
+
+instance Core.AWSRequest ListScenes where
+  type AWSResponse ListScenes = ListScenesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListScenesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "sceneSummaries" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListScenes where
+  hashWithSalt _salt ListScenes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData ListScenes where
+  rnf ListScenes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders ListScenes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListScenes where
+  toJSON ListScenes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListScenes where
+  toPath ListScenes' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/scenes-list"
+      ]
+
+instance Data.ToQuery ListScenes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListScenesResponse' smart constructor.
+data ListScenesResponse = ListScenesResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of objects that contain information about the scenes.
+    sceneSummaries :: Prelude.Maybe [SceneSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListScenesResponse' 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', 'listScenesResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'sceneSummaries', 'listScenesResponse_sceneSummaries' - A list of objects that contain information about the scenes.
+--
+-- 'httpStatus', 'listScenesResponse_httpStatus' - The response's http status code.
+newListScenesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListScenesResponse
+newListScenesResponse pHttpStatus_ =
+  ListScenesResponse'
+    { nextToken = Prelude.Nothing,
+      sceneSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+listScenesResponse_nextToken :: Lens.Lens' ListScenesResponse (Prelude.Maybe Prelude.Text)
+listScenesResponse_nextToken = Lens.lens (\ListScenesResponse' {nextToken} -> nextToken) (\s@ListScenesResponse' {} a -> s {nextToken = a} :: ListScenesResponse)
+
+-- | A list of objects that contain information about the scenes.
+listScenesResponse_sceneSummaries :: Lens.Lens' ListScenesResponse (Prelude.Maybe [SceneSummary])
+listScenesResponse_sceneSummaries = Lens.lens (\ListScenesResponse' {sceneSummaries} -> sceneSummaries) (\s@ListScenesResponse' {} a -> s {sceneSummaries = a} :: ListScenesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listScenesResponse_httpStatus :: Lens.Lens' ListScenesResponse Prelude.Int
+listScenesResponse_httpStatus = Lens.lens (\ListScenesResponse' {httpStatus} -> httpStatus) (\s@ListScenesResponse' {} a -> s {httpStatus = a} :: ListScenesResponse)
+
+instance Prelude.NFData ListScenesResponse where
+  rnf ListScenesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf sceneSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ListSyncJobs.hs b/gen/Amazonka/IotTwinMaker/ListSyncJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListSyncJobs.hs
@@ -0,0 +1,217 @@
+{-# 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.IotTwinMaker.ListSyncJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List all SyncJobs.
+module Amazonka.IotTwinMaker.ListSyncJobs
+  ( -- * Creating a Request
+    ListSyncJobs (..),
+    newListSyncJobs,
+
+    -- * Request Lenses
+    listSyncJobs_maxResults,
+    listSyncJobs_nextToken,
+    listSyncJobs_workspaceId,
+
+    -- * Destructuring the Response
+    ListSyncJobsResponse (..),
+    newListSyncJobsResponse,
+
+    -- * Response Lenses
+    listSyncJobsResponse_nextToken,
+    listSyncJobsResponse_syncJobSummaries,
+    listSyncJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListSyncJobs' smart constructor.
+data ListSyncJobs = ListSyncJobs'
+  { -- | The maximum number of results to return at one time. The default is 50.
+    --
+    -- Valid Range: Minimum value of 0. Maximum value of 200.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace that contains the sync job.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSyncJobs' 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', 'listSyncJobs_maxResults' - The maximum number of results to return at one time. The default is 50.
+--
+-- Valid Range: Minimum value of 0. Maximum value of 200.
+--
+-- 'nextToken', 'listSyncJobs_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'listSyncJobs_workspaceId' - The ID of the workspace that contains the sync job.
+newListSyncJobs ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  ListSyncJobs
+newListSyncJobs pWorkspaceId_ =
+  ListSyncJobs'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_
+    }
+
+-- | The maximum number of results to return at one time. The default is 50.
+--
+-- Valid Range: Minimum value of 0. Maximum value of 200.
+listSyncJobs_maxResults :: Lens.Lens' ListSyncJobs (Prelude.Maybe Prelude.Natural)
+listSyncJobs_maxResults = Lens.lens (\ListSyncJobs' {maxResults} -> maxResults) (\s@ListSyncJobs' {} a -> s {maxResults = a} :: ListSyncJobs)
+
+-- | The string that specifies the next page of results.
+listSyncJobs_nextToken :: Lens.Lens' ListSyncJobs (Prelude.Maybe Prelude.Text)
+listSyncJobs_nextToken = Lens.lens (\ListSyncJobs' {nextToken} -> nextToken) (\s@ListSyncJobs' {} a -> s {nextToken = a} :: ListSyncJobs)
+
+-- | The ID of the workspace that contains the sync job.
+listSyncJobs_workspaceId :: Lens.Lens' ListSyncJobs Prelude.Text
+listSyncJobs_workspaceId = Lens.lens (\ListSyncJobs' {workspaceId} -> workspaceId) (\s@ListSyncJobs' {} a -> s {workspaceId = a} :: ListSyncJobs)
+
+instance Core.AWSRequest ListSyncJobs where
+  type AWSResponse ListSyncJobs = ListSyncJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSyncJobsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "syncJobSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSyncJobs where
+  hashWithSalt _salt ListSyncJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData ListSyncJobs where
+  rnf ListSyncJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders ListSyncJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSyncJobs where
+  toJSON ListSyncJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListSyncJobs where
+  toPath ListSyncJobs' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/sync-jobs-list"
+      ]
+
+instance Data.ToQuery ListSyncJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSyncJobsResponse' smart constructor.
+data ListSyncJobsResponse = ListSyncJobsResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The listed SyncJob summaries.
+    syncJobSummaries :: Prelude.Maybe [SyncJobSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSyncJobsResponse' 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', 'listSyncJobsResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'syncJobSummaries', 'listSyncJobsResponse_syncJobSummaries' - The listed SyncJob summaries.
+--
+-- 'httpStatus', 'listSyncJobsResponse_httpStatus' - The response's http status code.
+newListSyncJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSyncJobsResponse
+newListSyncJobsResponse pHttpStatus_ =
+  ListSyncJobsResponse'
+    { nextToken = Prelude.Nothing,
+      syncJobSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+listSyncJobsResponse_nextToken :: Lens.Lens' ListSyncJobsResponse (Prelude.Maybe Prelude.Text)
+listSyncJobsResponse_nextToken = Lens.lens (\ListSyncJobsResponse' {nextToken} -> nextToken) (\s@ListSyncJobsResponse' {} a -> s {nextToken = a} :: ListSyncJobsResponse)
+
+-- | The listed SyncJob summaries.
+listSyncJobsResponse_syncJobSummaries :: Lens.Lens' ListSyncJobsResponse (Prelude.Maybe [SyncJobSummary])
+listSyncJobsResponse_syncJobSummaries = Lens.lens (\ListSyncJobsResponse' {syncJobSummaries} -> syncJobSummaries) (\s@ListSyncJobsResponse' {} a -> s {syncJobSummaries = a} :: ListSyncJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSyncJobsResponse_httpStatus :: Lens.Lens' ListSyncJobsResponse Prelude.Int
+listSyncJobsResponse_httpStatus = Lens.lens (\ListSyncJobsResponse' {httpStatus} -> httpStatus) (\s@ListSyncJobsResponse' {} a -> s {httpStatus = a} :: ListSyncJobsResponse)
+
+instance Prelude.NFData ListSyncJobsResponse where
+  rnf ListSyncJobsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf syncJobSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ListSyncResources.hs b/gen/Amazonka/IotTwinMaker/ListSyncResources.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListSyncResources.hs
@@ -0,0 +1,252 @@
+{-# 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.IotTwinMaker.ListSyncResources
+-- 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 sync resources.
+module Amazonka.IotTwinMaker.ListSyncResources
+  ( -- * Creating a Request
+    ListSyncResources (..),
+    newListSyncResources,
+
+    -- * Request Lenses
+    listSyncResources_filters,
+    listSyncResources_maxResults,
+    listSyncResources_nextToken,
+    listSyncResources_workspaceId,
+    listSyncResources_syncSource,
+
+    -- * Destructuring the Response
+    ListSyncResourcesResponse (..),
+    newListSyncResourcesResponse,
+
+    -- * Response Lenses
+    listSyncResourcesResponse_nextToken,
+    listSyncResourcesResponse_syncResources,
+    listSyncResourcesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListSyncResources' smart constructor.
+data ListSyncResources = ListSyncResources'
+  { -- | A list of objects that filter the request.
+    filters :: Prelude.Maybe [SyncResourceFilter],
+    -- | The maximum number of results to return at one time. The default is 50.
+    --
+    -- Valid Range: Minimum value of 0. Maximum value of 200.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace that contains the sync job.
+    workspaceId :: Prelude.Text,
+    -- | The sync soucre.
+    --
+    -- Currently the only supported syncSoucre is @SITEWISE @.
+    syncSource :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSyncResources' 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:
+--
+-- 'filters', 'listSyncResources_filters' - A list of objects that filter the request.
+--
+-- 'maxResults', 'listSyncResources_maxResults' - The maximum number of results to return at one time. The default is 50.
+--
+-- Valid Range: Minimum value of 0. Maximum value of 200.
+--
+-- 'nextToken', 'listSyncResources_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceId', 'listSyncResources_workspaceId' - The ID of the workspace that contains the sync job.
+--
+-- 'syncSource', 'listSyncResources_syncSource' - The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+newListSyncResources ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'syncSource'
+  Prelude.Text ->
+  ListSyncResources
+newListSyncResources pWorkspaceId_ pSyncSource_ =
+  ListSyncResources'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      syncSource = pSyncSource_
+    }
+
+-- | A list of objects that filter the request.
+listSyncResources_filters :: Lens.Lens' ListSyncResources (Prelude.Maybe [SyncResourceFilter])
+listSyncResources_filters = Lens.lens (\ListSyncResources' {filters} -> filters) (\s@ListSyncResources' {} a -> s {filters = a} :: ListSyncResources) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return at one time. The default is 50.
+--
+-- Valid Range: Minimum value of 0. Maximum value of 200.
+listSyncResources_maxResults :: Lens.Lens' ListSyncResources (Prelude.Maybe Prelude.Natural)
+listSyncResources_maxResults = Lens.lens (\ListSyncResources' {maxResults} -> maxResults) (\s@ListSyncResources' {} a -> s {maxResults = a} :: ListSyncResources)
+
+-- | The string that specifies the next page of results.
+listSyncResources_nextToken :: Lens.Lens' ListSyncResources (Prelude.Maybe Prelude.Text)
+listSyncResources_nextToken = Lens.lens (\ListSyncResources' {nextToken} -> nextToken) (\s@ListSyncResources' {} a -> s {nextToken = a} :: ListSyncResources)
+
+-- | The ID of the workspace that contains the sync job.
+listSyncResources_workspaceId :: Lens.Lens' ListSyncResources Prelude.Text
+listSyncResources_workspaceId = Lens.lens (\ListSyncResources' {workspaceId} -> workspaceId) (\s@ListSyncResources' {} a -> s {workspaceId = a} :: ListSyncResources)
+
+-- | The sync soucre.
+--
+-- Currently the only supported syncSoucre is @SITEWISE @.
+listSyncResources_syncSource :: Lens.Lens' ListSyncResources Prelude.Text
+listSyncResources_syncSource = Lens.lens (\ListSyncResources' {syncSource} -> syncSource) (\s@ListSyncResources' {} a -> s {syncSource = a} :: ListSyncResources)
+
+instance Core.AWSRequest ListSyncResources where
+  type
+    AWSResponse ListSyncResources =
+      ListSyncResourcesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSyncResourcesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "syncResources" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSyncResources where
+  hashWithSalt _salt ListSyncResources' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` syncSource
+
+instance Prelude.NFData ListSyncResources where
+  rnf ListSyncResources' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf syncSource
+
+instance Data.ToHeaders ListSyncResources where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSyncResources where
+  toJSON ListSyncResources' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filters" Data..=) Prelude.<$> filters,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListSyncResources where
+  toPath ListSyncResources' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/sync-jobs/",
+        Data.toBS syncSource,
+        "/resources-list"
+      ]
+
+instance Data.ToQuery ListSyncResources where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSyncResourcesResponse' smart constructor.
+data ListSyncResourcesResponse = ListSyncResourcesResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The sync resources.
+    syncResources :: Prelude.Maybe [SyncResourceSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSyncResourcesResponse' 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', 'listSyncResourcesResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'syncResources', 'listSyncResourcesResponse_syncResources' - The sync resources.
+--
+-- 'httpStatus', 'listSyncResourcesResponse_httpStatus' - The response's http status code.
+newListSyncResourcesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSyncResourcesResponse
+newListSyncResourcesResponse pHttpStatus_ =
+  ListSyncResourcesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      syncResources = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+listSyncResourcesResponse_nextToken :: Lens.Lens' ListSyncResourcesResponse (Prelude.Maybe Prelude.Text)
+listSyncResourcesResponse_nextToken = Lens.lens (\ListSyncResourcesResponse' {nextToken} -> nextToken) (\s@ListSyncResourcesResponse' {} a -> s {nextToken = a} :: ListSyncResourcesResponse)
+
+-- | The sync resources.
+listSyncResourcesResponse_syncResources :: Lens.Lens' ListSyncResourcesResponse (Prelude.Maybe [SyncResourceSummary])
+listSyncResourcesResponse_syncResources = Lens.lens (\ListSyncResourcesResponse' {syncResources} -> syncResources) (\s@ListSyncResourcesResponse' {} a -> s {syncResources = a} :: ListSyncResourcesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSyncResourcesResponse_httpStatus :: Lens.Lens' ListSyncResourcesResponse Prelude.Int
+listSyncResourcesResponse_httpStatus = Lens.lens (\ListSyncResourcesResponse' {httpStatus} -> httpStatus) (\s@ListSyncResourcesResponse' {} a -> s {httpStatus = a} :: ListSyncResourcesResponse)
+
+instance Prelude.NFData ListSyncResourcesResponse where
+  rnf ListSyncResourcesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf syncResources
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ListTagsForResource.hs b/gen/Amazonka/IotTwinMaker/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListTagsForResource.hs
@@ -0,0 +1,213 @@
+{-# 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.IotTwinMaker.ListTagsForResource
+-- 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 all tags associated with a resource.
+module Amazonka.IotTwinMaker.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_maxResults,
+    listTagsForResource_nextToken,
+    listTagsForResource_resourceARN,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_nextToken,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the resource.
+    resourceARN :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' 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', 'listTagsForResource_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'listTagsForResource_nextToken' - The string that specifies the next page of results.
+--
+-- 'resourceARN', 'listTagsForResource_resourceARN' - The ARN of the resource.
+newListTagsForResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceARN_ =
+  ListTagsForResource'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceARN = pResourceARN_
+    }
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+listTagsForResource_maxResults :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Natural)
+listTagsForResource_maxResults = Lens.lens (\ListTagsForResource' {maxResults} -> maxResults) (\s@ListTagsForResource' {} a -> s {maxResults = a} :: ListTagsForResource)
+
+-- | The string that specifies the next page of results.
+listTagsForResource_nextToken :: Lens.Lens' ListTagsForResource (Prelude.Maybe Prelude.Text)
+listTagsForResource_nextToken = Lens.lens (\ListTagsForResource' {nextToken} -> nextToken) (\s@ListTagsForResource' {} a -> s {nextToken = a} :: ListTagsForResource)
+
+-- | The ARN of the resource.
+listTagsForResource_resourceARN :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceARN = Lens.lens (\ListTagsForResource' {resourceARN} -> resourceARN) (\s@ListTagsForResource' {} a -> s {resourceARN = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` resourceARN
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceARN
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("resourceARN" Data..= resourceARN)
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/tags-list"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Metadata that you can use to manage a resource.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' 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', 'listTagsForResourceResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - Metadata that you can use to manage a resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { nextToken =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+listTagsForResourceResponse_nextToken :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe Prelude.Text)
+listTagsForResourceResponse_nextToken = Lens.lens (\ListTagsForResourceResponse' {nextToken} -> nextToken) (\s@ListTagsForResourceResponse' {} a -> s {nextToken = a} :: ListTagsForResourceResponse)
+
+-- | Metadata that you can use to manage a resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/ListWorkspaces.hs b/gen/Amazonka/IotTwinMaker/ListWorkspaces.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/ListWorkspaces.hs
@@ -0,0 +1,201 @@
+{-# 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.IotTwinMaker.ListWorkspaces
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about workspaces in the current account.
+module Amazonka.IotTwinMaker.ListWorkspaces
+  ( -- * Creating a Request
+    ListWorkspaces (..),
+    newListWorkspaces,
+
+    -- * Request Lenses
+    listWorkspaces_maxResults,
+    listWorkspaces_nextToken,
+
+    -- * Destructuring the Response
+    ListWorkspacesResponse (..),
+    newListWorkspacesResponse,
+
+    -- * Response Lenses
+    listWorkspacesResponse_nextToken,
+    listWorkspacesResponse_workspaceSummaries,
+    listWorkspacesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListWorkspaces' smart constructor.
+data ListWorkspaces = ListWorkspaces'
+  { -- | The maximum number of results to return at one time. The default is 25.
+    --
+    -- Valid Range: Minimum value of 1. Maximum value of 250.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListWorkspaces' 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', 'listWorkspaces_maxResults' - The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+--
+-- 'nextToken', 'listWorkspaces_nextToken' - The string that specifies the next page of results.
+newListWorkspaces ::
+  ListWorkspaces
+newListWorkspaces =
+  ListWorkspaces'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return at one time. The default is 25.
+--
+-- Valid Range: Minimum value of 1. Maximum value of 250.
+listWorkspaces_maxResults :: Lens.Lens' ListWorkspaces (Prelude.Maybe Prelude.Natural)
+listWorkspaces_maxResults = Lens.lens (\ListWorkspaces' {maxResults} -> maxResults) (\s@ListWorkspaces' {} a -> s {maxResults = a} :: ListWorkspaces)
+
+-- | The string that specifies the next page of results.
+listWorkspaces_nextToken :: Lens.Lens' ListWorkspaces (Prelude.Maybe Prelude.Text)
+listWorkspaces_nextToken = Lens.lens (\ListWorkspaces' {nextToken} -> nextToken) (\s@ListWorkspaces' {} a -> s {nextToken = a} :: ListWorkspaces)
+
+instance Core.AWSRequest ListWorkspaces where
+  type
+    AWSResponse ListWorkspaces =
+      ListWorkspacesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListWorkspacesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "workspaceSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListWorkspaces where
+  hashWithSalt _salt ListWorkspaces' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListWorkspaces where
+  rnf ListWorkspaces' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListWorkspaces where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListWorkspaces where
+  toJSON ListWorkspaces' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListWorkspaces where
+  toPath = Prelude.const "/workspaces-list"
+
+instance Data.ToQuery ListWorkspaces where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListWorkspacesResponse' smart constructor.
+data ListWorkspacesResponse = ListWorkspacesResponse'
+  { -- | The string that specifies the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of objects that contain information about the workspaces.
+    workspaceSummaries :: Prelude.Maybe [WorkspaceSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListWorkspacesResponse' 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', 'listWorkspacesResponse_nextToken' - The string that specifies the next page of results.
+--
+-- 'workspaceSummaries', 'listWorkspacesResponse_workspaceSummaries' - A list of objects that contain information about the workspaces.
+--
+-- 'httpStatus', 'listWorkspacesResponse_httpStatus' - The response's http status code.
+newListWorkspacesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListWorkspacesResponse
+newListWorkspacesResponse pHttpStatus_ =
+  ListWorkspacesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      workspaceSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The string that specifies the next page of results.
+listWorkspacesResponse_nextToken :: Lens.Lens' ListWorkspacesResponse (Prelude.Maybe Prelude.Text)
+listWorkspacesResponse_nextToken = Lens.lens (\ListWorkspacesResponse' {nextToken} -> nextToken) (\s@ListWorkspacesResponse' {} a -> s {nextToken = a} :: ListWorkspacesResponse)
+
+-- | A list of objects that contain information about the workspaces.
+listWorkspacesResponse_workspaceSummaries :: Lens.Lens' ListWorkspacesResponse (Prelude.Maybe [WorkspaceSummary])
+listWorkspacesResponse_workspaceSummaries = Lens.lens (\ListWorkspacesResponse' {workspaceSummaries} -> workspaceSummaries) (\s@ListWorkspacesResponse' {} a -> s {workspaceSummaries = a} :: ListWorkspacesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listWorkspacesResponse_httpStatus :: Lens.Lens' ListWorkspacesResponse Prelude.Int
+listWorkspacesResponse_httpStatus = Lens.lens (\ListWorkspacesResponse' {httpStatus} -> httpStatus) (\s@ListWorkspacesResponse' {} a -> s {httpStatus = a} :: ListWorkspacesResponse)
+
+instance Prelude.NFData ListWorkspacesResponse where
+  rnf ListWorkspacesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf workspaceSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/TagResource.hs b/gen/Amazonka/IotTwinMaker/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/TagResource.hs
@@ -0,0 +1,164 @@
+{-# 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.IotTwinMaker.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds tags to a resource.
+module Amazonka.IotTwinMaker.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceARN,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The ARN of the resource.
+    resourceARN :: Prelude.Text,
+    -- | Metadata to add to this resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' 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:
+--
+-- 'resourceARN', 'tagResource_resourceARN' - The ARN of the resource.
+--
+-- 'tags', 'tagResource_tags' - Metadata to add to this resource.
+newTagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceARN_ =
+  TagResource'
+    { resourceARN = pResourceARN_,
+      tags = Prelude.mempty
+    }
+
+-- | The ARN of the resource.
+tagResource_resourceARN :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceARN = Lens.lens (\TagResource' {resourceARN} -> resourceARN) (\s@TagResource' {} a -> s {resourceARN = a} :: TagResource)
+
+-- | Metadata to add to this resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceARN
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceARN
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceARN" Data..= resourceARN),
+            Prelude.Just ("tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/tags"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' 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', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/Types.hs b/gen/Amazonka/IotTwinMaker/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types.hs
@@ -0,0 +1,692 @@
+{-# 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.IotTwinMaker.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.IotTwinMaker.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _ConnectorFailureException,
+    _ConnectorTimeoutException,
+    _InternalServerException,
+    _QueryTimeoutException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _TooManyTagsException,
+    _ValidationException,
+
+    -- * ColumnType
+    ColumnType (..),
+
+    -- * ComponentUpdateType
+    ComponentUpdateType (..),
+
+    -- * ErrorCode
+    ErrorCode (..),
+
+    -- * GroupType
+    GroupType (..),
+
+    -- * InterpolationType
+    InterpolationType (..),
+
+    -- * Order
+    Order (..),
+
+    -- * OrderByTime
+    OrderByTime (..),
+
+    -- * ParentEntityUpdateType
+    ParentEntityUpdateType (..),
+
+    -- * PricingMode
+    PricingMode (..),
+
+    -- * PricingTier
+    PricingTier (..),
+
+    -- * PropertyGroupUpdateType
+    PropertyGroupUpdateType (..),
+
+    -- * PropertyUpdateType
+    PropertyUpdateType (..),
+
+    -- * Scope
+    Scope (..),
+
+    -- * State
+    State (..),
+
+    -- * SyncJobState
+    SyncJobState (..),
+
+    -- * SyncResourceState
+    SyncResourceState (..),
+
+    -- * SyncResourceType
+    SyncResourceType (..),
+
+    -- * Type
+    Type (..),
+
+    -- * UpdateReason
+    UpdateReason (..),
+
+    -- * BatchPutPropertyError
+    BatchPutPropertyError (..),
+    newBatchPutPropertyError,
+    batchPutPropertyError_errorCode,
+    batchPutPropertyError_errorMessage,
+    batchPutPropertyError_entry,
+
+    -- * BatchPutPropertyErrorEntry
+    BatchPutPropertyErrorEntry (..),
+    newBatchPutPropertyErrorEntry,
+    batchPutPropertyErrorEntry_errors,
+
+    -- * BundleInformation
+    BundleInformation (..),
+    newBundleInformation,
+    bundleInformation_pricingTier,
+    bundleInformation_bundleNames,
+
+    -- * ColumnDescription
+    ColumnDescription (..),
+    newColumnDescription,
+    columnDescription_name,
+    columnDescription_type,
+
+    -- * ComponentPropertyGroupRequest
+    ComponentPropertyGroupRequest (..),
+    newComponentPropertyGroupRequest,
+    componentPropertyGroupRequest_groupType,
+    componentPropertyGroupRequest_propertyNames,
+    componentPropertyGroupRequest_updateType,
+
+    -- * ComponentPropertyGroupResponse
+    ComponentPropertyGroupResponse (..),
+    newComponentPropertyGroupResponse,
+    componentPropertyGroupResponse_groupType,
+    componentPropertyGroupResponse_propertyNames,
+    componentPropertyGroupResponse_isInherited,
+
+    -- * ComponentRequest
+    ComponentRequest (..),
+    newComponentRequest,
+    componentRequest_componentTypeId,
+    componentRequest_description,
+    componentRequest_properties,
+    componentRequest_propertyGroups,
+
+    -- * ComponentResponse
+    ComponentResponse (..),
+    newComponentResponse,
+    componentResponse_componentName,
+    componentResponse_componentTypeId,
+    componentResponse_definedIn,
+    componentResponse_description,
+    componentResponse_properties,
+    componentResponse_propertyGroups,
+    componentResponse_status,
+    componentResponse_syncSource,
+
+    -- * ComponentTypeSummary
+    ComponentTypeSummary (..),
+    newComponentTypeSummary,
+    componentTypeSummary_componentTypeName,
+    componentTypeSummary_description,
+    componentTypeSummary_status,
+    componentTypeSummary_arn,
+    componentTypeSummary_componentTypeId,
+    componentTypeSummary_creationDateTime,
+    componentTypeSummary_updateDateTime,
+
+    -- * ComponentUpdateRequest
+    ComponentUpdateRequest (..),
+    newComponentUpdateRequest,
+    componentUpdateRequest_componentTypeId,
+    componentUpdateRequest_description,
+    componentUpdateRequest_propertyGroupUpdates,
+    componentUpdateRequest_propertyUpdates,
+    componentUpdateRequest_updateType,
+
+    -- * DataConnector
+    DataConnector (..),
+    newDataConnector,
+    dataConnector_isNative,
+    dataConnector_lambda,
+
+    -- * DataType
+    DataType (..),
+    newDataType,
+    dataType_allowedValues,
+    dataType_nestedType,
+    dataType_relationship,
+    dataType_unitOfMeasure,
+    dataType_type,
+
+    -- * DataValue
+    DataValue (..),
+    newDataValue,
+    dataValue_booleanValue,
+    dataValue_doubleValue,
+    dataValue_expression,
+    dataValue_integerValue,
+    dataValue_listValue,
+    dataValue_longValue,
+    dataValue_mapValue,
+    dataValue_relationshipValue,
+    dataValue_stringValue,
+
+    -- * EntityPropertyReference
+    EntityPropertyReference (..),
+    newEntityPropertyReference,
+    entityPropertyReference_componentName,
+    entityPropertyReference_entityId,
+    entityPropertyReference_externalIdProperty,
+    entityPropertyReference_propertyName,
+
+    -- * EntitySummary
+    EntitySummary (..),
+    newEntitySummary,
+    entitySummary_description,
+    entitySummary_hasChildEntities,
+    entitySummary_parentEntityId,
+    entitySummary_entityId,
+    entitySummary_entityName,
+    entitySummary_arn,
+    entitySummary_status,
+    entitySummary_creationDateTime,
+    entitySummary_updateDateTime,
+
+    -- * ErrorDetails
+    ErrorDetails (..),
+    newErrorDetails,
+    errorDetails_code,
+    errorDetails_message,
+
+    -- * FunctionRequest
+    FunctionRequest (..),
+    newFunctionRequest,
+    functionRequest_implementedBy,
+    functionRequest_requiredProperties,
+    functionRequest_scope,
+
+    -- * FunctionResponse
+    FunctionResponse (..),
+    newFunctionResponse,
+    functionResponse_implementedBy,
+    functionResponse_isInherited,
+    functionResponse_requiredProperties,
+    functionResponse_scope,
+
+    -- * InterpolationParameters
+    InterpolationParameters (..),
+    newInterpolationParameters,
+    interpolationParameters_interpolationType,
+    interpolationParameters_intervalInSeconds,
+
+    -- * LambdaFunction
+    LambdaFunction (..),
+    newLambdaFunction,
+    lambdaFunction_arn,
+
+    -- * ListComponentTypesFilter
+    ListComponentTypesFilter (..),
+    newListComponentTypesFilter,
+    listComponentTypesFilter_extendsFrom,
+    listComponentTypesFilter_isAbstract,
+    listComponentTypesFilter_namespace,
+
+    -- * ListEntitiesFilter
+    ListEntitiesFilter (..),
+    newListEntitiesFilter,
+    listEntitiesFilter_componentTypeId,
+    listEntitiesFilter_externalId,
+    listEntitiesFilter_parentEntityId,
+
+    -- * OrderBy
+    OrderBy (..),
+    newOrderBy,
+    orderBy_order,
+    orderBy_propertyName,
+
+    -- * ParentEntityUpdateRequest
+    ParentEntityUpdateRequest (..),
+    newParentEntityUpdateRequest,
+    parentEntityUpdateRequest_parentEntityId,
+    parentEntityUpdateRequest_updateType,
+
+    -- * PricingPlan
+    PricingPlan (..),
+    newPricingPlan,
+    pricingPlan_billableEntityCount,
+    pricingPlan_bundleInformation,
+    pricingPlan_effectiveDateTime,
+    pricingPlan_pricingMode,
+    pricingPlan_updateDateTime,
+    pricingPlan_updateReason,
+
+    -- * PropertyDefinitionRequest
+    PropertyDefinitionRequest (..),
+    newPropertyDefinitionRequest,
+    propertyDefinitionRequest_configuration,
+    propertyDefinitionRequest_dataType,
+    propertyDefinitionRequest_defaultValue,
+    propertyDefinitionRequest_displayName,
+    propertyDefinitionRequest_isExternalId,
+    propertyDefinitionRequest_isRequiredInEntity,
+    propertyDefinitionRequest_isStoredExternally,
+    propertyDefinitionRequest_isTimeSeries,
+
+    -- * PropertyDefinitionResponse
+    PropertyDefinitionResponse (..),
+    newPropertyDefinitionResponse,
+    propertyDefinitionResponse_configuration,
+    propertyDefinitionResponse_defaultValue,
+    propertyDefinitionResponse_displayName,
+    propertyDefinitionResponse_dataType,
+    propertyDefinitionResponse_isTimeSeries,
+    propertyDefinitionResponse_isRequiredInEntity,
+    propertyDefinitionResponse_isExternalId,
+    propertyDefinitionResponse_isStoredExternally,
+    propertyDefinitionResponse_isImported,
+    propertyDefinitionResponse_isFinal,
+    propertyDefinitionResponse_isInherited,
+
+    -- * PropertyFilter
+    PropertyFilter (..),
+    newPropertyFilter,
+    propertyFilter_operator,
+    propertyFilter_propertyName,
+    propertyFilter_value,
+
+    -- * PropertyGroupRequest
+    PropertyGroupRequest (..),
+    newPropertyGroupRequest,
+    propertyGroupRequest_groupType,
+    propertyGroupRequest_propertyNames,
+
+    -- * PropertyGroupResponse
+    PropertyGroupResponse (..),
+    newPropertyGroupResponse,
+    propertyGroupResponse_groupType,
+    propertyGroupResponse_propertyNames,
+    propertyGroupResponse_isInherited,
+
+    -- * PropertyLatestValue
+    PropertyLatestValue (..),
+    newPropertyLatestValue,
+    propertyLatestValue_propertyValue,
+    propertyLatestValue_propertyReference,
+
+    -- * PropertyRequest
+    PropertyRequest (..),
+    newPropertyRequest,
+    propertyRequest_definition,
+    propertyRequest_updateType,
+    propertyRequest_value,
+
+    -- * PropertyResponse
+    PropertyResponse (..),
+    newPropertyResponse,
+    propertyResponse_definition,
+    propertyResponse_value,
+
+    -- * PropertyValue
+    PropertyValue (..),
+    newPropertyValue,
+    propertyValue_time,
+    propertyValue_timestamp,
+    propertyValue_value,
+
+    -- * PropertyValueEntry
+    PropertyValueEntry (..),
+    newPropertyValueEntry,
+    propertyValueEntry_propertyValues,
+    propertyValueEntry_entityPropertyReference,
+
+    -- * PropertyValueHistory
+    PropertyValueHistory (..),
+    newPropertyValueHistory,
+    propertyValueHistory_values,
+    propertyValueHistory_entityPropertyReference,
+
+    -- * QueryResultValue
+    QueryResultValue (..),
+    newQueryResultValue,
+
+    -- * Relationship
+    Relationship (..),
+    newRelationship,
+    relationship_relationshipType,
+    relationship_targetComponentTypeId,
+
+    -- * RelationshipValue
+    RelationshipValue (..),
+    newRelationshipValue,
+    relationshipValue_targetComponentName,
+    relationshipValue_targetEntityId,
+
+    -- * Row
+    Row (..),
+    newRow,
+    row_rowData,
+
+    -- * SceneSummary
+    SceneSummary (..),
+    newSceneSummary,
+    sceneSummary_description,
+    sceneSummary_sceneId,
+    sceneSummary_contentLocation,
+    sceneSummary_arn,
+    sceneSummary_creationDateTime,
+    sceneSummary_updateDateTime,
+
+    -- * Status
+    Status (..),
+    newStatus,
+    status_error,
+    status_state,
+
+    -- * SyncJobStatus
+    SyncJobStatus (..),
+    newSyncJobStatus,
+    syncJobStatus_error,
+    syncJobStatus_state,
+
+    -- * SyncJobSummary
+    SyncJobSummary (..),
+    newSyncJobSummary,
+    syncJobSummary_arn,
+    syncJobSummary_creationDateTime,
+    syncJobSummary_status,
+    syncJobSummary_syncSource,
+    syncJobSummary_updateDateTime,
+    syncJobSummary_workspaceId,
+
+    -- * SyncResourceFilter
+    SyncResourceFilter (..),
+    newSyncResourceFilter,
+    syncResourceFilter_externalId,
+    syncResourceFilter_resourceId,
+    syncResourceFilter_resourceType,
+    syncResourceFilter_state,
+
+    -- * SyncResourceStatus
+    SyncResourceStatus (..),
+    newSyncResourceStatus,
+    syncResourceStatus_error,
+    syncResourceStatus_state,
+
+    -- * SyncResourceSummary
+    SyncResourceSummary (..),
+    newSyncResourceSummary,
+    syncResourceSummary_externalId,
+    syncResourceSummary_resourceId,
+    syncResourceSummary_resourceType,
+    syncResourceSummary_status,
+    syncResourceSummary_updateDateTime,
+
+    -- * TabularConditions
+    TabularConditions (..),
+    newTabularConditions,
+    tabularConditions_orderBy,
+    tabularConditions_propertyFilters,
+
+    -- * WorkspaceSummary
+    WorkspaceSummary (..),
+    newWorkspaceSummary,
+    workspaceSummary_description,
+    workspaceSummary_workspaceId,
+    workspaceSummary_arn,
+    workspaceSummary_creationDateTime,
+    workspaceSummary_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.IotTwinMaker.Types.BatchPutPropertyError
+import Amazonka.IotTwinMaker.Types.BatchPutPropertyErrorEntry
+import Amazonka.IotTwinMaker.Types.BundleInformation
+import Amazonka.IotTwinMaker.Types.ColumnDescription
+import Amazonka.IotTwinMaker.Types.ColumnType
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupResponse
+import Amazonka.IotTwinMaker.Types.ComponentRequest
+import Amazonka.IotTwinMaker.Types.ComponentResponse
+import Amazonka.IotTwinMaker.Types.ComponentTypeSummary
+import Amazonka.IotTwinMaker.Types.ComponentUpdateRequest
+import Amazonka.IotTwinMaker.Types.ComponentUpdateType
+import Amazonka.IotTwinMaker.Types.DataConnector
+import Amazonka.IotTwinMaker.Types.DataType
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.EntityPropertyReference
+import Amazonka.IotTwinMaker.Types.EntitySummary
+import Amazonka.IotTwinMaker.Types.ErrorCode
+import Amazonka.IotTwinMaker.Types.ErrorDetails
+import Amazonka.IotTwinMaker.Types.FunctionRequest
+import Amazonka.IotTwinMaker.Types.FunctionResponse
+import Amazonka.IotTwinMaker.Types.GroupType
+import Amazonka.IotTwinMaker.Types.InterpolationParameters
+import Amazonka.IotTwinMaker.Types.InterpolationType
+import Amazonka.IotTwinMaker.Types.LambdaFunction
+import Amazonka.IotTwinMaker.Types.ListComponentTypesFilter
+import Amazonka.IotTwinMaker.Types.ListEntitiesFilter
+import Amazonka.IotTwinMaker.Types.Order
+import Amazonka.IotTwinMaker.Types.OrderBy
+import Amazonka.IotTwinMaker.Types.OrderByTime
+import Amazonka.IotTwinMaker.Types.ParentEntityUpdateRequest
+import Amazonka.IotTwinMaker.Types.ParentEntityUpdateType
+import Amazonka.IotTwinMaker.Types.PricingMode
+import Amazonka.IotTwinMaker.Types.PricingPlan
+import Amazonka.IotTwinMaker.Types.PricingTier
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionRequest
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionResponse
+import Amazonka.IotTwinMaker.Types.PropertyFilter
+import Amazonka.IotTwinMaker.Types.PropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.PropertyGroupResponse
+import Amazonka.IotTwinMaker.Types.PropertyGroupUpdateType
+import Amazonka.IotTwinMaker.Types.PropertyLatestValue
+import Amazonka.IotTwinMaker.Types.PropertyRequest
+import Amazonka.IotTwinMaker.Types.PropertyResponse
+import Amazonka.IotTwinMaker.Types.PropertyUpdateType
+import Amazonka.IotTwinMaker.Types.PropertyValue
+import Amazonka.IotTwinMaker.Types.PropertyValueEntry
+import Amazonka.IotTwinMaker.Types.PropertyValueHistory
+import Amazonka.IotTwinMaker.Types.QueryResultValue
+import Amazonka.IotTwinMaker.Types.Relationship
+import Amazonka.IotTwinMaker.Types.RelationshipValue
+import Amazonka.IotTwinMaker.Types.Row
+import Amazonka.IotTwinMaker.Types.SceneSummary
+import Amazonka.IotTwinMaker.Types.Scope
+import Amazonka.IotTwinMaker.Types.State
+import Amazonka.IotTwinMaker.Types.Status
+import Amazonka.IotTwinMaker.Types.SyncJobState
+import Amazonka.IotTwinMaker.Types.SyncJobStatus
+import Amazonka.IotTwinMaker.Types.SyncJobSummary
+import Amazonka.IotTwinMaker.Types.SyncResourceFilter
+import Amazonka.IotTwinMaker.Types.SyncResourceState
+import Amazonka.IotTwinMaker.Types.SyncResourceStatus
+import Amazonka.IotTwinMaker.Types.SyncResourceSummary
+import Amazonka.IotTwinMaker.Types.SyncResourceType
+import Amazonka.IotTwinMaker.Types.TabularConditions
+import Amazonka.IotTwinMaker.Types.Type
+import Amazonka.IotTwinMaker.Types.UpdateReason
+import Amazonka.IotTwinMaker.Types.WorkspaceSummary
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2021-11-29@ of the Amazon IoT TwinMaker SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "IotTwinMaker",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "iottwinmaker",
+      Core.signingName = "iottwinmaker",
+      Core.version = "2021-11-29",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "IotTwinMaker",
+      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
+
+-- | Access is denied.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | A conflict occurred.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | The connector failed.
+_ConnectorFailureException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConnectorFailureException =
+  Core._MatchServiceError
+    defaultService
+    "ConnectorFailureException"
+    Prelude.. Core.hasStatus 424
+
+-- | The connector timed out.
+_ConnectorTimeoutException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConnectorTimeoutException =
+  Core._MatchServiceError
+    defaultService
+    "ConnectorTimeoutException"
+    Prelude.. Core.hasStatus 424
+
+-- | An unexpected error has occurred.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The query timeout exception.
+_QueryTimeoutException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_QueryTimeoutException =
+  Core._MatchServiceError
+    defaultService
+    "QueryTimeoutException"
+    Prelude.. Core.hasStatus 400
+
+-- | The resource wasn\'t found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The service quota was exceeded.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The rate exceeds the limit.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | The number of tags exceeds the limit.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
+    Prelude.. Core.hasStatus 400
+
+-- | Failed
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyError.hs b/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyError.hs
@@ -0,0 +1,109 @@
+{-# 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.IotTwinMaker.Types.BatchPutPropertyError
+-- 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.IotTwinMaker.Types.BatchPutPropertyError where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.PropertyValueEntry
+import qualified Amazonka.Prelude as Prelude
+
+-- | An error returned by the @BatchPutProperty@ action.
+--
+-- /See:/ 'newBatchPutPropertyError' smart constructor.
+data BatchPutPropertyError = BatchPutPropertyError'
+  { -- | The error code.
+    errorCode :: Prelude.Text,
+    -- | The error message.
+    errorMessage :: Prelude.Text,
+    -- | An object that contains information about errors returned by the
+    -- @BatchPutProperty@ action.
+    entry :: PropertyValueEntry
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutPropertyError' 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:
+--
+-- 'errorCode', 'batchPutPropertyError_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchPutPropertyError_errorMessage' - The error message.
+--
+-- 'entry', 'batchPutPropertyError_entry' - An object that contains information about errors returned by the
+-- @BatchPutProperty@ action.
+newBatchPutPropertyError ::
+  -- | 'errorCode'
+  Prelude.Text ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'entry'
+  PropertyValueEntry ->
+  BatchPutPropertyError
+newBatchPutPropertyError
+  pErrorCode_
+  pErrorMessage_
+  pEntry_ =
+    BatchPutPropertyError'
+      { errorCode = pErrorCode_,
+        errorMessage = pErrorMessage_,
+        entry = pEntry_
+      }
+
+-- | The error code.
+batchPutPropertyError_errorCode :: Lens.Lens' BatchPutPropertyError Prelude.Text
+batchPutPropertyError_errorCode = Lens.lens (\BatchPutPropertyError' {errorCode} -> errorCode) (\s@BatchPutPropertyError' {} a -> s {errorCode = a} :: BatchPutPropertyError)
+
+-- | The error message.
+batchPutPropertyError_errorMessage :: Lens.Lens' BatchPutPropertyError Prelude.Text
+batchPutPropertyError_errorMessage = Lens.lens (\BatchPutPropertyError' {errorMessage} -> errorMessage) (\s@BatchPutPropertyError' {} a -> s {errorMessage = a} :: BatchPutPropertyError)
+
+-- | An object that contains information about errors returned by the
+-- @BatchPutProperty@ action.
+batchPutPropertyError_entry :: Lens.Lens' BatchPutPropertyError PropertyValueEntry
+batchPutPropertyError_entry = Lens.lens (\BatchPutPropertyError' {entry} -> entry) (\s@BatchPutPropertyError' {} a -> s {entry = a} :: BatchPutPropertyError)
+
+instance Data.FromJSON BatchPutPropertyError where
+  parseJSON =
+    Data.withObject
+      "BatchPutPropertyError"
+      ( \x ->
+          BatchPutPropertyError'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorMessage")
+            Prelude.<*> (x Data..: "entry")
+      )
+
+instance Prelude.Hashable BatchPutPropertyError where
+  hashWithSalt _salt BatchPutPropertyError' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` entry
+
+instance Prelude.NFData BatchPutPropertyError where
+  rnf BatchPutPropertyError' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf entry
diff --git a/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyErrorEntry.hs b/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/BatchPutPropertyErrorEntry.hs
@@ -0,0 +1,79 @@
+{-# 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.IotTwinMaker.Types.BatchPutPropertyErrorEntry
+-- 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.IotTwinMaker.Types.BatchPutPropertyErrorEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.BatchPutPropertyError
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains information about errors returned by the
+-- @BatchPutProperty@ action.
+--
+-- /See:/ 'newBatchPutPropertyErrorEntry' smart constructor.
+data BatchPutPropertyErrorEntry = BatchPutPropertyErrorEntry'
+  { -- | A list of objects that contain information about errors returned by the
+    -- @BatchPutProperty@ action.
+    errors :: Prelude.NonEmpty BatchPutPropertyError
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutPropertyErrorEntry' 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:
+--
+-- 'errors', 'batchPutPropertyErrorEntry_errors' - A list of objects that contain information about errors returned by the
+-- @BatchPutProperty@ action.
+newBatchPutPropertyErrorEntry ::
+  -- | 'errors'
+  Prelude.NonEmpty BatchPutPropertyError ->
+  BatchPutPropertyErrorEntry
+newBatchPutPropertyErrorEntry pErrors_ =
+  BatchPutPropertyErrorEntry'
+    { errors =
+        Lens.coerced Lens.# pErrors_
+    }
+
+-- | A list of objects that contain information about errors returned by the
+-- @BatchPutProperty@ action.
+batchPutPropertyErrorEntry_errors :: Lens.Lens' BatchPutPropertyErrorEntry (Prelude.NonEmpty BatchPutPropertyError)
+batchPutPropertyErrorEntry_errors = Lens.lens (\BatchPutPropertyErrorEntry' {errors} -> errors) (\s@BatchPutPropertyErrorEntry' {} a -> s {errors = a} :: BatchPutPropertyErrorEntry) Prelude.. Lens.coerced
+
+instance Data.FromJSON BatchPutPropertyErrorEntry where
+  parseJSON =
+    Data.withObject
+      "BatchPutPropertyErrorEntry"
+      ( \x ->
+          BatchPutPropertyErrorEntry'
+            Prelude.<$> (x Data..: "errors")
+      )
+
+instance Prelude.Hashable BatchPutPropertyErrorEntry where
+  hashWithSalt _salt BatchPutPropertyErrorEntry' {..} =
+    _salt `Prelude.hashWithSalt` errors
+
+instance Prelude.NFData BatchPutPropertyErrorEntry where
+  rnf BatchPutPropertyErrorEntry' {..} =
+    Prelude.rnf errors
diff --git a/gen/Amazonka/IotTwinMaker/Types/BundleInformation.hs b/gen/Amazonka/IotTwinMaker/Types/BundleInformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/BundleInformation.hs
@@ -0,0 +1,87 @@
+{-# 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.IotTwinMaker.Types.BundleInformation
+-- 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.IotTwinMaker.Types.BundleInformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.PricingTier
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about pricing bundle.
+--
+-- /See:/ 'newBundleInformation' smart constructor.
+data BundleInformation = BundleInformation'
+  { -- | The pricing tier.
+    pricingTier :: Prelude.Maybe PricingTier,
+    -- | The bundle names.
+    bundleNames :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BundleInformation' 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:
+--
+-- 'pricingTier', 'bundleInformation_pricingTier' - The pricing tier.
+--
+-- 'bundleNames', 'bundleInformation_bundleNames' - The bundle names.
+newBundleInformation ::
+  -- | 'bundleNames'
+  Prelude.NonEmpty Prelude.Text ->
+  BundleInformation
+newBundleInformation pBundleNames_ =
+  BundleInformation'
+    { pricingTier = Prelude.Nothing,
+      bundleNames = Lens.coerced Lens.# pBundleNames_
+    }
+
+-- | The pricing tier.
+bundleInformation_pricingTier :: Lens.Lens' BundleInformation (Prelude.Maybe PricingTier)
+bundleInformation_pricingTier = Lens.lens (\BundleInformation' {pricingTier} -> pricingTier) (\s@BundleInformation' {} a -> s {pricingTier = a} :: BundleInformation)
+
+-- | The bundle names.
+bundleInformation_bundleNames :: Lens.Lens' BundleInformation (Prelude.NonEmpty Prelude.Text)
+bundleInformation_bundleNames = Lens.lens (\BundleInformation' {bundleNames} -> bundleNames) (\s@BundleInformation' {} a -> s {bundleNames = a} :: BundleInformation) Prelude.. Lens.coerced
+
+instance Data.FromJSON BundleInformation where
+  parseJSON =
+    Data.withObject
+      "BundleInformation"
+      ( \x ->
+          BundleInformation'
+            Prelude.<$> (x Data..:? "pricingTier")
+            Prelude.<*> (x Data..: "bundleNames")
+      )
+
+instance Prelude.Hashable BundleInformation where
+  hashWithSalt _salt BundleInformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` pricingTier
+      `Prelude.hashWithSalt` bundleNames
+
+instance Prelude.NFData BundleInformation where
+  rnf BundleInformation' {..} =
+    Prelude.rnf pricingTier
+      `Prelude.seq` Prelude.rnf bundleNames
diff --git a/gen/Amazonka/IotTwinMaker/Types/ColumnDescription.hs b/gen/Amazonka/IotTwinMaker/Types/ColumnDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ColumnDescription.hs
@@ -0,0 +1,84 @@
+{-# 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.IotTwinMaker.Types.ColumnDescription
+-- 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.IotTwinMaker.Types.ColumnDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ColumnType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A description of the column in the query results.
+--
+-- /See:/ 'newColumnDescription' smart constructor.
+data ColumnDescription = ColumnDescription'
+  { -- | The name of the column description.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The type of the column description.
+    type' :: Prelude.Maybe ColumnType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ColumnDescription' 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:
+--
+-- 'name', 'columnDescription_name' - The name of the column description.
+--
+-- 'type'', 'columnDescription_type' - The type of the column description.
+newColumnDescription ::
+  ColumnDescription
+newColumnDescription =
+  ColumnDescription'
+    { name = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The name of the column description.
+columnDescription_name :: Lens.Lens' ColumnDescription (Prelude.Maybe Prelude.Text)
+columnDescription_name = Lens.lens (\ColumnDescription' {name} -> name) (\s@ColumnDescription' {} a -> s {name = a} :: ColumnDescription)
+
+-- | The type of the column description.
+columnDescription_type :: Lens.Lens' ColumnDescription (Prelude.Maybe ColumnType)
+columnDescription_type = Lens.lens (\ColumnDescription' {type'} -> type') (\s@ColumnDescription' {} a -> s {type' = a} :: ColumnDescription)
+
+instance Data.FromJSON ColumnDescription where
+  parseJSON =
+    Data.withObject
+      "ColumnDescription"
+      ( \x ->
+          ColumnDescription'
+            Prelude.<$> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable ColumnDescription where
+  hashWithSalt _salt ColumnDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ColumnDescription where
+  rnf ColumnDescription' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/IotTwinMaker/Types/ColumnType.hs b/gen/Amazonka/IotTwinMaker/Types/ColumnType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ColumnType.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.ColumnType
+-- 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.IotTwinMaker.Types.ColumnType
+  ( ColumnType
+      ( ..,
+        ColumnType_EDGE,
+        ColumnType_NODE,
+        ColumnType_VALUE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ColumnType = ColumnType'
+  { fromColumnType ::
+      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 ColumnType_EDGE :: ColumnType
+pattern ColumnType_EDGE = ColumnType' "EDGE"
+
+pattern ColumnType_NODE :: ColumnType
+pattern ColumnType_NODE = ColumnType' "NODE"
+
+pattern ColumnType_VALUE :: ColumnType
+pattern ColumnType_VALUE = ColumnType' "VALUE"
+
+{-# COMPLETE
+  ColumnType_EDGE,
+  ColumnType_NODE,
+  ColumnType_VALUE,
+  ColumnType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupRequest.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupRequest.hs
@@ -0,0 +1,101 @@
+{-# 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.IotTwinMaker.Types.ComponentPropertyGroupRequest
+-- 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.IotTwinMaker.Types.ComponentPropertyGroupRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.GroupType
+import Amazonka.IotTwinMaker.Types.PropertyGroupUpdateType
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newComponentPropertyGroupRequest' smart constructor.
+data ComponentPropertyGroupRequest = ComponentPropertyGroupRequest'
+  { -- | The group type.
+    groupType :: Prelude.Maybe GroupType,
+    -- | The property names.
+    propertyNames :: Prelude.Maybe [Prelude.Text],
+    -- | The update type.
+    updateType :: Prelude.Maybe PropertyGroupUpdateType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentPropertyGroupRequest' 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:
+--
+-- 'groupType', 'componentPropertyGroupRequest_groupType' - The group type.
+--
+-- 'propertyNames', 'componentPropertyGroupRequest_propertyNames' - The property names.
+--
+-- 'updateType', 'componentPropertyGroupRequest_updateType' - The update type.
+newComponentPropertyGroupRequest ::
+  ComponentPropertyGroupRequest
+newComponentPropertyGroupRequest =
+  ComponentPropertyGroupRequest'
+    { groupType =
+        Prelude.Nothing,
+      propertyNames = Prelude.Nothing,
+      updateType = Prelude.Nothing
+    }
+
+-- | The group type.
+componentPropertyGroupRequest_groupType :: Lens.Lens' ComponentPropertyGroupRequest (Prelude.Maybe GroupType)
+componentPropertyGroupRequest_groupType = Lens.lens (\ComponentPropertyGroupRequest' {groupType} -> groupType) (\s@ComponentPropertyGroupRequest' {} a -> s {groupType = a} :: ComponentPropertyGroupRequest)
+
+-- | The property names.
+componentPropertyGroupRequest_propertyNames :: Lens.Lens' ComponentPropertyGroupRequest (Prelude.Maybe [Prelude.Text])
+componentPropertyGroupRequest_propertyNames = Lens.lens (\ComponentPropertyGroupRequest' {propertyNames} -> propertyNames) (\s@ComponentPropertyGroupRequest' {} a -> s {propertyNames = a} :: ComponentPropertyGroupRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | The update type.
+componentPropertyGroupRequest_updateType :: Lens.Lens' ComponentPropertyGroupRequest (Prelude.Maybe PropertyGroupUpdateType)
+componentPropertyGroupRequest_updateType = Lens.lens (\ComponentPropertyGroupRequest' {updateType} -> updateType) (\s@ComponentPropertyGroupRequest' {} a -> s {updateType = a} :: ComponentPropertyGroupRequest)
+
+instance
+  Prelude.Hashable
+    ComponentPropertyGroupRequest
+  where
+  hashWithSalt _salt ComponentPropertyGroupRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` groupType
+      `Prelude.hashWithSalt` propertyNames
+      `Prelude.hashWithSalt` updateType
+
+instance Prelude.NFData ComponentPropertyGroupRequest where
+  rnf ComponentPropertyGroupRequest' {..} =
+    Prelude.rnf groupType
+      `Prelude.seq` Prelude.rnf propertyNames
+      `Prelude.seq` Prelude.rnf updateType
+
+instance Data.ToJSON ComponentPropertyGroupRequest where
+  toJSON ComponentPropertyGroupRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("groupType" Data..=) Prelude.<$> groupType,
+            ("propertyNames" Data..=) Prelude.<$> propertyNames,
+            ("updateType" Data..=) Prelude.<$> updateType
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupResponse.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentPropertyGroupResponse.hs
@@ -0,0 +1,115 @@
+{-# 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.IotTwinMaker.Types.ComponentPropertyGroupResponse
+-- 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.IotTwinMaker.Types.ComponentPropertyGroupResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.GroupType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The component property group response.
+--
+-- /See:/ 'newComponentPropertyGroupResponse' smart constructor.
+data ComponentPropertyGroupResponse = ComponentPropertyGroupResponse'
+  { -- | The group type.
+    groupType :: GroupType,
+    -- | The names of properties
+    propertyNames :: [Prelude.Text],
+    -- | A Boolean value that specifies whether the property group is inherited
+    -- from a parent entity
+    isInherited :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentPropertyGroupResponse' 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:
+--
+-- 'groupType', 'componentPropertyGroupResponse_groupType' - The group type.
+--
+-- 'propertyNames', 'componentPropertyGroupResponse_propertyNames' - The names of properties
+--
+-- 'isInherited', 'componentPropertyGroupResponse_isInherited' - A Boolean value that specifies whether the property group is inherited
+-- from a parent entity
+newComponentPropertyGroupResponse ::
+  -- | 'groupType'
+  GroupType ->
+  -- | 'isInherited'
+  Prelude.Bool ->
+  ComponentPropertyGroupResponse
+newComponentPropertyGroupResponse
+  pGroupType_
+  pIsInherited_ =
+    ComponentPropertyGroupResponse'
+      { groupType =
+          pGroupType_,
+        propertyNames = Prelude.mempty,
+        isInherited = pIsInherited_
+      }
+
+-- | The group type.
+componentPropertyGroupResponse_groupType :: Lens.Lens' ComponentPropertyGroupResponse GroupType
+componentPropertyGroupResponse_groupType = Lens.lens (\ComponentPropertyGroupResponse' {groupType} -> groupType) (\s@ComponentPropertyGroupResponse' {} a -> s {groupType = a} :: ComponentPropertyGroupResponse)
+
+-- | The names of properties
+componentPropertyGroupResponse_propertyNames :: Lens.Lens' ComponentPropertyGroupResponse [Prelude.Text]
+componentPropertyGroupResponse_propertyNames = Lens.lens (\ComponentPropertyGroupResponse' {propertyNames} -> propertyNames) (\s@ComponentPropertyGroupResponse' {} a -> s {propertyNames = a} :: ComponentPropertyGroupResponse) Prelude.. Lens.coerced
+
+-- | A Boolean value that specifies whether the property group is inherited
+-- from a parent entity
+componentPropertyGroupResponse_isInherited :: Lens.Lens' ComponentPropertyGroupResponse Prelude.Bool
+componentPropertyGroupResponse_isInherited = Lens.lens (\ComponentPropertyGroupResponse' {isInherited} -> isInherited) (\s@ComponentPropertyGroupResponse' {} a -> s {isInherited = a} :: ComponentPropertyGroupResponse)
+
+instance Data.FromJSON ComponentPropertyGroupResponse where
+  parseJSON =
+    Data.withObject
+      "ComponentPropertyGroupResponse"
+      ( \x ->
+          ComponentPropertyGroupResponse'
+            Prelude.<$> (x Data..: "groupType")
+            Prelude.<*> (x Data..:? "propertyNames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "isInherited")
+      )
+
+instance
+  Prelude.Hashable
+    ComponentPropertyGroupResponse
+  where
+  hashWithSalt
+    _salt
+    ComponentPropertyGroupResponse' {..} =
+      _salt
+        `Prelude.hashWithSalt` groupType
+        `Prelude.hashWithSalt` propertyNames
+        `Prelude.hashWithSalt` isInherited
+
+instance
+  Prelude.NFData
+    ComponentPropertyGroupResponse
+  where
+  rnf ComponentPropertyGroupResponse' {..} =
+    Prelude.rnf groupType
+      `Prelude.seq` Prelude.rnf propertyNames
+      `Prelude.seq` Prelude.rnf isInherited
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentRequest.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentRequest.hs
@@ -0,0 +1,116 @@
+{-# 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.IotTwinMaker.Types.ComponentRequest
+-- 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.IotTwinMaker.Types.ComponentRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.PropertyRequest
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that sets information about a component type create or update
+-- request.
+--
+-- /See:/ 'newComponentRequest' smart constructor.
+data ComponentRequest = ComponentRequest'
+  { -- | The ID of the component type.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component request.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | An object that maps strings to the properties to set in the component
+    -- type. Each string in the mapping must be unique to this object.
+    properties :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyRequest),
+    -- | The property groups.
+    propertyGroups :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupRequest)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentRequest' 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:
+--
+-- 'componentTypeId', 'componentRequest_componentTypeId' - The ID of the component type.
+--
+-- 'description', 'componentRequest_description' - The description of the component request.
+--
+-- 'properties', 'componentRequest_properties' - An object that maps strings to the properties to set in the component
+-- type. Each string in the mapping must be unique to this object.
+--
+-- 'propertyGroups', 'componentRequest_propertyGroups' - The property groups.
+newComponentRequest ::
+  ComponentRequest
+newComponentRequest =
+  ComponentRequest'
+    { componentTypeId =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      properties = Prelude.Nothing,
+      propertyGroups = Prelude.Nothing
+    }
+
+-- | The ID of the component type.
+componentRequest_componentTypeId :: Lens.Lens' ComponentRequest (Prelude.Maybe Prelude.Text)
+componentRequest_componentTypeId = Lens.lens (\ComponentRequest' {componentTypeId} -> componentTypeId) (\s@ComponentRequest' {} a -> s {componentTypeId = a} :: ComponentRequest)
+
+-- | The description of the component request.
+componentRequest_description :: Lens.Lens' ComponentRequest (Prelude.Maybe Prelude.Text)
+componentRequest_description = Lens.lens (\ComponentRequest' {description} -> description) (\s@ComponentRequest' {} a -> s {description = a} :: ComponentRequest)
+
+-- | An object that maps strings to the properties to set in the component
+-- type. Each string in the mapping must be unique to this object.
+componentRequest_properties :: Lens.Lens' ComponentRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyRequest))
+componentRequest_properties = Lens.lens (\ComponentRequest' {properties} -> properties) (\s@ComponentRequest' {} a -> s {properties = a} :: ComponentRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | The property groups.
+componentRequest_propertyGroups :: Lens.Lens' ComponentRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupRequest))
+componentRequest_propertyGroups = Lens.lens (\ComponentRequest' {propertyGroups} -> propertyGroups) (\s@ComponentRequest' {} a -> s {propertyGroups = a} :: ComponentRequest) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable ComponentRequest where
+  hashWithSalt _salt ComponentRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` properties
+      `Prelude.hashWithSalt` propertyGroups
+
+instance Prelude.NFData ComponentRequest where
+  rnf ComponentRequest' {..} =
+    Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf properties
+      `Prelude.seq` Prelude.rnf propertyGroups
+
+instance Data.ToJSON ComponentRequest where
+  toJSON ComponentRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentTypeId" Data..=)
+              Prelude.<$> componentTypeId,
+            ("description" Data..=) Prelude.<$> description,
+            ("properties" Data..=) Prelude.<$> properties,
+            ("propertyGroups" Data..=)
+              Prelude.<$> propertyGroups
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentResponse.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentResponse.hs
@@ -0,0 +1,166 @@
+{-# 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.IotTwinMaker.Types.ComponentResponse
+-- 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.IotTwinMaker.Types.ComponentResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupResponse
+import Amazonka.IotTwinMaker.Types.PropertyResponse
+import Amazonka.IotTwinMaker.Types.Status
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that returns information about a component type create or
+-- update request.
+--
+-- /See:/ 'newComponentResponse' smart constructor.
+data ComponentResponse = ComponentResponse'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the property definition set in the request.
+    definedIn :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | An object that maps strings to the properties to set in the component
+    -- type. Each string in the mapping must be unique to this object.
+    properties :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyResponse),
+    -- | The property groups.
+    propertyGroups :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupResponse),
+    -- | The status of the component type.
+    status :: Prelude.Maybe Status,
+    -- | The syncSource of the sync job, if this entity was created by a sync
+    -- job.
+    syncSource :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentResponse' 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:
+--
+-- 'componentName', 'componentResponse_componentName' - The name of the component.
+--
+-- 'componentTypeId', 'componentResponse_componentTypeId' - The ID of the component type.
+--
+-- 'definedIn', 'componentResponse_definedIn' - The name of the property definition set in the request.
+--
+-- 'description', 'componentResponse_description' - The description of the component type.
+--
+-- 'properties', 'componentResponse_properties' - An object that maps strings to the properties to set in the component
+-- type. Each string in the mapping must be unique to this object.
+--
+-- 'propertyGroups', 'componentResponse_propertyGroups' - The property groups.
+--
+-- 'status', 'componentResponse_status' - The status of the component type.
+--
+-- 'syncSource', 'componentResponse_syncSource' - The syncSource of the sync job, if this entity was created by a sync
+-- job.
+newComponentResponse ::
+  ComponentResponse
+newComponentResponse =
+  ComponentResponse'
+    { componentName = Prelude.Nothing,
+      componentTypeId = Prelude.Nothing,
+      definedIn = Prelude.Nothing,
+      description = Prelude.Nothing,
+      properties = Prelude.Nothing,
+      propertyGroups = Prelude.Nothing,
+      status = Prelude.Nothing,
+      syncSource = Prelude.Nothing
+    }
+
+-- | The name of the component.
+componentResponse_componentName :: Lens.Lens' ComponentResponse (Prelude.Maybe Prelude.Text)
+componentResponse_componentName = Lens.lens (\ComponentResponse' {componentName} -> componentName) (\s@ComponentResponse' {} a -> s {componentName = a} :: ComponentResponse)
+
+-- | The ID of the component type.
+componentResponse_componentTypeId :: Lens.Lens' ComponentResponse (Prelude.Maybe Prelude.Text)
+componentResponse_componentTypeId = Lens.lens (\ComponentResponse' {componentTypeId} -> componentTypeId) (\s@ComponentResponse' {} a -> s {componentTypeId = a} :: ComponentResponse)
+
+-- | The name of the property definition set in the request.
+componentResponse_definedIn :: Lens.Lens' ComponentResponse (Prelude.Maybe Prelude.Text)
+componentResponse_definedIn = Lens.lens (\ComponentResponse' {definedIn} -> definedIn) (\s@ComponentResponse' {} a -> s {definedIn = a} :: ComponentResponse)
+
+-- | The description of the component type.
+componentResponse_description :: Lens.Lens' ComponentResponse (Prelude.Maybe Prelude.Text)
+componentResponse_description = Lens.lens (\ComponentResponse' {description} -> description) (\s@ComponentResponse' {} a -> s {description = a} :: ComponentResponse)
+
+-- | An object that maps strings to the properties to set in the component
+-- type. Each string in the mapping must be unique to this object.
+componentResponse_properties :: Lens.Lens' ComponentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyResponse))
+componentResponse_properties = Lens.lens (\ComponentResponse' {properties} -> properties) (\s@ComponentResponse' {} a -> s {properties = a} :: ComponentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The property groups.
+componentResponse_propertyGroups :: Lens.Lens' ComponentResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupResponse))
+componentResponse_propertyGroups = Lens.lens (\ComponentResponse' {propertyGroups} -> propertyGroups) (\s@ComponentResponse' {} a -> s {propertyGroups = a} :: ComponentResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The status of the component type.
+componentResponse_status :: Lens.Lens' ComponentResponse (Prelude.Maybe Status)
+componentResponse_status = Lens.lens (\ComponentResponse' {status} -> status) (\s@ComponentResponse' {} a -> s {status = a} :: ComponentResponse)
+
+-- | The syncSource of the sync job, if this entity was created by a sync
+-- job.
+componentResponse_syncSource :: Lens.Lens' ComponentResponse (Prelude.Maybe Prelude.Text)
+componentResponse_syncSource = Lens.lens (\ComponentResponse' {syncSource} -> syncSource) (\s@ComponentResponse' {} a -> s {syncSource = a} :: ComponentResponse)
+
+instance Data.FromJSON ComponentResponse where
+  parseJSON =
+    Data.withObject
+      "ComponentResponse"
+      ( \x ->
+          ComponentResponse'
+            Prelude.<$> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "componentTypeId")
+            Prelude.<*> (x Data..:? "definedIn")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "properties" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "propertyGroups" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "syncSource")
+      )
+
+instance Prelude.Hashable ComponentResponse where
+  hashWithSalt _salt ComponentResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` definedIn
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` properties
+      `Prelude.hashWithSalt` propertyGroups
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` syncSource
+
+instance Prelude.NFData ComponentResponse where
+  rnf ComponentResponse' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf definedIn
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf properties
+      `Prelude.seq` Prelude.rnf propertyGroups
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf syncSource
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentTypeSummary.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentTypeSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentTypeSummary.hs
@@ -0,0 +1,159 @@
+{-# 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.IotTwinMaker.Types.ComponentTypeSummary
+-- 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.IotTwinMaker.Types.ComponentTypeSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.Status
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains information about a component type.
+--
+-- /See:/ 'newComponentTypeSummary' smart constructor.
+data ComponentTypeSummary = ComponentTypeSummary'
+  { -- | The component type name.
+    componentTypeName :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the component type.
+    status :: Prelude.Maybe Status,
+    -- | The ARN of the component type.
+    arn :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text,
+    -- | The date and time when the component type was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the component type was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentTypeSummary' 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:
+--
+-- 'componentTypeName', 'componentTypeSummary_componentTypeName' - The component type name.
+--
+-- 'description', 'componentTypeSummary_description' - The description of the component type.
+--
+-- 'status', 'componentTypeSummary_status' - The current status of the component type.
+--
+-- 'arn', 'componentTypeSummary_arn' - The ARN of the component type.
+--
+-- 'componentTypeId', 'componentTypeSummary_componentTypeId' - The ID of the component type.
+--
+-- 'creationDateTime', 'componentTypeSummary_creationDateTime' - The date and time when the component type was created.
+--
+-- 'updateDateTime', 'componentTypeSummary_updateDateTime' - The date and time when the component type was last updated.
+newComponentTypeSummary ::
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  ComponentTypeSummary
+newComponentTypeSummary
+  pArn_
+  pComponentTypeId_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    ComponentTypeSummary'
+      { componentTypeName =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        status = Prelude.Nothing,
+        arn = pArn_,
+        componentTypeId = pComponentTypeId_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The component type name.
+componentTypeSummary_componentTypeName :: Lens.Lens' ComponentTypeSummary (Prelude.Maybe Prelude.Text)
+componentTypeSummary_componentTypeName = Lens.lens (\ComponentTypeSummary' {componentTypeName} -> componentTypeName) (\s@ComponentTypeSummary' {} a -> s {componentTypeName = a} :: ComponentTypeSummary)
+
+-- | The description of the component type.
+componentTypeSummary_description :: Lens.Lens' ComponentTypeSummary (Prelude.Maybe Prelude.Text)
+componentTypeSummary_description = Lens.lens (\ComponentTypeSummary' {description} -> description) (\s@ComponentTypeSummary' {} a -> s {description = a} :: ComponentTypeSummary)
+
+-- | The current status of the component type.
+componentTypeSummary_status :: Lens.Lens' ComponentTypeSummary (Prelude.Maybe Status)
+componentTypeSummary_status = Lens.lens (\ComponentTypeSummary' {status} -> status) (\s@ComponentTypeSummary' {} a -> s {status = a} :: ComponentTypeSummary)
+
+-- | The ARN of the component type.
+componentTypeSummary_arn :: Lens.Lens' ComponentTypeSummary Prelude.Text
+componentTypeSummary_arn = Lens.lens (\ComponentTypeSummary' {arn} -> arn) (\s@ComponentTypeSummary' {} a -> s {arn = a} :: ComponentTypeSummary)
+
+-- | The ID of the component type.
+componentTypeSummary_componentTypeId :: Lens.Lens' ComponentTypeSummary Prelude.Text
+componentTypeSummary_componentTypeId = Lens.lens (\ComponentTypeSummary' {componentTypeId} -> componentTypeId) (\s@ComponentTypeSummary' {} a -> s {componentTypeId = a} :: ComponentTypeSummary)
+
+-- | The date and time when the component type was created.
+componentTypeSummary_creationDateTime :: Lens.Lens' ComponentTypeSummary Prelude.UTCTime
+componentTypeSummary_creationDateTime = Lens.lens (\ComponentTypeSummary' {creationDateTime} -> creationDateTime) (\s@ComponentTypeSummary' {} a -> s {creationDateTime = a} :: ComponentTypeSummary) Prelude.. Data._Time
+
+-- | The date and time when the component type was last updated.
+componentTypeSummary_updateDateTime :: Lens.Lens' ComponentTypeSummary Prelude.UTCTime
+componentTypeSummary_updateDateTime = Lens.lens (\ComponentTypeSummary' {updateDateTime} -> updateDateTime) (\s@ComponentTypeSummary' {} a -> s {updateDateTime = a} :: ComponentTypeSummary) Prelude.. Data._Time
+
+instance Data.FromJSON ComponentTypeSummary where
+  parseJSON =
+    Data.withObject
+      "ComponentTypeSummary"
+      ( \x ->
+          ComponentTypeSummary'
+            Prelude.<$> (x Data..:? "componentTypeName")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "componentTypeId")
+            Prelude.<*> (x Data..: "creationDateTime")
+            Prelude.<*> (x Data..: "updateDateTime")
+      )
+
+instance Prelude.Hashable ComponentTypeSummary where
+  hashWithSalt _salt ComponentTypeSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` updateDateTime
+
+instance Prelude.NFData ComponentTypeSummary where
+  rnf ComponentTypeSummary' {..} =
+    Prelude.rnf componentTypeName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateRequest.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateRequest.hs
@@ -0,0 +1,129 @@
+{-# 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.IotTwinMaker.Types.ComponentUpdateRequest
+-- 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.IotTwinMaker.Types.ComponentUpdateRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ComponentPropertyGroupRequest
+import Amazonka.IotTwinMaker.Types.ComponentUpdateType
+import Amazonka.IotTwinMaker.Types.PropertyRequest
+import qualified Amazonka.Prelude as Prelude
+
+-- | The component update request.
+--
+-- /See:/ 'newComponentUpdateRequest' smart constructor.
+data ComponentUpdateRequest = ComponentUpdateRequest'
+  { -- | The ID of the component type.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The property group updates.
+    propertyGroupUpdates :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupRequest),
+    -- | An object that maps strings to the properties to set in the component
+    -- type update. Each string in the mapping must be unique to this object.
+    propertyUpdates :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyRequest),
+    -- | The update type of the component update request.
+    updateType :: Prelude.Maybe ComponentUpdateType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ComponentUpdateRequest' 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:
+--
+-- 'componentTypeId', 'componentUpdateRequest_componentTypeId' - The ID of the component type.
+--
+-- 'description', 'componentUpdateRequest_description' - The description of the component type.
+--
+-- 'propertyGroupUpdates', 'componentUpdateRequest_propertyGroupUpdates' - The property group updates.
+--
+-- 'propertyUpdates', 'componentUpdateRequest_propertyUpdates' - An object that maps strings to the properties to set in the component
+-- type update. Each string in the mapping must be unique to this object.
+--
+-- 'updateType', 'componentUpdateRequest_updateType' - The update type of the component update request.
+newComponentUpdateRequest ::
+  ComponentUpdateRequest
+newComponentUpdateRequest =
+  ComponentUpdateRequest'
+    { componentTypeId =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      propertyGroupUpdates = Prelude.Nothing,
+      propertyUpdates = Prelude.Nothing,
+      updateType = Prelude.Nothing
+    }
+
+-- | The ID of the component type.
+componentUpdateRequest_componentTypeId :: Lens.Lens' ComponentUpdateRequest (Prelude.Maybe Prelude.Text)
+componentUpdateRequest_componentTypeId = Lens.lens (\ComponentUpdateRequest' {componentTypeId} -> componentTypeId) (\s@ComponentUpdateRequest' {} a -> s {componentTypeId = a} :: ComponentUpdateRequest)
+
+-- | The description of the component type.
+componentUpdateRequest_description :: Lens.Lens' ComponentUpdateRequest (Prelude.Maybe Prelude.Text)
+componentUpdateRequest_description = Lens.lens (\ComponentUpdateRequest' {description} -> description) (\s@ComponentUpdateRequest' {} a -> s {description = a} :: ComponentUpdateRequest)
+
+-- | The property group updates.
+componentUpdateRequest_propertyGroupUpdates :: Lens.Lens' ComponentUpdateRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentPropertyGroupRequest))
+componentUpdateRequest_propertyGroupUpdates = Lens.lens (\ComponentUpdateRequest' {propertyGroupUpdates} -> propertyGroupUpdates) (\s@ComponentUpdateRequest' {} a -> s {propertyGroupUpdates = a} :: ComponentUpdateRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that maps strings to the properties to set in the component
+-- type update. Each string in the mapping must be unique to this object.
+componentUpdateRequest_propertyUpdates :: Lens.Lens' ComponentUpdateRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyRequest))
+componentUpdateRequest_propertyUpdates = Lens.lens (\ComponentUpdateRequest' {propertyUpdates} -> propertyUpdates) (\s@ComponentUpdateRequest' {} a -> s {propertyUpdates = a} :: ComponentUpdateRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | The update type of the component update request.
+componentUpdateRequest_updateType :: Lens.Lens' ComponentUpdateRequest (Prelude.Maybe ComponentUpdateType)
+componentUpdateRequest_updateType = Lens.lens (\ComponentUpdateRequest' {updateType} -> updateType) (\s@ComponentUpdateRequest' {} a -> s {updateType = a} :: ComponentUpdateRequest)
+
+instance Prelude.Hashable ComponentUpdateRequest where
+  hashWithSalt _salt ComponentUpdateRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` propertyGroupUpdates
+      `Prelude.hashWithSalt` propertyUpdates
+      `Prelude.hashWithSalt` updateType
+
+instance Prelude.NFData ComponentUpdateRequest where
+  rnf ComponentUpdateRequest' {..} =
+    Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf propertyGroupUpdates
+      `Prelude.seq` Prelude.rnf propertyUpdates
+      `Prelude.seq` Prelude.rnf updateType
+
+instance Data.ToJSON ComponentUpdateRequest where
+  toJSON ComponentUpdateRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentTypeId" Data..=)
+              Prelude.<$> componentTypeId,
+            ("description" Data..=) Prelude.<$> description,
+            ("propertyGroupUpdates" Data..=)
+              Prelude.<$> propertyGroupUpdates,
+            ("propertyUpdates" Data..=)
+              Prelude.<$> propertyUpdates,
+            ("updateType" Data..=) Prelude.<$> updateType
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateType.hs b/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ComponentUpdateType.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.ComponentUpdateType
+-- 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.IotTwinMaker.Types.ComponentUpdateType
+  ( ComponentUpdateType
+      ( ..,
+        ComponentUpdateType_CREATE,
+        ComponentUpdateType_DELETE,
+        ComponentUpdateType_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComponentUpdateType = ComponentUpdateType'
+  { fromComponentUpdateType ::
+      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 ComponentUpdateType_CREATE :: ComponentUpdateType
+pattern ComponentUpdateType_CREATE = ComponentUpdateType' "CREATE"
+
+pattern ComponentUpdateType_DELETE :: ComponentUpdateType
+pattern ComponentUpdateType_DELETE = ComponentUpdateType' "DELETE"
+
+pattern ComponentUpdateType_UPDATE :: ComponentUpdateType
+pattern ComponentUpdateType_UPDATE = ComponentUpdateType' "UPDATE"
+
+{-# COMPLETE
+  ComponentUpdateType_CREATE,
+  ComponentUpdateType_DELETE,
+  ComponentUpdateType_UPDATE,
+  ComponentUpdateType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/DataConnector.hs b/gen/Amazonka/IotTwinMaker/Types/DataConnector.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/DataConnector.hs
@@ -0,0 +1,97 @@
+{-# 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.IotTwinMaker.Types.DataConnector
+-- 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.IotTwinMaker.Types.DataConnector where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.LambdaFunction
+import qualified Amazonka.Prelude as Prelude
+
+-- | The data connector.
+--
+-- /See:/ 'newDataConnector' smart constructor.
+data DataConnector = DataConnector'
+  { -- | A Boolean value that specifies whether the data connector is native to
+    -- IoT TwinMaker.
+    isNative :: Prelude.Maybe Prelude.Bool,
+    -- | The Lambda function associated with this data connector.
+    lambda :: Prelude.Maybe LambdaFunction
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataConnector' 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:
+--
+-- 'isNative', 'dataConnector_isNative' - A Boolean value that specifies whether the data connector is native to
+-- IoT TwinMaker.
+--
+-- 'lambda', 'dataConnector_lambda' - The Lambda function associated with this data connector.
+newDataConnector ::
+  DataConnector
+newDataConnector =
+  DataConnector'
+    { isNative = Prelude.Nothing,
+      lambda = Prelude.Nothing
+    }
+
+-- | A Boolean value that specifies whether the data connector is native to
+-- IoT TwinMaker.
+dataConnector_isNative :: Lens.Lens' DataConnector (Prelude.Maybe Prelude.Bool)
+dataConnector_isNative = Lens.lens (\DataConnector' {isNative} -> isNative) (\s@DataConnector' {} a -> s {isNative = a} :: DataConnector)
+
+-- | The Lambda function associated with this data connector.
+dataConnector_lambda :: Lens.Lens' DataConnector (Prelude.Maybe LambdaFunction)
+dataConnector_lambda = Lens.lens (\DataConnector' {lambda} -> lambda) (\s@DataConnector' {} a -> s {lambda = a} :: DataConnector)
+
+instance Data.FromJSON DataConnector where
+  parseJSON =
+    Data.withObject
+      "DataConnector"
+      ( \x ->
+          DataConnector'
+            Prelude.<$> (x Data..:? "isNative")
+            Prelude.<*> (x Data..:? "lambda")
+      )
+
+instance Prelude.Hashable DataConnector where
+  hashWithSalt _salt DataConnector' {..} =
+    _salt
+      `Prelude.hashWithSalt` isNative
+      `Prelude.hashWithSalt` lambda
+
+instance Prelude.NFData DataConnector where
+  rnf DataConnector' {..} =
+    Prelude.rnf isNative
+      `Prelude.seq` Prelude.rnf lambda
+
+instance Data.ToJSON DataConnector where
+  toJSON DataConnector' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("isNative" Data..=) Prelude.<$> isNative,
+            ("lambda" Data..=) Prelude.<$> lambda
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/DataType.hs b/gen/Amazonka/IotTwinMaker/Types/DataType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/DataType.hs
@@ -0,0 +1,137 @@
+{-# 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.IotTwinMaker.Types.DataType
+-- 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.IotTwinMaker.Types.DataType where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.Relationship
+import Amazonka.IotTwinMaker.Types.Type
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that specifies the data type of a property.
+--
+-- /See:/ 'newDataType' smart constructor.
+data DataType = DataType'
+  { -- | The allowed values for this data type.
+    allowedValues :: Prelude.Maybe [DataValue],
+    -- | The nested type in the data type.
+    nestedType :: Prelude.Maybe DataType,
+    -- | A relationship that associates a component with another component.
+    relationship :: Prelude.Maybe Relationship,
+    -- | The unit of measure used in this data type.
+    unitOfMeasure :: Prelude.Maybe Prelude.Text,
+    -- | The underlying type of the data type.
+    type' :: Type
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataType' 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:
+--
+-- 'allowedValues', 'dataType_allowedValues' - The allowed values for this data type.
+--
+-- 'nestedType', 'dataType_nestedType' - The nested type in the data type.
+--
+-- 'relationship', 'dataType_relationship' - A relationship that associates a component with another component.
+--
+-- 'unitOfMeasure', 'dataType_unitOfMeasure' - The unit of measure used in this data type.
+--
+-- 'type'', 'dataType_type' - The underlying type of the data type.
+newDataType ::
+  -- | 'type''
+  Type ->
+  DataType
+newDataType pType_ =
+  DataType'
+    { allowedValues = Prelude.Nothing,
+      nestedType = Prelude.Nothing,
+      relationship = Prelude.Nothing,
+      unitOfMeasure = Prelude.Nothing,
+      type' = pType_
+    }
+
+-- | The allowed values for this data type.
+dataType_allowedValues :: Lens.Lens' DataType (Prelude.Maybe [DataValue])
+dataType_allowedValues = Lens.lens (\DataType' {allowedValues} -> allowedValues) (\s@DataType' {} a -> s {allowedValues = a} :: DataType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The nested type in the data type.
+dataType_nestedType :: Lens.Lens' DataType (Prelude.Maybe DataType)
+dataType_nestedType = Lens.lens (\DataType' {nestedType} -> nestedType) (\s@DataType' {} a -> s {nestedType = a} :: DataType)
+
+-- | A relationship that associates a component with another component.
+dataType_relationship :: Lens.Lens' DataType (Prelude.Maybe Relationship)
+dataType_relationship = Lens.lens (\DataType' {relationship} -> relationship) (\s@DataType' {} a -> s {relationship = a} :: DataType)
+
+-- | The unit of measure used in this data type.
+dataType_unitOfMeasure :: Lens.Lens' DataType (Prelude.Maybe Prelude.Text)
+dataType_unitOfMeasure = Lens.lens (\DataType' {unitOfMeasure} -> unitOfMeasure) (\s@DataType' {} a -> s {unitOfMeasure = a} :: DataType)
+
+-- | The underlying type of the data type.
+dataType_type :: Lens.Lens' DataType Type
+dataType_type = Lens.lens (\DataType' {type'} -> type') (\s@DataType' {} a -> s {type' = a} :: DataType)
+
+instance Data.FromJSON DataType where
+  parseJSON =
+    Data.withObject
+      "DataType"
+      ( \x ->
+          DataType'
+            Prelude.<$> (x Data..:? "allowedValues" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "nestedType")
+            Prelude.<*> (x Data..:? "relationship")
+            Prelude.<*> (x Data..:? "unitOfMeasure")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable DataType where
+  hashWithSalt _salt DataType' {..} =
+    _salt
+      `Prelude.hashWithSalt` allowedValues
+      `Prelude.hashWithSalt` nestedType
+      `Prelude.hashWithSalt` relationship
+      `Prelude.hashWithSalt` unitOfMeasure
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData DataType where
+  rnf DataType' {..} =
+    Prelude.rnf allowedValues
+      `Prelude.seq` Prelude.rnf nestedType
+      `Prelude.seq` Prelude.rnf relationship
+      `Prelude.seq` Prelude.rnf unitOfMeasure
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON DataType where
+  toJSON DataType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("allowedValues" Data..=) Prelude.<$> allowedValues,
+            ("nestedType" Data..=) Prelude.<$> nestedType,
+            ("relationship" Data..=) Prelude.<$> relationship,
+            ("unitOfMeasure" Data..=) Prelude.<$> unitOfMeasure,
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/DataValue.hs b/gen/Amazonka/IotTwinMaker/Types/DataValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/DataValue.hs
@@ -0,0 +1,186 @@
+{-# 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.IotTwinMaker.Types.DataValue
+-- 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.IotTwinMaker.Types.DataValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.RelationshipValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that specifies a value for a property.
+--
+-- /See:/ 'newDataValue' smart constructor.
+data DataValue = DataValue'
+  { -- | A Boolean value.
+    booleanValue :: Prelude.Maybe Prelude.Bool,
+    -- | A double value.
+    doubleValue :: Prelude.Maybe Prelude.Double,
+    -- | An expression that produces the value.
+    expression :: Prelude.Maybe Prelude.Text,
+    -- | An integer value.
+    integerValue :: Prelude.Maybe Prelude.Int,
+    -- | A list of multiple values.
+    listValue :: Prelude.Maybe [DataValue],
+    -- | A long value.
+    longValue :: Prelude.Maybe Prelude.Integer,
+    -- | An object that maps strings to multiple @DataValue@ objects.
+    mapValue :: Prelude.Maybe (Prelude.HashMap Prelude.Text DataValue),
+    -- | A value that relates a component to another component.
+    relationshipValue :: Prelude.Maybe RelationshipValue,
+    -- | A string value.
+    stringValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataValue' 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:
+--
+-- 'booleanValue', 'dataValue_booleanValue' - A Boolean value.
+--
+-- 'doubleValue', 'dataValue_doubleValue' - A double value.
+--
+-- 'expression', 'dataValue_expression' - An expression that produces the value.
+--
+-- 'integerValue', 'dataValue_integerValue' - An integer value.
+--
+-- 'listValue', 'dataValue_listValue' - A list of multiple values.
+--
+-- 'longValue', 'dataValue_longValue' - A long value.
+--
+-- 'mapValue', 'dataValue_mapValue' - An object that maps strings to multiple @DataValue@ objects.
+--
+-- 'relationshipValue', 'dataValue_relationshipValue' - A value that relates a component to another component.
+--
+-- 'stringValue', 'dataValue_stringValue' - A string value.
+newDataValue ::
+  DataValue
+newDataValue =
+  DataValue'
+    { booleanValue = Prelude.Nothing,
+      doubleValue = Prelude.Nothing,
+      expression = Prelude.Nothing,
+      integerValue = Prelude.Nothing,
+      listValue = Prelude.Nothing,
+      longValue = Prelude.Nothing,
+      mapValue = Prelude.Nothing,
+      relationshipValue = Prelude.Nothing,
+      stringValue = Prelude.Nothing
+    }
+
+-- | A Boolean value.
+dataValue_booleanValue :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Bool)
+dataValue_booleanValue = Lens.lens (\DataValue' {booleanValue} -> booleanValue) (\s@DataValue' {} a -> s {booleanValue = a} :: DataValue)
+
+-- | A double value.
+dataValue_doubleValue :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Double)
+dataValue_doubleValue = Lens.lens (\DataValue' {doubleValue} -> doubleValue) (\s@DataValue' {} a -> s {doubleValue = a} :: DataValue)
+
+-- | An expression that produces the value.
+dataValue_expression :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Text)
+dataValue_expression = Lens.lens (\DataValue' {expression} -> expression) (\s@DataValue' {} a -> s {expression = a} :: DataValue)
+
+-- | An integer value.
+dataValue_integerValue :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Int)
+dataValue_integerValue = Lens.lens (\DataValue' {integerValue} -> integerValue) (\s@DataValue' {} a -> s {integerValue = a} :: DataValue)
+
+-- | A list of multiple values.
+dataValue_listValue :: Lens.Lens' DataValue (Prelude.Maybe [DataValue])
+dataValue_listValue = Lens.lens (\DataValue' {listValue} -> listValue) (\s@DataValue' {} a -> s {listValue = a} :: DataValue) Prelude.. Lens.mapping Lens.coerced
+
+-- | A long value.
+dataValue_longValue :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Integer)
+dataValue_longValue = Lens.lens (\DataValue' {longValue} -> longValue) (\s@DataValue' {} a -> s {longValue = a} :: DataValue)
+
+-- | An object that maps strings to multiple @DataValue@ objects.
+dataValue_mapValue :: Lens.Lens' DataValue (Prelude.Maybe (Prelude.HashMap Prelude.Text DataValue))
+dataValue_mapValue = Lens.lens (\DataValue' {mapValue} -> mapValue) (\s@DataValue' {} a -> s {mapValue = a} :: DataValue) Prelude.. Lens.mapping Lens.coerced
+
+-- | A value that relates a component to another component.
+dataValue_relationshipValue :: Lens.Lens' DataValue (Prelude.Maybe RelationshipValue)
+dataValue_relationshipValue = Lens.lens (\DataValue' {relationshipValue} -> relationshipValue) (\s@DataValue' {} a -> s {relationshipValue = a} :: DataValue)
+
+-- | A string value.
+dataValue_stringValue :: Lens.Lens' DataValue (Prelude.Maybe Prelude.Text)
+dataValue_stringValue = Lens.lens (\DataValue' {stringValue} -> stringValue) (\s@DataValue' {} a -> s {stringValue = a} :: DataValue)
+
+instance Data.FromJSON DataValue where
+  parseJSON =
+    Data.withObject
+      "DataValue"
+      ( \x ->
+          DataValue'
+            Prelude.<$> (x Data..:? "booleanValue")
+            Prelude.<*> (x Data..:? "doubleValue")
+            Prelude.<*> (x Data..:? "expression")
+            Prelude.<*> (x Data..:? "integerValue")
+            Prelude.<*> (x Data..:? "listValue" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "longValue")
+            Prelude.<*> (x Data..:? "mapValue" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "relationshipValue")
+            Prelude.<*> (x Data..:? "stringValue")
+      )
+
+instance Prelude.Hashable DataValue where
+  hashWithSalt _salt DataValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` booleanValue
+      `Prelude.hashWithSalt` doubleValue
+      `Prelude.hashWithSalt` expression
+      `Prelude.hashWithSalt` integerValue
+      `Prelude.hashWithSalt` listValue
+      `Prelude.hashWithSalt` longValue
+      `Prelude.hashWithSalt` mapValue
+      `Prelude.hashWithSalt` relationshipValue
+      `Prelude.hashWithSalt` stringValue
+
+instance Prelude.NFData DataValue where
+  rnf DataValue' {..} =
+    Prelude.rnf booleanValue
+      `Prelude.seq` Prelude.rnf doubleValue
+      `Prelude.seq` Prelude.rnf expression
+      `Prelude.seq` Prelude.rnf integerValue
+      `Prelude.seq` Prelude.rnf listValue
+      `Prelude.seq` Prelude.rnf longValue
+      `Prelude.seq` Prelude.rnf mapValue
+      `Prelude.seq` Prelude.rnf relationshipValue
+      `Prelude.seq` Prelude.rnf stringValue
+
+instance Data.ToJSON DataValue where
+  toJSON DataValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("booleanValue" Data..=) Prelude.<$> booleanValue,
+            ("doubleValue" Data..=) Prelude.<$> doubleValue,
+            ("expression" Data..=) Prelude.<$> expression,
+            ("integerValue" Data..=) Prelude.<$> integerValue,
+            ("listValue" Data..=) Prelude.<$> listValue,
+            ("longValue" Data..=) Prelude.<$> longValue,
+            ("mapValue" Data..=) Prelude.<$> mapValue,
+            ("relationshipValue" Data..=)
+              Prelude.<$> relationshipValue,
+            ("stringValue" Data..=) Prelude.<$> stringValue
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/EntityPropertyReference.hs b/gen/Amazonka/IotTwinMaker/Types/EntityPropertyReference.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/EntityPropertyReference.hs
@@ -0,0 +1,129 @@
+{-# 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.IotTwinMaker.Types.EntityPropertyReference
+-- 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.IotTwinMaker.Types.EntityPropertyReference 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
+
+-- | An object that uniquely identifies an entity property.
+--
+-- /See:/ 'newEntityPropertyReference' smart constructor.
+data EntityPropertyReference = EntityPropertyReference'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Maybe Prelude.Text,
+    -- | A mapping of external IDs to property names. External IDs uniquely
+    -- identify properties from external data stores.
+    externalIdProperty :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the property.
+    propertyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EntityPropertyReference' 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:
+--
+-- 'componentName', 'entityPropertyReference_componentName' - The name of the component.
+--
+-- 'entityId', 'entityPropertyReference_entityId' - The ID of the entity.
+--
+-- 'externalIdProperty', 'entityPropertyReference_externalIdProperty' - A mapping of external IDs to property names. External IDs uniquely
+-- identify properties from external data stores.
+--
+-- 'propertyName', 'entityPropertyReference_propertyName' - The name of the property.
+newEntityPropertyReference ::
+  -- | 'propertyName'
+  Prelude.Text ->
+  EntityPropertyReference
+newEntityPropertyReference pPropertyName_ =
+  EntityPropertyReference'
+    { componentName =
+        Prelude.Nothing,
+      entityId = Prelude.Nothing,
+      externalIdProperty = Prelude.Nothing,
+      propertyName = pPropertyName_
+    }
+
+-- | The name of the component.
+entityPropertyReference_componentName :: Lens.Lens' EntityPropertyReference (Prelude.Maybe Prelude.Text)
+entityPropertyReference_componentName = Lens.lens (\EntityPropertyReference' {componentName} -> componentName) (\s@EntityPropertyReference' {} a -> s {componentName = a} :: EntityPropertyReference)
+
+-- | The ID of the entity.
+entityPropertyReference_entityId :: Lens.Lens' EntityPropertyReference (Prelude.Maybe Prelude.Text)
+entityPropertyReference_entityId = Lens.lens (\EntityPropertyReference' {entityId} -> entityId) (\s@EntityPropertyReference' {} a -> s {entityId = a} :: EntityPropertyReference)
+
+-- | A mapping of external IDs to property names. External IDs uniquely
+-- identify properties from external data stores.
+entityPropertyReference_externalIdProperty :: Lens.Lens' EntityPropertyReference (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+entityPropertyReference_externalIdProperty = Lens.lens (\EntityPropertyReference' {externalIdProperty} -> externalIdProperty) (\s@EntityPropertyReference' {} a -> s {externalIdProperty = a} :: EntityPropertyReference) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the property.
+entityPropertyReference_propertyName :: Lens.Lens' EntityPropertyReference Prelude.Text
+entityPropertyReference_propertyName = Lens.lens (\EntityPropertyReference' {propertyName} -> propertyName) (\s@EntityPropertyReference' {} a -> s {propertyName = a} :: EntityPropertyReference)
+
+instance Data.FromJSON EntityPropertyReference where
+  parseJSON =
+    Data.withObject
+      "EntityPropertyReference"
+      ( \x ->
+          EntityPropertyReference'
+            Prelude.<$> (x Data..:? "componentName")
+            Prelude.<*> (x Data..:? "entityId")
+            Prelude.<*> ( x
+                            Data..:? "externalIdProperty"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "propertyName")
+      )
+
+instance Prelude.Hashable EntityPropertyReference where
+  hashWithSalt _salt EntityPropertyReference' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` entityId
+      `Prelude.hashWithSalt` externalIdProperty
+      `Prelude.hashWithSalt` propertyName
+
+instance Prelude.NFData EntityPropertyReference where
+  rnf EntityPropertyReference' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf externalIdProperty
+      `Prelude.seq` Prelude.rnf propertyName
+
+instance Data.ToJSON EntityPropertyReference where
+  toJSON EntityPropertyReference' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentName" Data..=) Prelude.<$> componentName,
+            ("entityId" Data..=) Prelude.<$> entityId,
+            ("externalIdProperty" Data..=)
+              Prelude.<$> externalIdProperty,
+            Prelude.Just ("propertyName" Data..= propertyName)
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/EntitySummary.hs b/gen/Amazonka/IotTwinMaker/Types/EntitySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/EntitySummary.hs
@@ -0,0 +1,191 @@
+{-# 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.IotTwinMaker.Types.EntitySummary
+-- 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.IotTwinMaker.Types.EntitySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.Status
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains information about an entity.
+--
+-- /See:/ 'newEntitySummary' smart constructor.
+data EntitySummary = EntitySummary'
+  { -- | The description of the entity.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value that specifies whether the entity has child entities or
+    -- not.
+    hasChildEntities :: Prelude.Maybe Prelude.Bool,
+    -- | The ID of the parent entity.
+    parentEntityId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Text,
+    -- | The name of the entity.
+    entityName :: Prelude.Text,
+    -- | The ARN of the entity.
+    arn :: Prelude.Text,
+    -- | The current status of the entity.
+    status :: Status,
+    -- | The date and time when the entity was created.
+    creationDateTime :: Data.POSIX,
+    -- | The last date and time when the entity was updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EntitySummary' 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:
+--
+-- 'description', 'entitySummary_description' - The description of the entity.
+--
+-- 'hasChildEntities', 'entitySummary_hasChildEntities' - A Boolean value that specifies whether the entity has child entities or
+-- not.
+--
+-- 'parentEntityId', 'entitySummary_parentEntityId' - The ID of the parent entity.
+--
+-- 'entityId', 'entitySummary_entityId' - The ID of the entity.
+--
+-- 'entityName', 'entitySummary_entityName' - The name of the entity.
+--
+-- 'arn', 'entitySummary_arn' - The ARN of the entity.
+--
+-- 'status', 'entitySummary_status' - The current status of the entity.
+--
+-- 'creationDateTime', 'entitySummary_creationDateTime' - The date and time when the entity was created.
+--
+-- 'updateDateTime', 'entitySummary_updateDateTime' - The last date and time when the entity was updated.
+newEntitySummary ::
+  -- | 'entityId'
+  Prelude.Text ->
+  -- | 'entityName'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'status'
+  Status ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  EntitySummary
+newEntitySummary
+  pEntityId_
+  pEntityName_
+  pArn_
+  pStatus_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    EntitySummary'
+      { description = Prelude.Nothing,
+        hasChildEntities = Prelude.Nothing,
+        parentEntityId = Prelude.Nothing,
+        entityId = pEntityId_,
+        entityName = pEntityName_,
+        arn = pArn_,
+        status = pStatus_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The description of the entity.
+entitySummary_description :: Lens.Lens' EntitySummary (Prelude.Maybe Prelude.Text)
+entitySummary_description = Lens.lens (\EntitySummary' {description} -> description) (\s@EntitySummary' {} a -> s {description = a} :: EntitySummary)
+
+-- | A Boolean value that specifies whether the entity has child entities or
+-- not.
+entitySummary_hasChildEntities :: Lens.Lens' EntitySummary (Prelude.Maybe Prelude.Bool)
+entitySummary_hasChildEntities = Lens.lens (\EntitySummary' {hasChildEntities} -> hasChildEntities) (\s@EntitySummary' {} a -> s {hasChildEntities = a} :: EntitySummary)
+
+-- | The ID of the parent entity.
+entitySummary_parentEntityId :: Lens.Lens' EntitySummary (Prelude.Maybe Prelude.Text)
+entitySummary_parentEntityId = Lens.lens (\EntitySummary' {parentEntityId} -> parentEntityId) (\s@EntitySummary' {} a -> s {parentEntityId = a} :: EntitySummary)
+
+-- | The ID of the entity.
+entitySummary_entityId :: Lens.Lens' EntitySummary Prelude.Text
+entitySummary_entityId = Lens.lens (\EntitySummary' {entityId} -> entityId) (\s@EntitySummary' {} a -> s {entityId = a} :: EntitySummary)
+
+-- | The name of the entity.
+entitySummary_entityName :: Lens.Lens' EntitySummary Prelude.Text
+entitySummary_entityName = Lens.lens (\EntitySummary' {entityName} -> entityName) (\s@EntitySummary' {} a -> s {entityName = a} :: EntitySummary)
+
+-- | The ARN of the entity.
+entitySummary_arn :: Lens.Lens' EntitySummary Prelude.Text
+entitySummary_arn = Lens.lens (\EntitySummary' {arn} -> arn) (\s@EntitySummary' {} a -> s {arn = a} :: EntitySummary)
+
+-- | The current status of the entity.
+entitySummary_status :: Lens.Lens' EntitySummary Status
+entitySummary_status = Lens.lens (\EntitySummary' {status} -> status) (\s@EntitySummary' {} a -> s {status = a} :: EntitySummary)
+
+-- | The date and time when the entity was created.
+entitySummary_creationDateTime :: Lens.Lens' EntitySummary Prelude.UTCTime
+entitySummary_creationDateTime = Lens.lens (\EntitySummary' {creationDateTime} -> creationDateTime) (\s@EntitySummary' {} a -> s {creationDateTime = a} :: EntitySummary) Prelude.. Data._Time
+
+-- | The last date and time when the entity was updated.
+entitySummary_updateDateTime :: Lens.Lens' EntitySummary Prelude.UTCTime
+entitySummary_updateDateTime = Lens.lens (\EntitySummary' {updateDateTime} -> updateDateTime) (\s@EntitySummary' {} a -> s {updateDateTime = a} :: EntitySummary) Prelude.. Data._Time
+
+instance Data.FromJSON EntitySummary where
+  parseJSON =
+    Data.withObject
+      "EntitySummary"
+      ( \x ->
+          EntitySummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "hasChildEntities")
+            Prelude.<*> (x Data..:? "parentEntityId")
+            Prelude.<*> (x Data..: "entityId")
+            Prelude.<*> (x Data..: "entityName")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..: "creationDateTime")
+            Prelude.<*> (x Data..: "updateDateTime")
+      )
+
+instance Prelude.Hashable EntitySummary where
+  hashWithSalt _salt EntitySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` hasChildEntities
+      `Prelude.hashWithSalt` parentEntityId
+      `Prelude.hashWithSalt` entityId
+      `Prelude.hashWithSalt` entityName
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` updateDateTime
+
+instance Prelude.NFData EntitySummary where
+  rnf EntitySummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf hasChildEntities
+      `Prelude.seq` Prelude.rnf parentEntityId
+      `Prelude.seq` Prelude.rnf entityId
+      `Prelude.seq` Prelude.rnf entityName
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Types/ErrorCode.hs b/gen/Amazonka/IotTwinMaker/Types/ErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ErrorCode.hs
@@ -0,0 +1,86 @@
+{-# 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.IotTwinMaker.Types.ErrorCode
+-- 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.IotTwinMaker.Types.ErrorCode
+  ( ErrorCode
+      ( ..,
+        ErrorCode_INTERNAL_FAILURE,
+        ErrorCode_SYNC_CREATING_ERROR,
+        ErrorCode_SYNC_INITIALIZING_ERROR,
+        ErrorCode_SYNC_PROCESSING_ERROR,
+        ErrorCode_VALIDATION_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ErrorCode = ErrorCode'
+  { fromErrorCode ::
+      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 ErrorCode_INTERNAL_FAILURE :: ErrorCode
+pattern ErrorCode_INTERNAL_FAILURE = ErrorCode' "INTERNAL_FAILURE"
+
+pattern ErrorCode_SYNC_CREATING_ERROR :: ErrorCode
+pattern ErrorCode_SYNC_CREATING_ERROR = ErrorCode' "SYNC_CREATING_ERROR"
+
+pattern ErrorCode_SYNC_INITIALIZING_ERROR :: ErrorCode
+pattern ErrorCode_SYNC_INITIALIZING_ERROR = ErrorCode' "SYNC_INITIALIZING_ERROR"
+
+pattern ErrorCode_SYNC_PROCESSING_ERROR :: ErrorCode
+pattern ErrorCode_SYNC_PROCESSING_ERROR = ErrorCode' "SYNC_PROCESSING_ERROR"
+
+pattern ErrorCode_VALIDATION_ERROR :: ErrorCode
+pattern ErrorCode_VALIDATION_ERROR = ErrorCode' "VALIDATION_ERROR"
+
+{-# COMPLETE
+  ErrorCode_INTERNAL_FAILURE,
+  ErrorCode_SYNC_CREATING_ERROR,
+  ErrorCode_SYNC_INITIALIZING_ERROR,
+  ErrorCode_SYNC_PROCESSING_ERROR,
+  ErrorCode_VALIDATION_ERROR,
+  ErrorCode'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/ErrorDetails.hs b/gen/Amazonka/IotTwinMaker/Types/ErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ErrorDetails.hs
@@ -0,0 +1,84 @@
+{-# 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.IotTwinMaker.Types.ErrorDetails
+-- 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.IotTwinMaker.Types.ErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The error details.
+--
+-- /See:/ 'newErrorDetails' smart constructor.
+data ErrorDetails = ErrorDetails'
+  { -- | The error code.
+    code :: Prelude.Maybe ErrorCode,
+    -- | The error message.
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorDetails' 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:
+--
+-- 'code', 'errorDetails_code' - The error code.
+--
+-- 'message', 'errorDetails_message' - The error message.
+newErrorDetails ::
+  ErrorDetails
+newErrorDetails =
+  ErrorDetails'
+    { code = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | The error code.
+errorDetails_code :: Lens.Lens' ErrorDetails (Prelude.Maybe ErrorCode)
+errorDetails_code = Lens.lens (\ErrorDetails' {code} -> code) (\s@ErrorDetails' {} a -> s {code = a} :: ErrorDetails)
+
+-- | The error message.
+errorDetails_message :: Lens.Lens' ErrorDetails (Prelude.Maybe Prelude.Text)
+errorDetails_message = Lens.lens (\ErrorDetails' {message} -> message) (\s@ErrorDetails' {} a -> s {message = a} :: ErrorDetails)
+
+instance Data.FromJSON ErrorDetails where
+  parseJSON =
+    Data.withObject
+      "ErrorDetails"
+      ( \x ->
+          ErrorDetails'
+            Prelude.<$> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+      )
+
+instance Prelude.Hashable ErrorDetails where
+  hashWithSalt _salt ErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData ErrorDetails where
+  rnf ErrorDetails' {..} =
+    Prelude.rnf code `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IotTwinMaker/Types/FunctionRequest.hs b/gen/Amazonka/IotTwinMaker/Types/FunctionRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/FunctionRequest.hs
@@ -0,0 +1,98 @@
+{-# 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.IotTwinMaker.Types.FunctionRequest
+-- 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.IotTwinMaker.Types.FunctionRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataConnector
+import Amazonka.IotTwinMaker.Types.Scope
+import qualified Amazonka.Prelude as Prelude
+
+-- | The function request body.
+--
+-- /See:/ 'newFunctionRequest' smart constructor.
+data FunctionRequest = FunctionRequest'
+  { -- | The data connector.
+    implementedBy :: Prelude.Maybe DataConnector,
+    -- | The required properties of the function.
+    requiredProperties :: Prelude.Maybe [Prelude.Text],
+    -- | The scope of the function.
+    scope :: Prelude.Maybe Scope
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FunctionRequest' 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:
+--
+-- 'implementedBy', 'functionRequest_implementedBy' - The data connector.
+--
+-- 'requiredProperties', 'functionRequest_requiredProperties' - The required properties of the function.
+--
+-- 'scope', 'functionRequest_scope' - The scope of the function.
+newFunctionRequest ::
+  FunctionRequest
+newFunctionRequest =
+  FunctionRequest'
+    { implementedBy = Prelude.Nothing,
+      requiredProperties = Prelude.Nothing,
+      scope = Prelude.Nothing
+    }
+
+-- | The data connector.
+functionRequest_implementedBy :: Lens.Lens' FunctionRequest (Prelude.Maybe DataConnector)
+functionRequest_implementedBy = Lens.lens (\FunctionRequest' {implementedBy} -> implementedBy) (\s@FunctionRequest' {} a -> s {implementedBy = a} :: FunctionRequest)
+
+-- | The required properties of the function.
+functionRequest_requiredProperties :: Lens.Lens' FunctionRequest (Prelude.Maybe [Prelude.Text])
+functionRequest_requiredProperties = Lens.lens (\FunctionRequest' {requiredProperties} -> requiredProperties) (\s@FunctionRequest' {} a -> s {requiredProperties = a} :: FunctionRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | The scope of the function.
+functionRequest_scope :: Lens.Lens' FunctionRequest (Prelude.Maybe Scope)
+functionRequest_scope = Lens.lens (\FunctionRequest' {scope} -> scope) (\s@FunctionRequest' {} a -> s {scope = a} :: FunctionRequest)
+
+instance Prelude.Hashable FunctionRequest where
+  hashWithSalt _salt FunctionRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` implementedBy
+      `Prelude.hashWithSalt` requiredProperties
+      `Prelude.hashWithSalt` scope
+
+instance Prelude.NFData FunctionRequest where
+  rnf FunctionRequest' {..} =
+    Prelude.rnf implementedBy
+      `Prelude.seq` Prelude.rnf requiredProperties
+      `Prelude.seq` Prelude.rnf scope
+
+instance Data.ToJSON FunctionRequest where
+  toJSON FunctionRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("implementedBy" Data..=) Prelude.<$> implementedBy,
+            ("requiredProperties" Data..=)
+              Prelude.<$> requiredProperties,
+            ("scope" Data..=) Prelude.<$> scope
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/FunctionResponse.hs b/gen/Amazonka/IotTwinMaker/Types/FunctionResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/FunctionResponse.hs
@@ -0,0 +1,113 @@
+{-# 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.IotTwinMaker.Types.FunctionResponse
+-- 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.IotTwinMaker.Types.FunctionResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataConnector
+import Amazonka.IotTwinMaker.Types.Scope
+import qualified Amazonka.Prelude as Prelude
+
+-- | The function response.
+--
+-- /See:/ 'newFunctionResponse' smart constructor.
+data FunctionResponse = FunctionResponse'
+  { -- | The data connector.
+    implementedBy :: Prelude.Maybe DataConnector,
+    -- | Indicates whether this function is inherited.
+    isInherited :: Prelude.Maybe Prelude.Bool,
+    -- | The required properties of the function.
+    requiredProperties :: Prelude.Maybe [Prelude.Text],
+    -- | The scope of the function.
+    scope :: Prelude.Maybe Scope
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FunctionResponse' 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:
+--
+-- 'implementedBy', 'functionResponse_implementedBy' - The data connector.
+--
+-- 'isInherited', 'functionResponse_isInherited' - Indicates whether this function is inherited.
+--
+-- 'requiredProperties', 'functionResponse_requiredProperties' - The required properties of the function.
+--
+-- 'scope', 'functionResponse_scope' - The scope of the function.
+newFunctionResponse ::
+  FunctionResponse
+newFunctionResponse =
+  FunctionResponse'
+    { implementedBy = Prelude.Nothing,
+      isInherited = Prelude.Nothing,
+      requiredProperties = Prelude.Nothing,
+      scope = Prelude.Nothing
+    }
+
+-- | The data connector.
+functionResponse_implementedBy :: Lens.Lens' FunctionResponse (Prelude.Maybe DataConnector)
+functionResponse_implementedBy = Lens.lens (\FunctionResponse' {implementedBy} -> implementedBy) (\s@FunctionResponse' {} a -> s {implementedBy = a} :: FunctionResponse)
+
+-- | Indicates whether this function is inherited.
+functionResponse_isInherited :: Lens.Lens' FunctionResponse (Prelude.Maybe Prelude.Bool)
+functionResponse_isInherited = Lens.lens (\FunctionResponse' {isInherited} -> isInherited) (\s@FunctionResponse' {} a -> s {isInherited = a} :: FunctionResponse)
+
+-- | The required properties of the function.
+functionResponse_requiredProperties :: Lens.Lens' FunctionResponse (Prelude.Maybe [Prelude.Text])
+functionResponse_requiredProperties = Lens.lens (\FunctionResponse' {requiredProperties} -> requiredProperties) (\s@FunctionResponse' {} a -> s {requiredProperties = a} :: FunctionResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The scope of the function.
+functionResponse_scope :: Lens.Lens' FunctionResponse (Prelude.Maybe Scope)
+functionResponse_scope = Lens.lens (\FunctionResponse' {scope} -> scope) (\s@FunctionResponse' {} a -> s {scope = a} :: FunctionResponse)
+
+instance Data.FromJSON FunctionResponse where
+  parseJSON =
+    Data.withObject
+      "FunctionResponse"
+      ( \x ->
+          FunctionResponse'
+            Prelude.<$> (x Data..:? "implementedBy")
+            Prelude.<*> (x Data..:? "isInherited")
+            Prelude.<*> ( x
+                            Data..:? "requiredProperties"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "scope")
+      )
+
+instance Prelude.Hashable FunctionResponse where
+  hashWithSalt _salt FunctionResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` implementedBy
+      `Prelude.hashWithSalt` isInherited
+      `Prelude.hashWithSalt` requiredProperties
+      `Prelude.hashWithSalt` scope
+
+instance Prelude.NFData FunctionResponse where
+  rnf FunctionResponse' {..} =
+    Prelude.rnf implementedBy
+      `Prelude.seq` Prelude.rnf isInherited
+      `Prelude.seq` Prelude.rnf requiredProperties
+      `Prelude.seq` Prelude.rnf scope
diff --git a/gen/Amazonka/IotTwinMaker/Types/GroupType.hs b/gen/Amazonka/IotTwinMaker/Types/GroupType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/GroupType.hs
@@ -0,0 +1,66 @@
+{-# 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.IotTwinMaker.Types.GroupType
+-- 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.IotTwinMaker.Types.GroupType
+  ( GroupType
+      ( ..,
+        GroupType_TABULAR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype GroupType = GroupType'
+  { fromGroupType ::
+      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 GroupType_TABULAR :: GroupType
+pattern GroupType_TABULAR = GroupType' "TABULAR"
+
+{-# COMPLETE
+  GroupType_TABULAR,
+  GroupType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/InterpolationParameters.hs b/gen/Amazonka/IotTwinMaker/Types/InterpolationParameters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/InterpolationParameters.hs
@@ -0,0 +1,87 @@
+{-# 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.IotTwinMaker.Types.InterpolationParameters
+-- 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.IotTwinMaker.Types.InterpolationParameters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.InterpolationType
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that specifies how to interpolate data in a list.
+--
+-- /See:/ 'newInterpolationParameters' smart constructor.
+data InterpolationParameters = InterpolationParameters'
+  { -- | The interpolation type.
+    interpolationType :: Prelude.Maybe InterpolationType,
+    -- | The interpolation time interval in seconds.
+    intervalInSeconds :: Prelude.Maybe Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InterpolationParameters' 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:
+--
+-- 'interpolationType', 'interpolationParameters_interpolationType' - The interpolation type.
+--
+-- 'intervalInSeconds', 'interpolationParameters_intervalInSeconds' - The interpolation time interval in seconds.
+newInterpolationParameters ::
+  InterpolationParameters
+newInterpolationParameters =
+  InterpolationParameters'
+    { interpolationType =
+        Prelude.Nothing,
+      intervalInSeconds = Prelude.Nothing
+    }
+
+-- | The interpolation type.
+interpolationParameters_interpolationType :: Lens.Lens' InterpolationParameters (Prelude.Maybe InterpolationType)
+interpolationParameters_interpolationType = Lens.lens (\InterpolationParameters' {interpolationType} -> interpolationType) (\s@InterpolationParameters' {} a -> s {interpolationType = a} :: InterpolationParameters)
+
+-- | The interpolation time interval in seconds.
+interpolationParameters_intervalInSeconds :: Lens.Lens' InterpolationParameters (Prelude.Maybe Prelude.Integer)
+interpolationParameters_intervalInSeconds = Lens.lens (\InterpolationParameters' {intervalInSeconds} -> intervalInSeconds) (\s@InterpolationParameters' {} a -> s {intervalInSeconds = a} :: InterpolationParameters)
+
+instance Prelude.Hashable InterpolationParameters where
+  hashWithSalt _salt InterpolationParameters' {..} =
+    _salt
+      `Prelude.hashWithSalt` interpolationType
+      `Prelude.hashWithSalt` intervalInSeconds
+
+instance Prelude.NFData InterpolationParameters where
+  rnf InterpolationParameters' {..} =
+    Prelude.rnf interpolationType
+      `Prelude.seq` Prelude.rnf intervalInSeconds
+
+instance Data.ToJSON InterpolationParameters where
+  toJSON InterpolationParameters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("interpolationType" Data..=)
+              Prelude.<$> interpolationType,
+            ("intervalInSeconds" Data..=)
+              Prelude.<$> intervalInSeconds
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/InterpolationType.hs b/gen/Amazonka/IotTwinMaker/Types/InterpolationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/InterpolationType.hs
@@ -0,0 +1,66 @@
+{-# 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.IotTwinMaker.Types.InterpolationType
+-- 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.IotTwinMaker.Types.InterpolationType
+  ( InterpolationType
+      ( ..,
+        InterpolationType_LINEAR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InterpolationType = InterpolationType'
+  { fromInterpolationType ::
+      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 InterpolationType_LINEAR :: InterpolationType
+pattern InterpolationType_LINEAR = InterpolationType' "LINEAR"
+
+{-# COMPLETE
+  InterpolationType_LINEAR,
+  InterpolationType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/LambdaFunction.hs b/gen/Amazonka/IotTwinMaker/Types/LambdaFunction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/LambdaFunction.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.LambdaFunction
+-- 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.IotTwinMaker.Types.LambdaFunction 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
+
+-- | The Lambda function.
+--
+-- /See:/ 'newLambdaFunction' smart constructor.
+data LambdaFunction = LambdaFunction'
+  { -- | The ARN of the Lambda function.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LambdaFunction' 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:
+--
+-- 'arn', 'lambdaFunction_arn' - The ARN of the Lambda function.
+newLambdaFunction ::
+  -- | 'arn'
+  Prelude.Text ->
+  LambdaFunction
+newLambdaFunction pArn_ =
+  LambdaFunction' {arn = pArn_}
+
+-- | The ARN of the Lambda function.
+lambdaFunction_arn :: Lens.Lens' LambdaFunction Prelude.Text
+lambdaFunction_arn = Lens.lens (\LambdaFunction' {arn} -> arn) (\s@LambdaFunction' {} a -> s {arn = a} :: LambdaFunction)
+
+instance Data.FromJSON LambdaFunction where
+  parseJSON =
+    Data.withObject
+      "LambdaFunction"
+      ( \x ->
+          LambdaFunction' Prelude.<$> (x Data..: "arn")
+      )
+
+instance Prelude.Hashable LambdaFunction where
+  hashWithSalt _salt LambdaFunction' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData LambdaFunction where
+  rnf LambdaFunction' {..} = Prelude.rnf arn
+
+instance Data.ToJSON LambdaFunction where
+  toJSON LambdaFunction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ListComponentTypesFilter.hs b/gen/Amazonka/IotTwinMaker/Types/ListComponentTypesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ListComponentTypesFilter.hs
@@ -0,0 +1,101 @@
+{-# 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.IotTwinMaker.Types.ListComponentTypesFilter
+-- 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.IotTwinMaker.Types.ListComponentTypesFilter 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
+
+-- | An object that filters items in a list of component types.
+--
+-- Only one object is accepted as a valid input.
+--
+-- /See:/ 'newListComponentTypesFilter' smart constructor.
+data ListComponentTypesFilter = ListComponentTypesFilter'
+  { -- | The component type that the component types in the list extend.
+    extendsFrom :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value that specifies whether the component types in the list
+    -- are abstract.
+    isAbstract :: Prelude.Maybe Prelude.Bool,
+    -- | The namespace to which the component types in the list belong.
+    namespace :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListComponentTypesFilter' 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:
+--
+-- 'extendsFrom', 'listComponentTypesFilter_extendsFrom' - The component type that the component types in the list extend.
+--
+-- 'isAbstract', 'listComponentTypesFilter_isAbstract' - A Boolean value that specifies whether the component types in the list
+-- are abstract.
+--
+-- 'namespace', 'listComponentTypesFilter_namespace' - The namespace to which the component types in the list belong.
+newListComponentTypesFilter ::
+  ListComponentTypesFilter
+newListComponentTypesFilter =
+  ListComponentTypesFilter'
+    { extendsFrom =
+        Prelude.Nothing,
+      isAbstract = Prelude.Nothing,
+      namespace = Prelude.Nothing
+    }
+
+-- | The component type that the component types in the list extend.
+listComponentTypesFilter_extendsFrom :: Lens.Lens' ListComponentTypesFilter (Prelude.Maybe Prelude.Text)
+listComponentTypesFilter_extendsFrom = Lens.lens (\ListComponentTypesFilter' {extendsFrom} -> extendsFrom) (\s@ListComponentTypesFilter' {} a -> s {extendsFrom = a} :: ListComponentTypesFilter)
+
+-- | A Boolean value that specifies whether the component types in the list
+-- are abstract.
+listComponentTypesFilter_isAbstract :: Lens.Lens' ListComponentTypesFilter (Prelude.Maybe Prelude.Bool)
+listComponentTypesFilter_isAbstract = Lens.lens (\ListComponentTypesFilter' {isAbstract} -> isAbstract) (\s@ListComponentTypesFilter' {} a -> s {isAbstract = a} :: ListComponentTypesFilter)
+
+-- | The namespace to which the component types in the list belong.
+listComponentTypesFilter_namespace :: Lens.Lens' ListComponentTypesFilter (Prelude.Maybe Prelude.Text)
+listComponentTypesFilter_namespace = Lens.lens (\ListComponentTypesFilter' {namespace} -> namespace) (\s@ListComponentTypesFilter' {} a -> s {namespace = a} :: ListComponentTypesFilter)
+
+instance Prelude.Hashable ListComponentTypesFilter where
+  hashWithSalt _salt ListComponentTypesFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` extendsFrom
+      `Prelude.hashWithSalt` isAbstract
+      `Prelude.hashWithSalt` namespace
+
+instance Prelude.NFData ListComponentTypesFilter where
+  rnf ListComponentTypesFilter' {..} =
+    Prelude.rnf extendsFrom
+      `Prelude.seq` Prelude.rnf isAbstract
+      `Prelude.seq` Prelude.rnf namespace
+
+instance Data.ToJSON ListComponentTypesFilter where
+  toJSON ListComponentTypesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("extendsFrom" Data..=) Prelude.<$> extendsFrom,
+            ("isAbstract" Data..=) Prelude.<$> isAbstract,
+            ("namespace" Data..=) Prelude.<$> namespace
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ListEntitiesFilter.hs b/gen/Amazonka/IotTwinMaker/Types/ListEntitiesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ListEntitiesFilter.hs
@@ -0,0 +1,101 @@
+{-# 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.IotTwinMaker.Types.ListEntitiesFilter
+-- 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.IotTwinMaker.Types.ListEntitiesFilter 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
+
+-- | An object that filters items in a list of entities.
+--
+-- /See:/ 'newListEntitiesFilter' smart constructor.
+data ListEntitiesFilter = ListEntitiesFilter'
+  { -- | The ID of the component type in the entities in the list.
+    componentTypeId :: Prelude.Maybe Prelude.Text,
+    -- | The external-Id property of a component. The external-Id property is the
+    -- primary key of an external storage system.
+    externalId :: Prelude.Maybe Prelude.Text,
+    -- | The parent of the entities in the list.
+    parentEntityId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEntitiesFilter' 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:
+--
+-- 'componentTypeId', 'listEntitiesFilter_componentTypeId' - The ID of the component type in the entities in the list.
+--
+-- 'externalId', 'listEntitiesFilter_externalId' - The external-Id property of a component. The external-Id property is the
+-- primary key of an external storage system.
+--
+-- 'parentEntityId', 'listEntitiesFilter_parentEntityId' - The parent of the entities in the list.
+newListEntitiesFilter ::
+  ListEntitiesFilter
+newListEntitiesFilter =
+  ListEntitiesFilter'
+    { componentTypeId =
+        Prelude.Nothing,
+      externalId = Prelude.Nothing,
+      parentEntityId = Prelude.Nothing
+    }
+
+-- | The ID of the component type in the entities in the list.
+listEntitiesFilter_componentTypeId :: Lens.Lens' ListEntitiesFilter (Prelude.Maybe Prelude.Text)
+listEntitiesFilter_componentTypeId = Lens.lens (\ListEntitiesFilter' {componentTypeId} -> componentTypeId) (\s@ListEntitiesFilter' {} a -> s {componentTypeId = a} :: ListEntitiesFilter)
+
+-- | The external-Id property of a component. The external-Id property is the
+-- primary key of an external storage system.
+listEntitiesFilter_externalId :: Lens.Lens' ListEntitiesFilter (Prelude.Maybe Prelude.Text)
+listEntitiesFilter_externalId = Lens.lens (\ListEntitiesFilter' {externalId} -> externalId) (\s@ListEntitiesFilter' {} a -> s {externalId = a} :: ListEntitiesFilter)
+
+-- | The parent of the entities in the list.
+listEntitiesFilter_parentEntityId :: Lens.Lens' ListEntitiesFilter (Prelude.Maybe Prelude.Text)
+listEntitiesFilter_parentEntityId = Lens.lens (\ListEntitiesFilter' {parentEntityId} -> parentEntityId) (\s@ListEntitiesFilter' {} a -> s {parentEntityId = a} :: ListEntitiesFilter)
+
+instance Prelude.Hashable ListEntitiesFilter where
+  hashWithSalt _salt ListEntitiesFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeId
+      `Prelude.hashWithSalt` externalId
+      `Prelude.hashWithSalt` parentEntityId
+
+instance Prelude.NFData ListEntitiesFilter where
+  rnf ListEntitiesFilter' {..} =
+    Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf externalId
+      `Prelude.seq` Prelude.rnf parentEntityId
+
+instance Data.ToJSON ListEntitiesFilter where
+  toJSON ListEntitiesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentTypeId" Data..=)
+              Prelude.<$> componentTypeId,
+            ("externalId" Data..=) Prelude.<$> externalId,
+            ("parentEntityId" Data..=)
+              Prelude.<$> parentEntityId
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/Order.hs b/gen/Amazonka/IotTwinMaker/Types/Order.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Order.hs
@@ -0,0 +1,68 @@
+{-# 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.IotTwinMaker.Types.Order
+-- 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.IotTwinMaker.Types.Order
+  ( Order
+      ( ..,
+        Order_ASCENDING,
+        Order_DESCENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Order = Order' {fromOrder :: 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 Order_ASCENDING :: Order
+pattern Order_ASCENDING = Order' "ASCENDING"
+
+pattern Order_DESCENDING :: Order
+pattern Order_DESCENDING = Order' "DESCENDING"
+
+{-# COMPLETE
+  Order_ASCENDING,
+  Order_DESCENDING,
+  Order'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/OrderBy.hs b/gen/Amazonka/IotTwinMaker/Types/OrderBy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/OrderBy.hs
@@ -0,0 +1,87 @@
+{-# 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.IotTwinMaker.Types.OrderBy
+-- 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.IotTwinMaker.Types.OrderBy where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.Order
+import qualified Amazonka.Prelude as Prelude
+
+-- | Filter criteria that orders the return output. It can be sorted in
+-- ascending or descending order.
+--
+-- /See:/ 'newOrderBy' smart constructor.
+data OrderBy = OrderBy'
+  { -- | The set order that filters results.
+    order :: Prelude.Maybe Order,
+    -- | The property name.
+    propertyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OrderBy' 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:
+--
+-- 'order', 'orderBy_order' - The set order that filters results.
+--
+-- 'propertyName', 'orderBy_propertyName' - The property name.
+newOrderBy ::
+  -- | 'propertyName'
+  Prelude.Text ->
+  OrderBy
+newOrderBy pPropertyName_ =
+  OrderBy'
+    { order = Prelude.Nothing,
+      propertyName = pPropertyName_
+    }
+
+-- | The set order that filters results.
+orderBy_order :: Lens.Lens' OrderBy (Prelude.Maybe Order)
+orderBy_order = Lens.lens (\OrderBy' {order} -> order) (\s@OrderBy' {} a -> s {order = a} :: OrderBy)
+
+-- | The property name.
+orderBy_propertyName :: Lens.Lens' OrderBy Prelude.Text
+orderBy_propertyName = Lens.lens (\OrderBy' {propertyName} -> propertyName) (\s@OrderBy' {} a -> s {propertyName = a} :: OrderBy)
+
+instance Prelude.Hashable OrderBy where
+  hashWithSalt _salt OrderBy' {..} =
+    _salt
+      `Prelude.hashWithSalt` order
+      `Prelude.hashWithSalt` propertyName
+
+instance Prelude.NFData OrderBy where
+  rnf OrderBy' {..} =
+    Prelude.rnf order
+      `Prelude.seq` Prelude.rnf propertyName
+
+instance Data.ToJSON OrderBy where
+  toJSON OrderBy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("order" Data..=) Prelude.<$> order,
+            Prelude.Just ("propertyName" Data..= propertyName)
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/OrderByTime.hs b/gen/Amazonka/IotTwinMaker/Types/OrderByTime.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/OrderByTime.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.IotTwinMaker.Types.OrderByTime
+-- 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.IotTwinMaker.Types.OrderByTime
+  ( OrderByTime
+      ( ..,
+        OrderByTime_ASCENDING,
+        OrderByTime_DESCENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OrderByTime = OrderByTime'
+  { fromOrderByTime ::
+      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 OrderByTime_ASCENDING :: OrderByTime
+pattern OrderByTime_ASCENDING = OrderByTime' "ASCENDING"
+
+pattern OrderByTime_DESCENDING :: OrderByTime
+pattern OrderByTime_DESCENDING = OrderByTime' "DESCENDING"
+
+{-# COMPLETE
+  OrderByTime_ASCENDING,
+  OrderByTime_DESCENDING,
+  OrderByTime'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateRequest.hs b/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateRequest.hs
@@ -0,0 +1,88 @@
+{-# 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.IotTwinMaker.Types.ParentEntityUpdateRequest
+-- 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.IotTwinMaker.Types.ParentEntityUpdateRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ParentEntityUpdateType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The parent entity update request.
+--
+-- /See:/ 'newParentEntityUpdateRequest' smart constructor.
+data ParentEntityUpdateRequest = ParentEntityUpdateRequest'
+  { -- | The ID of the parent entity.
+    parentEntityId :: Prelude.Maybe Prelude.Text,
+    -- | The type of the update.
+    updateType :: ParentEntityUpdateType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ParentEntityUpdateRequest' 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:
+--
+-- 'parentEntityId', 'parentEntityUpdateRequest_parentEntityId' - The ID of the parent entity.
+--
+-- 'updateType', 'parentEntityUpdateRequest_updateType' - The type of the update.
+newParentEntityUpdateRequest ::
+  -- | 'updateType'
+  ParentEntityUpdateType ->
+  ParentEntityUpdateRequest
+newParentEntityUpdateRequest pUpdateType_ =
+  ParentEntityUpdateRequest'
+    { parentEntityId =
+        Prelude.Nothing,
+      updateType = pUpdateType_
+    }
+
+-- | The ID of the parent entity.
+parentEntityUpdateRequest_parentEntityId :: Lens.Lens' ParentEntityUpdateRequest (Prelude.Maybe Prelude.Text)
+parentEntityUpdateRequest_parentEntityId = Lens.lens (\ParentEntityUpdateRequest' {parentEntityId} -> parentEntityId) (\s@ParentEntityUpdateRequest' {} a -> s {parentEntityId = a} :: ParentEntityUpdateRequest)
+
+-- | The type of the update.
+parentEntityUpdateRequest_updateType :: Lens.Lens' ParentEntityUpdateRequest ParentEntityUpdateType
+parentEntityUpdateRequest_updateType = Lens.lens (\ParentEntityUpdateRequest' {updateType} -> updateType) (\s@ParentEntityUpdateRequest' {} a -> s {updateType = a} :: ParentEntityUpdateRequest)
+
+instance Prelude.Hashable ParentEntityUpdateRequest where
+  hashWithSalt _salt ParentEntityUpdateRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` parentEntityId
+      `Prelude.hashWithSalt` updateType
+
+instance Prelude.NFData ParentEntityUpdateRequest where
+  rnf ParentEntityUpdateRequest' {..} =
+    Prelude.rnf parentEntityId
+      `Prelude.seq` Prelude.rnf updateType
+
+instance Data.ToJSON ParentEntityUpdateRequest where
+  toJSON ParentEntityUpdateRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("parentEntityId" Data..=)
+              Prelude.<$> parentEntityId,
+            Prelude.Just ("updateType" Data..= updateType)
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateType.hs b/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/ParentEntityUpdateType.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.IotTwinMaker.Types.ParentEntityUpdateType
+-- 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.IotTwinMaker.Types.ParentEntityUpdateType
+  ( ParentEntityUpdateType
+      ( ..,
+        ParentEntityUpdateType_DELETE,
+        ParentEntityUpdateType_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ParentEntityUpdateType = ParentEntityUpdateType'
+  { fromParentEntityUpdateType ::
+      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 ParentEntityUpdateType_DELETE :: ParentEntityUpdateType
+pattern ParentEntityUpdateType_DELETE = ParentEntityUpdateType' "DELETE"
+
+pattern ParentEntityUpdateType_UPDATE :: ParentEntityUpdateType
+pattern ParentEntityUpdateType_UPDATE = ParentEntityUpdateType' "UPDATE"
+
+{-# COMPLETE
+  ParentEntityUpdateType_DELETE,
+  ParentEntityUpdateType_UPDATE,
+  ParentEntityUpdateType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/PricingMode.hs b/gen/Amazonka/IotTwinMaker/Types/PricingMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PricingMode.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.PricingMode
+-- 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.IotTwinMaker.Types.PricingMode
+  ( PricingMode
+      ( ..,
+        PricingMode_BASIC,
+        PricingMode_STANDARD,
+        PricingMode_TIERED_BUNDLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PricingMode = PricingMode'
+  { fromPricingMode ::
+      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 PricingMode_BASIC :: PricingMode
+pattern PricingMode_BASIC = PricingMode' "BASIC"
+
+pattern PricingMode_STANDARD :: PricingMode
+pattern PricingMode_STANDARD = PricingMode' "STANDARD"
+
+pattern PricingMode_TIERED_BUNDLE :: PricingMode
+pattern PricingMode_TIERED_BUNDLE = PricingMode' "TIERED_BUNDLE"
+
+{-# COMPLETE
+  PricingMode_BASIC,
+  PricingMode_STANDARD,
+  PricingMode_TIERED_BUNDLE,
+  PricingMode'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/PricingPlan.hs b/gen/Amazonka/IotTwinMaker/Types/PricingPlan.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PricingPlan.hs
@@ -0,0 +1,148 @@
+{-# 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.IotTwinMaker.Types.PricingPlan
+-- 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.IotTwinMaker.Types.PricingPlan where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.BundleInformation
+import Amazonka.IotTwinMaker.Types.PricingMode
+import Amazonka.IotTwinMaker.Types.UpdateReason
+import qualified Amazonka.Prelude as Prelude
+
+-- | The pricing plan.
+--
+-- /See:/ 'newPricingPlan' smart constructor.
+data PricingPlan = PricingPlan'
+  { -- | The billable entity count.
+    billableEntityCount :: Prelude.Maybe Prelude.Integer,
+    -- | The pricing plan\'s bundle information.
+    bundleInformation :: Prelude.Maybe BundleInformation,
+    -- | The effective date and time of the pricing plan.
+    effectiveDateTime :: Data.POSIX,
+    -- | The pricing mode.
+    pricingMode :: PricingMode,
+    -- | The set date and time for updating a pricing plan.
+    updateDateTime :: Data.POSIX,
+    -- | The update reason, for changing a pricing plan.
+    updateReason :: UpdateReason
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PricingPlan' 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:
+--
+-- 'billableEntityCount', 'pricingPlan_billableEntityCount' - The billable entity count.
+--
+-- 'bundleInformation', 'pricingPlan_bundleInformation' - The pricing plan\'s bundle information.
+--
+-- 'effectiveDateTime', 'pricingPlan_effectiveDateTime' - The effective date and time of the pricing plan.
+--
+-- 'pricingMode', 'pricingPlan_pricingMode' - The pricing mode.
+--
+-- 'updateDateTime', 'pricingPlan_updateDateTime' - The set date and time for updating a pricing plan.
+--
+-- 'updateReason', 'pricingPlan_updateReason' - The update reason, for changing a pricing plan.
+newPricingPlan ::
+  -- | 'effectiveDateTime'
+  Prelude.UTCTime ->
+  -- | 'pricingMode'
+  PricingMode ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateReason'
+  UpdateReason ->
+  PricingPlan
+newPricingPlan
+  pEffectiveDateTime_
+  pPricingMode_
+  pUpdateDateTime_
+  pUpdateReason_ =
+    PricingPlan'
+      { billableEntityCount = Prelude.Nothing,
+        bundleInformation = Prelude.Nothing,
+        effectiveDateTime =
+          Data._Time Lens.# pEffectiveDateTime_,
+        pricingMode = pPricingMode_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_,
+        updateReason = pUpdateReason_
+      }
+
+-- | The billable entity count.
+pricingPlan_billableEntityCount :: Lens.Lens' PricingPlan (Prelude.Maybe Prelude.Integer)
+pricingPlan_billableEntityCount = Lens.lens (\PricingPlan' {billableEntityCount} -> billableEntityCount) (\s@PricingPlan' {} a -> s {billableEntityCount = a} :: PricingPlan)
+
+-- | The pricing plan\'s bundle information.
+pricingPlan_bundleInformation :: Lens.Lens' PricingPlan (Prelude.Maybe BundleInformation)
+pricingPlan_bundleInformation = Lens.lens (\PricingPlan' {bundleInformation} -> bundleInformation) (\s@PricingPlan' {} a -> s {bundleInformation = a} :: PricingPlan)
+
+-- | The effective date and time of the pricing plan.
+pricingPlan_effectiveDateTime :: Lens.Lens' PricingPlan Prelude.UTCTime
+pricingPlan_effectiveDateTime = Lens.lens (\PricingPlan' {effectiveDateTime} -> effectiveDateTime) (\s@PricingPlan' {} a -> s {effectiveDateTime = a} :: PricingPlan) Prelude.. Data._Time
+
+-- | The pricing mode.
+pricingPlan_pricingMode :: Lens.Lens' PricingPlan PricingMode
+pricingPlan_pricingMode = Lens.lens (\PricingPlan' {pricingMode} -> pricingMode) (\s@PricingPlan' {} a -> s {pricingMode = a} :: PricingPlan)
+
+-- | The set date and time for updating a pricing plan.
+pricingPlan_updateDateTime :: Lens.Lens' PricingPlan Prelude.UTCTime
+pricingPlan_updateDateTime = Lens.lens (\PricingPlan' {updateDateTime} -> updateDateTime) (\s@PricingPlan' {} a -> s {updateDateTime = a} :: PricingPlan) Prelude.. Data._Time
+
+-- | The update reason, for changing a pricing plan.
+pricingPlan_updateReason :: Lens.Lens' PricingPlan UpdateReason
+pricingPlan_updateReason = Lens.lens (\PricingPlan' {updateReason} -> updateReason) (\s@PricingPlan' {} a -> s {updateReason = a} :: PricingPlan)
+
+instance Data.FromJSON PricingPlan where
+  parseJSON =
+    Data.withObject
+      "PricingPlan"
+      ( \x ->
+          PricingPlan'
+            Prelude.<$> (x Data..:? "billableEntityCount")
+            Prelude.<*> (x Data..:? "bundleInformation")
+            Prelude.<*> (x Data..: "effectiveDateTime")
+            Prelude.<*> (x Data..: "pricingMode")
+            Prelude.<*> (x Data..: "updateDateTime")
+            Prelude.<*> (x Data..: "updateReason")
+      )
+
+instance Prelude.Hashable PricingPlan where
+  hashWithSalt _salt PricingPlan' {..} =
+    _salt
+      `Prelude.hashWithSalt` billableEntityCount
+      `Prelude.hashWithSalt` bundleInformation
+      `Prelude.hashWithSalt` effectiveDateTime
+      `Prelude.hashWithSalt` pricingMode
+      `Prelude.hashWithSalt` updateDateTime
+      `Prelude.hashWithSalt` updateReason
+
+instance Prelude.NFData PricingPlan where
+  rnf PricingPlan' {..} =
+    Prelude.rnf billableEntityCount
+      `Prelude.seq` Prelude.rnf bundleInformation
+      `Prelude.seq` Prelude.rnf effectiveDateTime
+      `Prelude.seq` Prelude.rnf pricingMode
+      `Prelude.seq` Prelude.rnf updateDateTime
+      `Prelude.seq` Prelude.rnf updateReason
diff --git a/gen/Amazonka/IotTwinMaker/Types/PricingTier.hs b/gen/Amazonka/IotTwinMaker/Types/PricingTier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PricingTier.hs
@@ -0,0 +1,81 @@
+{-# 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.IotTwinMaker.Types.PricingTier
+-- 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.IotTwinMaker.Types.PricingTier
+  ( PricingTier
+      ( ..,
+        PricingTier_TIER_1,
+        PricingTier_TIER_2,
+        PricingTier_TIER_3,
+        PricingTier_TIER_4
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PricingTier = PricingTier'
+  { fromPricingTier ::
+      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 PricingTier_TIER_1 :: PricingTier
+pattern PricingTier_TIER_1 = PricingTier' "TIER_1"
+
+pattern PricingTier_TIER_2 :: PricingTier
+pattern PricingTier_TIER_2 = PricingTier' "TIER_2"
+
+pattern PricingTier_TIER_3 :: PricingTier
+pattern PricingTier_TIER_3 = PricingTier' "TIER_3"
+
+pattern PricingTier_TIER_4 :: PricingTier
+pattern PricingTier_TIER_4 = PricingTier' "TIER_4"
+
+{-# COMPLETE
+  PricingTier_TIER_1,
+  PricingTier_TIER_2,
+  PricingTier_TIER_3,
+  PricingTier_TIER_4,
+  PricingTier'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionRequest.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionRequest.hs
@@ -0,0 +1,175 @@
+{-# 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.IotTwinMaker.Types.PropertyDefinitionRequest
+-- 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.IotTwinMaker.Types.PropertyDefinitionRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataType
+import Amazonka.IotTwinMaker.Types.DataValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that sets information about a property.
+--
+-- /See:/ 'newPropertyDefinitionRequest' smart constructor.
+data PropertyDefinitionRequest = PropertyDefinitionRequest'
+  { -- | A mapping that specifies configuration information about the property.
+    -- Use this field to specify information that you read from and write to an
+    -- external source.
+    configuration :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | An object that contains information about the data type.
+    dataType :: Prelude.Maybe DataType,
+    -- | An object that contains the default value.
+    defaultValue :: Prelude.Maybe DataValue,
+    -- | A friendly name for the property.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | A Boolean value that specifies whether the property ID comes from an
+    -- external data store.
+    isExternalId :: Prelude.Maybe Prelude.Bool,
+    -- | A Boolean value that specifies whether the property is required.
+    isRequiredInEntity :: Prelude.Maybe Prelude.Bool,
+    -- | A Boolean value that specifies whether the property is stored
+    -- externally.
+    isStoredExternally :: Prelude.Maybe Prelude.Bool,
+    -- | A Boolean value that specifies whether the property consists of time
+    -- series data.
+    isTimeSeries :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyDefinitionRequest' 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:
+--
+-- 'configuration', 'propertyDefinitionRequest_configuration' - A mapping that specifies configuration information about the property.
+-- Use this field to specify information that you read from and write to an
+-- external source.
+--
+-- 'dataType', 'propertyDefinitionRequest_dataType' - An object that contains information about the data type.
+--
+-- 'defaultValue', 'propertyDefinitionRequest_defaultValue' - An object that contains the default value.
+--
+-- 'displayName', 'propertyDefinitionRequest_displayName' - A friendly name for the property.
+--
+-- 'isExternalId', 'propertyDefinitionRequest_isExternalId' - A Boolean value that specifies whether the property ID comes from an
+-- external data store.
+--
+-- 'isRequiredInEntity', 'propertyDefinitionRequest_isRequiredInEntity' - A Boolean value that specifies whether the property is required.
+--
+-- 'isStoredExternally', 'propertyDefinitionRequest_isStoredExternally' - A Boolean value that specifies whether the property is stored
+-- externally.
+--
+-- 'isTimeSeries', 'propertyDefinitionRequest_isTimeSeries' - A Boolean value that specifies whether the property consists of time
+-- series data.
+newPropertyDefinitionRequest ::
+  PropertyDefinitionRequest
+newPropertyDefinitionRequest =
+  PropertyDefinitionRequest'
+    { configuration =
+        Prelude.Nothing,
+      dataType = Prelude.Nothing,
+      defaultValue = Prelude.Nothing,
+      displayName = Prelude.Nothing,
+      isExternalId = Prelude.Nothing,
+      isRequiredInEntity = Prelude.Nothing,
+      isStoredExternally = Prelude.Nothing,
+      isTimeSeries = Prelude.Nothing
+    }
+
+-- | A mapping that specifies configuration information about the property.
+-- Use this field to specify information that you read from and write to an
+-- external source.
+propertyDefinitionRequest_configuration :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+propertyDefinitionRequest_configuration = Lens.lens (\PropertyDefinitionRequest' {configuration} -> configuration) (\s@PropertyDefinitionRequest' {} a -> s {configuration = a} :: PropertyDefinitionRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that contains information about the data type.
+propertyDefinitionRequest_dataType :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe DataType)
+propertyDefinitionRequest_dataType = Lens.lens (\PropertyDefinitionRequest' {dataType} -> dataType) (\s@PropertyDefinitionRequest' {} a -> s {dataType = a} :: PropertyDefinitionRequest)
+
+-- | An object that contains the default value.
+propertyDefinitionRequest_defaultValue :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe DataValue)
+propertyDefinitionRequest_defaultValue = Lens.lens (\PropertyDefinitionRequest' {defaultValue} -> defaultValue) (\s@PropertyDefinitionRequest' {} a -> s {defaultValue = a} :: PropertyDefinitionRequest)
+
+-- | A friendly name for the property.
+propertyDefinitionRequest_displayName :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe Prelude.Text)
+propertyDefinitionRequest_displayName = Lens.lens (\PropertyDefinitionRequest' {displayName} -> displayName) (\s@PropertyDefinitionRequest' {} a -> s {displayName = a} :: PropertyDefinitionRequest)
+
+-- | A Boolean value that specifies whether the property ID comes from an
+-- external data store.
+propertyDefinitionRequest_isExternalId :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe Prelude.Bool)
+propertyDefinitionRequest_isExternalId = Lens.lens (\PropertyDefinitionRequest' {isExternalId} -> isExternalId) (\s@PropertyDefinitionRequest' {} a -> s {isExternalId = a} :: PropertyDefinitionRequest)
+
+-- | A Boolean value that specifies whether the property is required.
+propertyDefinitionRequest_isRequiredInEntity :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe Prelude.Bool)
+propertyDefinitionRequest_isRequiredInEntity = Lens.lens (\PropertyDefinitionRequest' {isRequiredInEntity} -> isRequiredInEntity) (\s@PropertyDefinitionRequest' {} a -> s {isRequiredInEntity = a} :: PropertyDefinitionRequest)
+
+-- | A Boolean value that specifies whether the property is stored
+-- externally.
+propertyDefinitionRequest_isStoredExternally :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe Prelude.Bool)
+propertyDefinitionRequest_isStoredExternally = Lens.lens (\PropertyDefinitionRequest' {isStoredExternally} -> isStoredExternally) (\s@PropertyDefinitionRequest' {} a -> s {isStoredExternally = a} :: PropertyDefinitionRequest)
+
+-- | A Boolean value that specifies whether the property consists of time
+-- series data.
+propertyDefinitionRequest_isTimeSeries :: Lens.Lens' PropertyDefinitionRequest (Prelude.Maybe Prelude.Bool)
+propertyDefinitionRequest_isTimeSeries = Lens.lens (\PropertyDefinitionRequest' {isTimeSeries} -> isTimeSeries) (\s@PropertyDefinitionRequest' {} a -> s {isTimeSeries = a} :: PropertyDefinitionRequest)
+
+instance Prelude.Hashable PropertyDefinitionRequest where
+  hashWithSalt _salt PropertyDefinitionRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` configuration
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` defaultValue
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` isExternalId
+      `Prelude.hashWithSalt` isRequiredInEntity
+      `Prelude.hashWithSalt` isStoredExternally
+      `Prelude.hashWithSalt` isTimeSeries
+
+instance Prelude.NFData PropertyDefinitionRequest where
+  rnf PropertyDefinitionRequest' {..} =
+    Prelude.rnf configuration
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf defaultValue
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf isExternalId
+      `Prelude.seq` Prelude.rnf isRequiredInEntity
+      `Prelude.seq` Prelude.rnf isStoredExternally
+      `Prelude.seq` Prelude.rnf isTimeSeries
+
+instance Data.ToJSON PropertyDefinitionRequest where
+  toJSON PropertyDefinitionRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("configuration" Data..=) Prelude.<$> configuration,
+            ("dataType" Data..=) Prelude.<$> dataType,
+            ("defaultValue" Data..=) Prelude.<$> defaultValue,
+            ("displayName" Data..=) Prelude.<$> displayName,
+            ("isExternalId" Data..=) Prelude.<$> isExternalId,
+            ("isRequiredInEntity" Data..=)
+              Prelude.<$> isRequiredInEntity,
+            ("isStoredExternally" Data..=)
+              Prelude.<$> isStoredExternally,
+            ("isTimeSeries" Data..=) Prelude.<$> isTimeSeries
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionResponse.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyDefinitionResponse.hs
@@ -0,0 +1,241 @@
+{-# 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.IotTwinMaker.Types.PropertyDefinitionResponse
+-- 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.IotTwinMaker.Types.PropertyDefinitionResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataType
+import Amazonka.IotTwinMaker.Types.DataValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains response data from a property definition
+-- request.
+--
+-- /See:/ 'newPropertyDefinitionResponse' smart constructor.
+data PropertyDefinitionResponse = PropertyDefinitionResponse'
+  { -- | A mapping that specifies configuration information about the property.
+    configuration :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | An object that contains the default value.
+    defaultValue :: Prelude.Maybe DataValue,
+    -- | A friendly name for the property.
+    displayName :: Prelude.Maybe Prelude.Text,
+    -- | An object that contains information about the data type.
+    dataType :: DataType,
+    -- | A Boolean value that specifies whether the property consists of time
+    -- series data.
+    isTimeSeries :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property is required in an
+    -- entity.
+    isRequiredInEntity :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property ID comes from an
+    -- external data store.
+    isExternalId :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property is stored
+    -- externally.
+    isStoredExternally :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property definition is
+    -- imported from an external data store.
+    isImported :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property definition can be
+    -- updated.
+    isFinal :: Prelude.Bool,
+    -- | A Boolean value that specifies whether the property definition is
+    -- inherited from a parent entity.
+    isInherited :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyDefinitionResponse' 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:
+--
+-- 'configuration', 'propertyDefinitionResponse_configuration' - A mapping that specifies configuration information about the property.
+--
+-- 'defaultValue', 'propertyDefinitionResponse_defaultValue' - An object that contains the default value.
+--
+-- 'displayName', 'propertyDefinitionResponse_displayName' - A friendly name for the property.
+--
+-- 'dataType', 'propertyDefinitionResponse_dataType' - An object that contains information about the data type.
+--
+-- 'isTimeSeries', 'propertyDefinitionResponse_isTimeSeries' - A Boolean value that specifies whether the property consists of time
+-- series data.
+--
+-- 'isRequiredInEntity', 'propertyDefinitionResponse_isRequiredInEntity' - A Boolean value that specifies whether the property is required in an
+-- entity.
+--
+-- 'isExternalId', 'propertyDefinitionResponse_isExternalId' - A Boolean value that specifies whether the property ID comes from an
+-- external data store.
+--
+-- 'isStoredExternally', 'propertyDefinitionResponse_isStoredExternally' - A Boolean value that specifies whether the property is stored
+-- externally.
+--
+-- 'isImported', 'propertyDefinitionResponse_isImported' - A Boolean value that specifies whether the property definition is
+-- imported from an external data store.
+--
+-- 'isFinal', 'propertyDefinitionResponse_isFinal' - A Boolean value that specifies whether the property definition can be
+-- updated.
+--
+-- 'isInherited', 'propertyDefinitionResponse_isInherited' - A Boolean value that specifies whether the property definition is
+-- inherited from a parent entity.
+newPropertyDefinitionResponse ::
+  -- | 'dataType'
+  DataType ->
+  -- | 'isTimeSeries'
+  Prelude.Bool ->
+  -- | 'isRequiredInEntity'
+  Prelude.Bool ->
+  -- | 'isExternalId'
+  Prelude.Bool ->
+  -- | 'isStoredExternally'
+  Prelude.Bool ->
+  -- | 'isImported'
+  Prelude.Bool ->
+  -- | 'isFinal'
+  Prelude.Bool ->
+  -- | 'isInherited'
+  Prelude.Bool ->
+  PropertyDefinitionResponse
+newPropertyDefinitionResponse
+  pDataType_
+  pIsTimeSeries_
+  pIsRequiredInEntity_
+  pIsExternalId_
+  pIsStoredExternally_
+  pIsImported_
+  pIsFinal_
+  pIsInherited_ =
+    PropertyDefinitionResponse'
+      { configuration =
+          Prelude.Nothing,
+        defaultValue = Prelude.Nothing,
+        displayName = Prelude.Nothing,
+        dataType = pDataType_,
+        isTimeSeries = pIsTimeSeries_,
+        isRequiredInEntity = pIsRequiredInEntity_,
+        isExternalId = pIsExternalId_,
+        isStoredExternally = pIsStoredExternally_,
+        isImported = pIsImported_,
+        isFinal = pIsFinal_,
+        isInherited = pIsInherited_
+      }
+
+-- | A mapping that specifies configuration information about the property.
+propertyDefinitionResponse_configuration :: Lens.Lens' PropertyDefinitionResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+propertyDefinitionResponse_configuration = Lens.lens (\PropertyDefinitionResponse' {configuration} -> configuration) (\s@PropertyDefinitionResponse' {} a -> s {configuration = a} :: PropertyDefinitionResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that contains the default value.
+propertyDefinitionResponse_defaultValue :: Lens.Lens' PropertyDefinitionResponse (Prelude.Maybe DataValue)
+propertyDefinitionResponse_defaultValue = Lens.lens (\PropertyDefinitionResponse' {defaultValue} -> defaultValue) (\s@PropertyDefinitionResponse' {} a -> s {defaultValue = a} :: PropertyDefinitionResponse)
+
+-- | A friendly name for the property.
+propertyDefinitionResponse_displayName :: Lens.Lens' PropertyDefinitionResponse (Prelude.Maybe Prelude.Text)
+propertyDefinitionResponse_displayName = Lens.lens (\PropertyDefinitionResponse' {displayName} -> displayName) (\s@PropertyDefinitionResponse' {} a -> s {displayName = a} :: PropertyDefinitionResponse)
+
+-- | An object that contains information about the data type.
+propertyDefinitionResponse_dataType :: Lens.Lens' PropertyDefinitionResponse DataType
+propertyDefinitionResponse_dataType = Lens.lens (\PropertyDefinitionResponse' {dataType} -> dataType) (\s@PropertyDefinitionResponse' {} a -> s {dataType = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property consists of time
+-- series data.
+propertyDefinitionResponse_isTimeSeries :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isTimeSeries = Lens.lens (\PropertyDefinitionResponse' {isTimeSeries} -> isTimeSeries) (\s@PropertyDefinitionResponse' {} a -> s {isTimeSeries = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property is required in an
+-- entity.
+propertyDefinitionResponse_isRequiredInEntity :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isRequiredInEntity = Lens.lens (\PropertyDefinitionResponse' {isRequiredInEntity} -> isRequiredInEntity) (\s@PropertyDefinitionResponse' {} a -> s {isRequiredInEntity = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property ID comes from an
+-- external data store.
+propertyDefinitionResponse_isExternalId :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isExternalId = Lens.lens (\PropertyDefinitionResponse' {isExternalId} -> isExternalId) (\s@PropertyDefinitionResponse' {} a -> s {isExternalId = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property is stored
+-- externally.
+propertyDefinitionResponse_isStoredExternally :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isStoredExternally = Lens.lens (\PropertyDefinitionResponse' {isStoredExternally} -> isStoredExternally) (\s@PropertyDefinitionResponse' {} a -> s {isStoredExternally = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property definition is
+-- imported from an external data store.
+propertyDefinitionResponse_isImported :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isImported = Lens.lens (\PropertyDefinitionResponse' {isImported} -> isImported) (\s@PropertyDefinitionResponse' {} a -> s {isImported = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property definition can be
+-- updated.
+propertyDefinitionResponse_isFinal :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isFinal = Lens.lens (\PropertyDefinitionResponse' {isFinal} -> isFinal) (\s@PropertyDefinitionResponse' {} a -> s {isFinal = a} :: PropertyDefinitionResponse)
+
+-- | A Boolean value that specifies whether the property definition is
+-- inherited from a parent entity.
+propertyDefinitionResponse_isInherited :: Lens.Lens' PropertyDefinitionResponse Prelude.Bool
+propertyDefinitionResponse_isInherited = Lens.lens (\PropertyDefinitionResponse' {isInherited} -> isInherited) (\s@PropertyDefinitionResponse' {} a -> s {isInherited = a} :: PropertyDefinitionResponse)
+
+instance Data.FromJSON PropertyDefinitionResponse where
+  parseJSON =
+    Data.withObject
+      "PropertyDefinitionResponse"
+      ( \x ->
+          PropertyDefinitionResponse'
+            Prelude.<$> (x Data..:? "configuration" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "defaultValue")
+            Prelude.<*> (x Data..:? "displayName")
+            Prelude.<*> (x Data..: "dataType")
+            Prelude.<*> (x Data..: "isTimeSeries")
+            Prelude.<*> (x Data..: "isRequiredInEntity")
+            Prelude.<*> (x Data..: "isExternalId")
+            Prelude.<*> (x Data..: "isStoredExternally")
+            Prelude.<*> (x Data..: "isImported")
+            Prelude.<*> (x Data..: "isFinal")
+            Prelude.<*> (x Data..: "isInherited")
+      )
+
+instance Prelude.Hashable PropertyDefinitionResponse where
+  hashWithSalt _salt PropertyDefinitionResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` configuration
+      `Prelude.hashWithSalt` defaultValue
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` isTimeSeries
+      `Prelude.hashWithSalt` isRequiredInEntity
+      `Prelude.hashWithSalt` isExternalId
+      `Prelude.hashWithSalt` isStoredExternally
+      `Prelude.hashWithSalt` isImported
+      `Prelude.hashWithSalt` isFinal
+      `Prelude.hashWithSalt` isInherited
+
+instance Prelude.NFData PropertyDefinitionResponse where
+  rnf PropertyDefinitionResponse' {..} =
+    Prelude.rnf configuration
+      `Prelude.seq` Prelude.rnf defaultValue
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf isTimeSeries
+      `Prelude.seq` Prelude.rnf isRequiredInEntity
+      `Prelude.seq` Prelude.rnf isExternalId
+      `Prelude.seq` Prelude.rnf isStoredExternally
+      `Prelude.seq` Prelude.rnf isImported
+      `Prelude.seq` Prelude.rnf isFinal
+      `Prelude.seq` Prelude.rnf isInherited
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyFilter.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyFilter.hs
@@ -0,0 +1,96 @@
+{-# 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.IotTwinMaker.Types.PropertyFilter
+-- 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.IotTwinMaker.Types.PropertyFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that filters items returned by a property request.
+--
+-- /See:/ 'newPropertyFilter' smart constructor.
+data PropertyFilter = PropertyFilter'
+  { -- | The operator associated with this property filter.
+    operator :: Prelude.Maybe Prelude.Text,
+    -- | The property name associated with this property filter.
+    propertyName :: Prelude.Maybe Prelude.Text,
+    -- | The value associated with this property filter.
+    value :: Prelude.Maybe DataValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyFilter' 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:
+--
+-- 'operator', 'propertyFilter_operator' - The operator associated with this property filter.
+--
+-- 'propertyName', 'propertyFilter_propertyName' - The property name associated with this property filter.
+--
+-- 'value', 'propertyFilter_value' - The value associated with this property filter.
+newPropertyFilter ::
+  PropertyFilter
+newPropertyFilter =
+  PropertyFilter'
+    { operator = Prelude.Nothing,
+      propertyName = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The operator associated with this property filter.
+propertyFilter_operator :: Lens.Lens' PropertyFilter (Prelude.Maybe Prelude.Text)
+propertyFilter_operator = Lens.lens (\PropertyFilter' {operator} -> operator) (\s@PropertyFilter' {} a -> s {operator = a} :: PropertyFilter)
+
+-- | The property name associated with this property filter.
+propertyFilter_propertyName :: Lens.Lens' PropertyFilter (Prelude.Maybe Prelude.Text)
+propertyFilter_propertyName = Lens.lens (\PropertyFilter' {propertyName} -> propertyName) (\s@PropertyFilter' {} a -> s {propertyName = a} :: PropertyFilter)
+
+-- | The value associated with this property filter.
+propertyFilter_value :: Lens.Lens' PropertyFilter (Prelude.Maybe DataValue)
+propertyFilter_value = Lens.lens (\PropertyFilter' {value} -> value) (\s@PropertyFilter' {} a -> s {value = a} :: PropertyFilter)
+
+instance Prelude.Hashable PropertyFilter where
+  hashWithSalt _salt PropertyFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` operator
+      `Prelude.hashWithSalt` propertyName
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData PropertyFilter where
+  rnf PropertyFilter' {..} =
+    Prelude.rnf operator
+      `Prelude.seq` Prelude.rnf propertyName
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON PropertyFilter where
+  toJSON PropertyFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("operator" Data..=) Prelude.<$> operator,
+            ("propertyName" Data..=) Prelude.<$> propertyName,
+            ("value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyGroupRequest.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupRequest.hs
@@ -0,0 +1,84 @@
+{-# 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.IotTwinMaker.Types.PropertyGroupRequest
+-- 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.IotTwinMaker.Types.PropertyGroupRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.GroupType
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newPropertyGroupRequest' smart constructor.
+data PropertyGroupRequest = PropertyGroupRequest'
+  { -- | The group type.
+    groupType :: Prelude.Maybe GroupType,
+    -- | The names of properties.
+    propertyNames :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyGroupRequest' 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:
+--
+-- 'groupType', 'propertyGroupRequest_groupType' - The group type.
+--
+-- 'propertyNames', 'propertyGroupRequest_propertyNames' - The names of properties.
+newPropertyGroupRequest ::
+  PropertyGroupRequest
+newPropertyGroupRequest =
+  PropertyGroupRequest'
+    { groupType = Prelude.Nothing,
+      propertyNames = Prelude.Nothing
+    }
+
+-- | The group type.
+propertyGroupRequest_groupType :: Lens.Lens' PropertyGroupRequest (Prelude.Maybe GroupType)
+propertyGroupRequest_groupType = Lens.lens (\PropertyGroupRequest' {groupType} -> groupType) (\s@PropertyGroupRequest' {} a -> s {groupType = a} :: PropertyGroupRequest)
+
+-- | The names of properties.
+propertyGroupRequest_propertyNames :: Lens.Lens' PropertyGroupRequest (Prelude.Maybe [Prelude.Text])
+propertyGroupRequest_propertyNames = Lens.lens (\PropertyGroupRequest' {propertyNames} -> propertyNames) (\s@PropertyGroupRequest' {} a -> s {propertyNames = a} :: PropertyGroupRequest) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable PropertyGroupRequest where
+  hashWithSalt _salt PropertyGroupRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` groupType
+      `Prelude.hashWithSalt` propertyNames
+
+instance Prelude.NFData PropertyGroupRequest where
+  rnf PropertyGroupRequest' {..} =
+    Prelude.rnf groupType
+      `Prelude.seq` Prelude.rnf propertyNames
+
+instance Data.ToJSON PropertyGroupRequest where
+  toJSON PropertyGroupRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("groupType" Data..=) Prelude.<$> groupType,
+            ("propertyNames" Data..=) Prelude.<$> propertyNames
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyGroupResponse.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupResponse.hs
@@ -0,0 +1,104 @@
+{-# 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.IotTwinMaker.Types.PropertyGroupResponse
+-- 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.IotTwinMaker.Types.PropertyGroupResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.GroupType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The property group response
+--
+-- /See:/ 'newPropertyGroupResponse' smart constructor.
+data PropertyGroupResponse = PropertyGroupResponse'
+  { -- | The group types.
+    groupType :: GroupType,
+    -- | The names of properties.
+    propertyNames :: [Prelude.Text],
+    -- | A Boolean value that specifies whether the property group is inherited
+    -- from a parent entity
+    isInherited :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyGroupResponse' 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:
+--
+-- 'groupType', 'propertyGroupResponse_groupType' - The group types.
+--
+-- 'propertyNames', 'propertyGroupResponse_propertyNames' - The names of properties.
+--
+-- 'isInherited', 'propertyGroupResponse_isInherited' - A Boolean value that specifies whether the property group is inherited
+-- from a parent entity
+newPropertyGroupResponse ::
+  -- | 'groupType'
+  GroupType ->
+  -- | 'isInherited'
+  Prelude.Bool ->
+  PropertyGroupResponse
+newPropertyGroupResponse pGroupType_ pIsInherited_ =
+  PropertyGroupResponse'
+    { groupType = pGroupType_,
+      propertyNames = Prelude.mempty,
+      isInherited = pIsInherited_
+    }
+
+-- | The group types.
+propertyGroupResponse_groupType :: Lens.Lens' PropertyGroupResponse GroupType
+propertyGroupResponse_groupType = Lens.lens (\PropertyGroupResponse' {groupType} -> groupType) (\s@PropertyGroupResponse' {} a -> s {groupType = a} :: PropertyGroupResponse)
+
+-- | The names of properties.
+propertyGroupResponse_propertyNames :: Lens.Lens' PropertyGroupResponse [Prelude.Text]
+propertyGroupResponse_propertyNames = Lens.lens (\PropertyGroupResponse' {propertyNames} -> propertyNames) (\s@PropertyGroupResponse' {} a -> s {propertyNames = a} :: PropertyGroupResponse) Prelude.. Lens.coerced
+
+-- | A Boolean value that specifies whether the property group is inherited
+-- from a parent entity
+propertyGroupResponse_isInherited :: Lens.Lens' PropertyGroupResponse Prelude.Bool
+propertyGroupResponse_isInherited = Lens.lens (\PropertyGroupResponse' {isInherited} -> isInherited) (\s@PropertyGroupResponse' {} a -> s {isInherited = a} :: PropertyGroupResponse)
+
+instance Data.FromJSON PropertyGroupResponse where
+  parseJSON =
+    Data.withObject
+      "PropertyGroupResponse"
+      ( \x ->
+          PropertyGroupResponse'
+            Prelude.<$> (x Data..: "groupType")
+            Prelude.<*> (x Data..:? "propertyNames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "isInherited")
+      )
+
+instance Prelude.Hashable PropertyGroupResponse where
+  hashWithSalt _salt PropertyGroupResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` groupType
+      `Prelude.hashWithSalt` propertyNames
+      `Prelude.hashWithSalt` isInherited
+
+instance Prelude.NFData PropertyGroupResponse where
+  rnf PropertyGroupResponse' {..} =
+    Prelude.rnf groupType
+      `Prelude.seq` Prelude.rnf propertyNames
+      `Prelude.seq` Prelude.rnf isInherited
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyGroupUpdateType.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupUpdateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyGroupUpdateType.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.PropertyGroupUpdateType
+-- 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.IotTwinMaker.Types.PropertyGroupUpdateType
+  ( PropertyGroupUpdateType
+      ( ..,
+        PropertyGroupUpdateType_CREATE,
+        PropertyGroupUpdateType_DELETE,
+        PropertyGroupUpdateType_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PropertyGroupUpdateType = PropertyGroupUpdateType'
+  { fromPropertyGroupUpdateType ::
+      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 PropertyGroupUpdateType_CREATE :: PropertyGroupUpdateType
+pattern PropertyGroupUpdateType_CREATE = PropertyGroupUpdateType' "CREATE"
+
+pattern PropertyGroupUpdateType_DELETE :: PropertyGroupUpdateType
+pattern PropertyGroupUpdateType_DELETE = PropertyGroupUpdateType' "DELETE"
+
+pattern PropertyGroupUpdateType_UPDATE :: PropertyGroupUpdateType
+pattern PropertyGroupUpdateType_UPDATE = PropertyGroupUpdateType' "UPDATE"
+
+{-# COMPLETE
+  PropertyGroupUpdateType_CREATE,
+  PropertyGroupUpdateType_DELETE,
+  PropertyGroupUpdateType_UPDATE,
+  PropertyGroupUpdateType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyLatestValue.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyLatestValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyLatestValue.hs
@@ -0,0 +1,89 @@
+{-# 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.IotTwinMaker.Types.PropertyLatestValue
+-- 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.IotTwinMaker.Types.PropertyLatestValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.EntityPropertyReference
+import qualified Amazonka.Prelude as Prelude
+
+-- | The latest value of the property.
+--
+-- /See:/ 'newPropertyLatestValue' smart constructor.
+data PropertyLatestValue = PropertyLatestValue'
+  { -- | The value of the property.
+    propertyValue :: Prelude.Maybe DataValue,
+    -- | An object that specifies information about a property.>
+    propertyReference :: EntityPropertyReference
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyLatestValue' 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:
+--
+-- 'propertyValue', 'propertyLatestValue_propertyValue' - The value of the property.
+--
+-- 'propertyReference', 'propertyLatestValue_propertyReference' - An object that specifies information about a property.>
+newPropertyLatestValue ::
+  -- | 'propertyReference'
+  EntityPropertyReference ->
+  PropertyLatestValue
+newPropertyLatestValue pPropertyReference_ =
+  PropertyLatestValue'
+    { propertyValue =
+        Prelude.Nothing,
+      propertyReference = pPropertyReference_
+    }
+
+-- | The value of the property.
+propertyLatestValue_propertyValue :: Lens.Lens' PropertyLatestValue (Prelude.Maybe DataValue)
+propertyLatestValue_propertyValue = Lens.lens (\PropertyLatestValue' {propertyValue} -> propertyValue) (\s@PropertyLatestValue' {} a -> s {propertyValue = a} :: PropertyLatestValue)
+
+-- | An object that specifies information about a property.>
+propertyLatestValue_propertyReference :: Lens.Lens' PropertyLatestValue EntityPropertyReference
+propertyLatestValue_propertyReference = Lens.lens (\PropertyLatestValue' {propertyReference} -> propertyReference) (\s@PropertyLatestValue' {} a -> s {propertyReference = a} :: PropertyLatestValue)
+
+instance Data.FromJSON PropertyLatestValue where
+  parseJSON =
+    Data.withObject
+      "PropertyLatestValue"
+      ( \x ->
+          PropertyLatestValue'
+            Prelude.<$> (x Data..:? "propertyValue")
+            Prelude.<*> (x Data..: "propertyReference")
+      )
+
+instance Prelude.Hashable PropertyLatestValue where
+  hashWithSalt _salt PropertyLatestValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` propertyValue
+      `Prelude.hashWithSalt` propertyReference
+
+instance Prelude.NFData PropertyLatestValue where
+  rnf PropertyLatestValue' {..} =
+    Prelude.rnf propertyValue
+      `Prelude.seq` Prelude.rnf propertyReference
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyRequest.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyRequest.hs
@@ -0,0 +1,98 @@
+{-# 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.IotTwinMaker.Types.PropertyRequest
+-- 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.IotTwinMaker.Types.PropertyRequest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionRequest
+import Amazonka.IotTwinMaker.Types.PropertyUpdateType
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that sets information about a property.
+--
+-- /See:/ 'newPropertyRequest' smart constructor.
+data PropertyRequest = PropertyRequest'
+  { -- | An object that specifies information about a property.
+    definition :: Prelude.Maybe PropertyDefinitionRequest,
+    -- | The update type of the update property request.
+    updateType :: Prelude.Maybe PropertyUpdateType,
+    -- | The value of the property.
+    value :: Prelude.Maybe DataValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyRequest' 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:
+--
+-- 'definition', 'propertyRequest_definition' - An object that specifies information about a property.
+--
+-- 'updateType', 'propertyRequest_updateType' - The update type of the update property request.
+--
+-- 'value', 'propertyRequest_value' - The value of the property.
+newPropertyRequest ::
+  PropertyRequest
+newPropertyRequest =
+  PropertyRequest'
+    { definition = Prelude.Nothing,
+      updateType = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | An object that specifies information about a property.
+propertyRequest_definition :: Lens.Lens' PropertyRequest (Prelude.Maybe PropertyDefinitionRequest)
+propertyRequest_definition = Lens.lens (\PropertyRequest' {definition} -> definition) (\s@PropertyRequest' {} a -> s {definition = a} :: PropertyRequest)
+
+-- | The update type of the update property request.
+propertyRequest_updateType :: Lens.Lens' PropertyRequest (Prelude.Maybe PropertyUpdateType)
+propertyRequest_updateType = Lens.lens (\PropertyRequest' {updateType} -> updateType) (\s@PropertyRequest' {} a -> s {updateType = a} :: PropertyRequest)
+
+-- | The value of the property.
+propertyRequest_value :: Lens.Lens' PropertyRequest (Prelude.Maybe DataValue)
+propertyRequest_value = Lens.lens (\PropertyRequest' {value} -> value) (\s@PropertyRequest' {} a -> s {value = a} :: PropertyRequest)
+
+instance Prelude.Hashable PropertyRequest where
+  hashWithSalt _salt PropertyRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` definition
+      `Prelude.hashWithSalt` updateType
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData PropertyRequest where
+  rnf PropertyRequest' {..} =
+    Prelude.rnf definition
+      `Prelude.seq` Prelude.rnf updateType
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON PropertyRequest where
+  toJSON PropertyRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("definition" Data..=) Prelude.<$> definition,
+            ("updateType" Data..=) Prelude.<$> updateType,
+            ("value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyResponse.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyResponse.hs
@@ -0,0 +1,86 @@
+{-# 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.IotTwinMaker.Types.PropertyResponse
+-- 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.IotTwinMaker.Types.PropertyResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import Amazonka.IotTwinMaker.Types.PropertyDefinitionResponse
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains information about a property response.
+--
+-- /See:/ 'newPropertyResponse' smart constructor.
+data PropertyResponse = PropertyResponse'
+  { -- | An object that specifies information about a property.
+    definition :: Prelude.Maybe PropertyDefinitionResponse,
+    -- | The value of the property.
+    value :: Prelude.Maybe DataValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyResponse' 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:
+--
+-- 'definition', 'propertyResponse_definition' - An object that specifies information about a property.
+--
+-- 'value', 'propertyResponse_value' - The value of the property.
+newPropertyResponse ::
+  PropertyResponse
+newPropertyResponse =
+  PropertyResponse'
+    { definition = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | An object that specifies information about a property.
+propertyResponse_definition :: Lens.Lens' PropertyResponse (Prelude.Maybe PropertyDefinitionResponse)
+propertyResponse_definition = Lens.lens (\PropertyResponse' {definition} -> definition) (\s@PropertyResponse' {} a -> s {definition = a} :: PropertyResponse)
+
+-- | The value of the property.
+propertyResponse_value :: Lens.Lens' PropertyResponse (Prelude.Maybe DataValue)
+propertyResponse_value = Lens.lens (\PropertyResponse' {value} -> value) (\s@PropertyResponse' {} a -> s {value = a} :: PropertyResponse)
+
+instance Data.FromJSON PropertyResponse where
+  parseJSON =
+    Data.withObject
+      "PropertyResponse"
+      ( \x ->
+          PropertyResponse'
+            Prelude.<$> (x Data..:? "definition")
+            Prelude.<*> (x Data..:? "value")
+      )
+
+instance Prelude.Hashable PropertyResponse where
+  hashWithSalt _salt PropertyResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` definition
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData PropertyResponse where
+  rnf PropertyResponse' {..} =
+    Prelude.rnf definition
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyUpdateType.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyUpdateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyUpdateType.hs
@@ -0,0 +1,76 @@
+{-# 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.IotTwinMaker.Types.PropertyUpdateType
+-- 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.IotTwinMaker.Types.PropertyUpdateType
+  ( PropertyUpdateType
+      ( ..,
+        PropertyUpdateType_CREATE,
+        PropertyUpdateType_DELETE,
+        PropertyUpdateType_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PropertyUpdateType = PropertyUpdateType'
+  { fromPropertyUpdateType ::
+      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 PropertyUpdateType_CREATE :: PropertyUpdateType
+pattern PropertyUpdateType_CREATE = PropertyUpdateType' "CREATE"
+
+pattern PropertyUpdateType_DELETE :: PropertyUpdateType
+pattern PropertyUpdateType_DELETE = PropertyUpdateType' "DELETE"
+
+pattern PropertyUpdateType_UPDATE :: PropertyUpdateType
+pattern PropertyUpdateType_UPDATE = PropertyUpdateType' "UPDATE"
+
+{-# COMPLETE
+  PropertyUpdateType_CREATE,
+  PropertyUpdateType_DELETE,
+  PropertyUpdateType_UPDATE,
+  PropertyUpdateType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyValue.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyValue.hs
@@ -0,0 +1,185 @@
+{-# 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.IotTwinMaker.Types.PropertyValue
+-- 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.IotTwinMaker.Types.PropertyValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.DataValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains information about a value for a time series
+-- property.
+--
+-- /See:/ 'newPropertyValue' smart constructor.
+data PropertyValue = PropertyValue'
+  { -- | ISO8601 DateTime of a value for a time series property.
+    --
+    -- The time for when the property value was recorded in ISO 8601 format:
+    -- /YYYY-MM-DDThh:mm:ss[.SSSSSSSSS][Z\/±HH:mm]/.
+    --
+    -- -   /[YYYY]/: year
+    --
+    -- -   /[MM]/: month
+    --
+    -- -   /[DD]/: day
+    --
+    -- -   /[hh]/: hour
+    --
+    -- -   /[mm]/: minute
+    --
+    -- -   /[ss]/: seconds
+    --
+    -- -   /[.SSSSSSSSS]/: additional precision, where precedence is
+    --     maintained. For example: [.573123] is equal to 573123000
+    --     nanoseconds.
+    --
+    -- -   /Z/: default timezone UTC
+    --
+    -- -   /± HH:mm/: time zone offset in Hours and Minutes.
+    --
+    -- /Required sub-fields/: YYYY-MM-DDThh:mm:ss and [Z\/±HH:mm]
+    time :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp of a value for a time series property.
+    timestamp :: Prelude.Maybe Data.POSIX,
+    -- | An object that specifies a value for a time series property.
+    value :: DataValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyValue' 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:
+--
+-- 'time', 'propertyValue_time' - ISO8601 DateTime of a value for a time series property.
+--
+-- The time for when the property value was recorded in ISO 8601 format:
+-- /YYYY-MM-DDThh:mm:ss[.SSSSSSSSS][Z\/±HH:mm]/.
+--
+-- -   /[YYYY]/: year
+--
+-- -   /[MM]/: month
+--
+-- -   /[DD]/: day
+--
+-- -   /[hh]/: hour
+--
+-- -   /[mm]/: minute
+--
+-- -   /[ss]/: seconds
+--
+-- -   /[.SSSSSSSSS]/: additional precision, where precedence is
+--     maintained. For example: [.573123] is equal to 573123000
+--     nanoseconds.
+--
+-- -   /Z/: default timezone UTC
+--
+-- -   /± HH:mm/: time zone offset in Hours and Minutes.
+--
+-- /Required sub-fields/: YYYY-MM-DDThh:mm:ss and [Z\/±HH:mm]
+--
+-- 'timestamp', 'propertyValue_timestamp' - The timestamp of a value for a time series property.
+--
+-- 'value', 'propertyValue_value' - An object that specifies a value for a time series property.
+newPropertyValue ::
+  -- | 'value'
+  DataValue ->
+  PropertyValue
+newPropertyValue pValue_ =
+  PropertyValue'
+    { time = Prelude.Nothing,
+      timestamp = Prelude.Nothing,
+      value = pValue_
+    }
+
+-- | ISO8601 DateTime of a value for a time series property.
+--
+-- The time for when the property value was recorded in ISO 8601 format:
+-- /YYYY-MM-DDThh:mm:ss[.SSSSSSSSS][Z\/±HH:mm]/.
+--
+-- -   /[YYYY]/: year
+--
+-- -   /[MM]/: month
+--
+-- -   /[DD]/: day
+--
+-- -   /[hh]/: hour
+--
+-- -   /[mm]/: minute
+--
+-- -   /[ss]/: seconds
+--
+-- -   /[.SSSSSSSSS]/: additional precision, where precedence is
+--     maintained. For example: [.573123] is equal to 573123000
+--     nanoseconds.
+--
+-- -   /Z/: default timezone UTC
+--
+-- -   /± HH:mm/: time zone offset in Hours and Minutes.
+--
+-- /Required sub-fields/: YYYY-MM-DDThh:mm:ss and [Z\/±HH:mm]
+propertyValue_time :: Lens.Lens' PropertyValue (Prelude.Maybe Prelude.Text)
+propertyValue_time = Lens.lens (\PropertyValue' {time} -> time) (\s@PropertyValue' {} a -> s {time = a} :: PropertyValue)
+
+-- | The timestamp of a value for a time series property.
+propertyValue_timestamp :: Lens.Lens' PropertyValue (Prelude.Maybe Prelude.UTCTime)
+propertyValue_timestamp = Lens.lens (\PropertyValue' {timestamp} -> timestamp) (\s@PropertyValue' {} a -> s {timestamp = a} :: PropertyValue) Prelude.. Lens.mapping Data._Time
+
+-- | An object that specifies a value for a time series property.
+propertyValue_value :: Lens.Lens' PropertyValue DataValue
+propertyValue_value = Lens.lens (\PropertyValue' {value} -> value) (\s@PropertyValue' {} a -> s {value = a} :: PropertyValue)
+
+instance Data.FromJSON PropertyValue where
+  parseJSON =
+    Data.withObject
+      "PropertyValue"
+      ( \x ->
+          PropertyValue'
+            Prelude.<$> (x Data..:? "time")
+            Prelude.<*> (x Data..:? "timestamp")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable PropertyValue where
+  hashWithSalt _salt PropertyValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` time
+      `Prelude.hashWithSalt` timestamp
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData PropertyValue where
+  rnf PropertyValue' {..} =
+    Prelude.rnf time
+      `Prelude.seq` Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON PropertyValue where
+  toJSON PropertyValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("time" Data..=) Prelude.<$> time,
+            ("timestamp" Data..=) Prelude.<$> timestamp,
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyValueEntry.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyValueEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyValueEntry.hs
@@ -0,0 +1,108 @@
+{-# 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.IotTwinMaker.Types.PropertyValueEntry
+-- 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.IotTwinMaker.Types.PropertyValueEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.EntityPropertyReference
+import Amazonka.IotTwinMaker.Types.PropertyValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that specifies information about time series property values.
+-- This object is used and consumed by the
+-- <https://docs.aws.amazon.com/iot-twinmaker/latest/apireference/API_BatchPutPropertyValues.html BatchPutPropertyValues>
+-- action.
+--
+-- /See:/ 'newPropertyValueEntry' smart constructor.
+data PropertyValueEntry = PropertyValueEntry'
+  { -- | A list of objects that specify time series property values.
+    propertyValues :: Prelude.Maybe (Prelude.NonEmpty PropertyValue),
+    -- | An object that contains information about the entity that has the
+    -- property.
+    entityPropertyReference :: EntityPropertyReference
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyValueEntry' 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:
+--
+-- 'propertyValues', 'propertyValueEntry_propertyValues' - A list of objects that specify time series property values.
+--
+-- 'entityPropertyReference', 'propertyValueEntry_entityPropertyReference' - An object that contains information about the entity that has the
+-- property.
+newPropertyValueEntry ::
+  -- | 'entityPropertyReference'
+  EntityPropertyReference ->
+  PropertyValueEntry
+newPropertyValueEntry pEntityPropertyReference_ =
+  PropertyValueEntry'
+    { propertyValues =
+        Prelude.Nothing,
+      entityPropertyReference = pEntityPropertyReference_
+    }
+
+-- | A list of objects that specify time series property values.
+propertyValueEntry_propertyValues :: Lens.Lens' PropertyValueEntry (Prelude.Maybe (Prelude.NonEmpty PropertyValue))
+propertyValueEntry_propertyValues = Lens.lens (\PropertyValueEntry' {propertyValues} -> propertyValues) (\s@PropertyValueEntry' {} a -> s {propertyValues = a} :: PropertyValueEntry) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that contains information about the entity that has the
+-- property.
+propertyValueEntry_entityPropertyReference :: Lens.Lens' PropertyValueEntry EntityPropertyReference
+propertyValueEntry_entityPropertyReference = Lens.lens (\PropertyValueEntry' {entityPropertyReference} -> entityPropertyReference) (\s@PropertyValueEntry' {} a -> s {entityPropertyReference = a} :: PropertyValueEntry)
+
+instance Data.FromJSON PropertyValueEntry where
+  parseJSON =
+    Data.withObject
+      "PropertyValueEntry"
+      ( \x ->
+          PropertyValueEntry'
+            Prelude.<$> (x Data..:? "propertyValues")
+            Prelude.<*> (x Data..: "entityPropertyReference")
+      )
+
+instance Prelude.Hashable PropertyValueEntry where
+  hashWithSalt _salt PropertyValueEntry' {..} =
+    _salt
+      `Prelude.hashWithSalt` propertyValues
+      `Prelude.hashWithSalt` entityPropertyReference
+
+instance Prelude.NFData PropertyValueEntry where
+  rnf PropertyValueEntry' {..} =
+    Prelude.rnf propertyValues
+      `Prelude.seq` Prelude.rnf entityPropertyReference
+
+instance Data.ToJSON PropertyValueEntry where
+  toJSON PropertyValueEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("propertyValues" Data..=)
+              Prelude.<$> propertyValues,
+            Prelude.Just
+              ( "entityPropertyReference"
+                  Data..= entityPropertyReference
+              )
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/PropertyValueHistory.hs b/gen/Amazonka/IotTwinMaker/Types/PropertyValueHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/PropertyValueHistory.hs
@@ -0,0 +1,91 @@
+{-# 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.IotTwinMaker.Types.PropertyValueHistory
+-- 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.IotTwinMaker.Types.PropertyValueHistory where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.EntityPropertyReference
+import Amazonka.IotTwinMaker.Types.PropertyValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | The history of values for a time series property.
+--
+-- /See:/ 'newPropertyValueHistory' smart constructor.
+data PropertyValueHistory = PropertyValueHistory'
+  { -- | A list of objects that contain information about the values in the
+    -- history of a time series property.
+    values :: Prelude.Maybe [PropertyValue],
+    -- | An object that uniquely identifies an entity property.
+    entityPropertyReference :: EntityPropertyReference
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyValueHistory' 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:
+--
+-- 'values', 'propertyValueHistory_values' - A list of objects that contain information about the values in the
+-- history of a time series property.
+--
+-- 'entityPropertyReference', 'propertyValueHistory_entityPropertyReference' - An object that uniquely identifies an entity property.
+newPropertyValueHistory ::
+  -- | 'entityPropertyReference'
+  EntityPropertyReference ->
+  PropertyValueHistory
+newPropertyValueHistory pEntityPropertyReference_ =
+  PropertyValueHistory'
+    { values = Prelude.Nothing,
+      entityPropertyReference = pEntityPropertyReference_
+    }
+
+-- | A list of objects that contain information about the values in the
+-- history of a time series property.
+propertyValueHistory_values :: Lens.Lens' PropertyValueHistory (Prelude.Maybe [PropertyValue])
+propertyValueHistory_values = Lens.lens (\PropertyValueHistory' {values} -> values) (\s@PropertyValueHistory' {} a -> s {values = a} :: PropertyValueHistory) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that uniquely identifies an entity property.
+propertyValueHistory_entityPropertyReference :: Lens.Lens' PropertyValueHistory EntityPropertyReference
+propertyValueHistory_entityPropertyReference = Lens.lens (\PropertyValueHistory' {entityPropertyReference} -> entityPropertyReference) (\s@PropertyValueHistory' {} a -> s {entityPropertyReference = a} :: PropertyValueHistory)
+
+instance Data.FromJSON PropertyValueHistory where
+  parseJSON =
+    Data.withObject
+      "PropertyValueHistory"
+      ( \x ->
+          PropertyValueHistory'
+            Prelude.<$> (x Data..:? "values" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "entityPropertyReference")
+      )
+
+instance Prelude.Hashable PropertyValueHistory where
+  hashWithSalt _salt PropertyValueHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` values
+      `Prelude.hashWithSalt` entityPropertyReference
+
+instance Prelude.NFData PropertyValueHistory where
+  rnf PropertyValueHistory' {..} =
+    Prelude.rnf values
+      `Prelude.seq` Prelude.rnf entityPropertyReference
diff --git a/gen/Amazonka/IotTwinMaker/Types/QueryResultValue.hs b/gen/Amazonka/IotTwinMaker/Types/QueryResultValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/QueryResultValue.hs
@@ -0,0 +1,52 @@
+{-# 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.IotTwinMaker.Types.QueryResultValue
+-- 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.IotTwinMaker.Types.QueryResultValue 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
+
+-- | /See:/ 'newQueryResultValue' smart constructor.
+data QueryResultValue = QueryResultValue'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryResultValue' 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.
+newQueryResultValue ::
+  QueryResultValue
+newQueryResultValue = QueryResultValue'
+
+instance Data.FromJSON QueryResultValue where
+  parseJSON =
+    Data.withObject
+      "QueryResultValue"
+      (\x -> Prelude.pure QueryResultValue')
+
+instance Prelude.Hashable QueryResultValue where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData QueryResultValue where
+  rnf _ = ()
diff --git a/gen/Amazonka/IotTwinMaker/Types/Relationship.hs b/gen/Amazonka/IotTwinMaker/Types/Relationship.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Relationship.hs
@@ -0,0 +1,95 @@
+{-# 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.IotTwinMaker.Types.Relationship
+-- 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.IotTwinMaker.Types.Relationship 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
+
+-- | An object that specifies a relationship with another component type.
+--
+-- /See:/ 'newRelationship' smart constructor.
+data Relationship = Relationship'
+  { -- | The type of the relationship.
+    relationshipType :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the target component type associated with this relationship.
+    targetComponentTypeId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Relationship' 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:
+--
+-- 'relationshipType', 'relationship_relationshipType' - The type of the relationship.
+--
+-- 'targetComponentTypeId', 'relationship_targetComponentTypeId' - The ID of the target component type associated with this relationship.
+newRelationship ::
+  Relationship
+newRelationship =
+  Relationship'
+    { relationshipType = Prelude.Nothing,
+      targetComponentTypeId = Prelude.Nothing
+    }
+
+-- | The type of the relationship.
+relationship_relationshipType :: Lens.Lens' Relationship (Prelude.Maybe Prelude.Text)
+relationship_relationshipType = Lens.lens (\Relationship' {relationshipType} -> relationshipType) (\s@Relationship' {} a -> s {relationshipType = a} :: Relationship)
+
+-- | The ID of the target component type associated with this relationship.
+relationship_targetComponentTypeId :: Lens.Lens' Relationship (Prelude.Maybe Prelude.Text)
+relationship_targetComponentTypeId = Lens.lens (\Relationship' {targetComponentTypeId} -> targetComponentTypeId) (\s@Relationship' {} a -> s {targetComponentTypeId = a} :: Relationship)
+
+instance Data.FromJSON Relationship where
+  parseJSON =
+    Data.withObject
+      "Relationship"
+      ( \x ->
+          Relationship'
+            Prelude.<$> (x Data..:? "relationshipType")
+            Prelude.<*> (x Data..:? "targetComponentTypeId")
+      )
+
+instance Prelude.Hashable Relationship where
+  hashWithSalt _salt Relationship' {..} =
+    _salt
+      `Prelude.hashWithSalt` relationshipType
+      `Prelude.hashWithSalt` targetComponentTypeId
+
+instance Prelude.NFData Relationship where
+  rnf Relationship' {..} =
+    Prelude.rnf relationshipType
+      `Prelude.seq` Prelude.rnf targetComponentTypeId
+
+instance Data.ToJSON Relationship where
+  toJSON Relationship' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("relationshipType" Data..=)
+              Prelude.<$> relationshipType,
+            ("targetComponentTypeId" Data..=)
+              Prelude.<$> targetComponentTypeId
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/RelationshipValue.hs b/gen/Amazonka/IotTwinMaker/Types/RelationshipValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/RelationshipValue.hs
@@ -0,0 +1,96 @@
+{-# 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.IotTwinMaker.Types.RelationshipValue
+-- 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.IotTwinMaker.Types.RelationshipValue 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
+
+-- | A value that associates a component and an entity.
+--
+-- /See:/ 'newRelationshipValue' smart constructor.
+data RelationshipValue = RelationshipValue'
+  { -- | The name of the target component associated with the relationship value.
+    targetComponentName :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the target entity associated with this relationship value.
+    targetEntityId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RelationshipValue' 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:
+--
+-- 'targetComponentName', 'relationshipValue_targetComponentName' - The name of the target component associated with the relationship value.
+--
+-- 'targetEntityId', 'relationshipValue_targetEntityId' - The ID of the target entity associated with this relationship value.
+newRelationshipValue ::
+  RelationshipValue
+newRelationshipValue =
+  RelationshipValue'
+    { targetComponentName =
+        Prelude.Nothing,
+      targetEntityId = Prelude.Nothing
+    }
+
+-- | The name of the target component associated with the relationship value.
+relationshipValue_targetComponentName :: Lens.Lens' RelationshipValue (Prelude.Maybe Prelude.Text)
+relationshipValue_targetComponentName = Lens.lens (\RelationshipValue' {targetComponentName} -> targetComponentName) (\s@RelationshipValue' {} a -> s {targetComponentName = a} :: RelationshipValue)
+
+-- | The ID of the target entity associated with this relationship value.
+relationshipValue_targetEntityId :: Lens.Lens' RelationshipValue (Prelude.Maybe Prelude.Text)
+relationshipValue_targetEntityId = Lens.lens (\RelationshipValue' {targetEntityId} -> targetEntityId) (\s@RelationshipValue' {} a -> s {targetEntityId = a} :: RelationshipValue)
+
+instance Data.FromJSON RelationshipValue where
+  parseJSON =
+    Data.withObject
+      "RelationshipValue"
+      ( \x ->
+          RelationshipValue'
+            Prelude.<$> (x Data..:? "targetComponentName")
+            Prelude.<*> (x Data..:? "targetEntityId")
+      )
+
+instance Prelude.Hashable RelationshipValue where
+  hashWithSalt _salt RelationshipValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` targetComponentName
+      `Prelude.hashWithSalt` targetEntityId
+
+instance Prelude.NFData RelationshipValue where
+  rnf RelationshipValue' {..} =
+    Prelude.rnf targetComponentName
+      `Prelude.seq` Prelude.rnf targetEntityId
+
+instance Data.ToJSON RelationshipValue where
+  toJSON RelationshipValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("targetComponentName" Data..=)
+              Prelude.<$> targetComponentName,
+            ("targetEntityId" Data..=)
+              Prelude.<$> targetEntityId
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/Row.hs b/gen/Amazonka/IotTwinMaker/Types/Row.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Row.hs
@@ -0,0 +1,68 @@
+{-# 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.IotTwinMaker.Types.Row
+-- 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.IotTwinMaker.Types.Row where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.QueryResultValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Represents a single row in the query results.
+--
+-- /See:/ 'newRow' smart constructor.
+data Row = Row'
+  { -- | The data in a row of query results.
+    rowData :: Prelude.Maybe [QueryResultValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Row' 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:
+--
+-- 'rowData', 'row_rowData' - The data in a row of query results.
+newRow ::
+  Row
+newRow = Row' {rowData = Prelude.Nothing}
+
+-- | The data in a row of query results.
+row_rowData :: Lens.Lens' Row (Prelude.Maybe [QueryResultValue])
+row_rowData = Lens.lens (\Row' {rowData} -> rowData) (\s@Row' {} a -> s {rowData = a} :: Row) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Row where
+  parseJSON =
+    Data.withObject
+      "Row"
+      ( \x ->
+          Row'
+            Prelude.<$> (x Data..:? "rowData" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Row where
+  hashWithSalt _salt Row' {..} =
+    _salt `Prelude.hashWithSalt` rowData
+
+instance Prelude.NFData Row where
+  rnf Row' {..} = Prelude.rnf rowData
diff --git a/gen/Amazonka/IotTwinMaker/Types/SceneSummary.hs b/gen/Amazonka/IotTwinMaker/Types/SceneSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SceneSummary.hs
@@ -0,0 +1,151 @@
+{-# 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.IotTwinMaker.Types.SceneSummary
+-- 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.IotTwinMaker.Types.SceneSummary 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
+
+-- | An object that contains information about a scene.
+--
+-- /See:/ 'newSceneSummary' smart constructor.
+data SceneSummary = SceneSummary'
+  { -- | The scene description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the scene.
+    sceneId :: Prelude.Text,
+    -- | The relative path that specifies the location of the content definition
+    -- file.
+    contentLocation :: Prelude.Text,
+    -- | The ARN of the scene.
+    arn :: Prelude.Text,
+    -- | The date and time when the scene was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the scene was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SceneSummary' 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:
+--
+-- 'description', 'sceneSummary_description' - The scene description.
+--
+-- 'sceneId', 'sceneSummary_sceneId' - The ID of the scene.
+--
+-- 'contentLocation', 'sceneSummary_contentLocation' - The relative path that specifies the location of the content definition
+-- file.
+--
+-- 'arn', 'sceneSummary_arn' - The ARN of the scene.
+--
+-- 'creationDateTime', 'sceneSummary_creationDateTime' - The date and time when the scene was created.
+--
+-- 'updateDateTime', 'sceneSummary_updateDateTime' - The date and time when the scene was last updated.
+newSceneSummary ::
+  -- | 'sceneId'
+  Prelude.Text ->
+  -- | 'contentLocation'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  SceneSummary
+newSceneSummary
+  pSceneId_
+  pContentLocation_
+  pArn_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    SceneSummary'
+      { description = Prelude.Nothing,
+        sceneId = pSceneId_,
+        contentLocation = pContentLocation_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The scene description.
+sceneSummary_description :: Lens.Lens' SceneSummary (Prelude.Maybe Prelude.Text)
+sceneSummary_description = Lens.lens (\SceneSummary' {description} -> description) (\s@SceneSummary' {} a -> s {description = a} :: SceneSummary)
+
+-- | The ID of the scene.
+sceneSummary_sceneId :: Lens.Lens' SceneSummary Prelude.Text
+sceneSummary_sceneId = Lens.lens (\SceneSummary' {sceneId} -> sceneId) (\s@SceneSummary' {} a -> s {sceneId = a} :: SceneSummary)
+
+-- | The relative path that specifies the location of the content definition
+-- file.
+sceneSummary_contentLocation :: Lens.Lens' SceneSummary Prelude.Text
+sceneSummary_contentLocation = Lens.lens (\SceneSummary' {contentLocation} -> contentLocation) (\s@SceneSummary' {} a -> s {contentLocation = a} :: SceneSummary)
+
+-- | The ARN of the scene.
+sceneSummary_arn :: Lens.Lens' SceneSummary Prelude.Text
+sceneSummary_arn = Lens.lens (\SceneSummary' {arn} -> arn) (\s@SceneSummary' {} a -> s {arn = a} :: SceneSummary)
+
+-- | The date and time when the scene was created.
+sceneSummary_creationDateTime :: Lens.Lens' SceneSummary Prelude.UTCTime
+sceneSummary_creationDateTime = Lens.lens (\SceneSummary' {creationDateTime} -> creationDateTime) (\s@SceneSummary' {} a -> s {creationDateTime = a} :: SceneSummary) Prelude.. Data._Time
+
+-- | The date and time when the scene was last updated.
+sceneSummary_updateDateTime :: Lens.Lens' SceneSummary Prelude.UTCTime
+sceneSummary_updateDateTime = Lens.lens (\SceneSummary' {updateDateTime} -> updateDateTime) (\s@SceneSummary' {} a -> s {updateDateTime = a} :: SceneSummary) Prelude.. Data._Time
+
+instance Data.FromJSON SceneSummary where
+  parseJSON =
+    Data.withObject
+      "SceneSummary"
+      ( \x ->
+          SceneSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..: "sceneId")
+            Prelude.<*> (x Data..: "contentLocation")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "creationDateTime")
+            Prelude.<*> (x Data..: "updateDateTime")
+      )
+
+instance Prelude.Hashable SceneSummary where
+  hashWithSalt _salt SceneSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` sceneId
+      `Prelude.hashWithSalt` contentLocation
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` updateDateTime
+
+instance Prelude.NFData SceneSummary where
+  rnf SceneSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf sceneId
+      `Prelude.seq` Prelude.rnf contentLocation
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Types/Scope.hs b/gen/Amazonka/IotTwinMaker/Types/Scope.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Scope.hs
@@ -0,0 +1,68 @@
+{-# 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.IotTwinMaker.Types.Scope
+-- 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.IotTwinMaker.Types.Scope
+  ( Scope
+      ( ..,
+        Scope_ENTITY,
+        Scope_WORKSPACE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Scope = Scope' {fromScope :: 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 Scope_ENTITY :: Scope
+pattern Scope_ENTITY = Scope' "ENTITY"
+
+pattern Scope_WORKSPACE :: Scope
+pattern Scope_WORKSPACE = Scope' "WORKSPACE"
+
+{-# COMPLETE
+  Scope_ENTITY,
+  Scope_WORKSPACE,
+  Scope'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/State.hs b/gen/Amazonka/IotTwinMaker/Types/State.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/State.hs
@@ -0,0 +1,83 @@
+{-# 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.IotTwinMaker.Types.State
+-- 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.IotTwinMaker.Types.State
+  ( State
+      ( ..,
+        State_ACTIVE,
+        State_CREATING,
+        State_DELETING,
+        State_ERROR,
+        State_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype State = State' {fromState :: 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 State_ACTIVE :: State
+pattern State_ACTIVE = State' "ACTIVE"
+
+pattern State_CREATING :: State
+pattern State_CREATING = State' "CREATING"
+
+pattern State_DELETING :: State
+pattern State_DELETING = State' "DELETING"
+
+pattern State_ERROR :: State
+pattern State_ERROR = State' "ERROR"
+
+pattern State_UPDATING :: State
+pattern State_UPDATING = State' "UPDATING"
+
+{-# COMPLETE
+  State_ACTIVE,
+  State_CREATING,
+  State_DELETING,
+  State_ERROR,
+  State_UPDATING,
+  State'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/Status.hs b/gen/Amazonka/IotTwinMaker/Types/Status.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Status.hs
@@ -0,0 +1,89 @@
+{-# 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.IotTwinMaker.Types.Status
+-- 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.IotTwinMaker.Types.Status where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ErrorDetails
+import Amazonka.IotTwinMaker.Types.State
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that represents the status of an entity, component, component
+-- type, or workspace.
+--
+-- /See:/ 'newStatus' smart constructor.
+data Status = Status'
+  { -- | The error message.
+    error :: Prelude.Maybe ErrorDetails,
+    -- | The current state of the entity, component, component type, or
+    -- workspace.
+    state :: Prelude.Maybe State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Status' 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:
+--
+-- 'error', 'status_error' - The error message.
+--
+-- 'state', 'status_state' - The current state of the entity, component, component type, or
+-- workspace.
+newStatus ::
+  Status
+newStatus =
+  Status'
+    { error = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The error message.
+status_error :: Lens.Lens' Status (Prelude.Maybe ErrorDetails)
+status_error = Lens.lens (\Status' {error} -> error) (\s@Status' {} a -> s {error = a} :: Status)
+
+-- | The current state of the entity, component, component type, or
+-- workspace.
+status_state :: Lens.Lens' Status (Prelude.Maybe State)
+status_state = Lens.lens (\Status' {state} -> state) (\s@Status' {} a -> s {state = a} :: Status)
+
+instance Data.FromJSON Status where
+  parseJSON =
+    Data.withObject
+      "Status"
+      ( \x ->
+          Status'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..:? "state")
+      )
+
+instance Prelude.Hashable Status where
+  hashWithSalt _salt Status' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData Status where
+  rnf Status' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncJobState.hs b/gen/Amazonka/IotTwinMaker/Types/SyncJobState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncJobState.hs
@@ -0,0 +1,86 @@
+{-# 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.IotTwinMaker.Types.SyncJobState
+-- 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.IotTwinMaker.Types.SyncJobState
+  ( SyncJobState
+      ( ..,
+        SyncJobState_ACTIVE,
+        SyncJobState_CREATING,
+        SyncJobState_DELETING,
+        SyncJobState_ERROR,
+        SyncJobState_INITIALIZING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SyncJobState = SyncJobState'
+  { fromSyncJobState ::
+      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 SyncJobState_ACTIVE :: SyncJobState
+pattern SyncJobState_ACTIVE = SyncJobState' "ACTIVE"
+
+pattern SyncJobState_CREATING :: SyncJobState
+pattern SyncJobState_CREATING = SyncJobState' "CREATING"
+
+pattern SyncJobState_DELETING :: SyncJobState
+pattern SyncJobState_DELETING = SyncJobState' "DELETING"
+
+pattern SyncJobState_ERROR :: SyncJobState
+pattern SyncJobState_ERROR = SyncJobState' "ERROR"
+
+pattern SyncJobState_INITIALIZING :: SyncJobState
+pattern SyncJobState_INITIALIZING = SyncJobState' "INITIALIZING"
+
+{-# COMPLETE
+  SyncJobState_ACTIVE,
+  SyncJobState_CREATING,
+  SyncJobState_DELETING,
+  SyncJobState_ERROR,
+  SyncJobState_INITIALIZING,
+  SyncJobState'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncJobStatus.hs b/gen/Amazonka/IotTwinMaker/Types/SyncJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncJobStatus.hs
@@ -0,0 +1,85 @@
+{-# 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.IotTwinMaker.Types.SyncJobStatus
+-- 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.IotTwinMaker.Types.SyncJobStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ErrorDetails
+import Amazonka.IotTwinMaker.Types.SyncJobState
+import qualified Amazonka.Prelude as Prelude
+
+-- | The SyncJob status.
+--
+-- /See:/ 'newSyncJobStatus' smart constructor.
+data SyncJobStatus = SyncJobStatus'
+  { -- | The SyncJob error.
+    error :: Prelude.Maybe ErrorDetails,
+    -- | The SyncJob status state.
+    state :: Prelude.Maybe SyncJobState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SyncJobStatus' 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:
+--
+-- 'error', 'syncJobStatus_error' - The SyncJob error.
+--
+-- 'state', 'syncJobStatus_state' - The SyncJob status state.
+newSyncJobStatus ::
+  SyncJobStatus
+newSyncJobStatus =
+  SyncJobStatus'
+    { error = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The SyncJob error.
+syncJobStatus_error :: Lens.Lens' SyncJobStatus (Prelude.Maybe ErrorDetails)
+syncJobStatus_error = Lens.lens (\SyncJobStatus' {error} -> error) (\s@SyncJobStatus' {} a -> s {error = a} :: SyncJobStatus)
+
+-- | The SyncJob status state.
+syncJobStatus_state :: Lens.Lens' SyncJobStatus (Prelude.Maybe SyncJobState)
+syncJobStatus_state = Lens.lens (\SyncJobStatus' {state} -> state) (\s@SyncJobStatus' {} a -> s {state = a} :: SyncJobStatus)
+
+instance Data.FromJSON SyncJobStatus where
+  parseJSON =
+    Data.withObject
+      "SyncJobStatus"
+      ( \x ->
+          SyncJobStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..:? "state")
+      )
+
+instance Prelude.Hashable SyncJobStatus where
+  hashWithSalt _salt SyncJobStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData SyncJobStatus where
+  rnf SyncJobStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncJobSummary.hs b/gen/Amazonka/IotTwinMaker/Types/SyncJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncJobSummary.hs
@@ -0,0 +1,133 @@
+{-# 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.IotTwinMaker.Types.SyncJobSummary
+-- 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.IotTwinMaker.Types.SyncJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.SyncJobStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The SyncJob summary.
+--
+-- /See:/ 'newSyncJobSummary' smart constructor.
+data SyncJobSummary = SyncJobSummary'
+  { -- | The SyncJob summary ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The creation date and time.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The SyncJob summaries status.
+    status :: Prelude.Maybe SyncJobStatus,
+    -- | The sync source.
+    syncSource :: Prelude.Maybe Prelude.Text,
+    -- | The update date and time.
+    updateDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the workspace that contains the sync job.
+    workspaceId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SyncJobSummary' 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:
+--
+-- 'arn', 'syncJobSummary_arn' - The SyncJob summary ARN.
+--
+-- 'creationDateTime', 'syncJobSummary_creationDateTime' - The creation date and time.
+--
+-- 'status', 'syncJobSummary_status' - The SyncJob summaries status.
+--
+-- 'syncSource', 'syncJobSummary_syncSource' - The sync source.
+--
+-- 'updateDateTime', 'syncJobSummary_updateDateTime' - The update date and time.
+--
+-- 'workspaceId', 'syncJobSummary_workspaceId' - The ID of the workspace that contains the sync job.
+newSyncJobSummary ::
+  SyncJobSummary
+newSyncJobSummary =
+  SyncJobSummary'
+    { arn = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      status = Prelude.Nothing,
+      syncSource = Prelude.Nothing,
+      updateDateTime = Prelude.Nothing,
+      workspaceId = Prelude.Nothing
+    }
+
+-- | The SyncJob summary ARN.
+syncJobSummary_arn :: Lens.Lens' SyncJobSummary (Prelude.Maybe Prelude.Text)
+syncJobSummary_arn = Lens.lens (\SyncJobSummary' {arn} -> arn) (\s@SyncJobSummary' {} a -> s {arn = a} :: SyncJobSummary)
+
+-- | The creation date and time.
+syncJobSummary_creationDateTime :: Lens.Lens' SyncJobSummary (Prelude.Maybe Prelude.UTCTime)
+syncJobSummary_creationDateTime = Lens.lens (\SyncJobSummary' {creationDateTime} -> creationDateTime) (\s@SyncJobSummary' {} a -> s {creationDateTime = a} :: SyncJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The SyncJob summaries status.
+syncJobSummary_status :: Lens.Lens' SyncJobSummary (Prelude.Maybe SyncJobStatus)
+syncJobSummary_status = Lens.lens (\SyncJobSummary' {status} -> status) (\s@SyncJobSummary' {} a -> s {status = a} :: SyncJobSummary)
+
+-- | The sync source.
+syncJobSummary_syncSource :: Lens.Lens' SyncJobSummary (Prelude.Maybe Prelude.Text)
+syncJobSummary_syncSource = Lens.lens (\SyncJobSummary' {syncSource} -> syncSource) (\s@SyncJobSummary' {} a -> s {syncSource = a} :: SyncJobSummary)
+
+-- | The update date and time.
+syncJobSummary_updateDateTime :: Lens.Lens' SyncJobSummary (Prelude.Maybe Prelude.UTCTime)
+syncJobSummary_updateDateTime = Lens.lens (\SyncJobSummary' {updateDateTime} -> updateDateTime) (\s@SyncJobSummary' {} a -> s {updateDateTime = a} :: SyncJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the workspace that contains the sync job.
+syncJobSummary_workspaceId :: Lens.Lens' SyncJobSummary (Prelude.Maybe Prelude.Text)
+syncJobSummary_workspaceId = Lens.lens (\SyncJobSummary' {workspaceId} -> workspaceId) (\s@SyncJobSummary' {} a -> s {workspaceId = a} :: SyncJobSummary)
+
+instance Data.FromJSON SyncJobSummary where
+  parseJSON =
+    Data.withObject
+      "SyncJobSummary"
+      ( \x ->
+          SyncJobSummary'
+            Prelude.<$> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "syncSource")
+            Prelude.<*> (x Data..:? "updateDateTime")
+            Prelude.<*> (x Data..:? "workspaceId")
+      )
+
+instance Prelude.Hashable SyncJobSummary where
+  hashWithSalt _salt SyncJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` syncSource
+      `Prelude.hashWithSalt` updateDateTime
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData SyncJobSummary where
+  rnf SyncJobSummary' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf syncSource
+      `Prelude.seq` Prelude.rnf updateDateTime
+      `Prelude.seq` Prelude.rnf workspaceId
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncResourceFilter.hs b/gen/Amazonka/IotTwinMaker/Types/SyncResourceFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncResourceFilter.hs
@@ -0,0 +1,109 @@
+{-# 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.IotTwinMaker.Types.SyncResourceFilter
+-- 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.IotTwinMaker.Types.SyncResourceFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.SyncResourceState
+import Amazonka.IotTwinMaker.Types.SyncResourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The sync resource filter.
+--
+-- /See:/ 'newSyncResourceFilter' smart constructor.
+data SyncResourceFilter = SyncResourceFilter'
+  { -- | The external Id.
+    externalId :: Prelude.Maybe Prelude.Text,
+    -- | The sync resource filter resource Id.
+    resourceId :: Prelude.Maybe Prelude.Text,
+    -- | The sync resource filter resoucre type
+    resourceType :: Prelude.Maybe SyncResourceType,
+    -- | The sync resource filter\'s state.
+    state :: Prelude.Maybe SyncResourceState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SyncResourceFilter' 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:
+--
+-- 'externalId', 'syncResourceFilter_externalId' - The external Id.
+--
+-- 'resourceId', 'syncResourceFilter_resourceId' - The sync resource filter resource Id.
+--
+-- 'resourceType', 'syncResourceFilter_resourceType' - The sync resource filter resoucre type
+--
+-- 'state', 'syncResourceFilter_state' - The sync resource filter\'s state.
+newSyncResourceFilter ::
+  SyncResourceFilter
+newSyncResourceFilter =
+  SyncResourceFilter'
+    { externalId = Prelude.Nothing,
+      resourceId = Prelude.Nothing,
+      resourceType = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The external Id.
+syncResourceFilter_externalId :: Lens.Lens' SyncResourceFilter (Prelude.Maybe Prelude.Text)
+syncResourceFilter_externalId = Lens.lens (\SyncResourceFilter' {externalId} -> externalId) (\s@SyncResourceFilter' {} a -> s {externalId = a} :: SyncResourceFilter)
+
+-- | The sync resource filter resource Id.
+syncResourceFilter_resourceId :: Lens.Lens' SyncResourceFilter (Prelude.Maybe Prelude.Text)
+syncResourceFilter_resourceId = Lens.lens (\SyncResourceFilter' {resourceId} -> resourceId) (\s@SyncResourceFilter' {} a -> s {resourceId = a} :: SyncResourceFilter)
+
+-- | The sync resource filter resoucre type
+syncResourceFilter_resourceType :: Lens.Lens' SyncResourceFilter (Prelude.Maybe SyncResourceType)
+syncResourceFilter_resourceType = Lens.lens (\SyncResourceFilter' {resourceType} -> resourceType) (\s@SyncResourceFilter' {} a -> s {resourceType = a} :: SyncResourceFilter)
+
+-- | The sync resource filter\'s state.
+syncResourceFilter_state :: Lens.Lens' SyncResourceFilter (Prelude.Maybe SyncResourceState)
+syncResourceFilter_state = Lens.lens (\SyncResourceFilter' {state} -> state) (\s@SyncResourceFilter' {} a -> s {state = a} :: SyncResourceFilter)
+
+instance Prelude.Hashable SyncResourceFilter where
+  hashWithSalt _salt SyncResourceFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` externalId
+      `Prelude.hashWithSalt` resourceId
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData SyncResourceFilter where
+  rnf SyncResourceFilter' {..} =
+    Prelude.rnf externalId
+      `Prelude.seq` Prelude.rnf resourceId
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf state
+
+instance Data.ToJSON SyncResourceFilter where
+  toJSON SyncResourceFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("externalId" Data..=) Prelude.<$> externalId,
+            ("resourceId" Data..=) Prelude.<$> resourceId,
+            ("resourceType" Data..=) Prelude.<$> resourceType,
+            ("state" Data..=) Prelude.<$> state
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncResourceState.hs b/gen/Amazonka/IotTwinMaker/Types/SyncResourceState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncResourceState.hs
@@ -0,0 +1,86 @@
+{-# 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.IotTwinMaker.Types.SyncResourceState
+-- 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.IotTwinMaker.Types.SyncResourceState
+  ( SyncResourceState
+      ( ..,
+        SyncResourceState_DELETED,
+        SyncResourceState_ERROR,
+        SyncResourceState_INITIALIZING,
+        SyncResourceState_IN_SYNC,
+        SyncResourceState_PROCESSING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SyncResourceState = SyncResourceState'
+  { fromSyncResourceState ::
+      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 SyncResourceState_DELETED :: SyncResourceState
+pattern SyncResourceState_DELETED = SyncResourceState' "DELETED"
+
+pattern SyncResourceState_ERROR :: SyncResourceState
+pattern SyncResourceState_ERROR = SyncResourceState' "ERROR"
+
+pattern SyncResourceState_INITIALIZING :: SyncResourceState
+pattern SyncResourceState_INITIALIZING = SyncResourceState' "INITIALIZING"
+
+pattern SyncResourceState_IN_SYNC :: SyncResourceState
+pattern SyncResourceState_IN_SYNC = SyncResourceState' "IN_SYNC"
+
+pattern SyncResourceState_PROCESSING :: SyncResourceState
+pattern SyncResourceState_PROCESSING = SyncResourceState' "PROCESSING"
+
+{-# COMPLETE
+  SyncResourceState_DELETED,
+  SyncResourceState_ERROR,
+  SyncResourceState_INITIALIZING,
+  SyncResourceState_IN_SYNC,
+  SyncResourceState_PROCESSING,
+  SyncResourceState'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncResourceStatus.hs b/gen/Amazonka/IotTwinMaker/Types/SyncResourceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncResourceStatus.hs
@@ -0,0 +1,85 @@
+{-# 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.IotTwinMaker.Types.SyncResourceStatus
+-- 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.IotTwinMaker.Types.SyncResourceStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.ErrorDetails
+import Amazonka.IotTwinMaker.Types.SyncResourceState
+import qualified Amazonka.Prelude as Prelude
+
+-- | The sync resource status.
+--
+-- /See:/ 'newSyncResourceStatus' smart constructor.
+data SyncResourceStatus = SyncResourceStatus'
+  { -- | The status error.
+    error :: Prelude.Maybe ErrorDetails,
+    -- | The sync resource status state.
+    state :: Prelude.Maybe SyncResourceState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SyncResourceStatus' 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:
+--
+-- 'error', 'syncResourceStatus_error' - The status error.
+--
+-- 'state', 'syncResourceStatus_state' - The sync resource status state.
+newSyncResourceStatus ::
+  SyncResourceStatus
+newSyncResourceStatus =
+  SyncResourceStatus'
+    { error = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The status error.
+syncResourceStatus_error :: Lens.Lens' SyncResourceStatus (Prelude.Maybe ErrorDetails)
+syncResourceStatus_error = Lens.lens (\SyncResourceStatus' {error} -> error) (\s@SyncResourceStatus' {} a -> s {error = a} :: SyncResourceStatus)
+
+-- | The sync resource status state.
+syncResourceStatus_state :: Lens.Lens' SyncResourceStatus (Prelude.Maybe SyncResourceState)
+syncResourceStatus_state = Lens.lens (\SyncResourceStatus' {state} -> state) (\s@SyncResourceStatus' {} a -> s {state = a} :: SyncResourceStatus)
+
+instance Data.FromJSON SyncResourceStatus where
+  parseJSON =
+    Data.withObject
+      "SyncResourceStatus"
+      ( \x ->
+          SyncResourceStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..:? "state")
+      )
+
+instance Prelude.Hashable SyncResourceStatus where
+  hashWithSalt _salt SyncResourceStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData SyncResourceStatus where
+  rnf SyncResourceStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncResourceSummary.hs b/gen/Amazonka/IotTwinMaker/Types/SyncResourceSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncResourceSummary.hs
@@ -0,0 +1,122 @@
+{-# 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.IotTwinMaker.Types.SyncResourceSummary
+-- 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.IotTwinMaker.Types.SyncResourceSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.SyncResourceStatus
+import Amazonka.IotTwinMaker.Types.SyncResourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The sync resource summary.
+--
+-- /See:/ 'newSyncResourceSummary' smart constructor.
+data SyncResourceSummary = SyncResourceSummary'
+  { -- | The external Id.
+    externalId :: Prelude.Maybe Prelude.Text,
+    -- | The resource Id.
+    resourceId :: Prelude.Maybe Prelude.Text,
+    -- | The resource type.
+    resourceType :: Prelude.Maybe SyncResourceType,
+    -- | The sync resource summary status.
+    status :: Prelude.Maybe SyncResourceStatus,
+    -- | The update date and time.
+    updateDateTime :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SyncResourceSummary' 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:
+--
+-- 'externalId', 'syncResourceSummary_externalId' - The external Id.
+--
+-- 'resourceId', 'syncResourceSummary_resourceId' - The resource Id.
+--
+-- 'resourceType', 'syncResourceSummary_resourceType' - The resource type.
+--
+-- 'status', 'syncResourceSummary_status' - The sync resource summary status.
+--
+-- 'updateDateTime', 'syncResourceSummary_updateDateTime' - The update date and time.
+newSyncResourceSummary ::
+  SyncResourceSummary
+newSyncResourceSummary =
+  SyncResourceSummary'
+    { externalId = Prelude.Nothing,
+      resourceId = Prelude.Nothing,
+      resourceType = Prelude.Nothing,
+      status = Prelude.Nothing,
+      updateDateTime = Prelude.Nothing
+    }
+
+-- | The external Id.
+syncResourceSummary_externalId :: Lens.Lens' SyncResourceSummary (Prelude.Maybe Prelude.Text)
+syncResourceSummary_externalId = Lens.lens (\SyncResourceSummary' {externalId} -> externalId) (\s@SyncResourceSummary' {} a -> s {externalId = a} :: SyncResourceSummary)
+
+-- | The resource Id.
+syncResourceSummary_resourceId :: Lens.Lens' SyncResourceSummary (Prelude.Maybe Prelude.Text)
+syncResourceSummary_resourceId = Lens.lens (\SyncResourceSummary' {resourceId} -> resourceId) (\s@SyncResourceSummary' {} a -> s {resourceId = a} :: SyncResourceSummary)
+
+-- | The resource type.
+syncResourceSummary_resourceType :: Lens.Lens' SyncResourceSummary (Prelude.Maybe SyncResourceType)
+syncResourceSummary_resourceType = Lens.lens (\SyncResourceSummary' {resourceType} -> resourceType) (\s@SyncResourceSummary' {} a -> s {resourceType = a} :: SyncResourceSummary)
+
+-- | The sync resource summary status.
+syncResourceSummary_status :: Lens.Lens' SyncResourceSummary (Prelude.Maybe SyncResourceStatus)
+syncResourceSummary_status = Lens.lens (\SyncResourceSummary' {status} -> status) (\s@SyncResourceSummary' {} a -> s {status = a} :: SyncResourceSummary)
+
+-- | The update date and time.
+syncResourceSummary_updateDateTime :: Lens.Lens' SyncResourceSummary (Prelude.Maybe Prelude.UTCTime)
+syncResourceSummary_updateDateTime = Lens.lens (\SyncResourceSummary' {updateDateTime} -> updateDateTime) (\s@SyncResourceSummary' {} a -> s {updateDateTime = a} :: SyncResourceSummary) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON SyncResourceSummary where
+  parseJSON =
+    Data.withObject
+      "SyncResourceSummary"
+      ( \x ->
+          SyncResourceSummary'
+            Prelude.<$> (x Data..:? "externalId")
+            Prelude.<*> (x Data..:? "resourceId")
+            Prelude.<*> (x Data..:? "resourceType")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "updateDateTime")
+      )
+
+instance Prelude.Hashable SyncResourceSummary where
+  hashWithSalt _salt SyncResourceSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` externalId
+      `Prelude.hashWithSalt` resourceId
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` updateDateTime
+
+instance Prelude.NFData SyncResourceSummary where
+  rnf SyncResourceSummary' {..} =
+    Prelude.rnf externalId
+      `Prelude.seq` Prelude.rnf resourceId
+      `Prelude.seq` Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Types/SyncResourceType.hs b/gen/Amazonka/IotTwinMaker/Types/SyncResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/SyncResourceType.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.IotTwinMaker.Types.SyncResourceType
+-- 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.IotTwinMaker.Types.SyncResourceType
+  ( SyncResourceType
+      ( ..,
+        SyncResourceType_COMPONENT_TYPE,
+        SyncResourceType_ENTITY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SyncResourceType = SyncResourceType'
+  { fromSyncResourceType ::
+      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 SyncResourceType_COMPONENT_TYPE :: SyncResourceType
+pattern SyncResourceType_COMPONENT_TYPE = SyncResourceType' "COMPONENT_TYPE"
+
+pattern SyncResourceType_ENTITY :: SyncResourceType
+pattern SyncResourceType_ENTITY = SyncResourceType' "ENTITY"
+
+{-# COMPLETE
+  SyncResourceType_COMPONENT_TYPE,
+  SyncResourceType_ENTITY,
+  SyncResourceType'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/TabularConditions.hs b/gen/Amazonka/IotTwinMaker/Types/TabularConditions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/TabularConditions.hs
@@ -0,0 +1,98 @@
+{-# 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.IotTwinMaker.Types.TabularConditions
+-- 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.IotTwinMaker.Types.TabularConditions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types.OrderBy
+import Amazonka.IotTwinMaker.Types.PropertyFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | The tabular conditions.
+--
+-- /See:/ 'newTabularConditions' smart constructor.
+data TabularConditions = TabularConditions'
+  { -- | Filter criteria that orders the output. It can be sorted in ascending or
+    -- descending order.
+    orderBy :: Prelude.Maybe (Prelude.NonEmpty OrderBy),
+    -- | You can filter the request using various logical operators and a
+    -- key-value format. For example:
+    --
+    -- @{\"key\": \"serverType\", \"value\": \"webServer\"}@
+    propertyFilters :: Prelude.Maybe (Prelude.NonEmpty PropertyFilter)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TabularConditions' 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:
+--
+-- 'orderBy', 'tabularConditions_orderBy' - Filter criteria that orders the output. It can be sorted in ascending or
+-- descending order.
+--
+-- 'propertyFilters', 'tabularConditions_propertyFilters' - You can filter the request using various logical operators and a
+-- key-value format. For example:
+--
+-- @{\"key\": \"serverType\", \"value\": \"webServer\"}@
+newTabularConditions ::
+  TabularConditions
+newTabularConditions =
+  TabularConditions'
+    { orderBy = Prelude.Nothing,
+      propertyFilters = Prelude.Nothing
+    }
+
+-- | Filter criteria that orders the output. It can be sorted in ascending or
+-- descending order.
+tabularConditions_orderBy :: Lens.Lens' TabularConditions (Prelude.Maybe (Prelude.NonEmpty OrderBy))
+tabularConditions_orderBy = Lens.lens (\TabularConditions' {orderBy} -> orderBy) (\s@TabularConditions' {} a -> s {orderBy = a} :: TabularConditions) Prelude.. Lens.mapping Lens.coerced
+
+-- | You can filter the request using various logical operators and a
+-- key-value format. For example:
+--
+-- @{\"key\": \"serverType\", \"value\": \"webServer\"}@
+tabularConditions_propertyFilters :: Lens.Lens' TabularConditions (Prelude.Maybe (Prelude.NonEmpty PropertyFilter))
+tabularConditions_propertyFilters = Lens.lens (\TabularConditions' {propertyFilters} -> propertyFilters) (\s@TabularConditions' {} a -> s {propertyFilters = a} :: TabularConditions) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable TabularConditions where
+  hashWithSalt _salt TabularConditions' {..} =
+    _salt
+      `Prelude.hashWithSalt` orderBy
+      `Prelude.hashWithSalt` propertyFilters
+
+instance Prelude.NFData TabularConditions where
+  rnf TabularConditions' {..} =
+    Prelude.rnf orderBy
+      `Prelude.seq` Prelude.rnf propertyFilters
+
+instance Data.ToJSON TabularConditions where
+  toJSON TabularConditions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("orderBy" Data..=) Prelude.<$> orderBy,
+            ("propertyFilters" Data..=)
+              Prelude.<$> propertyFilters
+          ]
+      )
diff --git a/gen/Amazonka/IotTwinMaker/Types/Type.hs b/gen/Amazonka/IotTwinMaker/Types/Type.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/Type.hs
@@ -0,0 +1,98 @@
+{-# 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.IotTwinMaker.Types.Type
+-- 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.IotTwinMaker.Types.Type
+  ( Type
+      ( ..,
+        Type_BOOLEAN,
+        Type_DOUBLE,
+        Type_INTEGER,
+        Type_LIST,
+        Type_LONG,
+        Type_MAP,
+        Type_RELATIONSHIP,
+        Type_STRING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Type = Type' {fromType :: 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 Type_BOOLEAN :: Type
+pattern Type_BOOLEAN = Type' "BOOLEAN"
+
+pattern Type_DOUBLE :: Type
+pattern Type_DOUBLE = Type' "DOUBLE"
+
+pattern Type_INTEGER :: Type
+pattern Type_INTEGER = Type' "INTEGER"
+
+pattern Type_LIST :: Type
+pattern Type_LIST = Type' "LIST"
+
+pattern Type_LONG :: Type
+pattern Type_LONG = Type' "LONG"
+
+pattern Type_MAP :: Type
+pattern Type_MAP = Type' "MAP"
+
+pattern Type_RELATIONSHIP :: Type
+pattern Type_RELATIONSHIP = Type' "RELATIONSHIP"
+
+pattern Type_STRING :: Type
+pattern Type_STRING = Type' "STRING"
+
+{-# COMPLETE
+  Type_BOOLEAN,
+  Type_DOUBLE,
+  Type_INTEGER,
+  Type_LIST,
+  Type_LONG,
+  Type_MAP,
+  Type_RELATIONSHIP,
+  Type_STRING,
+  Type'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/UpdateReason.hs b/gen/Amazonka/IotTwinMaker/Types/UpdateReason.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/UpdateReason.hs
@@ -0,0 +1,86 @@
+{-# 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.IotTwinMaker.Types.UpdateReason
+-- 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.IotTwinMaker.Types.UpdateReason
+  ( UpdateReason
+      ( ..,
+        UpdateReason_DEFAULT,
+        UpdateReason_ENTITY_COUNT_UPDATE,
+        UpdateReason_OVERWRITTEN,
+        UpdateReason_PRICING_MODE_UPDATE,
+        UpdateReason_PRICING_TIER_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UpdateReason = UpdateReason'
+  { fromUpdateReason ::
+      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 UpdateReason_DEFAULT :: UpdateReason
+pattern UpdateReason_DEFAULT = UpdateReason' "DEFAULT"
+
+pattern UpdateReason_ENTITY_COUNT_UPDATE :: UpdateReason
+pattern UpdateReason_ENTITY_COUNT_UPDATE = UpdateReason' "ENTITY_COUNT_UPDATE"
+
+pattern UpdateReason_OVERWRITTEN :: UpdateReason
+pattern UpdateReason_OVERWRITTEN = UpdateReason' "OVERWRITTEN"
+
+pattern UpdateReason_PRICING_MODE_UPDATE :: UpdateReason
+pattern UpdateReason_PRICING_MODE_UPDATE = UpdateReason' "PRICING_MODE_UPDATE"
+
+pattern UpdateReason_PRICING_TIER_UPDATE :: UpdateReason
+pattern UpdateReason_PRICING_TIER_UPDATE = UpdateReason' "PRICING_TIER_UPDATE"
+
+{-# COMPLETE
+  UpdateReason_DEFAULT,
+  UpdateReason_ENTITY_COUNT_UPDATE,
+  UpdateReason_OVERWRITTEN,
+  UpdateReason_PRICING_MODE_UPDATE,
+  UpdateReason_PRICING_TIER_UPDATE,
+  UpdateReason'
+  #-}
diff --git a/gen/Amazonka/IotTwinMaker/Types/WorkspaceSummary.hs b/gen/Amazonka/IotTwinMaker/Types/WorkspaceSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/Types/WorkspaceSummary.hs
@@ -0,0 +1,133 @@
+{-# 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.IotTwinMaker.Types.WorkspaceSummary
+-- 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.IotTwinMaker.Types.WorkspaceSummary 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
+
+-- | An object that contains information about a workspace.
+--
+-- /See:/ 'newWorkspaceSummary' smart constructor.
+data WorkspaceSummary = WorkspaceSummary'
+  { -- | The description of the workspace.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ARN of the workspace.
+    arn :: Prelude.Text,
+    -- | The date and time when the workspace was created.
+    creationDateTime :: Data.POSIX,
+    -- | The date and time when the workspace was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'WorkspaceSummary' 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:
+--
+-- 'description', 'workspaceSummary_description' - The description of the workspace.
+--
+-- 'workspaceId', 'workspaceSummary_workspaceId' - The ID of the workspace.
+--
+-- 'arn', 'workspaceSummary_arn' - The ARN of the workspace.
+--
+-- 'creationDateTime', 'workspaceSummary_creationDateTime' - The date and time when the workspace was created.
+--
+-- 'updateDateTime', 'workspaceSummary_updateDateTime' - The date and time when the workspace was last updated.
+newWorkspaceSummary ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'creationDateTime'
+  Prelude.UTCTime ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  WorkspaceSummary
+newWorkspaceSummary
+  pWorkspaceId_
+  pArn_
+  pCreationDateTime_
+  pUpdateDateTime_ =
+    WorkspaceSummary'
+      { description = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        arn = pArn_,
+        creationDateTime =
+          Data._Time Lens.# pCreationDateTime_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The description of the workspace.
+workspaceSummary_description :: Lens.Lens' WorkspaceSummary (Prelude.Maybe Prelude.Text)
+workspaceSummary_description = Lens.lens (\WorkspaceSummary' {description} -> description) (\s@WorkspaceSummary' {} a -> s {description = a} :: WorkspaceSummary)
+
+-- | The ID of the workspace.
+workspaceSummary_workspaceId :: Lens.Lens' WorkspaceSummary Prelude.Text
+workspaceSummary_workspaceId = Lens.lens (\WorkspaceSummary' {workspaceId} -> workspaceId) (\s@WorkspaceSummary' {} a -> s {workspaceId = a} :: WorkspaceSummary)
+
+-- | The ARN of the workspace.
+workspaceSummary_arn :: Lens.Lens' WorkspaceSummary Prelude.Text
+workspaceSummary_arn = Lens.lens (\WorkspaceSummary' {arn} -> arn) (\s@WorkspaceSummary' {} a -> s {arn = a} :: WorkspaceSummary)
+
+-- | The date and time when the workspace was created.
+workspaceSummary_creationDateTime :: Lens.Lens' WorkspaceSummary Prelude.UTCTime
+workspaceSummary_creationDateTime = Lens.lens (\WorkspaceSummary' {creationDateTime} -> creationDateTime) (\s@WorkspaceSummary' {} a -> s {creationDateTime = a} :: WorkspaceSummary) Prelude.. Data._Time
+
+-- | The date and time when the workspace was last updated.
+workspaceSummary_updateDateTime :: Lens.Lens' WorkspaceSummary Prelude.UTCTime
+workspaceSummary_updateDateTime = Lens.lens (\WorkspaceSummary' {updateDateTime} -> updateDateTime) (\s@WorkspaceSummary' {} a -> s {updateDateTime = a} :: WorkspaceSummary) Prelude.. Data._Time
+
+instance Data.FromJSON WorkspaceSummary where
+  parseJSON =
+    Data.withObject
+      "WorkspaceSummary"
+      ( \x ->
+          WorkspaceSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..: "workspaceId")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "creationDateTime")
+            Prelude.<*> (x Data..: "updateDateTime")
+      )
+
+instance Prelude.Hashable WorkspaceSummary where
+  hashWithSalt _salt WorkspaceSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` updateDateTime
+
+instance Prelude.NFData WorkspaceSummary where
+  rnf WorkspaceSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/UntagResource.hs b/gen/Amazonka/IotTwinMaker/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UntagResource.hs
@@ -0,0 +1,165 @@
+{-# 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.IotTwinMaker.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes tags from a resource.
+module Amazonka.IotTwinMaker.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceARN,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The ARN of the resource.
+    resourceARN :: Prelude.Text,
+    -- | A list of tag key names to remove from the resource. You don\'t specify
+    -- the value. Both the key and its associated value are removed.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' 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:
+--
+-- 'resourceARN', 'untagResource_resourceARN' - The ARN of the resource.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of tag key names to remove from the resource. You don\'t specify
+-- the value. Both the key and its associated value are removed.
+newUntagResource ::
+  -- | 'resourceARN'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceARN_ =
+  UntagResource'
+    { resourceARN = pResourceARN_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The ARN of the resource.
+untagResource_resourceARN :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceARN = Lens.lens (\UntagResource' {resourceARN} -> resourceARN) (\s@UntagResource' {} a -> s {resourceARN = a} :: UntagResource)
+
+-- | A list of tag key names to remove from the resource. You don\'t specify
+-- the value. Both the key and its associated value are removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceARN
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceARN
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/tags"
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      [ "resourceARN" Data.=: resourceARN,
+        "tagKeys" Data.=: Data.toQueryList "member" tagKeys
+      ]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' 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', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IotTwinMaker/UpdateComponentType.hs b/gen/Amazonka/IotTwinMaker/UpdateComponentType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UpdateComponentType.hs
@@ -0,0 +1,343 @@
+{-# 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.IotTwinMaker.UpdateComponentType
+-- 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 information in a component type.
+module Amazonka.IotTwinMaker.UpdateComponentType
+  ( -- * Creating a Request
+    UpdateComponentType (..),
+    newUpdateComponentType,
+
+    -- * Request Lenses
+    updateComponentType_componentTypeName,
+    updateComponentType_description,
+    updateComponentType_extendsFrom,
+    updateComponentType_functions,
+    updateComponentType_isSingleton,
+    updateComponentType_propertyDefinitions,
+    updateComponentType_propertyGroups,
+    updateComponentType_workspaceId,
+    updateComponentType_componentTypeId,
+
+    -- * Destructuring the Response
+    UpdateComponentTypeResponse (..),
+    newUpdateComponentTypeResponse,
+
+    -- * Response Lenses
+    updateComponentTypeResponse_httpStatus,
+    updateComponentTypeResponse_workspaceId,
+    updateComponentTypeResponse_arn,
+    updateComponentTypeResponse_componentTypeId,
+    updateComponentTypeResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateComponentType' smart constructor.
+data UpdateComponentType = UpdateComponentType'
+  { -- | The component type name.
+    componentTypeName :: Prelude.Maybe Prelude.Text,
+    -- | The description of the component type.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the component type that this component type extends.
+    extendsFrom :: Prelude.Maybe [Prelude.Text],
+    -- | An object that maps strings to the functions in the component type. Each
+    -- string in the mapping must be unique to this object.
+    functions :: Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionRequest),
+    -- | A Boolean value that specifies whether an entity can have more than one
+    -- component of this type.
+    isSingleton :: Prelude.Maybe Prelude.Bool,
+    -- | An object that maps strings to the property definitions in the component
+    -- type. Each string in the mapping must be unique to this object.
+    propertyDefinitions :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionRequest),
+    -- | The property groups
+    propertyGroups :: Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupRequest),
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateComponentType' 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:
+--
+-- 'componentTypeName', 'updateComponentType_componentTypeName' - The component type name.
+--
+-- 'description', 'updateComponentType_description' - The description of the component type.
+--
+-- 'extendsFrom', 'updateComponentType_extendsFrom' - Specifies the component type that this component type extends.
+--
+-- 'functions', 'updateComponentType_functions' - An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+--
+-- 'isSingleton', 'updateComponentType_isSingleton' - A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+--
+-- 'propertyDefinitions', 'updateComponentType_propertyDefinitions' - An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+--
+-- 'propertyGroups', 'updateComponentType_propertyGroups' - The property groups
+--
+-- 'workspaceId', 'updateComponentType_workspaceId' - The ID of the workspace.
+--
+-- 'componentTypeId', 'updateComponentType_componentTypeId' - The ID of the component type.
+newUpdateComponentType ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  UpdateComponentType
+newUpdateComponentType
+  pWorkspaceId_
+  pComponentTypeId_ =
+    UpdateComponentType'
+      { componentTypeName =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        extendsFrom = Prelude.Nothing,
+        functions = Prelude.Nothing,
+        isSingleton = Prelude.Nothing,
+        propertyDefinitions = Prelude.Nothing,
+        propertyGroups = Prelude.Nothing,
+        workspaceId = pWorkspaceId_,
+        componentTypeId = pComponentTypeId_
+      }
+
+-- | The component type name.
+updateComponentType_componentTypeName :: Lens.Lens' UpdateComponentType (Prelude.Maybe Prelude.Text)
+updateComponentType_componentTypeName = Lens.lens (\UpdateComponentType' {componentTypeName} -> componentTypeName) (\s@UpdateComponentType' {} a -> s {componentTypeName = a} :: UpdateComponentType)
+
+-- | The description of the component type.
+updateComponentType_description :: Lens.Lens' UpdateComponentType (Prelude.Maybe Prelude.Text)
+updateComponentType_description = Lens.lens (\UpdateComponentType' {description} -> description) (\s@UpdateComponentType' {} a -> s {description = a} :: UpdateComponentType)
+
+-- | Specifies the component type that this component type extends.
+updateComponentType_extendsFrom :: Lens.Lens' UpdateComponentType (Prelude.Maybe [Prelude.Text])
+updateComponentType_extendsFrom = Lens.lens (\UpdateComponentType' {extendsFrom} -> extendsFrom) (\s@UpdateComponentType' {} a -> s {extendsFrom = a} :: UpdateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | An object that maps strings to the functions in the component type. Each
+-- string in the mapping must be unique to this object.
+updateComponentType_functions :: Lens.Lens' UpdateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text FunctionRequest))
+updateComponentType_functions = Lens.lens (\UpdateComponentType' {functions} -> functions) (\s@UpdateComponentType' {} a -> s {functions = a} :: UpdateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | A Boolean value that specifies whether an entity can have more than one
+-- component of this type.
+updateComponentType_isSingleton :: Lens.Lens' UpdateComponentType (Prelude.Maybe Prelude.Bool)
+updateComponentType_isSingleton = Lens.lens (\UpdateComponentType' {isSingleton} -> isSingleton) (\s@UpdateComponentType' {} a -> s {isSingleton = a} :: UpdateComponentType)
+
+-- | An object that maps strings to the property definitions in the component
+-- type. Each string in the mapping must be unique to this object.
+updateComponentType_propertyDefinitions :: Lens.Lens' UpdateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyDefinitionRequest))
+updateComponentType_propertyDefinitions = Lens.lens (\UpdateComponentType' {propertyDefinitions} -> propertyDefinitions) (\s@UpdateComponentType' {} a -> s {propertyDefinitions = a} :: UpdateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The property groups
+updateComponentType_propertyGroups :: Lens.Lens' UpdateComponentType (Prelude.Maybe (Prelude.HashMap Prelude.Text PropertyGroupRequest))
+updateComponentType_propertyGroups = Lens.lens (\UpdateComponentType' {propertyGroups} -> propertyGroups) (\s@UpdateComponentType' {} a -> s {propertyGroups = a} :: UpdateComponentType) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the workspace.
+updateComponentType_workspaceId :: Lens.Lens' UpdateComponentType Prelude.Text
+updateComponentType_workspaceId = Lens.lens (\UpdateComponentType' {workspaceId} -> workspaceId) (\s@UpdateComponentType' {} a -> s {workspaceId = a} :: UpdateComponentType)
+
+-- | The ID of the component type.
+updateComponentType_componentTypeId :: Lens.Lens' UpdateComponentType Prelude.Text
+updateComponentType_componentTypeId = Lens.lens (\UpdateComponentType' {componentTypeId} -> componentTypeId) (\s@UpdateComponentType' {} a -> s {componentTypeId = a} :: UpdateComponentType)
+
+instance Core.AWSRequest UpdateComponentType where
+  type
+    AWSResponse UpdateComponentType =
+      UpdateComponentTypeResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateComponentTypeResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "workspaceId")
+            Prelude.<*> (x Data..:> "arn")
+            Prelude.<*> (x Data..:> "componentTypeId")
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable UpdateComponentType where
+  hashWithSalt _salt UpdateComponentType' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentTypeName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` extendsFrom
+      `Prelude.hashWithSalt` functions
+      `Prelude.hashWithSalt` isSingleton
+      `Prelude.hashWithSalt` propertyDefinitions
+      `Prelude.hashWithSalt` propertyGroups
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` componentTypeId
+
+instance Prelude.NFData UpdateComponentType where
+  rnf UpdateComponentType' {..} =
+    Prelude.rnf componentTypeName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf extendsFrom
+      `Prelude.seq` Prelude.rnf functions
+      `Prelude.seq` Prelude.rnf isSingleton
+      `Prelude.seq` Prelude.rnf propertyDefinitions
+      `Prelude.seq` Prelude.rnf propertyGroups
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf componentTypeId
+
+instance Data.ToHeaders UpdateComponentType where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateComponentType where
+  toJSON UpdateComponentType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentTypeName" Data..=)
+              Prelude.<$> componentTypeName,
+            ("description" Data..=) Prelude.<$> description,
+            ("extendsFrom" Data..=) Prelude.<$> extendsFrom,
+            ("functions" Data..=) Prelude.<$> functions,
+            ("isSingleton" Data..=) Prelude.<$> isSingleton,
+            ("propertyDefinitions" Data..=)
+              Prelude.<$> propertyDefinitions,
+            ("propertyGroups" Data..=)
+              Prelude.<$> propertyGroups
+          ]
+      )
+
+instance Data.ToPath UpdateComponentType where
+  toPath UpdateComponentType' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/component-types/",
+        Data.toBS componentTypeId
+      ]
+
+instance Data.ToQuery UpdateComponentType where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateComponentTypeResponse' smart constructor.
+data UpdateComponentTypeResponse = UpdateComponentTypeResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the workspace that contains the component type.
+    workspaceId :: Prelude.Text,
+    -- | The ARN of the component type.
+    arn :: Prelude.Text,
+    -- | The ID of the component type.
+    componentTypeId :: Prelude.Text,
+    -- | The current state of the component type.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateComponentTypeResponse' 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', 'updateComponentTypeResponse_httpStatus' - The response's http status code.
+--
+-- 'workspaceId', 'updateComponentTypeResponse_workspaceId' - The ID of the workspace that contains the component type.
+--
+-- 'arn', 'updateComponentTypeResponse_arn' - The ARN of the component type.
+--
+-- 'componentTypeId', 'updateComponentTypeResponse_componentTypeId' - The ID of the component type.
+--
+-- 'state', 'updateComponentTypeResponse_state' - The current state of the component type.
+newUpdateComponentTypeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'componentTypeId'
+  Prelude.Text ->
+  -- | 'state'
+  State ->
+  UpdateComponentTypeResponse
+newUpdateComponentTypeResponse
+  pHttpStatus_
+  pWorkspaceId_
+  pArn_
+  pComponentTypeId_
+  pState_ =
+    UpdateComponentTypeResponse'
+      { httpStatus =
+          pHttpStatus_,
+        workspaceId = pWorkspaceId_,
+        arn = pArn_,
+        componentTypeId = pComponentTypeId_,
+        state = pState_
+      }
+
+-- | The response's http status code.
+updateComponentTypeResponse_httpStatus :: Lens.Lens' UpdateComponentTypeResponse Prelude.Int
+updateComponentTypeResponse_httpStatus = Lens.lens (\UpdateComponentTypeResponse' {httpStatus} -> httpStatus) (\s@UpdateComponentTypeResponse' {} a -> s {httpStatus = a} :: UpdateComponentTypeResponse)
+
+-- | The ID of the workspace that contains the component type.
+updateComponentTypeResponse_workspaceId :: Lens.Lens' UpdateComponentTypeResponse Prelude.Text
+updateComponentTypeResponse_workspaceId = Lens.lens (\UpdateComponentTypeResponse' {workspaceId} -> workspaceId) (\s@UpdateComponentTypeResponse' {} a -> s {workspaceId = a} :: UpdateComponentTypeResponse)
+
+-- | The ARN of the component type.
+updateComponentTypeResponse_arn :: Lens.Lens' UpdateComponentTypeResponse Prelude.Text
+updateComponentTypeResponse_arn = Lens.lens (\UpdateComponentTypeResponse' {arn} -> arn) (\s@UpdateComponentTypeResponse' {} a -> s {arn = a} :: UpdateComponentTypeResponse)
+
+-- | The ID of the component type.
+updateComponentTypeResponse_componentTypeId :: Lens.Lens' UpdateComponentTypeResponse Prelude.Text
+updateComponentTypeResponse_componentTypeId = Lens.lens (\UpdateComponentTypeResponse' {componentTypeId} -> componentTypeId) (\s@UpdateComponentTypeResponse' {} a -> s {componentTypeId = a} :: UpdateComponentTypeResponse)
+
+-- | The current state of the component type.
+updateComponentTypeResponse_state :: Lens.Lens' UpdateComponentTypeResponse State
+updateComponentTypeResponse_state = Lens.lens (\UpdateComponentTypeResponse' {state} -> state) (\s@UpdateComponentTypeResponse' {} a -> s {state = a} :: UpdateComponentTypeResponse)
+
+instance Prelude.NFData UpdateComponentTypeResponse where
+  rnf UpdateComponentTypeResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf componentTypeId
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/UpdateEntity.hs b/gen/Amazonka/IotTwinMaker/UpdateEntity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UpdateEntity.hs
@@ -0,0 +1,261 @@
+{-# 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.IotTwinMaker.UpdateEntity
+-- 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 an entity.
+module Amazonka.IotTwinMaker.UpdateEntity
+  ( -- * Creating a Request
+    UpdateEntity (..),
+    newUpdateEntity,
+
+    -- * Request Lenses
+    updateEntity_componentUpdates,
+    updateEntity_description,
+    updateEntity_entityName,
+    updateEntity_parentEntityUpdate,
+    updateEntity_workspaceId,
+    updateEntity_entityId,
+
+    -- * Destructuring the Response
+    UpdateEntityResponse (..),
+    newUpdateEntityResponse,
+
+    -- * Response Lenses
+    updateEntityResponse_httpStatus,
+    updateEntityResponse_updateDateTime,
+    updateEntityResponse_state,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateEntity' smart constructor.
+data UpdateEntity = UpdateEntity'
+  { -- | An object that maps strings to the component updates in the request.
+    -- Each string in the mapping must be unique to this object.
+    componentUpdates :: Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentUpdateRequest),
+    -- | The description of the entity.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The name of the entity.
+    entityName :: Prelude.Maybe Prelude.Text,
+    -- | An object that describes the update request for a parent entity.
+    parentEntityUpdate :: Prelude.Maybe ParentEntityUpdateRequest,
+    -- | The ID of the workspace that contains the entity.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the entity.
+    entityId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEntity' 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:
+--
+-- 'componentUpdates', 'updateEntity_componentUpdates' - An object that maps strings to the component updates in the request.
+-- Each string in the mapping must be unique to this object.
+--
+-- 'description', 'updateEntity_description' - The description of the entity.
+--
+-- 'entityName', 'updateEntity_entityName' - The name of the entity.
+--
+-- 'parentEntityUpdate', 'updateEntity_parentEntityUpdate' - An object that describes the update request for a parent entity.
+--
+-- 'workspaceId', 'updateEntity_workspaceId' - The ID of the workspace that contains the entity.
+--
+-- 'entityId', 'updateEntity_entityId' - The ID of the entity.
+newUpdateEntity ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'entityId'
+  Prelude.Text ->
+  UpdateEntity
+newUpdateEntity pWorkspaceId_ pEntityId_ =
+  UpdateEntity'
+    { componentUpdates = Prelude.Nothing,
+      description = Prelude.Nothing,
+      entityName = Prelude.Nothing,
+      parentEntityUpdate = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      entityId = pEntityId_
+    }
+
+-- | An object that maps strings to the component updates in the request.
+-- Each string in the mapping must be unique to this object.
+updateEntity_componentUpdates :: Lens.Lens' UpdateEntity (Prelude.Maybe (Prelude.HashMap Prelude.Text ComponentUpdateRequest))
+updateEntity_componentUpdates = Lens.lens (\UpdateEntity' {componentUpdates} -> componentUpdates) (\s@UpdateEntity' {} a -> s {componentUpdates = a} :: UpdateEntity) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the entity.
+updateEntity_description :: Lens.Lens' UpdateEntity (Prelude.Maybe Prelude.Text)
+updateEntity_description = Lens.lens (\UpdateEntity' {description} -> description) (\s@UpdateEntity' {} a -> s {description = a} :: UpdateEntity)
+
+-- | The name of the entity.
+updateEntity_entityName :: Lens.Lens' UpdateEntity (Prelude.Maybe Prelude.Text)
+updateEntity_entityName = Lens.lens (\UpdateEntity' {entityName} -> entityName) (\s@UpdateEntity' {} a -> s {entityName = a} :: UpdateEntity)
+
+-- | An object that describes the update request for a parent entity.
+updateEntity_parentEntityUpdate :: Lens.Lens' UpdateEntity (Prelude.Maybe ParentEntityUpdateRequest)
+updateEntity_parentEntityUpdate = Lens.lens (\UpdateEntity' {parentEntityUpdate} -> parentEntityUpdate) (\s@UpdateEntity' {} a -> s {parentEntityUpdate = a} :: UpdateEntity)
+
+-- | The ID of the workspace that contains the entity.
+updateEntity_workspaceId :: Lens.Lens' UpdateEntity Prelude.Text
+updateEntity_workspaceId = Lens.lens (\UpdateEntity' {workspaceId} -> workspaceId) (\s@UpdateEntity' {} a -> s {workspaceId = a} :: UpdateEntity)
+
+-- | The ID of the entity.
+updateEntity_entityId :: Lens.Lens' UpdateEntity Prelude.Text
+updateEntity_entityId = Lens.lens (\UpdateEntity' {entityId} -> entityId) (\s@UpdateEntity' {} a -> s {entityId = a} :: UpdateEntity)
+
+instance Core.AWSRequest UpdateEntity where
+  type AWSResponse UpdateEntity = UpdateEntityResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateEntityResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "updateDateTime")
+            Prelude.<*> (x Data..:> "state")
+      )
+
+instance Prelude.Hashable UpdateEntity where
+  hashWithSalt _salt UpdateEntity' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentUpdates
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` entityName
+      `Prelude.hashWithSalt` parentEntityUpdate
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` entityId
+
+instance Prelude.NFData UpdateEntity where
+  rnf UpdateEntity' {..} =
+    Prelude.rnf componentUpdates
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf entityName
+      `Prelude.seq` Prelude.rnf parentEntityUpdate
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf entityId
+
+instance Data.ToHeaders UpdateEntity where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateEntity where
+  toJSON UpdateEntity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("componentUpdates" Data..=)
+              Prelude.<$> componentUpdates,
+            ("description" Data..=) Prelude.<$> description,
+            ("entityName" Data..=) Prelude.<$> entityName,
+            ("parentEntityUpdate" Data..=)
+              Prelude.<$> parentEntityUpdate
+          ]
+      )
+
+instance Data.ToPath UpdateEntity where
+  toPath UpdateEntity' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/entities/",
+        Data.toBS entityId
+      ]
+
+instance Data.ToQuery UpdateEntity where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateEntityResponse' smart constructor.
+data UpdateEntityResponse = UpdateEntityResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The date and time when the entity was last updated.
+    updateDateTime :: Data.POSIX,
+    -- | The current state of the entity update.
+    state :: State
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEntityResponse' 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', 'updateEntityResponse_httpStatus' - The response's http status code.
+--
+-- 'updateDateTime', 'updateEntityResponse_updateDateTime' - The date and time when the entity was last updated.
+--
+-- 'state', 'updateEntityResponse_state' - The current state of the entity update.
+newUpdateEntityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  -- | 'state'
+  State ->
+  UpdateEntityResponse
+newUpdateEntityResponse
+  pHttpStatus_
+  pUpdateDateTime_
+  pState_ =
+    UpdateEntityResponse'
+      { httpStatus = pHttpStatus_,
+        updateDateTime = Data._Time Lens.# pUpdateDateTime_,
+        state = pState_
+      }
+
+-- | The response's http status code.
+updateEntityResponse_httpStatus :: Lens.Lens' UpdateEntityResponse Prelude.Int
+updateEntityResponse_httpStatus = Lens.lens (\UpdateEntityResponse' {httpStatus} -> httpStatus) (\s@UpdateEntityResponse' {} a -> s {httpStatus = a} :: UpdateEntityResponse)
+
+-- | The date and time when the entity was last updated.
+updateEntityResponse_updateDateTime :: Lens.Lens' UpdateEntityResponse Prelude.UTCTime
+updateEntityResponse_updateDateTime = Lens.lens (\UpdateEntityResponse' {updateDateTime} -> updateDateTime) (\s@UpdateEntityResponse' {} a -> s {updateDateTime = a} :: UpdateEntityResponse) Prelude.. Data._Time
+
+-- | The current state of the entity update.
+updateEntityResponse_state :: Lens.Lens' UpdateEntityResponse State
+updateEntityResponse_state = Lens.lens (\UpdateEntityResponse' {state} -> state) (\s@UpdateEntityResponse' {} a -> s {state = a} :: UpdateEntityResponse)
+
+instance Prelude.NFData UpdateEntityResponse where
+  rnf UpdateEntityResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf updateDateTime
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IotTwinMaker/UpdatePricingPlan.hs b/gen/Amazonka/IotTwinMaker/UpdatePricingPlan.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UpdatePricingPlan.hs
@@ -0,0 +1,198 @@
+{-# 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.IotTwinMaker.UpdatePricingPlan
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Update the pricing plan.
+module Amazonka.IotTwinMaker.UpdatePricingPlan
+  ( -- * Creating a Request
+    UpdatePricingPlan (..),
+    newUpdatePricingPlan,
+
+    -- * Request Lenses
+    updatePricingPlan_bundleNames,
+    updatePricingPlan_pricingMode,
+
+    -- * Destructuring the Response
+    UpdatePricingPlanResponse (..),
+    newUpdatePricingPlanResponse,
+
+    -- * Response Lenses
+    updatePricingPlanResponse_pendingPricingPlan,
+    updatePricingPlanResponse_httpStatus,
+    updatePricingPlanResponse_currentPricingPlan,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdatePricingPlan' smart constructor.
+data UpdatePricingPlan = UpdatePricingPlan'
+  { -- | The bundle names.
+    bundleNames :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The pricing mode.
+    pricingMode :: PricingMode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePricingPlan' 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:
+--
+-- 'bundleNames', 'updatePricingPlan_bundleNames' - The bundle names.
+--
+-- 'pricingMode', 'updatePricingPlan_pricingMode' - The pricing mode.
+newUpdatePricingPlan ::
+  -- | 'pricingMode'
+  PricingMode ->
+  UpdatePricingPlan
+newUpdatePricingPlan pPricingMode_ =
+  UpdatePricingPlan'
+    { bundleNames = Prelude.Nothing,
+      pricingMode = pPricingMode_
+    }
+
+-- | The bundle names.
+updatePricingPlan_bundleNames :: Lens.Lens' UpdatePricingPlan (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updatePricingPlan_bundleNames = Lens.lens (\UpdatePricingPlan' {bundleNames} -> bundleNames) (\s@UpdatePricingPlan' {} a -> s {bundleNames = a} :: UpdatePricingPlan) Prelude.. Lens.mapping Lens.coerced
+
+-- | The pricing mode.
+updatePricingPlan_pricingMode :: Lens.Lens' UpdatePricingPlan PricingMode
+updatePricingPlan_pricingMode = Lens.lens (\UpdatePricingPlan' {pricingMode} -> pricingMode) (\s@UpdatePricingPlan' {} a -> s {pricingMode = a} :: UpdatePricingPlan)
+
+instance Core.AWSRequest UpdatePricingPlan where
+  type
+    AWSResponse UpdatePricingPlan =
+      UpdatePricingPlanResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePricingPlanResponse'
+            Prelude.<$> (x Data..?> "pendingPricingPlan")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "currentPricingPlan")
+      )
+
+instance Prelude.Hashable UpdatePricingPlan where
+  hashWithSalt _salt UpdatePricingPlan' {..} =
+    _salt
+      `Prelude.hashWithSalt` bundleNames
+      `Prelude.hashWithSalt` pricingMode
+
+instance Prelude.NFData UpdatePricingPlan where
+  rnf UpdatePricingPlan' {..} =
+    Prelude.rnf bundleNames
+      `Prelude.seq` Prelude.rnf pricingMode
+
+instance Data.ToHeaders UpdatePricingPlan where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdatePricingPlan where
+  toJSON UpdatePricingPlan' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("bundleNames" Data..=) Prelude.<$> bundleNames,
+            Prelude.Just ("pricingMode" Data..= pricingMode)
+          ]
+      )
+
+instance Data.ToPath UpdatePricingPlan where
+  toPath = Prelude.const "/pricingplan"
+
+instance Data.ToQuery UpdatePricingPlan where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdatePricingPlanResponse' smart constructor.
+data UpdatePricingPlanResponse = UpdatePricingPlanResponse'
+  { -- | Update the pending pricing plan.
+    pendingPricingPlan :: Prelude.Maybe PricingPlan,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Update the current pricing plan.
+    currentPricingPlan :: PricingPlan
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePricingPlanResponse' 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:
+--
+-- 'pendingPricingPlan', 'updatePricingPlanResponse_pendingPricingPlan' - Update the pending pricing plan.
+--
+-- 'httpStatus', 'updatePricingPlanResponse_httpStatus' - The response's http status code.
+--
+-- 'currentPricingPlan', 'updatePricingPlanResponse_currentPricingPlan' - Update the current pricing plan.
+newUpdatePricingPlanResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'currentPricingPlan'
+  PricingPlan ->
+  UpdatePricingPlanResponse
+newUpdatePricingPlanResponse
+  pHttpStatus_
+  pCurrentPricingPlan_ =
+    UpdatePricingPlanResponse'
+      { pendingPricingPlan =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        currentPricingPlan = pCurrentPricingPlan_
+      }
+
+-- | Update the pending pricing plan.
+updatePricingPlanResponse_pendingPricingPlan :: Lens.Lens' UpdatePricingPlanResponse (Prelude.Maybe PricingPlan)
+updatePricingPlanResponse_pendingPricingPlan = Lens.lens (\UpdatePricingPlanResponse' {pendingPricingPlan} -> pendingPricingPlan) (\s@UpdatePricingPlanResponse' {} a -> s {pendingPricingPlan = a} :: UpdatePricingPlanResponse)
+
+-- | The response's http status code.
+updatePricingPlanResponse_httpStatus :: Lens.Lens' UpdatePricingPlanResponse Prelude.Int
+updatePricingPlanResponse_httpStatus = Lens.lens (\UpdatePricingPlanResponse' {httpStatus} -> httpStatus) (\s@UpdatePricingPlanResponse' {} a -> s {httpStatus = a} :: UpdatePricingPlanResponse)
+
+-- | Update the current pricing plan.
+updatePricingPlanResponse_currentPricingPlan :: Lens.Lens' UpdatePricingPlanResponse PricingPlan
+updatePricingPlanResponse_currentPricingPlan = Lens.lens (\UpdatePricingPlanResponse' {currentPricingPlan} -> currentPricingPlan) (\s@UpdatePricingPlanResponse' {} a -> s {currentPricingPlan = a} :: UpdatePricingPlanResponse)
+
+instance Prelude.NFData UpdatePricingPlanResponse where
+  rnf UpdatePricingPlanResponse' {..} =
+    Prelude.rnf pendingPricingPlan
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf currentPricingPlan
diff --git a/gen/Amazonka/IotTwinMaker/UpdateScene.hs b/gen/Amazonka/IotTwinMaker/UpdateScene.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UpdateScene.hs
@@ -0,0 +1,230 @@
+{-# 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.IotTwinMaker.UpdateScene
+-- 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 a scene.
+module Amazonka.IotTwinMaker.UpdateScene
+  ( -- * Creating a Request
+    UpdateScene (..),
+    newUpdateScene,
+
+    -- * Request Lenses
+    updateScene_capabilities,
+    updateScene_contentLocation,
+    updateScene_description,
+    updateScene_workspaceId,
+    updateScene_sceneId,
+
+    -- * Destructuring the Response
+    UpdateSceneResponse (..),
+    newUpdateSceneResponse,
+
+    -- * Response Lenses
+    updateSceneResponse_httpStatus,
+    updateSceneResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateScene' smart constructor.
+data UpdateScene = UpdateScene'
+  { -- | A list of capabilities that the scene uses to render.
+    capabilities :: Prelude.Maybe [Prelude.Text],
+    -- | The relative path that specifies the location of the content definition
+    -- file.
+    contentLocation :: Prelude.Maybe Prelude.Text,
+    -- | The description of this scene.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace that contains the scene.
+    workspaceId :: Prelude.Text,
+    -- | The ID of the scene.
+    sceneId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateScene' 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:
+--
+-- 'capabilities', 'updateScene_capabilities' - A list of capabilities that the scene uses to render.
+--
+-- 'contentLocation', 'updateScene_contentLocation' - The relative path that specifies the location of the content definition
+-- file.
+--
+-- 'description', 'updateScene_description' - The description of this scene.
+--
+-- 'workspaceId', 'updateScene_workspaceId' - The ID of the workspace that contains the scene.
+--
+-- 'sceneId', 'updateScene_sceneId' - The ID of the scene.
+newUpdateScene ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  -- | 'sceneId'
+  Prelude.Text ->
+  UpdateScene
+newUpdateScene pWorkspaceId_ pSceneId_ =
+  UpdateScene'
+    { capabilities = Prelude.Nothing,
+      contentLocation = Prelude.Nothing,
+      description = Prelude.Nothing,
+      workspaceId = pWorkspaceId_,
+      sceneId = pSceneId_
+    }
+
+-- | A list of capabilities that the scene uses to render.
+updateScene_capabilities :: Lens.Lens' UpdateScene (Prelude.Maybe [Prelude.Text])
+updateScene_capabilities = Lens.lens (\UpdateScene' {capabilities} -> capabilities) (\s@UpdateScene' {} a -> s {capabilities = a} :: UpdateScene) Prelude.. Lens.mapping Lens.coerced
+
+-- | The relative path that specifies the location of the content definition
+-- file.
+updateScene_contentLocation :: Lens.Lens' UpdateScene (Prelude.Maybe Prelude.Text)
+updateScene_contentLocation = Lens.lens (\UpdateScene' {contentLocation} -> contentLocation) (\s@UpdateScene' {} a -> s {contentLocation = a} :: UpdateScene)
+
+-- | The description of this scene.
+updateScene_description :: Lens.Lens' UpdateScene (Prelude.Maybe Prelude.Text)
+updateScene_description = Lens.lens (\UpdateScene' {description} -> description) (\s@UpdateScene' {} a -> s {description = a} :: UpdateScene)
+
+-- | The ID of the workspace that contains the scene.
+updateScene_workspaceId :: Lens.Lens' UpdateScene Prelude.Text
+updateScene_workspaceId = Lens.lens (\UpdateScene' {workspaceId} -> workspaceId) (\s@UpdateScene' {} a -> s {workspaceId = a} :: UpdateScene)
+
+-- | The ID of the scene.
+updateScene_sceneId :: Lens.Lens' UpdateScene Prelude.Text
+updateScene_sceneId = Lens.lens (\UpdateScene' {sceneId} -> sceneId) (\s@UpdateScene' {} a -> s {sceneId = a} :: UpdateScene)
+
+instance Core.AWSRequest UpdateScene where
+  type AWSResponse UpdateScene = UpdateSceneResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateSceneResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable UpdateScene where
+  hashWithSalt _salt UpdateScene' {..} =
+    _salt
+      `Prelude.hashWithSalt` capabilities
+      `Prelude.hashWithSalt` contentLocation
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` workspaceId
+      `Prelude.hashWithSalt` sceneId
+
+instance Prelude.NFData UpdateScene where
+  rnf UpdateScene' {..} =
+    Prelude.rnf capabilities
+      `Prelude.seq` Prelude.rnf contentLocation
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf workspaceId
+      `Prelude.seq` Prelude.rnf sceneId
+
+instance Data.ToHeaders UpdateScene where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateScene where
+  toJSON UpdateScene' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("capabilities" Data..=) Prelude.<$> capabilities,
+            ("contentLocation" Data..=)
+              Prelude.<$> contentLocation,
+            ("description" Data..=) Prelude.<$> description
+          ]
+      )
+
+instance Data.ToPath UpdateScene where
+  toPath UpdateScene' {..} =
+    Prelude.mconcat
+      [ "/workspaces/",
+        Data.toBS workspaceId,
+        "/scenes/",
+        Data.toBS sceneId
+      ]
+
+instance Data.ToQuery UpdateScene where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateSceneResponse' smart constructor.
+data UpdateSceneResponse = UpdateSceneResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The date and time when the scene was last updated.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSceneResponse' 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', 'updateSceneResponse_httpStatus' - The response's http status code.
+--
+-- 'updateDateTime', 'updateSceneResponse_updateDateTime' - The date and time when the scene was last updated.
+newUpdateSceneResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  UpdateSceneResponse
+newUpdateSceneResponse pHttpStatus_ pUpdateDateTime_ =
+  UpdateSceneResponse'
+    { httpStatus = pHttpStatus_,
+      updateDateTime = Data._Time Lens.# pUpdateDateTime_
+    }
+
+-- | The response's http status code.
+updateSceneResponse_httpStatus :: Lens.Lens' UpdateSceneResponse Prelude.Int
+updateSceneResponse_httpStatus = Lens.lens (\UpdateSceneResponse' {httpStatus} -> httpStatus) (\s@UpdateSceneResponse' {} a -> s {httpStatus = a} :: UpdateSceneResponse)
+
+-- | The date and time when the scene was last updated.
+updateSceneResponse_updateDateTime :: Lens.Lens' UpdateSceneResponse Prelude.UTCTime
+updateSceneResponse_updateDateTime = Lens.lens (\UpdateSceneResponse' {updateDateTime} -> updateDateTime) (\s@UpdateSceneResponse' {} a -> s {updateDateTime = a} :: UpdateSceneResponse) Prelude.. Data._Time
+
+instance Prelude.NFData UpdateSceneResponse where
+  rnf UpdateSceneResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/UpdateWorkspace.hs b/gen/Amazonka/IotTwinMaker/UpdateWorkspace.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/UpdateWorkspace.hs
@@ -0,0 +1,200 @@
+{-# 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.IotTwinMaker.UpdateWorkspace
+-- 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 a workspace.
+module Amazonka.IotTwinMaker.UpdateWorkspace
+  ( -- * Creating a Request
+    UpdateWorkspace (..),
+    newUpdateWorkspace,
+
+    -- * Request Lenses
+    updateWorkspace_description,
+    updateWorkspace_role,
+    updateWorkspace_workspaceId,
+
+    -- * Destructuring the Response
+    UpdateWorkspaceResponse (..),
+    newUpdateWorkspaceResponse,
+
+    -- * Response Lenses
+    updateWorkspaceResponse_httpStatus,
+    updateWorkspaceResponse_updateDateTime,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateWorkspace' smart constructor.
+data UpdateWorkspace = UpdateWorkspace'
+  { -- | The description of the workspace.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the execution role associated with the workspace.
+    role' :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the workspace.
+    workspaceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateWorkspace' 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:
+--
+-- 'description', 'updateWorkspace_description' - The description of the workspace.
+--
+-- 'role'', 'updateWorkspace_role' - The ARN of the execution role associated with the workspace.
+--
+-- 'workspaceId', 'updateWorkspace_workspaceId' - The ID of the workspace.
+newUpdateWorkspace ::
+  -- | 'workspaceId'
+  Prelude.Text ->
+  UpdateWorkspace
+newUpdateWorkspace pWorkspaceId_ =
+  UpdateWorkspace'
+    { description = Prelude.Nothing,
+      role' = Prelude.Nothing,
+      workspaceId = pWorkspaceId_
+    }
+
+-- | The description of the workspace.
+updateWorkspace_description :: Lens.Lens' UpdateWorkspace (Prelude.Maybe Prelude.Text)
+updateWorkspace_description = Lens.lens (\UpdateWorkspace' {description} -> description) (\s@UpdateWorkspace' {} a -> s {description = a} :: UpdateWorkspace)
+
+-- | The ARN of the execution role associated with the workspace.
+updateWorkspace_role :: Lens.Lens' UpdateWorkspace (Prelude.Maybe Prelude.Text)
+updateWorkspace_role = Lens.lens (\UpdateWorkspace' {role'} -> role') (\s@UpdateWorkspace' {} a -> s {role' = a} :: UpdateWorkspace)
+
+-- | The ID of the workspace.
+updateWorkspace_workspaceId :: Lens.Lens' UpdateWorkspace Prelude.Text
+updateWorkspace_workspaceId = Lens.lens (\UpdateWorkspace' {workspaceId} -> workspaceId) (\s@UpdateWorkspace' {} a -> s {workspaceId = a} :: UpdateWorkspace)
+
+instance Core.AWSRequest UpdateWorkspace where
+  type
+    AWSResponse UpdateWorkspace =
+      UpdateWorkspaceResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateWorkspaceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "updateDateTime")
+      )
+
+instance Prelude.Hashable UpdateWorkspace where
+  hashWithSalt _salt UpdateWorkspace' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` role'
+      `Prelude.hashWithSalt` workspaceId
+
+instance Prelude.NFData UpdateWorkspace where
+  rnf UpdateWorkspace' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf role'
+      `Prelude.seq` Prelude.rnf workspaceId
+
+instance Data.ToHeaders UpdateWorkspace where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateWorkspace where
+  toJSON UpdateWorkspace' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("role" Data..=) Prelude.<$> role'
+          ]
+      )
+
+instance Data.ToPath UpdateWorkspace where
+  toPath UpdateWorkspace' {..} =
+    Prelude.mconcat
+      ["/workspaces/", Data.toBS workspaceId]
+
+instance Data.ToQuery UpdateWorkspace where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateWorkspaceResponse' smart constructor.
+data UpdateWorkspaceResponse = UpdateWorkspaceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The date and time of the current update.
+    updateDateTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateWorkspaceResponse' 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', 'updateWorkspaceResponse_httpStatus' - The response's http status code.
+--
+-- 'updateDateTime', 'updateWorkspaceResponse_updateDateTime' - The date and time of the current update.
+newUpdateWorkspaceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'updateDateTime'
+  Prelude.UTCTime ->
+  UpdateWorkspaceResponse
+newUpdateWorkspaceResponse
+  pHttpStatus_
+  pUpdateDateTime_ =
+    UpdateWorkspaceResponse'
+      { httpStatus = pHttpStatus_,
+        updateDateTime =
+          Data._Time Lens.# pUpdateDateTime_
+      }
+
+-- | The response's http status code.
+updateWorkspaceResponse_httpStatus :: Lens.Lens' UpdateWorkspaceResponse Prelude.Int
+updateWorkspaceResponse_httpStatus = Lens.lens (\UpdateWorkspaceResponse' {httpStatus} -> httpStatus) (\s@UpdateWorkspaceResponse' {} a -> s {httpStatus = a} :: UpdateWorkspaceResponse)
+
+-- | The date and time of the current update.
+updateWorkspaceResponse_updateDateTime :: Lens.Lens' UpdateWorkspaceResponse Prelude.UTCTime
+updateWorkspaceResponse_updateDateTime = Lens.lens (\UpdateWorkspaceResponse' {updateDateTime} -> updateDateTime) (\s@UpdateWorkspaceResponse' {} a -> s {updateDateTime = a} :: UpdateWorkspaceResponse) Prelude.. Data._Time
+
+instance Prelude.NFData UpdateWorkspaceResponse where
+  rnf UpdateWorkspaceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf updateDateTime
diff --git a/gen/Amazonka/IotTwinMaker/Waiters.hs b/gen/Amazonka/IotTwinMaker/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IotTwinMaker/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.IotTwinMaker.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.IotTwinMaker.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IotTwinMaker.Lens
+import Amazonka.IotTwinMaker.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- 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 Main (main) where
+
+import Test.Amazonka.IotTwinMaker
+import Test.Amazonka.IotTwinMaker.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "IotTwinMaker"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/IotTwinMaker.hs b/test/Test/Amazonka/Gen/IotTwinMaker.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/IotTwinMaker.hs
@@ -0,0 +1,718 @@
+{-# 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.IotTwinMaker
+-- 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.IotTwinMaker where
+
+import Amazonka.IotTwinMaker
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.IotTwinMaker.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"
+--         [ requestBatchPutPropertyValues $
+--             newBatchPutPropertyValues
+--
+--         , requestCreateComponentType $
+--             newCreateComponentType
+--
+--         , requestCreateEntity $
+--             newCreateEntity
+--
+--         , requestCreateScene $
+--             newCreateScene
+--
+--         , requestCreateSyncJob $
+--             newCreateSyncJob
+--
+--         , requestCreateWorkspace $
+--             newCreateWorkspace
+--
+--         , requestDeleteComponentType $
+--             newDeleteComponentType
+--
+--         , requestDeleteEntity $
+--             newDeleteEntity
+--
+--         , requestDeleteScene $
+--             newDeleteScene
+--
+--         , requestDeleteSyncJob $
+--             newDeleteSyncJob
+--
+--         , requestDeleteWorkspace $
+--             newDeleteWorkspace
+--
+--         , requestExecuteQuery $
+--             newExecuteQuery
+--
+--         , requestGetComponentType $
+--             newGetComponentType
+--
+--         , requestGetEntity $
+--             newGetEntity
+--
+--         , requestGetPricingPlan $
+--             newGetPricingPlan
+--
+--         , requestGetPropertyValue $
+--             newGetPropertyValue
+--
+--         , requestGetPropertyValueHistory $
+--             newGetPropertyValueHistory
+--
+--         , requestGetScene $
+--             newGetScene
+--
+--         , requestGetSyncJob $
+--             newGetSyncJob
+--
+--         , requestGetWorkspace $
+--             newGetWorkspace
+--
+--         , requestListComponentTypes $
+--             newListComponentTypes
+--
+--         , requestListEntities $
+--             newListEntities
+--
+--         , requestListScenes $
+--             newListScenes
+--
+--         , requestListSyncJobs $
+--             newListSyncJobs
+--
+--         , requestListSyncResources $
+--             newListSyncResources
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListWorkspaces $
+--             newListWorkspaces
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateComponentType $
+--             newUpdateComponentType
+--
+--         , requestUpdateEntity $
+--             newUpdateEntity
+--
+--         , requestUpdatePricingPlan $
+--             newUpdatePricingPlan
+--
+--         , requestUpdateScene $
+--             newUpdateScene
+--
+--         , requestUpdateWorkspace $
+--             newUpdateWorkspace
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchPutPropertyValues $
+--             newBatchPutPropertyValuesResponse
+--
+--         , responseCreateComponentType $
+--             newCreateComponentTypeResponse
+--
+--         , responseCreateEntity $
+--             newCreateEntityResponse
+--
+--         , responseCreateScene $
+--             newCreateSceneResponse
+--
+--         , responseCreateSyncJob $
+--             newCreateSyncJobResponse
+--
+--         , responseCreateWorkspace $
+--             newCreateWorkspaceResponse
+--
+--         , responseDeleteComponentType $
+--             newDeleteComponentTypeResponse
+--
+--         , responseDeleteEntity $
+--             newDeleteEntityResponse
+--
+--         , responseDeleteScene $
+--             newDeleteSceneResponse
+--
+--         , responseDeleteSyncJob $
+--             newDeleteSyncJobResponse
+--
+--         , responseDeleteWorkspace $
+--             newDeleteWorkspaceResponse
+--
+--         , responseExecuteQuery $
+--             newExecuteQueryResponse
+--
+--         , responseGetComponentType $
+--             newGetComponentTypeResponse
+--
+--         , responseGetEntity $
+--             newGetEntityResponse
+--
+--         , responseGetPricingPlan $
+--             newGetPricingPlanResponse
+--
+--         , responseGetPropertyValue $
+--             newGetPropertyValueResponse
+--
+--         , responseGetPropertyValueHistory $
+--             newGetPropertyValueHistoryResponse
+--
+--         , responseGetScene $
+--             newGetSceneResponse
+--
+--         , responseGetSyncJob $
+--             newGetSyncJobResponse
+--
+--         , responseGetWorkspace $
+--             newGetWorkspaceResponse
+--
+--         , responseListComponentTypes $
+--             newListComponentTypesResponse
+--
+--         , responseListEntities $
+--             newListEntitiesResponse
+--
+--         , responseListScenes $
+--             newListScenesResponse
+--
+--         , responseListSyncJobs $
+--             newListSyncJobsResponse
+--
+--         , responseListSyncResources $
+--             newListSyncResourcesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListWorkspaces $
+--             newListWorkspacesResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateComponentType $
+--             newUpdateComponentTypeResponse
+--
+--         , responseUpdateEntity $
+--             newUpdateEntityResponse
+--
+--         , responseUpdatePricingPlan $
+--             newUpdatePricingPlanResponse
+--
+--         , responseUpdateScene $
+--             newUpdateSceneResponse
+--
+--         , responseUpdateWorkspace $
+--             newUpdateWorkspaceResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchPutPropertyValues :: BatchPutPropertyValues -> TestTree
+requestBatchPutPropertyValues =
+  req
+    "BatchPutPropertyValues"
+    "fixture/BatchPutPropertyValues.yaml"
+
+requestCreateComponentType :: CreateComponentType -> TestTree
+requestCreateComponentType =
+  req
+    "CreateComponentType"
+    "fixture/CreateComponentType.yaml"
+
+requestCreateEntity :: CreateEntity -> TestTree
+requestCreateEntity =
+  req
+    "CreateEntity"
+    "fixture/CreateEntity.yaml"
+
+requestCreateScene :: CreateScene -> TestTree
+requestCreateScene =
+  req
+    "CreateScene"
+    "fixture/CreateScene.yaml"
+
+requestCreateSyncJob :: CreateSyncJob -> TestTree
+requestCreateSyncJob =
+  req
+    "CreateSyncJob"
+    "fixture/CreateSyncJob.yaml"
+
+requestCreateWorkspace :: CreateWorkspace -> TestTree
+requestCreateWorkspace =
+  req
+    "CreateWorkspace"
+    "fixture/CreateWorkspace.yaml"
+
+requestDeleteComponentType :: DeleteComponentType -> TestTree
+requestDeleteComponentType =
+  req
+    "DeleteComponentType"
+    "fixture/DeleteComponentType.yaml"
+
+requestDeleteEntity :: DeleteEntity -> TestTree
+requestDeleteEntity =
+  req
+    "DeleteEntity"
+    "fixture/DeleteEntity.yaml"
+
+requestDeleteScene :: DeleteScene -> TestTree
+requestDeleteScene =
+  req
+    "DeleteScene"
+    "fixture/DeleteScene.yaml"
+
+requestDeleteSyncJob :: DeleteSyncJob -> TestTree
+requestDeleteSyncJob =
+  req
+    "DeleteSyncJob"
+    "fixture/DeleteSyncJob.yaml"
+
+requestDeleteWorkspace :: DeleteWorkspace -> TestTree
+requestDeleteWorkspace =
+  req
+    "DeleteWorkspace"
+    "fixture/DeleteWorkspace.yaml"
+
+requestExecuteQuery :: ExecuteQuery -> TestTree
+requestExecuteQuery =
+  req
+    "ExecuteQuery"
+    "fixture/ExecuteQuery.yaml"
+
+requestGetComponentType :: GetComponentType -> TestTree
+requestGetComponentType =
+  req
+    "GetComponentType"
+    "fixture/GetComponentType.yaml"
+
+requestGetEntity :: GetEntity -> TestTree
+requestGetEntity =
+  req
+    "GetEntity"
+    "fixture/GetEntity.yaml"
+
+requestGetPricingPlan :: GetPricingPlan -> TestTree
+requestGetPricingPlan =
+  req
+    "GetPricingPlan"
+    "fixture/GetPricingPlan.yaml"
+
+requestGetPropertyValue :: GetPropertyValue -> TestTree
+requestGetPropertyValue =
+  req
+    "GetPropertyValue"
+    "fixture/GetPropertyValue.yaml"
+
+requestGetPropertyValueHistory :: GetPropertyValueHistory -> TestTree
+requestGetPropertyValueHistory =
+  req
+    "GetPropertyValueHistory"
+    "fixture/GetPropertyValueHistory.yaml"
+
+requestGetScene :: GetScene -> TestTree
+requestGetScene =
+  req
+    "GetScene"
+    "fixture/GetScene.yaml"
+
+requestGetSyncJob :: GetSyncJob -> TestTree
+requestGetSyncJob =
+  req
+    "GetSyncJob"
+    "fixture/GetSyncJob.yaml"
+
+requestGetWorkspace :: GetWorkspace -> TestTree
+requestGetWorkspace =
+  req
+    "GetWorkspace"
+    "fixture/GetWorkspace.yaml"
+
+requestListComponentTypes :: ListComponentTypes -> TestTree
+requestListComponentTypes =
+  req
+    "ListComponentTypes"
+    "fixture/ListComponentTypes.yaml"
+
+requestListEntities :: ListEntities -> TestTree
+requestListEntities =
+  req
+    "ListEntities"
+    "fixture/ListEntities.yaml"
+
+requestListScenes :: ListScenes -> TestTree
+requestListScenes =
+  req
+    "ListScenes"
+    "fixture/ListScenes.yaml"
+
+requestListSyncJobs :: ListSyncJobs -> TestTree
+requestListSyncJobs =
+  req
+    "ListSyncJobs"
+    "fixture/ListSyncJobs.yaml"
+
+requestListSyncResources :: ListSyncResources -> TestTree
+requestListSyncResources =
+  req
+    "ListSyncResources"
+    "fixture/ListSyncResources.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListWorkspaces :: ListWorkspaces -> TestTree
+requestListWorkspaces =
+  req
+    "ListWorkspaces"
+    "fixture/ListWorkspaces.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateComponentType :: UpdateComponentType -> TestTree
+requestUpdateComponentType =
+  req
+    "UpdateComponentType"
+    "fixture/UpdateComponentType.yaml"
+
+requestUpdateEntity :: UpdateEntity -> TestTree
+requestUpdateEntity =
+  req
+    "UpdateEntity"
+    "fixture/UpdateEntity.yaml"
+
+requestUpdatePricingPlan :: UpdatePricingPlan -> TestTree
+requestUpdatePricingPlan =
+  req
+    "UpdatePricingPlan"
+    "fixture/UpdatePricingPlan.yaml"
+
+requestUpdateScene :: UpdateScene -> TestTree
+requestUpdateScene =
+  req
+    "UpdateScene"
+    "fixture/UpdateScene.yaml"
+
+requestUpdateWorkspace :: UpdateWorkspace -> TestTree
+requestUpdateWorkspace =
+  req
+    "UpdateWorkspace"
+    "fixture/UpdateWorkspace.yaml"
+
+-- Responses
+
+responseBatchPutPropertyValues :: BatchPutPropertyValuesResponse -> TestTree
+responseBatchPutPropertyValues =
+  res
+    "BatchPutPropertyValuesResponse"
+    "fixture/BatchPutPropertyValuesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchPutPropertyValues)
+
+responseCreateComponentType :: CreateComponentTypeResponse -> TestTree
+responseCreateComponentType =
+  res
+    "CreateComponentTypeResponse"
+    "fixture/CreateComponentTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateComponentType)
+
+responseCreateEntity :: CreateEntityResponse -> TestTree
+responseCreateEntity =
+  res
+    "CreateEntityResponse"
+    "fixture/CreateEntityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateEntity)
+
+responseCreateScene :: CreateSceneResponse -> TestTree
+responseCreateScene =
+  res
+    "CreateSceneResponse"
+    "fixture/CreateSceneResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateScene)
+
+responseCreateSyncJob :: CreateSyncJobResponse -> TestTree
+responseCreateSyncJob =
+  res
+    "CreateSyncJobResponse"
+    "fixture/CreateSyncJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSyncJob)
+
+responseCreateWorkspace :: CreateWorkspaceResponse -> TestTree
+responseCreateWorkspace =
+  res
+    "CreateWorkspaceResponse"
+    "fixture/CreateWorkspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateWorkspace)
+
+responseDeleteComponentType :: DeleteComponentTypeResponse -> TestTree
+responseDeleteComponentType =
+  res
+    "DeleteComponentTypeResponse"
+    "fixture/DeleteComponentTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteComponentType)
+
+responseDeleteEntity :: DeleteEntityResponse -> TestTree
+responseDeleteEntity =
+  res
+    "DeleteEntityResponse"
+    "fixture/DeleteEntityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteEntity)
+
+responseDeleteScene :: DeleteSceneResponse -> TestTree
+responseDeleteScene =
+  res
+    "DeleteSceneResponse"
+    "fixture/DeleteSceneResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteScene)
+
+responseDeleteSyncJob :: DeleteSyncJobResponse -> TestTree
+responseDeleteSyncJob =
+  res
+    "DeleteSyncJobResponse"
+    "fixture/DeleteSyncJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSyncJob)
+
+responseDeleteWorkspace :: DeleteWorkspaceResponse -> TestTree
+responseDeleteWorkspace =
+  res
+    "DeleteWorkspaceResponse"
+    "fixture/DeleteWorkspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteWorkspace)
+
+responseExecuteQuery :: ExecuteQueryResponse -> TestTree
+responseExecuteQuery =
+  res
+    "ExecuteQueryResponse"
+    "fixture/ExecuteQueryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ExecuteQuery)
+
+responseGetComponentType :: GetComponentTypeResponse -> TestTree
+responseGetComponentType =
+  res
+    "GetComponentTypeResponse"
+    "fixture/GetComponentTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetComponentType)
+
+responseGetEntity :: GetEntityResponse -> TestTree
+responseGetEntity =
+  res
+    "GetEntityResponse"
+    "fixture/GetEntityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetEntity)
+
+responseGetPricingPlan :: GetPricingPlanResponse -> TestTree
+responseGetPricingPlan =
+  res
+    "GetPricingPlanResponse"
+    "fixture/GetPricingPlanResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPricingPlan)
+
+responseGetPropertyValue :: GetPropertyValueResponse -> TestTree
+responseGetPropertyValue =
+  res
+    "GetPropertyValueResponse"
+    "fixture/GetPropertyValueResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPropertyValue)
+
+responseGetPropertyValueHistory :: GetPropertyValueHistoryResponse -> TestTree
+responseGetPropertyValueHistory =
+  res
+    "GetPropertyValueHistoryResponse"
+    "fixture/GetPropertyValueHistoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPropertyValueHistory)
+
+responseGetScene :: GetSceneResponse -> TestTree
+responseGetScene =
+  res
+    "GetSceneResponse"
+    "fixture/GetSceneResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetScene)
+
+responseGetSyncJob :: GetSyncJobResponse -> TestTree
+responseGetSyncJob =
+  res
+    "GetSyncJobResponse"
+    "fixture/GetSyncJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetSyncJob)
+
+responseGetWorkspace :: GetWorkspaceResponse -> TestTree
+responseGetWorkspace =
+  res
+    "GetWorkspaceResponse"
+    "fixture/GetWorkspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetWorkspace)
+
+responseListComponentTypes :: ListComponentTypesResponse -> TestTree
+responseListComponentTypes =
+  res
+    "ListComponentTypesResponse"
+    "fixture/ListComponentTypesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListComponentTypes)
+
+responseListEntities :: ListEntitiesResponse -> TestTree
+responseListEntities =
+  res
+    "ListEntitiesResponse"
+    "fixture/ListEntitiesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEntities)
+
+responseListScenes :: ListScenesResponse -> TestTree
+responseListScenes =
+  res
+    "ListScenesResponse"
+    "fixture/ListScenesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListScenes)
+
+responseListSyncJobs :: ListSyncJobsResponse -> TestTree
+responseListSyncJobs =
+  res
+    "ListSyncJobsResponse"
+    "fixture/ListSyncJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSyncJobs)
+
+responseListSyncResources :: ListSyncResourcesResponse -> TestTree
+responseListSyncResources =
+  res
+    "ListSyncResourcesResponse"
+    "fixture/ListSyncResourcesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSyncResources)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListWorkspaces :: ListWorkspacesResponse -> TestTree
+responseListWorkspaces =
+  res
+    "ListWorkspacesResponse"
+    "fixture/ListWorkspacesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListWorkspaces)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateComponentType :: UpdateComponentTypeResponse -> TestTree
+responseUpdateComponentType =
+  res
+    "UpdateComponentTypeResponse"
+    "fixture/UpdateComponentTypeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateComponentType)
+
+responseUpdateEntity :: UpdateEntityResponse -> TestTree
+responseUpdateEntity =
+  res
+    "UpdateEntityResponse"
+    "fixture/UpdateEntityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateEntity)
+
+responseUpdatePricingPlan :: UpdatePricingPlanResponse -> TestTree
+responseUpdatePricingPlan =
+  res
+    "UpdatePricingPlanResponse"
+    "fixture/UpdatePricingPlanResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePricingPlan)
+
+responseUpdateScene :: UpdateSceneResponse -> TestTree
+responseUpdateScene =
+  res
+    "UpdateSceneResponse"
+    "fixture/UpdateSceneResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateScene)
+
+responseUpdateWorkspace :: UpdateWorkspaceResponse -> TestTree
+responseUpdateWorkspace =
+  res
+    "UpdateWorkspaceResponse"
+    "fixture/UpdateWorkspaceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateWorkspace)
diff --git a/test/Test/Amazonka/IotTwinMaker.hs b/test/Test/Amazonka/IotTwinMaker.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IotTwinMaker.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.IotTwinMaker
+-- 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.IotTwinMaker
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/IotTwinMaker/Internal.hs b/test/Test/Amazonka/IotTwinMaker/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IotTwinMaker/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.IotTwinMaker.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.IotTwinMaker.Internal where
