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 SSO Identity Store SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-06-15@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-identitystore)
+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.IdentityStore](http://hackage.haskell.org/package/amazonka-identitystore/docs/Amazonka-IdentityStore.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-identitystore` 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-identitystore.cabal b/amazonka-identitystore.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-identitystore.cabal
@@ -0,0 +1,117 @@
+cabal-version:      2.2
+name:               amazonka-identitystore
+version:            2.0
+synopsis:           Amazon SSO Identity Store 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 @2020-06-15@ 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.IdentityStore.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.IdentityStore" 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-identitystore
+
+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.IdentityStore
+    Amazonka.IdentityStore.CreateGroup
+    Amazonka.IdentityStore.CreateGroupMembership
+    Amazonka.IdentityStore.CreateUser
+    Amazonka.IdentityStore.DeleteGroup
+    Amazonka.IdentityStore.DeleteGroupMembership
+    Amazonka.IdentityStore.DeleteUser
+    Amazonka.IdentityStore.DescribeGroup
+    Amazonka.IdentityStore.DescribeGroupMembership
+    Amazonka.IdentityStore.DescribeUser
+    Amazonka.IdentityStore.GetGroupId
+    Amazonka.IdentityStore.GetGroupMembershipId
+    Amazonka.IdentityStore.GetUserId
+    Amazonka.IdentityStore.IsMemberInGroups
+    Amazonka.IdentityStore.Lens
+    Amazonka.IdentityStore.ListGroupMemberships
+    Amazonka.IdentityStore.ListGroupMembershipsForMember
+    Amazonka.IdentityStore.ListGroups
+    Amazonka.IdentityStore.ListUsers
+    Amazonka.IdentityStore.Types
+    Amazonka.IdentityStore.Types.Address
+    Amazonka.IdentityStore.Types.AlternateIdentifier
+    Amazonka.IdentityStore.Types.AttributeOperation
+    Amazonka.IdentityStore.Types.AttributeValue
+    Amazonka.IdentityStore.Types.Email
+    Amazonka.IdentityStore.Types.ExternalId
+    Amazonka.IdentityStore.Types.Filter
+    Amazonka.IdentityStore.Types.Group
+    Amazonka.IdentityStore.Types.GroupMembership
+    Amazonka.IdentityStore.Types.GroupMembershipExistenceResult
+    Amazonka.IdentityStore.Types.MemberId
+    Amazonka.IdentityStore.Types.Name
+    Amazonka.IdentityStore.Types.PhoneNumber
+    Amazonka.IdentityStore.Types.UniqueAttribute
+    Amazonka.IdentityStore.Types.User
+    Amazonka.IdentityStore.UpdateGroup
+    Amazonka.IdentityStore.UpdateUser
+    Amazonka.IdentityStore.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-identitystore-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.IdentityStore
+    Test.Amazonka.IdentityStore
+    Test.Amazonka.IdentityStore.Internal
+
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-identitystore
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateGroup.yaml b/fixture/CreateGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/CreateGroupMembership.yaml b/fixture/CreateGroupMembership.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroupMembership.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/CreateGroupMembershipResponse.proto b/fixture/CreateGroupMembershipResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroupMembershipResponse.proto
diff --git a/fixture/CreateGroupResponse.proto b/fixture/CreateGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGroupResponse.proto
diff --git a/fixture/CreateUser.yaml b/fixture/CreateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/CreateUserResponse.proto b/fixture/CreateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateUserResponse.proto
diff --git a/fixture/DeleteGroup.yaml b/fixture/DeleteGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DeleteGroupMembership.yaml b/fixture/DeleteGroupMembership.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroupMembership.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DeleteGroupMembershipResponse.proto b/fixture/DeleteGroupMembershipResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroupMembershipResponse.proto
diff --git a/fixture/DeleteGroupResponse.proto b/fixture/DeleteGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGroupResponse.proto
diff --git a/fixture/DeleteUser.yaml b/fixture/DeleteUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DeleteUserResponse.proto b/fixture/DeleteUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteUserResponse.proto
diff --git a/fixture/DescribeGroup.yaml b/fixture/DescribeGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DescribeGroupMembership.yaml b/fixture/DescribeGroupMembership.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGroupMembership.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DescribeGroupMembershipResponse.proto b/fixture/DescribeGroupMembershipResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGroupMembershipResponse.proto
diff --git a/fixture/DescribeGroupResponse.proto b/fixture/DescribeGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGroupResponse.proto
diff --git a/fixture/DescribeUser.yaml b/fixture/DescribeUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/DescribeUserResponse.proto b/fixture/DescribeUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeUserResponse.proto
diff --git a/fixture/GetGroupId.yaml b/fixture/GetGroupId.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupId.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/GetGroupIdResponse.proto b/fixture/GetGroupIdResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupIdResponse.proto
diff --git a/fixture/GetGroupMembershipId.yaml b/fixture/GetGroupMembershipId.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupMembershipId.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/GetGroupMembershipIdResponse.proto b/fixture/GetGroupMembershipIdResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetGroupMembershipIdResponse.proto
diff --git a/fixture/GetUserId.yaml b/fixture/GetUserId.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetUserId.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/GetUserIdResponse.proto b/fixture/GetUserIdResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetUserIdResponse.proto
diff --git a/fixture/IsMemberInGroups.yaml b/fixture/IsMemberInGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/IsMemberInGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/IsMemberInGroupsResponse.proto b/fixture/IsMemberInGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/IsMemberInGroupsResponse.proto
diff --git a/fixture/ListGroupMemberships.yaml b/fixture/ListGroupMemberships.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupMemberships.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/ListGroupMembershipsForMember.yaml b/fixture/ListGroupMembershipsForMember.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupMembershipsForMember.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/ListGroupMembershipsForMemberResponse.proto b/fixture/ListGroupMembershipsForMemberResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupMembershipsForMemberResponse.proto
diff --git a/fixture/ListGroupMembershipsResponse.proto b/fixture/ListGroupMembershipsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupMembershipsResponse.proto
diff --git a/fixture/ListGroups.yaml b/fixture/ListGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/ListGroupsResponse.proto b/fixture/ListGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroupsResponse.proto
diff --git a/fixture/ListUsers.yaml b/fixture/ListUsers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/ListUsersResponse.proto b/fixture/ListUsersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListUsersResponse.proto
diff --git a/fixture/UpdateGroup.yaml b/fixture/UpdateGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/UpdateGroupResponse.proto b/fixture/UpdateGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGroupResponse.proto
diff --git a/fixture/UpdateUser.yaml b/fixture/UpdateUser.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUser.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/identitystore/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  identitystore.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/UpdateUserResponse.proto b/fixture/UpdateUserResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateUserResponse.proto
diff --git a/gen/Amazonka/IdentityStore.hs b/gen/Amazonka/IdentityStore.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore.hs
@@ -0,0 +1,280 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.IdentityStore
+-- 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 @2020-06-15@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- The Identity Store service used by AWS IAM Identity Center (successor to
+-- AWS Single Sign-On) provides a single place to retrieve all of your
+-- identities (users and groups). For more information, see the
+-- <https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html IAM Identity Center User Guide>.
+--
+-- >  <note> <p>Although AWS Single Sign-On was renamed, the <code>sso</code> and <code>identitystore</code> API namespaces will continue to retain their original name for backward compatibility purposes. For more information, see <a href="https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed">IAM Identity Center rename</a>.</p> </note> <p>This reference guide describes the identity store operations that you can call programatically and includes detailed information on data types and errors.</p>
+module Amazonka.IdentityStore
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateGroup
+    CreateGroup (CreateGroup'),
+    newCreateGroup,
+    CreateGroupResponse (CreateGroupResponse'),
+    newCreateGroupResponse,
+
+    -- ** CreateGroupMembership
+    CreateGroupMembership (CreateGroupMembership'),
+    newCreateGroupMembership,
+    CreateGroupMembershipResponse (CreateGroupMembershipResponse'),
+    newCreateGroupMembershipResponse,
+
+    -- ** CreateUser
+    CreateUser (CreateUser'),
+    newCreateUser,
+    CreateUserResponse (CreateUserResponse'),
+    newCreateUserResponse,
+
+    -- ** DeleteGroup
+    DeleteGroup (DeleteGroup'),
+    newDeleteGroup,
+    DeleteGroupResponse (DeleteGroupResponse'),
+    newDeleteGroupResponse,
+
+    -- ** DeleteGroupMembership
+    DeleteGroupMembership (DeleteGroupMembership'),
+    newDeleteGroupMembership,
+    DeleteGroupMembershipResponse (DeleteGroupMembershipResponse'),
+    newDeleteGroupMembershipResponse,
+
+    -- ** DeleteUser
+    DeleteUser (DeleteUser'),
+    newDeleteUser,
+    DeleteUserResponse (DeleteUserResponse'),
+    newDeleteUserResponse,
+
+    -- ** DescribeGroup
+    DescribeGroup (DescribeGroup'),
+    newDescribeGroup,
+    DescribeGroupResponse (DescribeGroupResponse'),
+    newDescribeGroupResponse,
+
+    -- ** DescribeGroupMembership
+    DescribeGroupMembership (DescribeGroupMembership'),
+    newDescribeGroupMembership,
+    DescribeGroupMembershipResponse (DescribeGroupMembershipResponse'),
+    newDescribeGroupMembershipResponse,
+
+    -- ** DescribeUser
+    DescribeUser (DescribeUser'),
+    newDescribeUser,
+    DescribeUserResponse (DescribeUserResponse'),
+    newDescribeUserResponse,
+
+    -- ** GetGroupId
+    GetGroupId (GetGroupId'),
+    newGetGroupId,
+    GetGroupIdResponse (GetGroupIdResponse'),
+    newGetGroupIdResponse,
+
+    -- ** GetGroupMembershipId
+    GetGroupMembershipId (GetGroupMembershipId'),
+    newGetGroupMembershipId,
+    GetGroupMembershipIdResponse (GetGroupMembershipIdResponse'),
+    newGetGroupMembershipIdResponse,
+
+    -- ** GetUserId
+    GetUserId (GetUserId'),
+    newGetUserId,
+    GetUserIdResponse (GetUserIdResponse'),
+    newGetUserIdResponse,
+
+    -- ** IsMemberInGroups
+    IsMemberInGroups (IsMemberInGroups'),
+    newIsMemberInGroups,
+    IsMemberInGroupsResponse (IsMemberInGroupsResponse'),
+    newIsMemberInGroupsResponse,
+
+    -- ** ListGroupMemberships (Paginated)
+    ListGroupMemberships (ListGroupMemberships'),
+    newListGroupMemberships,
+    ListGroupMembershipsResponse (ListGroupMembershipsResponse'),
+    newListGroupMembershipsResponse,
+
+    -- ** ListGroupMembershipsForMember (Paginated)
+    ListGroupMembershipsForMember (ListGroupMembershipsForMember'),
+    newListGroupMembershipsForMember,
+    ListGroupMembershipsForMemberResponse (ListGroupMembershipsForMemberResponse'),
+    newListGroupMembershipsForMemberResponse,
+
+    -- ** ListGroups (Paginated)
+    ListGroups (ListGroups'),
+    newListGroups,
+    ListGroupsResponse (ListGroupsResponse'),
+    newListGroupsResponse,
+
+    -- ** ListUsers (Paginated)
+    ListUsers (ListUsers'),
+    newListUsers,
+    ListUsersResponse (ListUsersResponse'),
+    newListUsersResponse,
+
+    -- ** UpdateGroup
+    UpdateGroup (UpdateGroup'),
+    newUpdateGroup,
+    UpdateGroupResponse (UpdateGroupResponse'),
+    newUpdateGroupResponse,
+
+    -- ** UpdateUser
+    UpdateUser (UpdateUser'),
+    newUpdateUser,
+    UpdateUserResponse (UpdateUserResponse'),
+    newUpdateUserResponse,
+
+    -- * Types
+
+    -- ** Address
+    Address (Address'),
+    newAddress,
+
+    -- ** AlternateIdentifier
+    AlternateIdentifier (AlternateIdentifier'),
+    newAlternateIdentifier,
+
+    -- ** AttributeOperation
+    AttributeOperation (AttributeOperation'),
+    newAttributeOperation,
+
+    -- ** AttributeValue
+    AttributeValue (AttributeValue'),
+    newAttributeValue,
+
+    -- ** Email
+    Email (Email'),
+    newEmail,
+
+    -- ** ExternalId
+    ExternalId (ExternalId'),
+    newExternalId,
+
+    -- ** Filter
+    Filter (Filter'),
+    newFilter,
+
+    -- ** Group
+    Group (Group'),
+    newGroup,
+
+    -- ** GroupMembership
+    GroupMembership (GroupMembership'),
+    newGroupMembership,
+
+    -- ** GroupMembershipExistenceResult
+    GroupMembershipExistenceResult (GroupMembershipExistenceResult'),
+    newGroupMembershipExistenceResult,
+
+    -- ** MemberId
+    MemberId (MemberId'),
+    newMemberId,
+
+    -- ** Name
+    Name (Name'),
+    newName,
+
+    -- ** PhoneNumber
+    PhoneNumber (PhoneNumber'),
+    newPhoneNumber,
+
+    -- ** UniqueAttribute
+    UniqueAttribute (UniqueAttribute'),
+    newUniqueAttribute,
+
+    -- ** User
+    User (User'),
+    newUser,
+  )
+where
+
+import Amazonka.IdentityStore.CreateGroup
+import Amazonka.IdentityStore.CreateGroupMembership
+import Amazonka.IdentityStore.CreateUser
+import Amazonka.IdentityStore.DeleteGroup
+import Amazonka.IdentityStore.DeleteGroupMembership
+import Amazonka.IdentityStore.DeleteUser
+import Amazonka.IdentityStore.DescribeGroup
+import Amazonka.IdentityStore.DescribeGroupMembership
+import Amazonka.IdentityStore.DescribeUser
+import Amazonka.IdentityStore.GetGroupId
+import Amazonka.IdentityStore.GetGroupMembershipId
+import Amazonka.IdentityStore.GetUserId
+import Amazonka.IdentityStore.IsMemberInGroups
+import Amazonka.IdentityStore.Lens
+import Amazonka.IdentityStore.ListGroupMemberships
+import Amazonka.IdentityStore.ListGroupMembershipsForMember
+import Amazonka.IdentityStore.ListGroups
+import Amazonka.IdentityStore.ListUsers
+import Amazonka.IdentityStore.Types
+import Amazonka.IdentityStore.UpdateGroup
+import Amazonka.IdentityStore.UpdateUser
+import Amazonka.IdentityStore.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 'IdentityStore'.
+
+-- $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/IdentityStore/CreateGroup.hs b/gen/Amazonka/IdentityStore/CreateGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/CreateGroup.hs
@@ -0,0 +1,219 @@
+{-# 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.IdentityStore.CreateGroup
+-- 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 group within the specified identity store.
+module Amazonka.IdentityStore.CreateGroup
+  ( -- * Creating a Request
+    CreateGroup (..),
+    newCreateGroup,
+
+    -- * Request Lenses
+    createGroup_description,
+    createGroup_displayName,
+    createGroup_identityStoreId,
+
+    -- * Destructuring the Response
+    CreateGroupResponse (..),
+    newCreateGroupResponse,
+
+    -- * Response Lenses
+    createGroupResponse_httpStatus,
+    createGroupResponse_groupId,
+    createGroupResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateGroup' smart constructor.
+data CreateGroup = CreateGroup'
+  { -- | A string containing the description of the group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the name of the group. This value is commonly
+    -- displayed when the group is referenced.
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGroup' 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', 'createGroup_description' - A string containing the description of the group.
+--
+-- 'displayName', 'createGroup_displayName' - A string containing the name of the group. This value is commonly
+-- displayed when the group is referenced.
+--
+-- 'identityStoreId', 'createGroup_identityStoreId' - The globally unique identifier for the identity store.
+newCreateGroup ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  CreateGroup
+newCreateGroup pIdentityStoreId_ =
+  CreateGroup'
+    { description = Prelude.Nothing,
+      displayName = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A string containing the description of the group.
+createGroup_description :: Lens.Lens' CreateGroup (Prelude.Maybe Prelude.Text)
+createGroup_description = Lens.lens (\CreateGroup' {description} -> description) (\s@CreateGroup' {} a -> s {description = a} :: CreateGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the name of the group. This value is commonly
+-- displayed when the group is referenced.
+createGroup_displayName :: Lens.Lens' CreateGroup (Prelude.Maybe Prelude.Text)
+createGroup_displayName = Lens.lens (\CreateGroup' {displayName} -> displayName) (\s@CreateGroup' {} a -> s {displayName = a} :: CreateGroup) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The globally unique identifier for the identity store.
+createGroup_identityStoreId :: Lens.Lens' CreateGroup Prelude.Text
+createGroup_identityStoreId = Lens.lens (\CreateGroup' {identityStoreId} -> identityStoreId) (\s@CreateGroup' {} a -> s {identityStoreId = a} :: CreateGroup)
+
+instance Core.AWSRequest CreateGroup where
+  type AWSResponse CreateGroup = CreateGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "GroupId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable CreateGroup where
+  hashWithSalt _salt CreateGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData CreateGroup where
+  rnf CreateGroup' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf identityStoreId
+
+instance Data.ToHeaders CreateGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.CreateGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateGroup where
+  toJSON CreateGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("DisplayName" Data..=) Prelude.<$> displayName,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId)
+          ]
+      )
+
+instance Data.ToPath CreateGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateGroupResponse' smart constructor.
+data CreateGroupResponse = CreateGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier of the newly created group in the identity store.
+    groupId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGroupResponse' 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', 'createGroupResponse_httpStatus' - The response's http status code.
+--
+-- 'groupId', 'createGroupResponse_groupId' - The identifier of the newly created group in the identity store.
+--
+-- 'identityStoreId', 'createGroupResponse_identityStoreId' - The globally unique identifier for the identity store.
+newCreateGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  CreateGroupResponse
+newCreateGroupResponse
+  pHttpStatus_
+  pGroupId_
+  pIdentityStoreId_ =
+    CreateGroupResponse'
+      { httpStatus = pHttpStatus_,
+        groupId = pGroupId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+createGroupResponse_httpStatus :: Lens.Lens' CreateGroupResponse Prelude.Int
+createGroupResponse_httpStatus = Lens.lens (\CreateGroupResponse' {httpStatus} -> httpStatus) (\s@CreateGroupResponse' {} a -> s {httpStatus = a} :: CreateGroupResponse)
+
+-- | The identifier of the newly created group in the identity store.
+createGroupResponse_groupId :: Lens.Lens' CreateGroupResponse Prelude.Text
+createGroupResponse_groupId = Lens.lens (\CreateGroupResponse' {groupId} -> groupId) (\s@CreateGroupResponse' {} a -> s {groupId = a} :: CreateGroupResponse)
+
+-- | The globally unique identifier for the identity store.
+createGroupResponse_identityStoreId :: Lens.Lens' CreateGroupResponse Prelude.Text
+createGroupResponse_identityStoreId = Lens.lens (\CreateGroupResponse' {identityStoreId} -> identityStoreId) (\s@CreateGroupResponse' {} a -> s {identityStoreId = a} :: CreateGroupResponse)
+
+instance Prelude.NFData CreateGroupResponse where
+  rnf CreateGroupResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/CreateGroupMembership.hs b/gen/Amazonka/IdentityStore/CreateGroupMembership.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/CreateGroupMembership.hs
@@ -0,0 +1,238 @@
+{-# 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.IdentityStore.CreateGroupMembership
+-- 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 relationship between a member and a group. The following
+-- identifiers must be specified: @GroupId@, @IdentityStoreId@, and
+-- @MemberId@.
+module Amazonka.IdentityStore.CreateGroupMembership
+  ( -- * Creating a Request
+    CreateGroupMembership (..),
+    newCreateGroupMembership,
+
+    -- * Request Lenses
+    createGroupMembership_identityStoreId,
+    createGroupMembership_groupId,
+    createGroupMembership_memberId,
+
+    -- * Destructuring the Response
+    CreateGroupMembershipResponse (..),
+    newCreateGroupMembershipResponse,
+
+    -- * Response Lenses
+    createGroupMembershipResponse_httpStatus,
+    createGroupMembershipResponse_membershipId,
+    createGroupMembershipResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateGroupMembership' smart constructor.
+data CreateGroupMembership = CreateGroupMembership'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | An object that contains the identifier of a group member. Setting the
+    -- @UserID@ field to the specific identifier for a user indicates that the
+    -- user is a member of the group.
+    memberId :: MemberId
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGroupMembership' 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:
+--
+-- 'identityStoreId', 'createGroupMembership_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'groupId', 'createGroupMembership_groupId' - The identifier for a group in the identity store.
+--
+-- 'memberId', 'createGroupMembership_memberId' - An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+newCreateGroupMembership ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'memberId'
+  MemberId ->
+  CreateGroupMembership
+newCreateGroupMembership
+  pIdentityStoreId_
+  pGroupId_
+  pMemberId_ =
+    CreateGroupMembership'
+      { identityStoreId =
+          pIdentityStoreId_,
+        groupId = pGroupId_,
+        memberId = pMemberId_
+      }
+
+-- | The globally unique identifier for the identity store.
+createGroupMembership_identityStoreId :: Lens.Lens' CreateGroupMembership Prelude.Text
+createGroupMembership_identityStoreId = Lens.lens (\CreateGroupMembership' {identityStoreId} -> identityStoreId) (\s@CreateGroupMembership' {} a -> s {identityStoreId = a} :: CreateGroupMembership)
+
+-- | The identifier for a group in the identity store.
+createGroupMembership_groupId :: Lens.Lens' CreateGroupMembership Prelude.Text
+createGroupMembership_groupId = Lens.lens (\CreateGroupMembership' {groupId} -> groupId) (\s@CreateGroupMembership' {} a -> s {groupId = a} :: CreateGroupMembership)
+
+-- | An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+createGroupMembership_memberId :: Lens.Lens' CreateGroupMembership MemberId
+createGroupMembership_memberId = Lens.lens (\CreateGroupMembership' {memberId} -> memberId) (\s@CreateGroupMembership' {} a -> s {memberId = a} :: CreateGroupMembership)
+
+instance Core.AWSRequest CreateGroupMembership where
+  type
+    AWSResponse CreateGroupMembership =
+      CreateGroupMembershipResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateGroupMembershipResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "MembershipId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable CreateGroupMembership where
+  hashWithSalt _salt CreateGroupMembership' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+      `Prelude.hashWithSalt` memberId
+
+instance Prelude.NFData CreateGroupMembership where
+  rnf CreateGroupMembership' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf memberId
+
+instance Data.ToHeaders CreateGroupMembership where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.CreateGroupMembership" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateGroupMembership where
+  toJSON CreateGroupMembership' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId),
+            Prelude.Just ("MemberId" Data..= memberId)
+          ]
+      )
+
+instance Data.ToPath CreateGroupMembership where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateGroupMembership where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateGroupMembershipResponse' smart constructor.
+data CreateGroupMembershipResponse = CreateGroupMembershipResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a newly created @GroupMembership@ in an identity
+    -- store.
+    membershipId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGroupMembershipResponse' 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', 'createGroupMembershipResponse_httpStatus' - The response's http status code.
+--
+-- 'membershipId', 'createGroupMembershipResponse_membershipId' - The identifier for a newly created @GroupMembership@ in an identity
+-- store.
+--
+-- 'identityStoreId', 'createGroupMembershipResponse_identityStoreId' - The globally unique identifier for the identity store.
+newCreateGroupMembershipResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'membershipId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  CreateGroupMembershipResponse
+newCreateGroupMembershipResponse
+  pHttpStatus_
+  pMembershipId_
+  pIdentityStoreId_ =
+    CreateGroupMembershipResponse'
+      { httpStatus =
+          pHttpStatus_,
+        membershipId = pMembershipId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+createGroupMembershipResponse_httpStatus :: Lens.Lens' CreateGroupMembershipResponse Prelude.Int
+createGroupMembershipResponse_httpStatus = Lens.lens (\CreateGroupMembershipResponse' {httpStatus} -> httpStatus) (\s@CreateGroupMembershipResponse' {} a -> s {httpStatus = a} :: CreateGroupMembershipResponse)
+
+-- | The identifier for a newly created @GroupMembership@ in an identity
+-- store.
+createGroupMembershipResponse_membershipId :: Lens.Lens' CreateGroupMembershipResponse Prelude.Text
+createGroupMembershipResponse_membershipId = Lens.lens (\CreateGroupMembershipResponse' {membershipId} -> membershipId) (\s@CreateGroupMembershipResponse' {} a -> s {membershipId = a} :: CreateGroupMembershipResponse)
+
+-- | The globally unique identifier for the identity store.
+createGroupMembershipResponse_identityStoreId :: Lens.Lens' CreateGroupMembershipResponse Prelude.Text
+createGroupMembershipResponse_identityStoreId = Lens.lens (\CreateGroupMembershipResponse' {identityStoreId} -> identityStoreId) (\s@CreateGroupMembershipResponse' {} a -> s {identityStoreId = a} :: CreateGroupMembershipResponse)
+
+instance Prelude.NFData CreateGroupMembershipResponse where
+  rnf CreateGroupMembershipResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf membershipId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/CreateUser.hs b/gen/Amazonka/IdentityStore/CreateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/CreateUser.hs
@@ -0,0 +1,393 @@
+{-# 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.IdentityStore.CreateUser
+-- 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 new user within the specified identity store.
+module Amazonka.IdentityStore.CreateUser
+  ( -- * Creating a Request
+    CreateUser (..),
+    newCreateUser,
+
+    -- * Request Lenses
+    createUser_addresses,
+    createUser_displayName,
+    createUser_emails,
+    createUser_locale,
+    createUser_name,
+    createUser_nickName,
+    createUser_phoneNumbers,
+    createUser_preferredLanguage,
+    createUser_profileUrl,
+    createUser_timezone,
+    createUser_title,
+    createUser_userName,
+    createUser_userType,
+    createUser_identityStoreId,
+
+    -- * Destructuring the Response
+    CreateUserResponse (..),
+    newCreateUserResponse,
+
+    -- * Response Lenses
+    createUserResponse_httpStatus,
+    createUserResponse_userId,
+    createUserResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateUser' smart constructor.
+data CreateUser = CreateUser'
+  { -- | A list of @Address@ objects containing addresses associated with the
+    -- user.
+    addresses :: Prelude.Maybe (Prelude.NonEmpty Address),
+    -- | A string containing the user\'s name. This value is typically formatted
+    -- for display when the user is referenced. For example, \"John Doe.\"
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @Email@ objects containing email addresses associated with the
+    -- user.
+    emails :: Prelude.Maybe (Prelude.NonEmpty Email),
+    -- | A string containing the user\'s geographical region or location.
+    locale :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | An object containing the user\'s name.
+    name :: Prelude.Maybe Name,
+    -- | A string containing an alternate name for the user.
+    nickName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @PhoneNumber@ objects containing phone numbers associated with
+    -- the user.
+    phoneNumbers :: Prelude.Maybe (Prelude.NonEmpty PhoneNumber),
+    -- | A string containing the preferred language of the user. For example,
+    -- \"American English\" or \"en-us.\"
+    preferredLanguage :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing a URL that may be associated with the user.
+    profileUrl :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the user\'s time zone.
+    timezone :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the user\'s title. Possible values are left
+    -- unspecified given that they depend on each customer\'s specific needs.
+    title :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A unique string used to identify the user. The length limit is 128
+    -- characters. This value can consist of letters, accented characters,
+    -- symbols, numbers, and punctuation. This value is specified at the time
+    -- the user is created and stored as an attribute of the user object in the
+    -- identity store.
+    userName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string indicating the user\'s type. Possible values depend on each
+    -- customer\'s specific needs, so they are left unspecified.
+    userType :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateUser' 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:
+--
+-- 'addresses', 'createUser_addresses' - A list of @Address@ objects containing addresses associated with the
+-- user.
+--
+-- 'displayName', 'createUser_displayName' - A string containing the user\'s name. This value is typically formatted
+-- for display when the user is referenced. For example, \"John Doe.\"
+--
+-- 'emails', 'createUser_emails' - A list of @Email@ objects containing email addresses associated with the
+-- user.
+--
+-- 'locale', 'createUser_locale' - A string containing the user\'s geographical region or location.
+--
+-- 'name', 'createUser_name' - An object containing the user\'s name.
+--
+-- 'nickName', 'createUser_nickName' - A string containing an alternate name for the user.
+--
+-- 'phoneNumbers', 'createUser_phoneNumbers' - A list of @PhoneNumber@ objects containing phone numbers associated with
+-- the user.
+--
+-- 'preferredLanguage', 'createUser_preferredLanguage' - A string containing the preferred language of the user. For example,
+-- \"American English\" or \"en-us.\"
+--
+-- 'profileUrl', 'createUser_profileUrl' - A string containing a URL that may be associated with the user.
+--
+-- 'timezone', 'createUser_timezone' - A string containing the user\'s time zone.
+--
+-- 'title', 'createUser_title' - A string containing the user\'s title. Possible values are left
+-- unspecified given that they depend on each customer\'s specific needs.
+--
+-- 'userName', 'createUser_userName' - A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+--
+-- 'userType', 'createUser_userType' - A string indicating the user\'s type. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+--
+-- 'identityStoreId', 'createUser_identityStoreId' - The globally unique identifier for the identity store.
+newCreateUser ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  CreateUser
+newCreateUser pIdentityStoreId_ =
+  CreateUser'
+    { addresses = Prelude.Nothing,
+      displayName = Prelude.Nothing,
+      emails = Prelude.Nothing,
+      locale = Prelude.Nothing,
+      name = Prelude.Nothing,
+      nickName = Prelude.Nothing,
+      phoneNumbers = Prelude.Nothing,
+      preferredLanguage = Prelude.Nothing,
+      profileUrl = Prelude.Nothing,
+      timezone = Prelude.Nothing,
+      title = Prelude.Nothing,
+      userName = Prelude.Nothing,
+      userType = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A list of @Address@ objects containing addresses associated with the
+-- user.
+createUser_addresses :: Lens.Lens' CreateUser (Prelude.Maybe (Prelude.NonEmpty Address))
+createUser_addresses = Lens.lens (\CreateUser' {addresses} -> addresses) (\s@CreateUser' {} a -> s {addresses = a} :: CreateUser) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the user\'s name. This value is typically formatted
+-- for display when the user is referenced. For example, \"John Doe.\"
+createUser_displayName :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_displayName = Lens.lens (\CreateUser' {displayName} -> displayName) (\s@CreateUser' {} a -> s {displayName = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @Email@ objects containing email addresses associated with the
+-- user.
+createUser_emails :: Lens.Lens' CreateUser (Prelude.Maybe (Prelude.NonEmpty Email))
+createUser_emails = Lens.lens (\CreateUser' {emails} -> emails) (\s@CreateUser' {} a -> s {emails = a} :: CreateUser) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the user\'s geographical region or location.
+createUser_locale :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_locale = Lens.lens (\CreateUser' {locale} -> locale) (\s@CreateUser' {} a -> s {locale = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | An object containing the user\'s name.
+createUser_name :: Lens.Lens' CreateUser (Prelude.Maybe Name)
+createUser_name = Lens.lens (\CreateUser' {name} -> name) (\s@CreateUser' {} a -> s {name = a} :: CreateUser)
+
+-- | A string containing an alternate name for the user.
+createUser_nickName :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_nickName = Lens.lens (\CreateUser' {nickName} -> nickName) (\s@CreateUser' {} a -> s {nickName = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @PhoneNumber@ objects containing phone numbers associated with
+-- the user.
+createUser_phoneNumbers :: Lens.Lens' CreateUser (Prelude.Maybe (Prelude.NonEmpty PhoneNumber))
+createUser_phoneNumbers = Lens.lens (\CreateUser' {phoneNumbers} -> phoneNumbers) (\s@CreateUser' {} a -> s {phoneNumbers = a} :: CreateUser) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the preferred language of the user. For example,
+-- \"American English\" or \"en-us.\"
+createUser_preferredLanguage :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_preferredLanguage = Lens.lens (\CreateUser' {preferredLanguage} -> preferredLanguage) (\s@CreateUser' {} a -> s {preferredLanguage = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing a URL that may be associated with the user.
+createUser_profileUrl :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_profileUrl = Lens.lens (\CreateUser' {profileUrl} -> profileUrl) (\s@CreateUser' {} a -> s {profileUrl = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the user\'s time zone.
+createUser_timezone :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_timezone = Lens.lens (\CreateUser' {timezone} -> timezone) (\s@CreateUser' {} a -> s {timezone = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the user\'s title. Possible values are left
+-- unspecified given that they depend on each customer\'s specific needs.
+createUser_title :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_title = Lens.lens (\CreateUser' {title} -> title) (\s@CreateUser' {} a -> s {title = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+createUser_userName :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_userName = Lens.lens (\CreateUser' {userName} -> userName) (\s@CreateUser' {} a -> s {userName = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string indicating the user\'s type. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+createUser_userType :: Lens.Lens' CreateUser (Prelude.Maybe Prelude.Text)
+createUser_userType = Lens.lens (\CreateUser' {userType} -> userType) (\s@CreateUser' {} a -> s {userType = a} :: CreateUser) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The globally unique identifier for the identity store.
+createUser_identityStoreId :: Lens.Lens' CreateUser Prelude.Text
+createUser_identityStoreId = Lens.lens (\CreateUser' {identityStoreId} -> identityStoreId) (\s@CreateUser' {} a -> s {identityStoreId = a} :: CreateUser)
+
+instance Core.AWSRequest CreateUser where
+  type AWSResponse CreateUser = CreateUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateUserResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "UserId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable CreateUser where
+  hashWithSalt _salt CreateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` addresses
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` emails
+      `Prelude.hashWithSalt` locale
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nickName
+      `Prelude.hashWithSalt` phoneNumbers
+      `Prelude.hashWithSalt` preferredLanguage
+      `Prelude.hashWithSalt` profileUrl
+      `Prelude.hashWithSalt` timezone
+      `Prelude.hashWithSalt` title
+      `Prelude.hashWithSalt` userName
+      `Prelude.hashWithSalt` userType
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData CreateUser where
+  rnf CreateUser' {..} =
+    Prelude.rnf addresses
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf emails
+      `Prelude.seq` Prelude.rnf locale
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nickName
+      `Prelude.seq` Prelude.rnf phoneNumbers
+      `Prelude.seq` Prelude.rnf preferredLanguage
+      `Prelude.seq` Prelude.rnf profileUrl
+      `Prelude.seq` Prelude.rnf timezone
+      `Prelude.seq` Prelude.rnf title
+      `Prelude.seq` Prelude.rnf userName
+      `Prelude.seq` Prelude.rnf userType
+      `Prelude.seq` Prelude.rnf identityStoreId
+
+instance Data.ToHeaders CreateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.CreateUser" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateUser where
+  toJSON CreateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Addresses" Data..=) Prelude.<$> addresses,
+            ("DisplayName" Data..=) Prelude.<$> displayName,
+            ("Emails" Data..=) Prelude.<$> emails,
+            ("Locale" Data..=) Prelude.<$> locale,
+            ("Name" Data..=) Prelude.<$> name,
+            ("NickName" Data..=) Prelude.<$> nickName,
+            ("PhoneNumbers" Data..=) Prelude.<$> phoneNumbers,
+            ("PreferredLanguage" Data..=)
+              Prelude.<$> preferredLanguage,
+            ("ProfileUrl" Data..=) Prelude.<$> profileUrl,
+            ("Timezone" Data..=) Prelude.<$> timezone,
+            ("Title" Data..=) Prelude.<$> title,
+            ("UserName" Data..=) Prelude.<$> userName,
+            ("UserType" Data..=) Prelude.<$> userType,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId)
+          ]
+      )
+
+instance Data.ToPath CreateUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateUserResponse' smart constructor.
+data CreateUserResponse = CreateUserResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier of the newly created user in the identity store.
+    userId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateUserResponse' 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', 'createUserResponse_httpStatus' - The response's http status code.
+--
+-- 'userId', 'createUserResponse_userId' - The identifier of the newly created user in the identity store.
+--
+-- 'identityStoreId', 'createUserResponse_identityStoreId' - The globally unique identifier for the identity store.
+newCreateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  CreateUserResponse
+newCreateUserResponse
+  pHttpStatus_
+  pUserId_
+  pIdentityStoreId_ =
+    CreateUserResponse'
+      { httpStatus = pHttpStatus_,
+        userId = pUserId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+createUserResponse_httpStatus :: Lens.Lens' CreateUserResponse Prelude.Int
+createUserResponse_httpStatus = Lens.lens (\CreateUserResponse' {httpStatus} -> httpStatus) (\s@CreateUserResponse' {} a -> s {httpStatus = a} :: CreateUserResponse)
+
+-- | The identifier of the newly created user in the identity store.
+createUserResponse_userId :: Lens.Lens' CreateUserResponse Prelude.Text
+createUserResponse_userId = Lens.lens (\CreateUserResponse' {userId} -> userId) (\s@CreateUserResponse' {} a -> s {userId = a} :: CreateUserResponse)
+
+-- | The globally unique identifier for the identity store.
+createUserResponse_identityStoreId :: Lens.Lens' CreateUserResponse Prelude.Text
+createUserResponse_identityStoreId = Lens.lens (\CreateUserResponse' {identityStoreId} -> identityStoreId) (\s@CreateUserResponse' {} a -> s {identityStoreId = a} :: CreateUserResponse)
+
+instance Prelude.NFData CreateUserResponse where
+  rnf CreateUserResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/DeleteGroup.hs b/gen/Amazonka/IdentityStore/DeleteGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DeleteGroup.hs
@@ -0,0 +1,171 @@
+{-# 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.IdentityStore.DeleteGroup
+-- 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 a group within an identity store given @GroupId@.
+module Amazonka.IdentityStore.DeleteGroup
+  ( -- * Creating a Request
+    DeleteGroup (..),
+    newDeleteGroup,
+
+    -- * Request Lenses
+    deleteGroup_identityStoreId,
+    deleteGroup_groupId,
+
+    -- * Destructuring the Response
+    DeleteGroupResponse (..),
+    newDeleteGroupResponse,
+
+    -- * Response Lenses
+    deleteGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteGroup' smart constructor.
+data DeleteGroup = DeleteGroup'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGroup' 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:
+--
+-- 'identityStoreId', 'deleteGroup_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'groupId', 'deleteGroup_groupId' - The identifier for a group in the identity store.
+newDeleteGroup ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  DeleteGroup
+newDeleteGroup pIdentityStoreId_ pGroupId_ =
+  DeleteGroup'
+    { identityStoreId = pIdentityStoreId_,
+      groupId = pGroupId_
+    }
+
+-- | The globally unique identifier for the identity store.
+deleteGroup_identityStoreId :: Lens.Lens' DeleteGroup Prelude.Text
+deleteGroup_identityStoreId = Lens.lens (\DeleteGroup' {identityStoreId} -> identityStoreId) (\s@DeleteGroup' {} a -> s {identityStoreId = a} :: DeleteGroup)
+
+-- | The identifier for a group in the identity store.
+deleteGroup_groupId :: Lens.Lens' DeleteGroup Prelude.Text
+deleteGroup_groupId = Lens.lens (\DeleteGroup' {groupId} -> groupId) (\s@DeleteGroup' {} a -> s {groupId = a} :: DeleteGroup)
+
+instance Core.AWSRequest DeleteGroup where
+  type AWSResponse DeleteGroup = DeleteGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteGroup where
+  hashWithSalt _salt DeleteGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+
+instance Prelude.NFData DeleteGroup where
+  rnf DeleteGroup' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+
+instance Data.ToHeaders DeleteGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DeleteGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteGroup where
+  toJSON DeleteGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId)
+          ]
+      )
+
+instance Data.ToPath DeleteGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteGroupResponse' smart constructor.
+data DeleteGroupResponse = DeleteGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGroupResponse' 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', 'deleteGroupResponse_httpStatus' - The response's http status code.
+newDeleteGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteGroupResponse
+newDeleteGroupResponse pHttpStatus_ =
+  DeleteGroupResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteGroupResponse_httpStatus :: Lens.Lens' DeleteGroupResponse Prelude.Int
+deleteGroupResponse_httpStatus = Lens.lens (\DeleteGroupResponse' {httpStatus} -> httpStatus) (\s@DeleteGroupResponse' {} a -> s {httpStatus = a} :: DeleteGroupResponse)
+
+instance Prelude.NFData DeleteGroupResponse where
+  rnf DeleteGroupResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IdentityStore/DeleteGroupMembership.hs b/gen/Amazonka/IdentityStore/DeleteGroupMembership.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DeleteGroupMembership.hs
@@ -0,0 +1,180 @@
+{-# 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.IdentityStore.DeleteGroupMembership
+-- 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 a membership within a group given @MembershipId@.
+module Amazonka.IdentityStore.DeleteGroupMembership
+  ( -- * Creating a Request
+    DeleteGroupMembership (..),
+    newDeleteGroupMembership,
+
+    -- * Request Lenses
+    deleteGroupMembership_identityStoreId,
+    deleteGroupMembership_membershipId,
+
+    -- * Destructuring the Response
+    DeleteGroupMembershipResponse (..),
+    newDeleteGroupMembershipResponse,
+
+    -- * Response Lenses
+    deleteGroupMembershipResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteGroupMembership' smart constructor.
+data DeleteGroupMembership = DeleteGroupMembership'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a @GroupMembership@ in an identity store.
+    membershipId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGroupMembership' 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:
+--
+-- 'identityStoreId', 'deleteGroupMembership_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'membershipId', 'deleteGroupMembership_membershipId' - The identifier for a @GroupMembership@ in an identity store.
+newDeleteGroupMembership ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'membershipId'
+  Prelude.Text ->
+  DeleteGroupMembership
+newDeleteGroupMembership
+  pIdentityStoreId_
+  pMembershipId_ =
+    DeleteGroupMembership'
+      { identityStoreId =
+          pIdentityStoreId_,
+        membershipId = pMembershipId_
+      }
+
+-- | The globally unique identifier for the identity store.
+deleteGroupMembership_identityStoreId :: Lens.Lens' DeleteGroupMembership Prelude.Text
+deleteGroupMembership_identityStoreId = Lens.lens (\DeleteGroupMembership' {identityStoreId} -> identityStoreId) (\s@DeleteGroupMembership' {} a -> s {identityStoreId = a} :: DeleteGroupMembership)
+
+-- | The identifier for a @GroupMembership@ in an identity store.
+deleteGroupMembership_membershipId :: Lens.Lens' DeleteGroupMembership Prelude.Text
+deleteGroupMembership_membershipId = Lens.lens (\DeleteGroupMembership' {membershipId} -> membershipId) (\s@DeleteGroupMembership' {} a -> s {membershipId = a} :: DeleteGroupMembership)
+
+instance Core.AWSRequest DeleteGroupMembership where
+  type
+    AWSResponse DeleteGroupMembership =
+      DeleteGroupMembershipResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteGroupMembershipResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteGroupMembership where
+  hashWithSalt _salt DeleteGroupMembership' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` membershipId
+
+instance Prelude.NFData DeleteGroupMembership where
+  rnf DeleteGroupMembership' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf membershipId
+
+instance Data.ToHeaders DeleteGroupMembership where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DeleteGroupMembership" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteGroupMembership where
+  toJSON DeleteGroupMembership' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("MembershipId" Data..= membershipId)
+          ]
+      )
+
+instance Data.ToPath DeleteGroupMembership where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteGroupMembership where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteGroupMembershipResponse' smart constructor.
+data DeleteGroupMembershipResponse = DeleteGroupMembershipResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGroupMembershipResponse' 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', 'deleteGroupMembershipResponse_httpStatus' - The response's http status code.
+newDeleteGroupMembershipResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteGroupMembershipResponse
+newDeleteGroupMembershipResponse pHttpStatus_ =
+  DeleteGroupMembershipResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteGroupMembershipResponse_httpStatus :: Lens.Lens' DeleteGroupMembershipResponse Prelude.Int
+deleteGroupMembershipResponse_httpStatus = Lens.lens (\DeleteGroupMembershipResponse' {httpStatus} -> httpStatus) (\s@DeleteGroupMembershipResponse' {} a -> s {httpStatus = a} :: DeleteGroupMembershipResponse)
+
+instance Prelude.NFData DeleteGroupMembershipResponse where
+  rnf DeleteGroupMembershipResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IdentityStore/DeleteUser.hs b/gen/Amazonka/IdentityStore/DeleteUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DeleteUser.hs
@@ -0,0 +1,171 @@
+{-# 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.IdentityStore.DeleteUser
+-- 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 user within an identity store given @UserId@.
+module Amazonka.IdentityStore.DeleteUser
+  ( -- * Creating a Request
+    DeleteUser (..),
+    newDeleteUser,
+
+    -- * Request Lenses
+    deleteUser_identityStoreId,
+    deleteUser_userId,
+
+    -- * Destructuring the Response
+    DeleteUserResponse (..),
+    newDeleteUserResponse,
+
+    -- * Response Lenses
+    deleteUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteUser' smart constructor.
+data DeleteUser = DeleteUser'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteUser' 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:
+--
+-- 'identityStoreId', 'deleteUser_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'userId', 'deleteUser_userId' - The identifier for a user in the identity store.
+newDeleteUser ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'userId'
+  Prelude.Text ->
+  DeleteUser
+newDeleteUser pIdentityStoreId_ pUserId_ =
+  DeleteUser'
+    { identityStoreId = pIdentityStoreId_,
+      userId = pUserId_
+    }
+
+-- | The globally unique identifier for the identity store.
+deleteUser_identityStoreId :: Lens.Lens' DeleteUser Prelude.Text
+deleteUser_identityStoreId = Lens.lens (\DeleteUser' {identityStoreId} -> identityStoreId) (\s@DeleteUser' {} a -> s {identityStoreId = a} :: DeleteUser)
+
+-- | The identifier for a user in the identity store.
+deleteUser_userId :: Lens.Lens' DeleteUser Prelude.Text
+deleteUser_userId = Lens.lens (\DeleteUser' {userId} -> userId) (\s@DeleteUser' {} a -> s {userId = a} :: DeleteUser)
+
+instance Core.AWSRequest DeleteUser where
+  type AWSResponse DeleteUser = DeleteUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteUserResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteUser where
+  hashWithSalt _salt DeleteUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData DeleteUser where
+  rnf DeleteUser' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders DeleteUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DeleteUser" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteUser where
+  toJSON DeleteUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("UserId" Data..= userId)
+          ]
+      )
+
+instance Data.ToPath DeleteUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteUserResponse' smart constructor.
+data DeleteUserResponse = DeleteUserResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteUserResponse' 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', 'deleteUserResponse_httpStatus' - The response's http status code.
+newDeleteUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteUserResponse
+newDeleteUserResponse pHttpStatus_ =
+  DeleteUserResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteUserResponse_httpStatus :: Lens.Lens' DeleteUserResponse Prelude.Int
+deleteUserResponse_httpStatus = Lens.lens (\DeleteUserResponse' {httpStatus} -> httpStatus) (\s@DeleteUserResponse' {} a -> s {httpStatus = a} :: DeleteUserResponse)
+
+instance Prelude.NFData DeleteUserResponse where
+  rnf DeleteUserResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IdentityStore/DescribeGroup.hs b/gen/Amazonka/IdentityStore/DescribeGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DescribeGroup.hs
@@ -0,0 +1,275 @@
+{-# 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.IdentityStore.DescribeGroup
+-- 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 the group metadata and attributes from @GroupId@ in an
+-- identity store.
+module Amazonka.IdentityStore.DescribeGroup
+  ( -- * Creating a Request
+    DescribeGroup (..),
+    newDescribeGroup,
+
+    -- * Request Lenses
+    describeGroup_identityStoreId,
+    describeGroup_groupId,
+
+    -- * Destructuring the Response
+    DescribeGroupResponse (..),
+    newDescribeGroupResponse,
+
+    -- * Response Lenses
+    describeGroupResponse_description,
+    describeGroupResponse_displayName,
+    describeGroupResponse_externalIds,
+    describeGroupResponse_httpStatus,
+    describeGroupResponse_groupId,
+    describeGroupResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeGroup' smart constructor.
+data DescribeGroup = DescribeGroup'
+  { -- | The globally unique identifier for the identity store, such as
+    -- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+    -- @1234567890@ is a randomly generated string that contains numbers and
+    -- lower case letters. This value is generated at the time that a new
+    -- identity store is created.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGroup' 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:
+--
+-- 'identityStoreId', 'describeGroup_identityStoreId' - The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+--
+-- 'groupId', 'describeGroup_groupId' - The identifier for a group in the identity store.
+newDescribeGroup ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  DescribeGroup
+newDescribeGroup pIdentityStoreId_ pGroupId_ =
+  DescribeGroup'
+    { identityStoreId = pIdentityStoreId_,
+      groupId = pGroupId_
+    }
+
+-- | The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+describeGroup_identityStoreId :: Lens.Lens' DescribeGroup Prelude.Text
+describeGroup_identityStoreId = Lens.lens (\DescribeGroup' {identityStoreId} -> identityStoreId) (\s@DescribeGroup' {} a -> s {identityStoreId = a} :: DescribeGroup)
+
+-- | The identifier for a group in the identity store.
+describeGroup_groupId :: Lens.Lens' DescribeGroup Prelude.Text
+describeGroup_groupId = Lens.lens (\DescribeGroup' {groupId} -> groupId) (\s@DescribeGroup' {} a -> s {groupId = a} :: DescribeGroup)
+
+instance Core.AWSRequest DescribeGroup where
+  type
+    AWSResponse DescribeGroup =
+      DescribeGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeGroupResponse'
+            Prelude.<$> (x Data..?> "Description")
+            Prelude.<*> (x Data..?> "DisplayName")
+            Prelude.<*> (x Data..?> "ExternalIds")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "GroupId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable DescribeGroup where
+  hashWithSalt _salt DescribeGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+
+instance Prelude.NFData DescribeGroup where
+  rnf DescribeGroup' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+
+instance Data.ToHeaders DescribeGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DescribeGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeGroup where
+  toJSON DescribeGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId)
+          ]
+      )
+
+instance Data.ToPath DescribeGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeGroupResponse' smart constructor.
+data DescribeGroupResponse = DescribeGroupResponse'
+  { -- | A string containing a description of the group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The group’s display name value. The length limit is 1,024 characters.
+    -- This value can consist of letters, accented characters, symbols,
+    -- numbers, punctuation, tab, new line, carriage return, space, and
+    -- nonbreaking space in this attribute. This value is specified at the time
+    -- that the group is created and stored as an attribute of the group object
+    -- in the identity store.
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @ExternalId@ objects that contains the identifiers issued to
+    -- this resource by an external identity provider.
+    externalIds :: Prelude.Maybe (Prelude.NonEmpty ExternalId),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGroupResponse' 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', 'describeGroupResponse_description' - A string containing a description of the group.
+--
+-- 'displayName', 'describeGroupResponse_displayName' - The group’s display name value. The length limit is 1,024 characters.
+-- This value can consist of letters, accented characters, symbols,
+-- numbers, punctuation, tab, new line, carriage return, space, and
+-- nonbreaking space in this attribute. This value is specified at the time
+-- that the group is created and stored as an attribute of the group object
+-- in the identity store.
+--
+-- 'externalIds', 'describeGroupResponse_externalIds' - A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+--
+-- 'httpStatus', 'describeGroupResponse_httpStatus' - The response's http status code.
+--
+-- 'groupId', 'describeGroupResponse_groupId' - The identifier for a group in the identity store.
+--
+-- 'identityStoreId', 'describeGroupResponse_identityStoreId' - The globally unique identifier for the identity store.
+newDescribeGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  DescribeGroupResponse
+newDescribeGroupResponse
+  pHttpStatus_
+  pGroupId_
+  pIdentityStoreId_ =
+    DescribeGroupResponse'
+      { description =
+          Prelude.Nothing,
+        displayName = Prelude.Nothing,
+        externalIds = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        groupId = pGroupId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | A string containing a description of the group.
+describeGroupResponse_description :: Lens.Lens' DescribeGroupResponse (Prelude.Maybe Prelude.Text)
+describeGroupResponse_description = Lens.lens (\DescribeGroupResponse' {description} -> description) (\s@DescribeGroupResponse' {} a -> s {description = a} :: DescribeGroupResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The group’s display name value. The length limit is 1,024 characters.
+-- This value can consist of letters, accented characters, symbols,
+-- numbers, punctuation, tab, new line, carriage return, space, and
+-- nonbreaking space in this attribute. This value is specified at the time
+-- that the group is created and stored as an attribute of the group object
+-- in the identity store.
+describeGroupResponse_displayName :: Lens.Lens' DescribeGroupResponse (Prelude.Maybe Prelude.Text)
+describeGroupResponse_displayName = Lens.lens (\DescribeGroupResponse' {displayName} -> displayName) (\s@DescribeGroupResponse' {} a -> s {displayName = a} :: DescribeGroupResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+describeGroupResponse_externalIds :: Lens.Lens' DescribeGroupResponse (Prelude.Maybe (Prelude.NonEmpty ExternalId))
+describeGroupResponse_externalIds = Lens.lens (\DescribeGroupResponse' {externalIds} -> externalIds) (\s@DescribeGroupResponse' {} a -> s {externalIds = a} :: DescribeGroupResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeGroupResponse_httpStatus :: Lens.Lens' DescribeGroupResponse Prelude.Int
+describeGroupResponse_httpStatus = Lens.lens (\DescribeGroupResponse' {httpStatus} -> httpStatus) (\s@DescribeGroupResponse' {} a -> s {httpStatus = a} :: DescribeGroupResponse)
+
+-- | The identifier for a group in the identity store.
+describeGroupResponse_groupId :: Lens.Lens' DescribeGroupResponse Prelude.Text
+describeGroupResponse_groupId = Lens.lens (\DescribeGroupResponse' {groupId} -> groupId) (\s@DescribeGroupResponse' {} a -> s {groupId = a} :: DescribeGroupResponse)
+
+-- | The globally unique identifier for the identity store.
+describeGroupResponse_identityStoreId :: Lens.Lens' DescribeGroupResponse Prelude.Text
+describeGroupResponse_identityStoreId = Lens.lens (\DescribeGroupResponse' {identityStoreId} -> identityStoreId) (\s@DescribeGroupResponse' {} a -> s {identityStoreId = a} :: DescribeGroupResponse)
+
+instance Prelude.NFData DescribeGroupResponse where
+  rnf DescribeGroupResponse' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf externalIds
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/DescribeGroupMembership.hs b/gen/Amazonka/IdentityStore/DescribeGroupMembership.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DescribeGroupMembership.hs
@@ -0,0 +1,244 @@
+{-# 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.IdentityStore.DescribeGroupMembership
+-- 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 membership metadata and attributes from @MembershipId@ in an
+-- identity store.
+module Amazonka.IdentityStore.DescribeGroupMembership
+  ( -- * Creating a Request
+    DescribeGroupMembership (..),
+    newDescribeGroupMembership,
+
+    -- * Request Lenses
+    describeGroupMembership_identityStoreId,
+    describeGroupMembership_membershipId,
+
+    -- * Destructuring the Response
+    DescribeGroupMembershipResponse (..),
+    newDescribeGroupMembershipResponse,
+
+    -- * Response Lenses
+    describeGroupMembershipResponse_httpStatus,
+    describeGroupMembershipResponse_identityStoreId,
+    describeGroupMembershipResponse_membershipId,
+    describeGroupMembershipResponse_groupId,
+    describeGroupMembershipResponse_memberId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeGroupMembership' smart constructor.
+data DescribeGroupMembership = DescribeGroupMembership'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a @GroupMembership@ in an identity store.
+    membershipId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGroupMembership' 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:
+--
+-- 'identityStoreId', 'describeGroupMembership_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'membershipId', 'describeGroupMembership_membershipId' - The identifier for a @GroupMembership@ in an identity store.
+newDescribeGroupMembership ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'membershipId'
+  Prelude.Text ->
+  DescribeGroupMembership
+newDescribeGroupMembership
+  pIdentityStoreId_
+  pMembershipId_ =
+    DescribeGroupMembership'
+      { identityStoreId =
+          pIdentityStoreId_,
+        membershipId = pMembershipId_
+      }
+
+-- | The globally unique identifier for the identity store.
+describeGroupMembership_identityStoreId :: Lens.Lens' DescribeGroupMembership Prelude.Text
+describeGroupMembership_identityStoreId = Lens.lens (\DescribeGroupMembership' {identityStoreId} -> identityStoreId) (\s@DescribeGroupMembership' {} a -> s {identityStoreId = a} :: DescribeGroupMembership)
+
+-- | The identifier for a @GroupMembership@ in an identity store.
+describeGroupMembership_membershipId :: Lens.Lens' DescribeGroupMembership Prelude.Text
+describeGroupMembership_membershipId = Lens.lens (\DescribeGroupMembership' {membershipId} -> membershipId) (\s@DescribeGroupMembership' {} a -> s {membershipId = a} :: DescribeGroupMembership)
+
+instance Core.AWSRequest DescribeGroupMembership where
+  type
+    AWSResponse DescribeGroupMembership =
+      DescribeGroupMembershipResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeGroupMembershipResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+            Prelude.<*> (x Data..:> "MembershipId")
+            Prelude.<*> (x Data..:> "GroupId")
+            Prelude.<*> (x Data..:> "MemberId")
+      )
+
+instance Prelude.Hashable DescribeGroupMembership where
+  hashWithSalt _salt DescribeGroupMembership' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` membershipId
+
+instance Prelude.NFData DescribeGroupMembership where
+  rnf DescribeGroupMembership' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf membershipId
+
+instance Data.ToHeaders DescribeGroupMembership where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DescribeGroupMembership" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeGroupMembership where
+  toJSON DescribeGroupMembership' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("MembershipId" Data..= membershipId)
+          ]
+      )
+
+instance Data.ToPath DescribeGroupMembership where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeGroupMembership where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeGroupMembershipResponse' smart constructor.
+data DescribeGroupMembershipResponse = DescribeGroupMembershipResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a @GroupMembership@ in an identity store.
+    membershipId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    memberId :: MemberId
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGroupMembershipResponse' 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', 'describeGroupMembershipResponse_httpStatus' - The response's http status code.
+--
+-- 'identityStoreId', 'describeGroupMembershipResponse_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'membershipId', 'describeGroupMembershipResponse_membershipId' - The identifier for a @GroupMembership@ in an identity store.
+--
+-- 'groupId', 'describeGroupMembershipResponse_groupId' - The identifier for a group in the identity store.
+--
+-- 'memberId', 'describeGroupMembershipResponse_memberId' - Undocumented member.
+newDescribeGroupMembershipResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'membershipId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'memberId'
+  MemberId ->
+  DescribeGroupMembershipResponse
+newDescribeGroupMembershipResponse
+  pHttpStatus_
+  pIdentityStoreId_
+  pMembershipId_
+  pGroupId_
+  pMemberId_ =
+    DescribeGroupMembershipResponse'
+      { httpStatus =
+          pHttpStatus_,
+        identityStoreId = pIdentityStoreId_,
+        membershipId = pMembershipId_,
+        groupId = pGroupId_,
+        memberId = pMemberId_
+      }
+
+-- | The response's http status code.
+describeGroupMembershipResponse_httpStatus :: Lens.Lens' DescribeGroupMembershipResponse Prelude.Int
+describeGroupMembershipResponse_httpStatus = Lens.lens (\DescribeGroupMembershipResponse' {httpStatus} -> httpStatus) (\s@DescribeGroupMembershipResponse' {} a -> s {httpStatus = a} :: DescribeGroupMembershipResponse)
+
+-- | The globally unique identifier for the identity store.
+describeGroupMembershipResponse_identityStoreId :: Lens.Lens' DescribeGroupMembershipResponse Prelude.Text
+describeGroupMembershipResponse_identityStoreId = Lens.lens (\DescribeGroupMembershipResponse' {identityStoreId} -> identityStoreId) (\s@DescribeGroupMembershipResponse' {} a -> s {identityStoreId = a} :: DescribeGroupMembershipResponse)
+
+-- | The identifier for a @GroupMembership@ in an identity store.
+describeGroupMembershipResponse_membershipId :: Lens.Lens' DescribeGroupMembershipResponse Prelude.Text
+describeGroupMembershipResponse_membershipId = Lens.lens (\DescribeGroupMembershipResponse' {membershipId} -> membershipId) (\s@DescribeGroupMembershipResponse' {} a -> s {membershipId = a} :: DescribeGroupMembershipResponse)
+
+-- | The identifier for a group in the identity store.
+describeGroupMembershipResponse_groupId :: Lens.Lens' DescribeGroupMembershipResponse Prelude.Text
+describeGroupMembershipResponse_groupId = Lens.lens (\DescribeGroupMembershipResponse' {groupId} -> groupId) (\s@DescribeGroupMembershipResponse' {} a -> s {groupId = a} :: DescribeGroupMembershipResponse)
+
+-- | Undocumented member.
+describeGroupMembershipResponse_memberId :: Lens.Lens' DescribeGroupMembershipResponse MemberId
+describeGroupMembershipResponse_memberId = Lens.lens (\DescribeGroupMembershipResponse' {memberId} -> memberId) (\s@DescribeGroupMembershipResponse' {} a -> s {memberId = a} :: DescribeGroupMembershipResponse)
+
+instance
+  Prelude.NFData
+    DescribeGroupMembershipResponse
+  where
+  rnf DescribeGroupMembershipResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf membershipId
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf memberId
diff --git a/gen/Amazonka/IdentityStore/DescribeUser.hs b/gen/Amazonka/IdentityStore/DescribeUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/DescribeUser.hs
@@ -0,0 +1,401 @@
+{-# 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.IdentityStore.DescribeUser
+-- 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 the user metadata and attributes from the @UserId@ in an
+-- identity store.
+module Amazonka.IdentityStore.DescribeUser
+  ( -- * Creating a Request
+    DescribeUser (..),
+    newDescribeUser,
+
+    -- * Request Lenses
+    describeUser_identityStoreId,
+    describeUser_userId,
+
+    -- * Destructuring the Response
+    DescribeUserResponse (..),
+    newDescribeUserResponse,
+
+    -- * Response Lenses
+    describeUserResponse_addresses,
+    describeUserResponse_displayName,
+    describeUserResponse_emails,
+    describeUserResponse_externalIds,
+    describeUserResponse_locale,
+    describeUserResponse_name,
+    describeUserResponse_nickName,
+    describeUserResponse_phoneNumbers,
+    describeUserResponse_preferredLanguage,
+    describeUserResponse_profileUrl,
+    describeUserResponse_timezone,
+    describeUserResponse_title,
+    describeUserResponse_userName,
+    describeUserResponse_userType,
+    describeUserResponse_httpStatus,
+    describeUserResponse_userId,
+    describeUserResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeUser' smart constructor.
+data DescribeUser = DescribeUser'
+  { -- | The globally unique identifier for the identity store, such as
+    -- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+    -- @1234567890@ is a randomly generated string that contains numbers and
+    -- lower case letters. This value is generated at the time that a new
+    -- identity store is created.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeUser' 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:
+--
+-- 'identityStoreId', 'describeUser_identityStoreId' - The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+--
+-- 'userId', 'describeUser_userId' - The identifier for a user in the identity store.
+newDescribeUser ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'userId'
+  Prelude.Text ->
+  DescribeUser
+newDescribeUser pIdentityStoreId_ pUserId_ =
+  DescribeUser'
+    { identityStoreId = pIdentityStoreId_,
+      userId = pUserId_
+    }
+
+-- | The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+describeUser_identityStoreId :: Lens.Lens' DescribeUser Prelude.Text
+describeUser_identityStoreId = Lens.lens (\DescribeUser' {identityStoreId} -> identityStoreId) (\s@DescribeUser' {} a -> s {identityStoreId = a} :: DescribeUser)
+
+-- | The identifier for a user in the identity store.
+describeUser_userId :: Lens.Lens' DescribeUser Prelude.Text
+describeUser_userId = Lens.lens (\DescribeUser' {userId} -> userId) (\s@DescribeUser' {} a -> s {userId = a} :: DescribeUser)
+
+instance Core.AWSRequest DescribeUser where
+  type AWSResponse DescribeUser = DescribeUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeUserResponse'
+            Prelude.<$> (x Data..?> "Addresses")
+            Prelude.<*> (x Data..?> "DisplayName")
+            Prelude.<*> (x Data..?> "Emails")
+            Prelude.<*> (x Data..?> "ExternalIds")
+            Prelude.<*> (x Data..?> "Locale")
+            Prelude.<*> (x Data..?> "Name")
+            Prelude.<*> (x Data..?> "NickName")
+            Prelude.<*> (x Data..?> "PhoneNumbers")
+            Prelude.<*> (x Data..?> "PreferredLanguage")
+            Prelude.<*> (x Data..?> "ProfileUrl")
+            Prelude.<*> (x Data..?> "Timezone")
+            Prelude.<*> (x Data..?> "Title")
+            Prelude.<*> (x Data..?> "UserName")
+            Prelude.<*> (x Data..?> "UserType")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "UserId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable DescribeUser where
+  hashWithSalt _salt DescribeUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData DescribeUser where
+  rnf DescribeUser' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToHeaders DescribeUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.DescribeUser" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeUser where
+  toJSON DescribeUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("UserId" Data..= userId)
+          ]
+      )
+
+instance Data.ToPath DescribeUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeUserResponse' smart constructor.
+data DescribeUserResponse = DescribeUserResponse'
+  { -- | The user\'s physical address.
+    addresses :: Prelude.Maybe (Prelude.NonEmpty Address),
+    -- | The user\'s name value for display.
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The user\'s email value.
+    emails :: Prelude.Maybe (Prelude.NonEmpty Email),
+    -- | A list of @ExternalId@ objects that contains the identifiers issued to
+    -- this resource by an external identity provider.
+    externalIds :: Prelude.Maybe (Prelude.NonEmpty ExternalId),
+    -- | A string containing the user\'s geographical region or location.
+    locale :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The name of the user.
+    name :: Prelude.Maybe Name,
+    -- | An alternative descriptive name for the user.
+    nickName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @PhoneNumber@ objects associated with a user.
+    phoneNumbers :: Prelude.Maybe (Prelude.NonEmpty PhoneNumber),
+    -- | The preferred language of the user.
+    preferredLanguage :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A URL link for the user\'s profile.
+    profileUrl :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The time zone for a user.
+    timezone :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the user\'s title.
+    title :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A unique string used to identify the user. The length limit is 128
+    -- characters. This value can consist of letters, accented characters,
+    -- symbols, numbers, and punctuation. This value is specified at the time
+    -- the user is created and stored as an attribute of the user object in the
+    -- identity store.
+    userName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string indicating the user\'s type.
+    userType :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeUserResponse' 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:
+--
+-- 'addresses', 'describeUserResponse_addresses' - The user\'s physical address.
+--
+-- 'displayName', 'describeUserResponse_displayName' - The user\'s name value for display.
+--
+-- 'emails', 'describeUserResponse_emails' - The user\'s email value.
+--
+-- 'externalIds', 'describeUserResponse_externalIds' - A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+--
+-- 'locale', 'describeUserResponse_locale' - A string containing the user\'s geographical region or location.
+--
+-- 'name', 'describeUserResponse_name' - The name of the user.
+--
+-- 'nickName', 'describeUserResponse_nickName' - An alternative descriptive name for the user.
+--
+-- 'phoneNumbers', 'describeUserResponse_phoneNumbers' - A list of @PhoneNumber@ objects associated with a user.
+--
+-- 'preferredLanguage', 'describeUserResponse_preferredLanguage' - The preferred language of the user.
+--
+-- 'profileUrl', 'describeUserResponse_profileUrl' - A URL link for the user\'s profile.
+--
+-- 'timezone', 'describeUserResponse_timezone' - The time zone for a user.
+--
+-- 'title', 'describeUserResponse_title' - A string containing the user\'s title.
+--
+-- 'userName', 'describeUserResponse_userName' - A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+--
+-- 'userType', 'describeUserResponse_userType' - A string indicating the user\'s type.
+--
+-- 'httpStatus', 'describeUserResponse_httpStatus' - The response's http status code.
+--
+-- 'userId', 'describeUserResponse_userId' - The identifier for a user in the identity store.
+--
+-- 'identityStoreId', 'describeUserResponse_identityStoreId' - The globally unique identifier for the identity store.
+newDescribeUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  DescribeUserResponse
+newDescribeUserResponse
+  pHttpStatus_
+  pUserId_
+  pIdentityStoreId_ =
+    DescribeUserResponse'
+      { addresses = Prelude.Nothing,
+        displayName = Prelude.Nothing,
+        emails = Prelude.Nothing,
+        externalIds = Prelude.Nothing,
+        locale = Prelude.Nothing,
+        name = Prelude.Nothing,
+        nickName = Prelude.Nothing,
+        phoneNumbers = Prelude.Nothing,
+        preferredLanguage = Prelude.Nothing,
+        profileUrl = Prelude.Nothing,
+        timezone = Prelude.Nothing,
+        title = Prelude.Nothing,
+        userName = Prelude.Nothing,
+        userType = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        userId = pUserId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The user\'s physical address.
+describeUserResponse_addresses :: Lens.Lens' DescribeUserResponse (Prelude.Maybe (Prelude.NonEmpty Address))
+describeUserResponse_addresses = Lens.lens (\DescribeUserResponse' {addresses} -> addresses) (\s@DescribeUserResponse' {} a -> s {addresses = a} :: DescribeUserResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The user\'s name value for display.
+describeUserResponse_displayName :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_displayName = Lens.lens (\DescribeUserResponse' {displayName} -> displayName) (\s@DescribeUserResponse' {} a -> s {displayName = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The user\'s email value.
+describeUserResponse_emails :: Lens.Lens' DescribeUserResponse (Prelude.Maybe (Prelude.NonEmpty Email))
+describeUserResponse_emails = Lens.lens (\DescribeUserResponse' {emails} -> emails) (\s@DescribeUserResponse' {} a -> s {emails = a} :: DescribeUserResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+describeUserResponse_externalIds :: Lens.Lens' DescribeUserResponse (Prelude.Maybe (Prelude.NonEmpty ExternalId))
+describeUserResponse_externalIds = Lens.lens (\DescribeUserResponse' {externalIds} -> externalIds) (\s@DescribeUserResponse' {} a -> s {externalIds = a} :: DescribeUserResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the user\'s geographical region or location.
+describeUserResponse_locale :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_locale = Lens.lens (\DescribeUserResponse' {locale} -> locale) (\s@DescribeUserResponse' {} a -> s {locale = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The name of the user.
+describeUserResponse_name :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Name)
+describeUserResponse_name = Lens.lens (\DescribeUserResponse' {name} -> name) (\s@DescribeUserResponse' {} a -> s {name = a} :: DescribeUserResponse)
+
+-- | An alternative descriptive name for the user.
+describeUserResponse_nickName :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_nickName = Lens.lens (\DescribeUserResponse' {nickName} -> nickName) (\s@DescribeUserResponse' {} a -> s {nickName = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @PhoneNumber@ objects associated with a user.
+describeUserResponse_phoneNumbers :: Lens.Lens' DescribeUserResponse (Prelude.Maybe (Prelude.NonEmpty PhoneNumber))
+describeUserResponse_phoneNumbers = Lens.lens (\DescribeUserResponse' {phoneNumbers} -> phoneNumbers) (\s@DescribeUserResponse' {} a -> s {phoneNumbers = a} :: DescribeUserResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The preferred language of the user.
+describeUserResponse_preferredLanguage :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_preferredLanguage = Lens.lens (\DescribeUserResponse' {preferredLanguage} -> preferredLanguage) (\s@DescribeUserResponse' {} a -> s {preferredLanguage = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A URL link for the user\'s profile.
+describeUserResponse_profileUrl :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_profileUrl = Lens.lens (\DescribeUserResponse' {profileUrl} -> profileUrl) (\s@DescribeUserResponse' {} a -> s {profileUrl = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The time zone for a user.
+describeUserResponse_timezone :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_timezone = Lens.lens (\DescribeUserResponse' {timezone} -> timezone) (\s@DescribeUserResponse' {} a -> s {timezone = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the user\'s title.
+describeUserResponse_title :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_title = Lens.lens (\DescribeUserResponse' {title} -> title) (\s@DescribeUserResponse' {} a -> s {title = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+describeUserResponse_userName :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_userName = Lens.lens (\DescribeUserResponse' {userName} -> userName) (\s@DescribeUserResponse' {} a -> s {userName = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string indicating the user\'s type.
+describeUserResponse_userType :: Lens.Lens' DescribeUserResponse (Prelude.Maybe Prelude.Text)
+describeUserResponse_userType = Lens.lens (\DescribeUserResponse' {userType} -> userType) (\s@DescribeUserResponse' {} a -> s {userType = a} :: DescribeUserResponse) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The response's http status code.
+describeUserResponse_httpStatus :: Lens.Lens' DescribeUserResponse Prelude.Int
+describeUserResponse_httpStatus = Lens.lens (\DescribeUserResponse' {httpStatus} -> httpStatus) (\s@DescribeUserResponse' {} a -> s {httpStatus = a} :: DescribeUserResponse)
+
+-- | The identifier for a user in the identity store.
+describeUserResponse_userId :: Lens.Lens' DescribeUserResponse Prelude.Text
+describeUserResponse_userId = Lens.lens (\DescribeUserResponse' {userId} -> userId) (\s@DescribeUserResponse' {} a -> s {userId = a} :: DescribeUserResponse)
+
+-- | The globally unique identifier for the identity store.
+describeUserResponse_identityStoreId :: Lens.Lens' DescribeUserResponse Prelude.Text
+describeUserResponse_identityStoreId = Lens.lens (\DescribeUserResponse' {identityStoreId} -> identityStoreId) (\s@DescribeUserResponse' {} a -> s {identityStoreId = a} :: DescribeUserResponse)
+
+instance Prelude.NFData DescribeUserResponse where
+  rnf DescribeUserResponse' {..} =
+    Prelude.rnf addresses
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf emails
+      `Prelude.seq` Prelude.rnf externalIds
+      `Prelude.seq` Prelude.rnf locale
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nickName
+      `Prelude.seq` Prelude.rnf phoneNumbers
+      `Prelude.seq` Prelude.rnf preferredLanguage
+      `Prelude.seq` Prelude.rnf profileUrl
+      `Prelude.seq` Prelude.rnf timezone
+      `Prelude.seq` Prelude.rnf title
+      `Prelude.seq` Prelude.rnf userName
+      `Prelude.seq` Prelude.rnf userType
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/GetGroupId.hs b/gen/Amazonka/IdentityStore/GetGroupId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/GetGroupId.hs
@@ -0,0 +1,215 @@
+{-# 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.IdentityStore.GetGroupId
+-- 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 @GroupId@ in an identity store.
+module Amazonka.IdentityStore.GetGroupId
+  ( -- * Creating a Request
+    GetGroupId (..),
+    newGetGroupId,
+
+    -- * Request Lenses
+    getGroupId_identityStoreId,
+    getGroupId_alternateIdentifier,
+
+    -- * Destructuring the Response
+    GetGroupIdResponse (..),
+    newGetGroupIdResponse,
+
+    -- * Response Lenses
+    getGroupIdResponse_httpStatus,
+    getGroupIdResponse_groupId,
+    getGroupIdResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetGroupId' smart constructor.
+data GetGroupId = GetGroupId'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | A unique identifier for a user or group that is not the primary
+    -- identifier. This value can be an identifier from an external identity
+    -- provider (IdP) that is associated with the user, the group, or a unique
+    -- attribute. For example, a unique @GroupDisplayName@.
+    alternateIdentifier :: AlternateIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetGroupId' 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:
+--
+-- 'identityStoreId', 'getGroupId_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'alternateIdentifier', 'getGroupId_alternateIdentifier' - A unique identifier for a user or group that is not the primary
+-- identifier. This value can be an identifier from an external identity
+-- provider (IdP) that is associated with the user, the group, or a unique
+-- attribute. For example, a unique @GroupDisplayName@.
+newGetGroupId ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'alternateIdentifier'
+  AlternateIdentifier ->
+  GetGroupId
+newGetGroupId pIdentityStoreId_ pAlternateIdentifier_ =
+  GetGroupId'
+    { identityStoreId = pIdentityStoreId_,
+      alternateIdentifier = pAlternateIdentifier_
+    }
+
+-- | The globally unique identifier for the identity store.
+getGroupId_identityStoreId :: Lens.Lens' GetGroupId Prelude.Text
+getGroupId_identityStoreId = Lens.lens (\GetGroupId' {identityStoreId} -> identityStoreId) (\s@GetGroupId' {} a -> s {identityStoreId = a} :: GetGroupId)
+
+-- | A unique identifier for a user or group that is not the primary
+-- identifier. This value can be an identifier from an external identity
+-- provider (IdP) that is associated with the user, the group, or a unique
+-- attribute. For example, a unique @GroupDisplayName@.
+getGroupId_alternateIdentifier :: Lens.Lens' GetGroupId AlternateIdentifier
+getGroupId_alternateIdentifier = Lens.lens (\GetGroupId' {alternateIdentifier} -> alternateIdentifier) (\s@GetGroupId' {} a -> s {alternateIdentifier = a} :: GetGroupId)
+
+instance Core.AWSRequest GetGroupId where
+  type AWSResponse GetGroupId = GetGroupIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetGroupIdResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "GroupId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable GetGroupId where
+  hashWithSalt _salt GetGroupId' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` alternateIdentifier
+
+instance Prelude.NFData GetGroupId where
+  rnf GetGroupId' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf alternateIdentifier
+
+instance Data.ToHeaders GetGroupId where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.GetGroupId" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetGroupId where
+  toJSON GetGroupId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just
+              ("AlternateIdentifier" Data..= alternateIdentifier)
+          ]
+      )
+
+instance Data.ToPath GetGroupId where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetGroupId where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetGroupIdResponse' smart constructor.
+data GetGroupIdResponse = GetGroupIdResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetGroupIdResponse' 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', 'getGroupIdResponse_httpStatus' - The response's http status code.
+--
+-- 'groupId', 'getGroupIdResponse_groupId' - The identifier for a group in the identity store.
+--
+-- 'identityStoreId', 'getGroupIdResponse_identityStoreId' - The globally unique identifier for the identity store.
+newGetGroupIdResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  GetGroupIdResponse
+newGetGroupIdResponse
+  pHttpStatus_
+  pGroupId_
+  pIdentityStoreId_ =
+    GetGroupIdResponse'
+      { httpStatus = pHttpStatus_,
+        groupId = pGroupId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+getGroupIdResponse_httpStatus :: Lens.Lens' GetGroupIdResponse Prelude.Int
+getGroupIdResponse_httpStatus = Lens.lens (\GetGroupIdResponse' {httpStatus} -> httpStatus) (\s@GetGroupIdResponse' {} a -> s {httpStatus = a} :: GetGroupIdResponse)
+
+-- | The identifier for a group in the identity store.
+getGroupIdResponse_groupId :: Lens.Lens' GetGroupIdResponse Prelude.Text
+getGroupIdResponse_groupId = Lens.lens (\GetGroupIdResponse' {groupId} -> groupId) (\s@GetGroupIdResponse' {} a -> s {groupId = a} :: GetGroupIdResponse)
+
+-- | The globally unique identifier for the identity store.
+getGroupIdResponse_identityStoreId :: Lens.Lens' GetGroupIdResponse Prelude.Text
+getGroupIdResponse_identityStoreId = Lens.lens (\GetGroupIdResponse' {identityStoreId} -> identityStoreId) (\s@GetGroupIdResponse' {} a -> s {identityStoreId = a} :: GetGroupIdResponse)
+
+instance Prelude.NFData GetGroupIdResponse where
+  rnf GetGroupIdResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/GetGroupMembershipId.hs b/gen/Amazonka/IdentityStore/GetGroupMembershipId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/GetGroupMembershipId.hs
@@ -0,0 +1,233 @@
+{-# 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.IdentityStore.GetGroupMembershipId
+-- 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 the @MembershipId@ in an identity store.
+module Amazonka.IdentityStore.GetGroupMembershipId
+  ( -- * Creating a Request
+    GetGroupMembershipId (..),
+    newGetGroupMembershipId,
+
+    -- * Request Lenses
+    getGroupMembershipId_identityStoreId,
+    getGroupMembershipId_groupId,
+    getGroupMembershipId_memberId,
+
+    -- * Destructuring the Response
+    GetGroupMembershipIdResponse (..),
+    newGetGroupMembershipIdResponse,
+
+    -- * Response Lenses
+    getGroupMembershipIdResponse_httpStatus,
+    getGroupMembershipIdResponse_membershipId,
+    getGroupMembershipIdResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetGroupMembershipId' smart constructor.
+data GetGroupMembershipId = GetGroupMembershipId'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | An object that contains the identifier of a group member. Setting the
+    -- @UserID@ field to the specific identifier for a user indicates that the
+    -- user is a member of the group.
+    memberId :: MemberId
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetGroupMembershipId' 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:
+--
+-- 'identityStoreId', 'getGroupMembershipId_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'groupId', 'getGroupMembershipId_groupId' - The identifier for a group in the identity store.
+--
+-- 'memberId', 'getGroupMembershipId_memberId' - An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+newGetGroupMembershipId ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'memberId'
+  MemberId ->
+  GetGroupMembershipId
+newGetGroupMembershipId
+  pIdentityStoreId_
+  pGroupId_
+  pMemberId_ =
+    GetGroupMembershipId'
+      { identityStoreId =
+          pIdentityStoreId_,
+        groupId = pGroupId_,
+        memberId = pMemberId_
+      }
+
+-- | The globally unique identifier for the identity store.
+getGroupMembershipId_identityStoreId :: Lens.Lens' GetGroupMembershipId Prelude.Text
+getGroupMembershipId_identityStoreId = Lens.lens (\GetGroupMembershipId' {identityStoreId} -> identityStoreId) (\s@GetGroupMembershipId' {} a -> s {identityStoreId = a} :: GetGroupMembershipId)
+
+-- | The identifier for a group in the identity store.
+getGroupMembershipId_groupId :: Lens.Lens' GetGroupMembershipId Prelude.Text
+getGroupMembershipId_groupId = Lens.lens (\GetGroupMembershipId' {groupId} -> groupId) (\s@GetGroupMembershipId' {} a -> s {groupId = a} :: GetGroupMembershipId)
+
+-- | An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+getGroupMembershipId_memberId :: Lens.Lens' GetGroupMembershipId MemberId
+getGroupMembershipId_memberId = Lens.lens (\GetGroupMembershipId' {memberId} -> memberId) (\s@GetGroupMembershipId' {} a -> s {memberId = a} :: GetGroupMembershipId)
+
+instance Core.AWSRequest GetGroupMembershipId where
+  type
+    AWSResponse GetGroupMembershipId =
+      GetGroupMembershipIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetGroupMembershipIdResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "MembershipId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable GetGroupMembershipId where
+  hashWithSalt _salt GetGroupMembershipId' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+      `Prelude.hashWithSalt` memberId
+
+instance Prelude.NFData GetGroupMembershipId where
+  rnf GetGroupMembershipId' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf memberId
+
+instance Data.ToHeaders GetGroupMembershipId where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.GetGroupMembershipId" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetGroupMembershipId where
+  toJSON GetGroupMembershipId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId),
+            Prelude.Just ("MemberId" Data..= memberId)
+          ]
+      )
+
+instance Data.ToPath GetGroupMembershipId where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetGroupMembershipId where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetGroupMembershipIdResponse' smart constructor.
+data GetGroupMembershipIdResponse = GetGroupMembershipIdResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a @GroupMembership@ in an identity store.
+    membershipId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetGroupMembershipIdResponse' 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', 'getGroupMembershipIdResponse_httpStatus' - The response's http status code.
+--
+-- 'membershipId', 'getGroupMembershipIdResponse_membershipId' - The identifier for a @GroupMembership@ in an identity store.
+--
+-- 'identityStoreId', 'getGroupMembershipIdResponse_identityStoreId' - The globally unique identifier for the identity store.
+newGetGroupMembershipIdResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'membershipId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  GetGroupMembershipIdResponse
+newGetGroupMembershipIdResponse
+  pHttpStatus_
+  pMembershipId_
+  pIdentityStoreId_ =
+    GetGroupMembershipIdResponse'
+      { httpStatus =
+          pHttpStatus_,
+        membershipId = pMembershipId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+getGroupMembershipIdResponse_httpStatus :: Lens.Lens' GetGroupMembershipIdResponse Prelude.Int
+getGroupMembershipIdResponse_httpStatus = Lens.lens (\GetGroupMembershipIdResponse' {httpStatus} -> httpStatus) (\s@GetGroupMembershipIdResponse' {} a -> s {httpStatus = a} :: GetGroupMembershipIdResponse)
+
+-- | The identifier for a @GroupMembership@ in an identity store.
+getGroupMembershipIdResponse_membershipId :: Lens.Lens' GetGroupMembershipIdResponse Prelude.Text
+getGroupMembershipIdResponse_membershipId = Lens.lens (\GetGroupMembershipIdResponse' {membershipId} -> membershipId) (\s@GetGroupMembershipIdResponse' {} a -> s {membershipId = a} :: GetGroupMembershipIdResponse)
+
+-- | The globally unique identifier for the identity store.
+getGroupMembershipIdResponse_identityStoreId :: Lens.Lens' GetGroupMembershipIdResponse Prelude.Text
+getGroupMembershipIdResponse_identityStoreId = Lens.lens (\GetGroupMembershipIdResponse' {identityStoreId} -> identityStoreId) (\s@GetGroupMembershipIdResponse' {} a -> s {identityStoreId = a} :: GetGroupMembershipIdResponse)
+
+instance Prelude.NFData GetGroupMembershipIdResponse where
+  rnf GetGroupMembershipIdResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf membershipId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/GetUserId.hs b/gen/Amazonka/IdentityStore/GetUserId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/GetUserId.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.IdentityStore.GetUserId
+-- 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 the @UserId@ in an identity store.
+module Amazonka.IdentityStore.GetUserId
+  ( -- * Creating a Request
+    GetUserId (..),
+    newGetUserId,
+
+    -- * Request Lenses
+    getUserId_identityStoreId,
+    getUserId_alternateIdentifier,
+
+    -- * Destructuring the Response
+    GetUserIdResponse (..),
+    newGetUserIdResponse,
+
+    -- * Response Lenses
+    getUserIdResponse_httpStatus,
+    getUserIdResponse_userId,
+    getUserIdResponse_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetUserId' smart constructor.
+data GetUserId = GetUserId'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | A unique identifier for a user or group that is not the primary
+    -- identifier. This value can be an identifier from an external identity
+    -- provider (IdP) that is associated with the user, the group, or a unique
+    -- attribute. For example, a unique @UserDisplayName@.
+    alternateIdentifier :: AlternateIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUserId' 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:
+--
+-- 'identityStoreId', 'getUserId_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'alternateIdentifier', 'getUserId_alternateIdentifier' - A unique identifier for a user or group that is not the primary
+-- identifier. This value can be an identifier from an external identity
+-- provider (IdP) that is associated with the user, the group, or a unique
+-- attribute. For example, a unique @UserDisplayName@.
+newGetUserId ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'alternateIdentifier'
+  AlternateIdentifier ->
+  GetUserId
+newGetUserId pIdentityStoreId_ pAlternateIdentifier_ =
+  GetUserId'
+    { identityStoreId = pIdentityStoreId_,
+      alternateIdentifier = pAlternateIdentifier_
+    }
+
+-- | The globally unique identifier for the identity store.
+getUserId_identityStoreId :: Lens.Lens' GetUserId Prelude.Text
+getUserId_identityStoreId = Lens.lens (\GetUserId' {identityStoreId} -> identityStoreId) (\s@GetUserId' {} a -> s {identityStoreId = a} :: GetUserId)
+
+-- | A unique identifier for a user or group that is not the primary
+-- identifier. This value can be an identifier from an external identity
+-- provider (IdP) that is associated with the user, the group, or a unique
+-- attribute. For example, a unique @UserDisplayName@.
+getUserId_alternateIdentifier :: Lens.Lens' GetUserId AlternateIdentifier
+getUserId_alternateIdentifier = Lens.lens (\GetUserId' {alternateIdentifier} -> alternateIdentifier) (\s@GetUserId' {} a -> s {alternateIdentifier = a} :: GetUserId)
+
+instance Core.AWSRequest GetUserId where
+  type AWSResponse GetUserId = GetUserIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetUserIdResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "UserId")
+            Prelude.<*> (x Data..:> "IdentityStoreId")
+      )
+
+instance Prelude.Hashable GetUserId where
+  hashWithSalt _salt GetUserId' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` alternateIdentifier
+
+instance Prelude.NFData GetUserId where
+  rnf GetUserId' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf alternateIdentifier
+
+instance Data.ToHeaders GetUserId where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AWSIdentityStore.GetUserId" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetUserId where
+  toJSON GetUserId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just
+              ("AlternateIdentifier" Data..= alternateIdentifier)
+          ]
+      )
+
+instance Data.ToPath GetUserId where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetUserId where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetUserIdResponse' smart constructor.
+data GetUserIdResponse = GetUserIdResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetUserIdResponse' 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', 'getUserIdResponse_httpStatus' - The response's http status code.
+--
+-- 'userId', 'getUserIdResponse_userId' - The identifier for a user in the identity store.
+--
+-- 'identityStoreId', 'getUserIdResponse_identityStoreId' - The globally unique identifier for the identity store.
+newGetUserIdResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  GetUserIdResponse
+newGetUserIdResponse
+  pHttpStatus_
+  pUserId_
+  pIdentityStoreId_ =
+    GetUserIdResponse'
+      { httpStatus = pHttpStatus_,
+        userId = pUserId_,
+        identityStoreId = pIdentityStoreId_
+      }
+
+-- | The response's http status code.
+getUserIdResponse_httpStatus :: Lens.Lens' GetUserIdResponse Prelude.Int
+getUserIdResponse_httpStatus = Lens.lens (\GetUserIdResponse' {httpStatus} -> httpStatus) (\s@GetUserIdResponse' {} a -> s {httpStatus = a} :: GetUserIdResponse)
+
+-- | The identifier for a user in the identity store.
+getUserIdResponse_userId :: Lens.Lens' GetUserIdResponse Prelude.Text
+getUserIdResponse_userId = Lens.lens (\GetUserIdResponse' {userId} -> userId) (\s@GetUserIdResponse' {} a -> s {userId = a} :: GetUserIdResponse)
+
+-- | The globally unique identifier for the identity store.
+getUserIdResponse_identityStoreId :: Lens.Lens' GetUserIdResponse Prelude.Text
+getUserIdResponse_identityStoreId = Lens.lens (\GetUserIdResponse' {identityStoreId} -> identityStoreId) (\s@GetUserIdResponse' {} a -> s {identityStoreId = a} :: GetUserIdResponse)
+
+instance Prelude.NFData GetUserIdResponse where
+  rnf GetUserIdResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/IsMemberInGroups.hs b/gen/Amazonka/IdentityStore/IsMemberInGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/IsMemberInGroups.hs
@@ -0,0 +1,209 @@
+{-# 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.IdentityStore.IsMemberInGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Checks the user\'s membership in all requested groups and returns if the
+-- member exists in all queried groups.
+module Amazonka.IdentityStore.IsMemberInGroups
+  ( -- * Creating a Request
+    IsMemberInGroups (..),
+    newIsMemberInGroups,
+
+    -- * Request Lenses
+    isMemberInGroups_identityStoreId,
+    isMemberInGroups_memberId,
+    isMemberInGroups_groupIds,
+
+    -- * Destructuring the Response
+    IsMemberInGroupsResponse (..),
+    newIsMemberInGroupsResponse,
+
+    -- * Response Lenses
+    isMemberInGroupsResponse_httpStatus,
+    isMemberInGroupsResponse_results,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newIsMemberInGroups' smart constructor.
+data IsMemberInGroups = IsMemberInGroups'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | An object containing the identifier of a group member.
+    memberId :: MemberId,
+    -- | A list of identifiers for groups in the identity store.
+    groupIds :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IsMemberInGroups' 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:
+--
+-- 'identityStoreId', 'isMemberInGroups_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'memberId', 'isMemberInGroups_memberId' - An object containing the identifier of a group member.
+--
+-- 'groupIds', 'isMemberInGroups_groupIds' - A list of identifiers for groups in the identity store.
+newIsMemberInGroups ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'memberId'
+  MemberId ->
+  -- | 'groupIds'
+  Prelude.NonEmpty Prelude.Text ->
+  IsMemberInGroups
+newIsMemberInGroups
+  pIdentityStoreId_
+  pMemberId_
+  pGroupIds_ =
+    IsMemberInGroups'
+      { identityStoreId =
+          pIdentityStoreId_,
+        memberId = pMemberId_,
+        groupIds = Lens.coerced Lens.# pGroupIds_
+      }
+
+-- | The globally unique identifier for the identity store.
+isMemberInGroups_identityStoreId :: Lens.Lens' IsMemberInGroups Prelude.Text
+isMemberInGroups_identityStoreId = Lens.lens (\IsMemberInGroups' {identityStoreId} -> identityStoreId) (\s@IsMemberInGroups' {} a -> s {identityStoreId = a} :: IsMemberInGroups)
+
+-- | An object containing the identifier of a group member.
+isMemberInGroups_memberId :: Lens.Lens' IsMemberInGroups MemberId
+isMemberInGroups_memberId = Lens.lens (\IsMemberInGroups' {memberId} -> memberId) (\s@IsMemberInGroups' {} a -> s {memberId = a} :: IsMemberInGroups)
+
+-- | A list of identifiers for groups in the identity store.
+isMemberInGroups_groupIds :: Lens.Lens' IsMemberInGroups (Prelude.NonEmpty Prelude.Text)
+isMemberInGroups_groupIds = Lens.lens (\IsMemberInGroups' {groupIds} -> groupIds) (\s@IsMemberInGroups' {} a -> s {groupIds = a} :: IsMemberInGroups) Prelude.. Lens.coerced
+
+instance Core.AWSRequest IsMemberInGroups where
+  type
+    AWSResponse IsMemberInGroups =
+      IsMemberInGroupsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          IsMemberInGroupsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Results" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable IsMemberInGroups where
+  hashWithSalt _salt IsMemberInGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` memberId
+      `Prelude.hashWithSalt` groupIds
+
+instance Prelude.NFData IsMemberInGroups where
+  rnf IsMemberInGroups' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf memberId
+      `Prelude.seq` Prelude.rnf groupIds
+
+instance Data.ToHeaders IsMemberInGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.IsMemberInGroups" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON IsMemberInGroups where
+  toJSON IsMemberInGroups' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("MemberId" Data..= memberId),
+            Prelude.Just ("GroupIds" Data..= groupIds)
+          ]
+      )
+
+instance Data.ToPath IsMemberInGroups where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery IsMemberInGroups where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newIsMemberInGroupsResponse' smart constructor.
+data IsMemberInGroupsResponse = IsMemberInGroupsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list containing the results of membership existence checks.
+    results :: [GroupMembershipExistenceResult]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IsMemberInGroupsResponse' 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', 'isMemberInGroupsResponse_httpStatus' - The response's http status code.
+--
+-- 'results', 'isMemberInGroupsResponse_results' - A list containing the results of membership existence checks.
+newIsMemberInGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  IsMemberInGroupsResponse
+newIsMemberInGroupsResponse pHttpStatus_ =
+  IsMemberInGroupsResponse'
+    { httpStatus =
+        pHttpStatus_,
+      results = Prelude.mempty
+    }
+
+-- | The response's http status code.
+isMemberInGroupsResponse_httpStatus :: Lens.Lens' IsMemberInGroupsResponse Prelude.Int
+isMemberInGroupsResponse_httpStatus = Lens.lens (\IsMemberInGroupsResponse' {httpStatus} -> httpStatus) (\s@IsMemberInGroupsResponse' {} a -> s {httpStatus = a} :: IsMemberInGroupsResponse)
+
+-- | A list containing the results of membership existence checks.
+isMemberInGroupsResponse_results :: Lens.Lens' IsMemberInGroupsResponse [GroupMembershipExistenceResult]
+isMemberInGroupsResponse_results = Lens.lens (\IsMemberInGroupsResponse' {results} -> results) (\s@IsMemberInGroupsResponse' {} a -> s {results = a} :: IsMemberInGroupsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData IsMemberInGroupsResponse where
+  rnf IsMemberInGroupsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf results
diff --git a/gen/Amazonka/IdentityStore/Lens.hs b/gen/Amazonka/IdentityStore/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Lens.hs
@@ -0,0 +1,310 @@
+{-# 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.IdentityStore.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.IdentityStore.Lens
+  ( -- * Operations
+
+    -- ** CreateGroup
+    createGroup_description,
+    createGroup_displayName,
+    createGroup_identityStoreId,
+    createGroupResponse_httpStatus,
+    createGroupResponse_groupId,
+    createGroupResponse_identityStoreId,
+
+    -- ** CreateGroupMembership
+    createGroupMembership_identityStoreId,
+    createGroupMembership_groupId,
+    createGroupMembership_memberId,
+    createGroupMembershipResponse_httpStatus,
+    createGroupMembershipResponse_membershipId,
+    createGroupMembershipResponse_identityStoreId,
+
+    -- ** CreateUser
+    createUser_addresses,
+    createUser_displayName,
+    createUser_emails,
+    createUser_locale,
+    createUser_name,
+    createUser_nickName,
+    createUser_phoneNumbers,
+    createUser_preferredLanguage,
+    createUser_profileUrl,
+    createUser_timezone,
+    createUser_title,
+    createUser_userName,
+    createUser_userType,
+    createUser_identityStoreId,
+    createUserResponse_httpStatus,
+    createUserResponse_userId,
+    createUserResponse_identityStoreId,
+
+    -- ** DeleteGroup
+    deleteGroup_identityStoreId,
+    deleteGroup_groupId,
+    deleteGroupResponse_httpStatus,
+
+    -- ** DeleteGroupMembership
+    deleteGroupMembership_identityStoreId,
+    deleteGroupMembership_membershipId,
+    deleteGroupMembershipResponse_httpStatus,
+
+    -- ** DeleteUser
+    deleteUser_identityStoreId,
+    deleteUser_userId,
+    deleteUserResponse_httpStatus,
+
+    -- ** DescribeGroup
+    describeGroup_identityStoreId,
+    describeGroup_groupId,
+    describeGroupResponse_description,
+    describeGroupResponse_displayName,
+    describeGroupResponse_externalIds,
+    describeGroupResponse_httpStatus,
+    describeGroupResponse_groupId,
+    describeGroupResponse_identityStoreId,
+
+    -- ** DescribeGroupMembership
+    describeGroupMembership_identityStoreId,
+    describeGroupMembership_membershipId,
+    describeGroupMembershipResponse_httpStatus,
+    describeGroupMembershipResponse_identityStoreId,
+    describeGroupMembershipResponse_membershipId,
+    describeGroupMembershipResponse_groupId,
+    describeGroupMembershipResponse_memberId,
+
+    -- ** DescribeUser
+    describeUser_identityStoreId,
+    describeUser_userId,
+    describeUserResponse_addresses,
+    describeUserResponse_displayName,
+    describeUserResponse_emails,
+    describeUserResponse_externalIds,
+    describeUserResponse_locale,
+    describeUserResponse_name,
+    describeUserResponse_nickName,
+    describeUserResponse_phoneNumbers,
+    describeUserResponse_preferredLanguage,
+    describeUserResponse_profileUrl,
+    describeUserResponse_timezone,
+    describeUserResponse_title,
+    describeUserResponse_userName,
+    describeUserResponse_userType,
+    describeUserResponse_httpStatus,
+    describeUserResponse_userId,
+    describeUserResponse_identityStoreId,
+
+    -- ** GetGroupId
+    getGroupId_identityStoreId,
+    getGroupId_alternateIdentifier,
+    getGroupIdResponse_httpStatus,
+    getGroupIdResponse_groupId,
+    getGroupIdResponse_identityStoreId,
+
+    -- ** GetGroupMembershipId
+    getGroupMembershipId_identityStoreId,
+    getGroupMembershipId_groupId,
+    getGroupMembershipId_memberId,
+    getGroupMembershipIdResponse_httpStatus,
+    getGroupMembershipIdResponse_membershipId,
+    getGroupMembershipIdResponse_identityStoreId,
+
+    -- ** GetUserId
+    getUserId_identityStoreId,
+    getUserId_alternateIdentifier,
+    getUserIdResponse_httpStatus,
+    getUserIdResponse_userId,
+    getUserIdResponse_identityStoreId,
+
+    -- ** IsMemberInGroups
+    isMemberInGroups_identityStoreId,
+    isMemberInGroups_memberId,
+    isMemberInGroups_groupIds,
+    isMemberInGroupsResponse_httpStatus,
+    isMemberInGroupsResponse_results,
+
+    -- ** ListGroupMemberships
+    listGroupMemberships_maxResults,
+    listGroupMemberships_nextToken,
+    listGroupMemberships_identityStoreId,
+    listGroupMemberships_groupId,
+    listGroupMembershipsResponse_nextToken,
+    listGroupMembershipsResponse_httpStatus,
+    listGroupMembershipsResponse_groupMemberships,
+
+    -- ** ListGroupMembershipsForMember
+    listGroupMembershipsForMember_maxResults,
+    listGroupMembershipsForMember_nextToken,
+    listGroupMembershipsForMember_identityStoreId,
+    listGroupMembershipsForMember_memberId,
+    listGroupMembershipsForMemberResponse_nextToken,
+    listGroupMembershipsForMemberResponse_httpStatus,
+    listGroupMembershipsForMemberResponse_groupMemberships,
+
+    -- ** ListGroups
+    listGroups_filters,
+    listGroups_maxResults,
+    listGroups_nextToken,
+    listGroups_identityStoreId,
+    listGroupsResponse_nextToken,
+    listGroupsResponse_httpStatus,
+    listGroupsResponse_groups,
+
+    -- ** ListUsers
+    listUsers_filters,
+    listUsers_maxResults,
+    listUsers_nextToken,
+    listUsers_identityStoreId,
+    listUsersResponse_nextToken,
+    listUsersResponse_httpStatus,
+    listUsersResponse_users,
+
+    -- ** UpdateGroup
+    updateGroup_identityStoreId,
+    updateGroup_groupId,
+    updateGroup_operations,
+    updateGroupResponse_httpStatus,
+
+    -- ** UpdateUser
+    updateUser_identityStoreId,
+    updateUser_userId,
+    updateUser_operations,
+    updateUserResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Address
+    address_country,
+    address_formatted,
+    address_locality,
+    address_postalCode,
+    address_primary,
+    address_region,
+    address_streetAddress,
+    address_type,
+
+    -- ** AlternateIdentifier
+    alternateIdentifier_externalId,
+    alternateIdentifier_uniqueAttribute,
+
+    -- ** AttributeOperation
+    attributeOperation_attributeValue,
+    attributeOperation_attributePath,
+
+    -- ** AttributeValue
+
+    -- ** Email
+    email_primary,
+    email_type,
+    email_value,
+
+    -- ** ExternalId
+    externalId_issuer,
+    externalId_id,
+
+    -- ** Filter
+    filter_attributePath,
+    filter_attributeValue,
+
+    -- ** Group
+    group_description,
+    group_displayName,
+    group_externalIds,
+    group_groupId,
+    group_identityStoreId,
+
+    -- ** GroupMembership
+    groupMembership_groupId,
+    groupMembership_memberId,
+    groupMembership_membershipId,
+    groupMembership_identityStoreId,
+
+    -- ** GroupMembershipExistenceResult
+    groupMembershipExistenceResult_groupId,
+    groupMembershipExistenceResult_memberId,
+    groupMembershipExistenceResult_membershipExists,
+
+    -- ** MemberId
+    memberId_userId,
+
+    -- ** Name
+    name_familyName,
+    name_formatted,
+    name_givenName,
+    name_honorificPrefix,
+    name_honorificSuffix,
+    name_middleName,
+
+    -- ** PhoneNumber
+    phoneNumber_primary,
+    phoneNumber_type,
+    phoneNumber_value,
+
+    -- ** UniqueAttribute
+    uniqueAttribute_attributePath,
+    uniqueAttribute_attributeValue,
+
+    -- ** User
+    user_addresses,
+    user_displayName,
+    user_emails,
+    user_externalIds,
+    user_locale,
+    user_name,
+    user_nickName,
+    user_phoneNumbers,
+    user_preferredLanguage,
+    user_profileUrl,
+    user_timezone,
+    user_title,
+    user_userName,
+    user_userType,
+    user_userId,
+    user_identityStoreId,
+  )
+where
+
+import Amazonka.IdentityStore.CreateGroup
+import Amazonka.IdentityStore.CreateGroupMembership
+import Amazonka.IdentityStore.CreateUser
+import Amazonka.IdentityStore.DeleteGroup
+import Amazonka.IdentityStore.DeleteGroupMembership
+import Amazonka.IdentityStore.DeleteUser
+import Amazonka.IdentityStore.DescribeGroup
+import Amazonka.IdentityStore.DescribeGroupMembership
+import Amazonka.IdentityStore.DescribeUser
+import Amazonka.IdentityStore.GetGroupId
+import Amazonka.IdentityStore.GetGroupMembershipId
+import Amazonka.IdentityStore.GetUserId
+import Amazonka.IdentityStore.IsMemberInGroups
+import Amazonka.IdentityStore.ListGroupMemberships
+import Amazonka.IdentityStore.ListGroupMembershipsForMember
+import Amazonka.IdentityStore.ListGroups
+import Amazonka.IdentityStore.ListUsers
+import Amazonka.IdentityStore.Types.Address
+import Amazonka.IdentityStore.Types.AlternateIdentifier
+import Amazonka.IdentityStore.Types.AttributeOperation
+import Amazonka.IdentityStore.Types.AttributeValue
+import Amazonka.IdentityStore.Types.Email
+import Amazonka.IdentityStore.Types.ExternalId
+import Amazonka.IdentityStore.Types.Filter
+import Amazonka.IdentityStore.Types.Group
+import Amazonka.IdentityStore.Types.GroupMembership
+import Amazonka.IdentityStore.Types.GroupMembershipExistenceResult
+import Amazonka.IdentityStore.Types.MemberId
+import Amazonka.IdentityStore.Types.Name
+import Amazonka.IdentityStore.Types.PhoneNumber
+import Amazonka.IdentityStore.Types.UniqueAttribute
+import Amazonka.IdentityStore.Types.User
+import Amazonka.IdentityStore.UpdateGroup
+import Amazonka.IdentityStore.UpdateUser
diff --git a/gen/Amazonka/IdentityStore/ListGroupMemberships.hs b/gen/Amazonka/IdentityStore/ListGroupMemberships.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/ListGroupMemberships.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.IdentityStore.ListGroupMemberships
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For the specified group in the specified identity store, returns the
+-- list of all @GroupMembership@ objects and returns results in paginated
+-- form.
+--
+-- This operation returns paginated results.
+module Amazonka.IdentityStore.ListGroupMemberships
+  ( -- * Creating a Request
+    ListGroupMemberships (..),
+    newListGroupMemberships,
+
+    -- * Request Lenses
+    listGroupMemberships_maxResults,
+    listGroupMemberships_nextToken,
+    listGroupMemberships_identityStoreId,
+    listGroupMemberships_groupId,
+
+    -- * Destructuring the Response
+    ListGroupMembershipsResponse (..),
+    newListGroupMembershipsResponse,
+
+    -- * Response Lenses
+    listGroupMembershipsResponse_nextToken,
+    listGroupMembershipsResponse_httpStatus,
+    listGroupMembershipsResponse_groupMemberships,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListGroupMemberships' smart constructor.
+data ListGroupMemberships = ListGroupMemberships'
+  { -- | The maximum number of results to be returned per request. This parameter
+    -- is used in all @List@ requests to specify how many results to return in
+    -- one page.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token used for the @ListUsers@, @ListGroups@ and
+    -- @ListGroupMemberships@ API operations. This value is generated by the
+    -- identity store service. It is returned in the API response if the total
+    -- results are more than the size of one page. This token is also returned
+    -- when it is used in the API request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroupMemberships' 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', 'listGroupMemberships_maxResults' - The maximum number of results to be returned per request. This parameter
+-- is used in all @List@ requests to specify how many results to return in
+-- one page.
+--
+-- 'nextToken', 'listGroupMemberships_nextToken' - The pagination token used for the @ListUsers@, @ListGroups@ and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+--
+-- 'identityStoreId', 'listGroupMemberships_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'groupId', 'listGroupMemberships_groupId' - The identifier for a group in the identity store.
+newListGroupMemberships ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  ListGroupMemberships
+newListGroupMemberships pIdentityStoreId_ pGroupId_ =
+  ListGroupMemberships'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_,
+      groupId = pGroupId_
+    }
+
+-- | The maximum number of results to be returned per request. This parameter
+-- is used in all @List@ requests to specify how many results to return in
+-- one page.
+listGroupMemberships_maxResults :: Lens.Lens' ListGroupMemberships (Prelude.Maybe Prelude.Natural)
+listGroupMemberships_maxResults = Lens.lens (\ListGroupMemberships' {maxResults} -> maxResults) (\s@ListGroupMemberships' {} a -> s {maxResults = a} :: ListGroupMemberships)
+
+-- | The pagination token used for the @ListUsers@, @ListGroups@ and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+listGroupMemberships_nextToken :: Lens.Lens' ListGroupMemberships (Prelude.Maybe Prelude.Text)
+listGroupMemberships_nextToken = Lens.lens (\ListGroupMemberships' {nextToken} -> nextToken) (\s@ListGroupMemberships' {} a -> s {nextToken = a} :: ListGroupMemberships)
+
+-- | The globally unique identifier for the identity store.
+listGroupMemberships_identityStoreId :: Lens.Lens' ListGroupMemberships Prelude.Text
+listGroupMemberships_identityStoreId = Lens.lens (\ListGroupMemberships' {identityStoreId} -> identityStoreId) (\s@ListGroupMemberships' {} a -> s {identityStoreId = a} :: ListGroupMemberships)
+
+-- | The identifier for a group in the identity store.
+listGroupMemberships_groupId :: Lens.Lens' ListGroupMemberships Prelude.Text
+listGroupMemberships_groupId = Lens.lens (\ListGroupMemberships' {groupId} -> groupId) (\s@ListGroupMemberships' {} a -> s {groupId = a} :: ListGroupMemberships)
+
+instance Core.AWSPager ListGroupMemberships where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGroupMembershipsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listGroupMembershipsResponse_groupMemberships
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGroupMemberships_nextToken
+          Lens..~ rs
+          Lens.^? listGroupMembershipsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListGroupMemberships where
+  type
+    AWSResponse ListGroupMemberships =
+      ListGroupMembershipsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGroupMembershipsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "GroupMemberships"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListGroupMemberships where
+  hashWithSalt _salt ListGroupMemberships' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+
+instance Prelude.NFData ListGroupMemberships where
+  rnf ListGroupMemberships' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+
+instance Data.ToHeaders ListGroupMemberships where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.ListGroupMemberships" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListGroupMemberships where
+  toJSON ListGroupMemberships' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId)
+          ]
+      )
+
+instance Data.ToPath ListGroupMemberships where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListGroupMemberships where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListGroupMembershipsResponse' smart constructor.
+data ListGroupMembershipsResponse = ListGroupMembershipsResponse'
+  { -- | The pagination token used for the @ListUsers@, @ListGroups@, and
+    -- @ListGroupMemberships@ API operations. This value is generated by the
+    -- identity store service. It is returned in the API response if the total
+    -- results are more than the size of one page. This token is also returned
+    -- when it is used in the API request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of @GroupMembership@ objects in the group.
+    groupMemberships :: [GroupMembership]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroupMembershipsResponse' 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', 'listGroupMembershipsResponse_nextToken' - The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+--
+-- 'httpStatus', 'listGroupMembershipsResponse_httpStatus' - The response's http status code.
+--
+-- 'groupMemberships', 'listGroupMembershipsResponse_groupMemberships' - A list of @GroupMembership@ objects in the group.
+newListGroupMembershipsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGroupMembershipsResponse
+newListGroupMembershipsResponse pHttpStatus_ =
+  ListGroupMembershipsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      groupMemberships = Prelude.mempty
+    }
+
+-- | The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+listGroupMembershipsResponse_nextToken :: Lens.Lens' ListGroupMembershipsResponse (Prelude.Maybe Prelude.Text)
+listGroupMembershipsResponse_nextToken = Lens.lens (\ListGroupMembershipsResponse' {nextToken} -> nextToken) (\s@ListGroupMembershipsResponse' {} a -> s {nextToken = a} :: ListGroupMembershipsResponse)
+
+-- | The response's http status code.
+listGroupMembershipsResponse_httpStatus :: Lens.Lens' ListGroupMembershipsResponse Prelude.Int
+listGroupMembershipsResponse_httpStatus = Lens.lens (\ListGroupMembershipsResponse' {httpStatus} -> httpStatus) (\s@ListGroupMembershipsResponse' {} a -> s {httpStatus = a} :: ListGroupMembershipsResponse)
+
+-- | A list of @GroupMembership@ objects in the group.
+listGroupMembershipsResponse_groupMemberships :: Lens.Lens' ListGroupMembershipsResponse [GroupMembership]
+listGroupMembershipsResponse_groupMemberships = Lens.lens (\ListGroupMembershipsResponse' {groupMemberships} -> groupMemberships) (\s@ListGroupMembershipsResponse' {} a -> s {groupMemberships = a} :: ListGroupMembershipsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListGroupMembershipsResponse where
+  rnf ListGroupMembershipsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groupMemberships
diff --git a/gen/Amazonka/IdentityStore/ListGroupMembershipsForMember.hs b/gen/Amazonka/IdentityStore/ListGroupMembershipsForMember.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/ListGroupMembershipsForMember.hs
@@ -0,0 +1,303 @@
+{-# 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.IdentityStore.ListGroupMembershipsForMember
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For the specified member in the specified identity store, returns the
+-- list of all @GroupMembership@ objects and returns results in paginated
+-- form.
+--
+-- This operation returns paginated results.
+module Amazonka.IdentityStore.ListGroupMembershipsForMember
+  ( -- * Creating a Request
+    ListGroupMembershipsForMember (..),
+    newListGroupMembershipsForMember,
+
+    -- * Request Lenses
+    listGroupMembershipsForMember_maxResults,
+    listGroupMembershipsForMember_nextToken,
+    listGroupMembershipsForMember_identityStoreId,
+    listGroupMembershipsForMember_memberId,
+
+    -- * Destructuring the Response
+    ListGroupMembershipsForMemberResponse (..),
+    newListGroupMembershipsForMemberResponse,
+
+    -- * Response Lenses
+    listGroupMembershipsForMemberResponse_nextToken,
+    listGroupMembershipsForMemberResponse_httpStatus,
+    listGroupMembershipsForMemberResponse_groupMemberships,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListGroupMembershipsForMember' smart constructor.
+data ListGroupMembershipsForMember = ListGroupMembershipsForMember'
+  { -- | The maximum number of results to be returned per request. This parameter
+    -- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+    -- results to return in one page. The length limit is 50 characters.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token used for the @ListUsers@, @ListGroups@, and
+    -- @ListGroupMemberships@ API operations. This value is generated by the
+    -- identity store service. It is returned in the API response if the total
+    -- results are more than the size of one page. This token is also returned
+    -- when it is used in the API request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | An object that contains the identifier of a group member. Setting the
+    -- @UserID@ field to the specific identifier for a user indicates that the
+    -- user is a member of the group.
+    memberId :: MemberId
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroupMembershipsForMember' 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', 'listGroupMembershipsForMember_maxResults' - The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+--
+-- 'nextToken', 'listGroupMembershipsForMember_nextToken' - The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+--
+-- 'identityStoreId', 'listGroupMembershipsForMember_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'memberId', 'listGroupMembershipsForMember_memberId' - An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+newListGroupMembershipsForMember ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'memberId'
+  MemberId ->
+  ListGroupMembershipsForMember
+newListGroupMembershipsForMember
+  pIdentityStoreId_
+  pMemberId_ =
+    ListGroupMembershipsForMember'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        identityStoreId = pIdentityStoreId_,
+        memberId = pMemberId_
+      }
+
+-- | The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+listGroupMembershipsForMember_maxResults :: Lens.Lens' ListGroupMembershipsForMember (Prelude.Maybe Prelude.Natural)
+listGroupMembershipsForMember_maxResults = Lens.lens (\ListGroupMembershipsForMember' {maxResults} -> maxResults) (\s@ListGroupMembershipsForMember' {} a -> s {maxResults = a} :: ListGroupMembershipsForMember)
+
+-- | The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+listGroupMembershipsForMember_nextToken :: Lens.Lens' ListGroupMembershipsForMember (Prelude.Maybe Prelude.Text)
+listGroupMembershipsForMember_nextToken = Lens.lens (\ListGroupMembershipsForMember' {nextToken} -> nextToken) (\s@ListGroupMembershipsForMember' {} a -> s {nextToken = a} :: ListGroupMembershipsForMember)
+
+-- | The globally unique identifier for the identity store.
+listGroupMembershipsForMember_identityStoreId :: Lens.Lens' ListGroupMembershipsForMember Prelude.Text
+listGroupMembershipsForMember_identityStoreId = Lens.lens (\ListGroupMembershipsForMember' {identityStoreId} -> identityStoreId) (\s@ListGroupMembershipsForMember' {} a -> s {identityStoreId = a} :: ListGroupMembershipsForMember)
+
+-- | An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+listGroupMembershipsForMember_memberId :: Lens.Lens' ListGroupMembershipsForMember MemberId
+listGroupMembershipsForMember_memberId = Lens.lens (\ListGroupMembershipsForMember' {memberId} -> memberId) (\s@ListGroupMembershipsForMember' {} a -> s {memberId = a} :: ListGroupMembershipsForMember)
+
+instance Core.AWSPager ListGroupMembershipsForMember where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGroupMembershipsForMemberResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listGroupMembershipsForMemberResponse_groupMemberships
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGroupMembershipsForMember_nextToken
+          Lens..~ rs
+          Lens.^? listGroupMembershipsForMemberResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    ListGroupMembershipsForMember
+  where
+  type
+    AWSResponse ListGroupMembershipsForMember =
+      ListGroupMembershipsForMemberResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGroupMembershipsForMemberResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "GroupMemberships"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    ListGroupMembershipsForMember
+  where
+  hashWithSalt _salt ListGroupMembershipsForMember' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` memberId
+
+instance Prelude.NFData ListGroupMembershipsForMember where
+  rnf ListGroupMembershipsForMember' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf memberId
+
+instance Data.ToHeaders ListGroupMembershipsForMember where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.ListGroupMembershipsForMember" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListGroupMembershipsForMember where
+  toJSON ListGroupMembershipsForMember' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("MemberId" Data..= memberId)
+          ]
+      )
+
+instance Data.ToPath ListGroupMembershipsForMember where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListGroupMembershipsForMember where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListGroupMembershipsForMemberResponse' smart constructor.
+data ListGroupMembershipsForMemberResponse = ListGroupMembershipsForMemberResponse'
+  { -- | The pagination token used for the @ListUsers@, @ListGroups@, and
+    -- @ListGroupMemberships@ API operations. This value is generated by the
+    -- identity store service. It is returned in the API response if the total
+    -- results are more than the size of one page. This token is also returned
+    -- when it is used in the API request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of @GroupMembership@ objects in the group for a specified member.
+    groupMemberships :: [GroupMembership]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroupMembershipsForMemberResponse' 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', 'listGroupMembershipsForMemberResponse_nextToken' - The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+--
+-- 'httpStatus', 'listGroupMembershipsForMemberResponse_httpStatus' - The response's http status code.
+--
+-- 'groupMemberships', 'listGroupMembershipsForMemberResponse_groupMemberships' - A list of @GroupMembership@ objects in the group for a specified member.
+newListGroupMembershipsForMemberResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGroupMembershipsForMemberResponse
+newListGroupMembershipsForMemberResponse pHttpStatus_ =
+  ListGroupMembershipsForMemberResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      groupMemberships = Prelude.mempty
+    }
+
+-- | The pagination token used for the @ListUsers@, @ListGroups@, and
+-- @ListGroupMemberships@ API operations. This value is generated by the
+-- identity store service. It is returned in the API response if the total
+-- results are more than the size of one page. This token is also returned
+-- when it is used in the API request to search for the next page.
+listGroupMembershipsForMemberResponse_nextToken :: Lens.Lens' ListGroupMembershipsForMemberResponse (Prelude.Maybe Prelude.Text)
+listGroupMembershipsForMemberResponse_nextToken = Lens.lens (\ListGroupMembershipsForMemberResponse' {nextToken} -> nextToken) (\s@ListGroupMembershipsForMemberResponse' {} a -> s {nextToken = a} :: ListGroupMembershipsForMemberResponse)
+
+-- | The response's http status code.
+listGroupMembershipsForMemberResponse_httpStatus :: Lens.Lens' ListGroupMembershipsForMemberResponse Prelude.Int
+listGroupMembershipsForMemberResponse_httpStatus = Lens.lens (\ListGroupMembershipsForMemberResponse' {httpStatus} -> httpStatus) (\s@ListGroupMembershipsForMemberResponse' {} a -> s {httpStatus = a} :: ListGroupMembershipsForMemberResponse)
+
+-- | A list of @GroupMembership@ objects in the group for a specified member.
+listGroupMembershipsForMemberResponse_groupMemberships :: Lens.Lens' ListGroupMembershipsForMemberResponse [GroupMembership]
+listGroupMembershipsForMemberResponse_groupMemberships = Lens.lens (\ListGroupMembershipsForMemberResponse' {groupMemberships} -> groupMemberships) (\s@ListGroupMembershipsForMemberResponse' {} a -> s {groupMemberships = a} :: ListGroupMembershipsForMemberResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    ListGroupMembershipsForMemberResponse
+  where
+  rnf ListGroupMembershipsForMemberResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groupMemberships
diff --git a/gen/Amazonka/IdentityStore/ListGroups.hs b/gen/Amazonka/IdentityStore/ListGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/ListGroups.hs
@@ -0,0 +1,289 @@
+{-# 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.IdentityStore.ListGroups
+-- 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 groups in the identity store. Returns a paginated list of
+-- complete @Group@ objects. Filtering for a @Group@ by the @DisplayName@
+-- attribute is deprecated. Instead, use the @GetGroupId@ API action.
+--
+-- This operation returns paginated results.
+module Amazonka.IdentityStore.ListGroups
+  ( -- * Creating a Request
+    ListGroups (..),
+    newListGroups,
+
+    -- * Request Lenses
+    listGroups_filters,
+    listGroups_maxResults,
+    listGroups_nextToken,
+    listGroups_identityStoreId,
+
+    -- * Destructuring the Response
+    ListGroupsResponse (..),
+    newListGroupsResponse,
+
+    -- * Response Lenses
+    listGroupsResponse_nextToken,
+    listGroupsResponse_httpStatus,
+    listGroupsResponse_groups,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListGroups' smart constructor.
+data ListGroups = ListGroups'
+  { -- | A list of @Filter@ objects, which is used in the @ListUsers@ and
+    -- @ListGroups@ requests.
+    filters :: Prelude.Maybe [Filter],
+    -- | The maximum number of results to be returned per request. This parameter
+    -- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+    -- results to return in one page. The length limit is 50 characters.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+    -- operations. This value is generated by the identity store service. It is
+    -- returned in the API response if the total results are more than the size
+    -- of one page. This token is also returned when it is used in the API
+    -- request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The globally unique identifier for the identity store, such as
+    -- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+    -- @1234567890@ is a randomly generated string that contains numbers and
+    -- lower case letters. This value is generated at the time that a new
+    -- identity store is created.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroups' 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', 'listGroups_filters' - A list of @Filter@ objects, which is used in the @ListUsers@ and
+-- @ListGroups@ requests.
+--
+-- 'maxResults', 'listGroups_maxResults' - The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+--
+-- 'nextToken', 'listGroups_nextToken' - The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+--
+-- 'identityStoreId', 'listGroups_identityStoreId' - The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+newListGroups ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  ListGroups
+newListGroups pIdentityStoreId_ =
+  ListGroups'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A list of @Filter@ objects, which is used in the @ListUsers@ and
+-- @ListGroups@ requests.
+listGroups_filters :: Lens.Lens' ListGroups (Prelude.Maybe [Filter])
+listGroups_filters = Lens.lens (\ListGroups' {filters} -> filters) (\s@ListGroups' {} a -> s {filters = a} :: ListGroups) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+listGroups_maxResults :: Lens.Lens' ListGroups (Prelude.Maybe Prelude.Natural)
+listGroups_maxResults = Lens.lens (\ListGroups' {maxResults} -> maxResults) (\s@ListGroups' {} a -> s {maxResults = a} :: ListGroups)
+
+-- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+listGroups_nextToken :: Lens.Lens' ListGroups (Prelude.Maybe Prelude.Text)
+listGroups_nextToken = Lens.lens (\ListGroups' {nextToken} -> nextToken) (\s@ListGroups' {} a -> s {nextToken = a} :: ListGroups)
+
+-- | The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+listGroups_identityStoreId :: Lens.Lens' ListGroups Prelude.Text
+listGroups_identityStoreId = Lens.lens (\ListGroups' {identityStoreId} -> identityStoreId) (\s@ListGroups' {} a -> s {identityStoreId = a} :: ListGroups)
+
+instance Core.AWSPager ListGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listGroupsResponse_groups) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGroups_nextToken
+          Lens..~ rs
+          Lens.^? listGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListGroups where
+  type AWSResponse ListGroups = ListGroupsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGroupsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Groups" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListGroups where
+  hashWithSalt _salt ListGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData ListGroups where
+  rnf ListGroups' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf identityStoreId
+
+instance Data.ToHeaders ListGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.ListGroups" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListGroups where
+  toJSON ListGroups' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId)
+          ]
+      )
+
+instance Data.ToPath ListGroups where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListGroups where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListGroupsResponse' smart constructor.
+data ListGroupsResponse = ListGroupsResponse'
+  { -- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+    -- operations. This value is generated by the identity store service. It is
+    -- returned in the API response if the total results are more than the size
+    -- of one page. This token is also returned when it1 is used in the API
+    -- request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of @Group@ objects in the identity store.
+    groups :: [Group]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroupsResponse' 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', 'listGroupsResponse_nextToken' - The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it1 is used in the API
+-- request to search for the next page.
+--
+-- 'httpStatus', 'listGroupsResponse_httpStatus' - The response's http status code.
+--
+-- 'groups', 'listGroupsResponse_groups' - A list of @Group@ objects in the identity store.
+newListGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGroupsResponse
+newListGroupsResponse pHttpStatus_ =
+  ListGroupsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      groups = Prelude.mempty
+    }
+
+-- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it1 is used in the API
+-- request to search for the next page.
+listGroupsResponse_nextToken :: Lens.Lens' ListGroupsResponse (Prelude.Maybe Prelude.Text)
+listGroupsResponse_nextToken = Lens.lens (\ListGroupsResponse' {nextToken} -> nextToken) (\s@ListGroupsResponse' {} a -> s {nextToken = a} :: ListGroupsResponse)
+
+-- | The response's http status code.
+listGroupsResponse_httpStatus :: Lens.Lens' ListGroupsResponse Prelude.Int
+listGroupsResponse_httpStatus = Lens.lens (\ListGroupsResponse' {httpStatus} -> httpStatus) (\s@ListGroupsResponse' {} a -> s {httpStatus = a} :: ListGroupsResponse)
+
+-- | A list of @Group@ objects in the identity store.
+listGroupsResponse_groups :: Lens.Lens' ListGroupsResponse [Group]
+listGroupsResponse_groups = Lens.lens (\ListGroupsResponse' {groups} -> groups) (\s@ListGroupsResponse' {} a -> s {groups = a} :: ListGroupsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListGroupsResponse where
+  rnf ListGroupsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf groups
diff --git a/gen/Amazonka/IdentityStore/ListUsers.hs b/gen/Amazonka/IdentityStore/ListUsers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/ListUsers.hs
@@ -0,0 +1,287 @@
+{-# 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.IdentityStore.ListUsers
+-- 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 users in the identity store. Returns a paginated list of
+-- complete @User@ objects. Filtering for a @User@ by the @UserName@
+-- attribute is deprecated. Instead, use the @GetUserId@ API action.
+--
+-- This operation returns paginated results.
+module Amazonka.IdentityStore.ListUsers
+  ( -- * Creating a Request
+    ListUsers (..),
+    newListUsers,
+
+    -- * Request Lenses
+    listUsers_filters,
+    listUsers_maxResults,
+    listUsers_nextToken,
+    listUsers_identityStoreId,
+
+    -- * Destructuring the Response
+    ListUsersResponse (..),
+    newListUsersResponse,
+
+    -- * Response Lenses
+    listUsersResponse_nextToken,
+    listUsersResponse_httpStatus,
+    listUsersResponse_users,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListUsers' smart constructor.
+data ListUsers = ListUsers'
+  { -- | A list of @Filter@ objects, which is used in the @ListUsers@ and
+    -- @ListGroups@ requests.
+    filters :: Prelude.Maybe [Filter],
+    -- | The maximum number of results to be returned per request. This parameter
+    -- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+    -- results to return in one page. The length limit is 50 characters.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+    -- operations. This value is generated by the identity store service. It is
+    -- returned in the API response if the total results are more than the size
+    -- of one page. This token is also returned when it is used in the API
+    -- request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The globally unique identifier for the identity store, such as
+    -- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+    -- @1234567890@ is a randomly generated string that contains numbers and
+    -- lower case letters. This value is generated at the time that a new
+    -- identity store is created.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsers' 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', 'listUsers_filters' - A list of @Filter@ objects, which is used in the @ListUsers@ and
+-- @ListGroups@ requests.
+--
+-- 'maxResults', 'listUsers_maxResults' - The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+--
+-- 'nextToken', 'listUsers_nextToken' - The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+--
+-- 'identityStoreId', 'listUsers_identityStoreId' - The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+newListUsers ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  ListUsers
+newListUsers pIdentityStoreId_ =
+  ListUsers'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A list of @Filter@ objects, which is used in the @ListUsers@ and
+-- @ListGroups@ requests.
+listUsers_filters :: Lens.Lens' ListUsers (Prelude.Maybe [Filter])
+listUsers_filters = Lens.lens (\ListUsers' {filters} -> filters) (\s@ListUsers' {} a -> s {filters = a} :: ListUsers) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to be returned per request. This parameter
+-- is used in the @ListUsers@ and @ListGroups@ requests to specify how many
+-- results to return in one page. The length limit is 50 characters.
+listUsers_maxResults :: Lens.Lens' ListUsers (Prelude.Maybe Prelude.Natural)
+listUsers_maxResults = Lens.lens (\ListUsers' {maxResults} -> maxResults) (\s@ListUsers' {} a -> s {maxResults = a} :: ListUsers)
+
+-- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+listUsers_nextToken :: Lens.Lens' ListUsers (Prelude.Maybe Prelude.Text)
+listUsers_nextToken = Lens.lens (\ListUsers' {nextToken} -> nextToken) (\s@ListUsers' {} a -> s {nextToken = a} :: ListUsers)
+
+-- | The globally unique identifier for the identity store, such as
+-- @d-1234567890@. In this example, @d-@ is a fixed prefix, and
+-- @1234567890@ is a randomly generated string that contains numbers and
+-- lower case letters. This value is generated at the time that a new
+-- identity store is created.
+listUsers_identityStoreId :: Lens.Lens' ListUsers Prelude.Text
+listUsers_identityStoreId = Lens.lens (\ListUsers' {identityStoreId} -> identityStoreId) (\s@ListUsers' {} a -> s {identityStoreId = a} :: ListUsers)
+
+instance Core.AWSPager ListUsers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listUsersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop (rs Lens.^. listUsersResponse_users) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listUsers_nextToken
+          Lens..~ rs
+          Lens.^? listUsersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListUsers where
+  type AWSResponse ListUsers = ListUsersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListUsersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Users" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListUsers where
+  hashWithSalt _salt ListUsers' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData ListUsers where
+  rnf ListUsers' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf identityStoreId
+
+instance Data.ToHeaders ListUsers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("AWSIdentityStore.ListUsers" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListUsers where
+  toJSON ListUsers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId)
+          ]
+      )
+
+instance Data.ToPath ListUsers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListUsers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListUsersResponse' smart constructor.
+data ListUsersResponse = ListUsersResponse'
+  { -- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+    -- operations. This value is generated by the identity store service. It is
+    -- returned in the API response if the total results are more than the size
+    -- of one page. This token is also returned when it is used in the API
+    -- request to search for the next page.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of @User@ objects in the identity store.
+    users :: [User]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListUsersResponse' 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', 'listUsersResponse_nextToken' - The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+--
+-- 'httpStatus', 'listUsersResponse_httpStatus' - The response's http status code.
+--
+-- 'users', 'listUsersResponse_users' - A list of @User@ objects in the identity store.
+newListUsersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListUsersResponse
+newListUsersResponse pHttpStatus_ =
+  ListUsersResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      users = Prelude.mempty
+    }
+
+-- | The pagination token used for the @ListUsers@ and @ListGroups@ API
+-- operations. This value is generated by the identity store service. It is
+-- returned in the API response if the total results are more than the size
+-- of one page. This token is also returned when it is used in the API
+-- request to search for the next page.
+listUsersResponse_nextToken :: Lens.Lens' ListUsersResponse (Prelude.Maybe Prelude.Text)
+listUsersResponse_nextToken = Lens.lens (\ListUsersResponse' {nextToken} -> nextToken) (\s@ListUsersResponse' {} a -> s {nextToken = a} :: ListUsersResponse)
+
+-- | The response's http status code.
+listUsersResponse_httpStatus :: Lens.Lens' ListUsersResponse Prelude.Int
+listUsersResponse_httpStatus = Lens.lens (\ListUsersResponse' {httpStatus} -> httpStatus) (\s@ListUsersResponse' {} a -> s {httpStatus = a} :: ListUsersResponse)
+
+-- | A list of @User@ objects in the identity store.
+listUsersResponse_users :: Lens.Lens' ListUsersResponse [User]
+listUsersResponse_users = Lens.lens (\ListUsersResponse' {users} -> users) (\s@ListUsersResponse' {} a -> s {users = a} :: ListUsersResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListUsersResponse where
+  rnf ListUsersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf users
diff --git a/gen/Amazonka/IdentityStore/Types.hs b/gen/Amazonka/IdentityStore/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types.hs
@@ -0,0 +1,297 @@
+{-# 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.IdentityStore.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.IdentityStore.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * Address
+    Address (..),
+    newAddress,
+    address_country,
+    address_formatted,
+    address_locality,
+    address_postalCode,
+    address_primary,
+    address_region,
+    address_streetAddress,
+    address_type,
+
+    -- * AlternateIdentifier
+    AlternateIdentifier (..),
+    newAlternateIdentifier,
+    alternateIdentifier_externalId,
+    alternateIdentifier_uniqueAttribute,
+
+    -- * AttributeOperation
+    AttributeOperation (..),
+    newAttributeOperation,
+    attributeOperation_attributeValue,
+    attributeOperation_attributePath,
+
+    -- * AttributeValue
+    AttributeValue (..),
+    newAttributeValue,
+
+    -- * Email
+    Email (..),
+    newEmail,
+    email_primary,
+    email_type,
+    email_value,
+
+    -- * ExternalId
+    ExternalId (..),
+    newExternalId,
+    externalId_issuer,
+    externalId_id,
+
+    -- * Filter
+    Filter (..),
+    newFilter,
+    filter_attributePath,
+    filter_attributeValue,
+
+    -- * Group
+    Group (..),
+    newGroup,
+    group_description,
+    group_displayName,
+    group_externalIds,
+    group_groupId,
+    group_identityStoreId,
+
+    -- * GroupMembership
+    GroupMembership (..),
+    newGroupMembership,
+    groupMembership_groupId,
+    groupMembership_memberId,
+    groupMembership_membershipId,
+    groupMembership_identityStoreId,
+
+    -- * GroupMembershipExistenceResult
+    GroupMembershipExistenceResult (..),
+    newGroupMembershipExistenceResult,
+    groupMembershipExistenceResult_groupId,
+    groupMembershipExistenceResult_memberId,
+    groupMembershipExistenceResult_membershipExists,
+
+    -- * MemberId
+    MemberId (..),
+    newMemberId,
+    memberId_userId,
+
+    -- * Name
+    Name (..),
+    newName,
+    name_familyName,
+    name_formatted,
+    name_givenName,
+    name_honorificPrefix,
+    name_honorificSuffix,
+    name_middleName,
+
+    -- * PhoneNumber
+    PhoneNumber (..),
+    newPhoneNumber,
+    phoneNumber_primary,
+    phoneNumber_type,
+    phoneNumber_value,
+
+    -- * UniqueAttribute
+    UniqueAttribute (..),
+    newUniqueAttribute,
+    uniqueAttribute_attributePath,
+    uniqueAttribute_attributeValue,
+
+    -- * User
+    User (..),
+    newUser,
+    user_addresses,
+    user_displayName,
+    user_emails,
+    user_externalIds,
+    user_locale,
+    user_name,
+    user_nickName,
+    user_phoneNumbers,
+    user_preferredLanguage,
+    user_profileUrl,
+    user_timezone,
+    user_title,
+    user_userName,
+    user_userType,
+    user_userId,
+    user_identityStoreId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.IdentityStore.Types.Address
+import Amazonka.IdentityStore.Types.AlternateIdentifier
+import Amazonka.IdentityStore.Types.AttributeOperation
+import Amazonka.IdentityStore.Types.AttributeValue
+import Amazonka.IdentityStore.Types.Email
+import Amazonka.IdentityStore.Types.ExternalId
+import Amazonka.IdentityStore.Types.Filter
+import Amazonka.IdentityStore.Types.Group
+import Amazonka.IdentityStore.Types.GroupMembership
+import Amazonka.IdentityStore.Types.GroupMembershipExistenceResult
+import Amazonka.IdentityStore.Types.MemberId
+import Amazonka.IdentityStore.Types.Name
+import Amazonka.IdentityStore.Types.PhoneNumber
+import Amazonka.IdentityStore.Types.UniqueAttribute
+import Amazonka.IdentityStore.Types.User
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-06-15@ of the Amazon SSO Identity Store SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "IdentityStore",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "identitystore",
+      Core.signingName = "identitystore",
+      Core.version = "2020-06-15",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "IdentityStore",
+      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
+
+-- | You do not have sufficient access to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | This request cannot be completed for one of the following reasons:
+--
+-- -   Performing the requested operation would violate an existing
+--     uniqueness claim in the identity store. Resolve the conflict before
+--     retrying this request.
+--
+-- -   The requested resource was being concurrently modified by another
+--     request.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | The request processing has failed because of an unknown error, exception
+-- or failure with an internal server.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+
+-- | Indicates that a requested resource is not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The request would cause the number of users or groups in the identity
+-- store to exceed the maximum allowed.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | Indicates that the principal has crossed the throttling limits of the
+-- API operations.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | The request failed because it contains a syntax error.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/IdentityStore/Types/Address.hs b/gen/Amazonka/IdentityStore/Types/Address.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/Address.hs
@@ -0,0 +1,174 @@
+{-# 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.IdentityStore.Types.Address
+-- 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.IdentityStore.Types.Address 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 address associated with the specified user.
+--
+-- /See:/ 'newAddress' smart constructor.
+data Address = Address'
+  { -- | The country of the address.
+    country :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing a formatted version of the address for display.
+    formatted :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string of the address locality.
+    locality :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The postal code of the address.
+    postalCode :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A Boolean value representing whether this is the primary address for the
+    -- associated resource.
+    primary :: Prelude.Maybe (Data.Sensitive Prelude.Bool),
+    -- | The region of the address.
+    region :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The street of the address.
+    streetAddress :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string representing the type of address. For example, \"Home.\"
+    type' :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Address' 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:
+--
+-- 'country', 'address_country' - The country of the address.
+--
+-- 'formatted', 'address_formatted' - A string containing a formatted version of the address for display.
+--
+-- 'locality', 'address_locality' - A string of the address locality.
+--
+-- 'postalCode', 'address_postalCode' - The postal code of the address.
+--
+-- 'primary', 'address_primary' - A Boolean value representing whether this is the primary address for the
+-- associated resource.
+--
+-- 'region', 'address_region' - The region of the address.
+--
+-- 'streetAddress', 'address_streetAddress' - The street of the address.
+--
+-- 'type'', 'address_type' - A string representing the type of address. For example, \"Home.\"
+newAddress ::
+  Address
+newAddress =
+  Address'
+    { country = Prelude.Nothing,
+      formatted = Prelude.Nothing,
+      locality = Prelude.Nothing,
+      postalCode = Prelude.Nothing,
+      primary = Prelude.Nothing,
+      region = Prelude.Nothing,
+      streetAddress = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The country of the address.
+address_country :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_country = Lens.lens (\Address' {country} -> country) (\s@Address' {} a -> s {country = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing a formatted version of the address for display.
+address_formatted :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_formatted = Lens.lens (\Address' {formatted} -> formatted) (\s@Address' {} a -> s {formatted = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string of the address locality.
+address_locality :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_locality = Lens.lens (\Address' {locality} -> locality) (\s@Address' {} a -> s {locality = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The postal code of the address.
+address_postalCode :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_postalCode = Lens.lens (\Address' {postalCode} -> postalCode) (\s@Address' {} a -> s {postalCode = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A Boolean value representing whether this is the primary address for the
+-- associated resource.
+address_primary :: Lens.Lens' Address (Prelude.Maybe Prelude.Bool)
+address_primary = Lens.lens (\Address' {primary} -> primary) (\s@Address' {} a -> s {primary = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The region of the address.
+address_region :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_region = Lens.lens (\Address' {region} -> region) (\s@Address' {} a -> s {region = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The street of the address.
+address_streetAddress :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_streetAddress = Lens.lens (\Address' {streetAddress} -> streetAddress) (\s@Address' {} a -> s {streetAddress = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string representing the type of address. For example, \"Home.\"
+address_type :: Lens.Lens' Address (Prelude.Maybe Prelude.Text)
+address_type = Lens.lens (\Address' {type'} -> type') (\s@Address' {} a -> s {type' = a} :: Address) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON Address where
+  parseJSON =
+    Data.withObject
+      "Address"
+      ( \x ->
+          Address'
+            Prelude.<$> (x Data..:? "Country")
+            Prelude.<*> (x Data..:? "Formatted")
+            Prelude.<*> (x Data..:? "Locality")
+            Prelude.<*> (x Data..:? "PostalCode")
+            Prelude.<*> (x Data..:? "Primary")
+            Prelude.<*> (x Data..:? "Region")
+            Prelude.<*> (x Data..:? "StreetAddress")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable Address where
+  hashWithSalt _salt Address' {..} =
+    _salt
+      `Prelude.hashWithSalt` country
+      `Prelude.hashWithSalt` formatted
+      `Prelude.hashWithSalt` locality
+      `Prelude.hashWithSalt` postalCode
+      `Prelude.hashWithSalt` primary
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` streetAddress
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Address where
+  rnf Address' {..} =
+    Prelude.rnf country
+      `Prelude.seq` Prelude.rnf formatted
+      `Prelude.seq` Prelude.rnf locality
+      `Prelude.seq` Prelude.rnf postalCode
+      `Prelude.seq` Prelude.rnf primary
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf streetAddress
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON Address where
+  toJSON Address' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Country" Data..=) Prelude.<$> country,
+            ("Formatted" Data..=) Prelude.<$> formatted,
+            ("Locality" Data..=) Prelude.<$> locality,
+            ("PostalCode" Data..=) Prelude.<$> postalCode,
+            ("Primary" Data..=) Prelude.<$> primary,
+            ("Region" Data..=) Prelude.<$> region,
+            ("StreetAddress" Data..=) Prelude.<$> streetAddress,
+            ("Type" Data..=) Prelude.<$> type'
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/AlternateIdentifier.hs b/gen/Amazonka/IdentityStore/Types/AlternateIdentifier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/AlternateIdentifier.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.IdentityStore.Types.AlternateIdentifier
+-- 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.IdentityStore.Types.AlternateIdentifier where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.ExternalId
+import Amazonka.IdentityStore.Types.UniqueAttribute
+import qualified Amazonka.Prelude as Prelude
+
+-- | A unique identifier for a user or group that is not the primary
+-- identifier. This value can be an identifier from an external identity
+-- provider (IdP) that is associated with the user, the group, or a unique
+-- attribute. For example, a unique @GroupDisplayName@.
+--
+-- /See:/ 'newAlternateIdentifier' smart constructor.
+data AlternateIdentifier = AlternateIdentifier'
+  { -- | The identifier issued to this resource by an external identity provider.
+    externalId :: Prelude.Maybe ExternalId,
+    -- | An entity attribute that\'s unique to a specific entity.
+    uniqueAttribute :: Prelude.Maybe UniqueAttribute
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AlternateIdentifier' 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', 'alternateIdentifier_externalId' - The identifier issued to this resource by an external identity provider.
+--
+-- 'uniqueAttribute', 'alternateIdentifier_uniqueAttribute' - An entity attribute that\'s unique to a specific entity.
+newAlternateIdentifier ::
+  AlternateIdentifier
+newAlternateIdentifier =
+  AlternateIdentifier'
+    { externalId = Prelude.Nothing,
+      uniqueAttribute = Prelude.Nothing
+    }
+
+-- | The identifier issued to this resource by an external identity provider.
+alternateIdentifier_externalId :: Lens.Lens' AlternateIdentifier (Prelude.Maybe ExternalId)
+alternateIdentifier_externalId = Lens.lens (\AlternateIdentifier' {externalId} -> externalId) (\s@AlternateIdentifier' {} a -> s {externalId = a} :: AlternateIdentifier)
+
+-- | An entity attribute that\'s unique to a specific entity.
+alternateIdentifier_uniqueAttribute :: Lens.Lens' AlternateIdentifier (Prelude.Maybe UniqueAttribute)
+alternateIdentifier_uniqueAttribute = Lens.lens (\AlternateIdentifier' {uniqueAttribute} -> uniqueAttribute) (\s@AlternateIdentifier' {} a -> s {uniqueAttribute = a} :: AlternateIdentifier)
+
+instance Prelude.Hashable AlternateIdentifier where
+  hashWithSalt _salt AlternateIdentifier' {..} =
+    _salt
+      `Prelude.hashWithSalt` externalId
+      `Prelude.hashWithSalt` uniqueAttribute
+
+instance Prelude.NFData AlternateIdentifier where
+  rnf AlternateIdentifier' {..} =
+    Prelude.rnf externalId
+      `Prelude.seq` Prelude.rnf uniqueAttribute
+
+instance Data.ToJSON AlternateIdentifier where
+  toJSON AlternateIdentifier' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ExternalId" Data..=) Prelude.<$> externalId,
+            ("UniqueAttribute" Data..=)
+              Prelude.<$> uniqueAttribute
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/AttributeOperation.hs b/gen/Amazonka/IdentityStore/Types/AttributeOperation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/AttributeOperation.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.IdentityStore.Types.AttributeOperation
+-- 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.IdentityStore.Types.AttributeOperation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.AttributeValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An operation that applies to the requested group. This operation might
+-- add, replace, or remove an attribute.
+--
+-- /See:/ 'newAttributeOperation' smart constructor.
+data AttributeOperation = AttributeOperation'
+  { -- | The value of the attribute. This is a @Document@ type. This type is not
+    -- supported by Java V1, Go V1, and older versions of the AWS CLI.
+    attributeValue :: Prelude.Maybe AttributeValue,
+    -- | A string representation of the path to a given attribute or
+    -- sub-attribute. Supports JMESPath.
+    attributePath :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AttributeOperation' 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:
+--
+-- 'attributeValue', 'attributeOperation_attributeValue' - The value of the attribute. This is a @Document@ type. This type is not
+-- supported by Java V1, Go V1, and older versions of the AWS CLI.
+--
+-- 'attributePath', 'attributeOperation_attributePath' - A string representation of the path to a given attribute or
+-- sub-attribute. Supports JMESPath.
+newAttributeOperation ::
+  -- | 'attributePath'
+  Prelude.Text ->
+  AttributeOperation
+newAttributeOperation pAttributePath_ =
+  AttributeOperation'
+    { attributeValue =
+        Prelude.Nothing,
+      attributePath = pAttributePath_
+    }
+
+-- | The value of the attribute. This is a @Document@ type. This type is not
+-- supported by Java V1, Go V1, and older versions of the AWS CLI.
+attributeOperation_attributeValue :: Lens.Lens' AttributeOperation (Prelude.Maybe AttributeValue)
+attributeOperation_attributeValue = Lens.lens (\AttributeOperation' {attributeValue} -> attributeValue) (\s@AttributeOperation' {} a -> s {attributeValue = a} :: AttributeOperation)
+
+-- | A string representation of the path to a given attribute or
+-- sub-attribute. Supports JMESPath.
+attributeOperation_attributePath :: Lens.Lens' AttributeOperation Prelude.Text
+attributeOperation_attributePath = Lens.lens (\AttributeOperation' {attributePath} -> attributePath) (\s@AttributeOperation' {} a -> s {attributePath = a} :: AttributeOperation)
+
+instance Prelude.Hashable AttributeOperation where
+  hashWithSalt _salt AttributeOperation' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributeValue
+      `Prelude.hashWithSalt` attributePath
+
+instance Prelude.NFData AttributeOperation where
+  rnf AttributeOperation' {..} =
+    Prelude.rnf attributeValue
+      `Prelude.seq` Prelude.rnf attributePath
+
+instance Data.ToJSON AttributeOperation where
+  toJSON AttributeOperation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AttributeValue" Data..=)
+              Prelude.<$> attributeValue,
+            Prelude.Just
+              ("AttributePath" Data..= attributePath)
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/AttributeValue.hs b/gen/Amazonka/IdentityStore/Types/AttributeValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/AttributeValue.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.IdentityStore.Types.AttributeValue
+-- 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.IdentityStore.Types.AttributeValue 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 value of the attribute. This is a @Document@ type. This type is not
+-- supported by Java V1, Go V1, and older versions of the AWS CLI.
+--
+-- /See:/ 'newAttributeValue' smart constructor.
+data AttributeValue = AttributeValue'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AttributeValue' 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.
+newAttributeValue ::
+  AttributeValue
+newAttributeValue = AttributeValue'
+
+instance Prelude.Hashable AttributeValue where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData AttributeValue where
+  rnf _ = ()
+
+instance Data.ToJSON AttributeValue where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
diff --git a/gen/Amazonka/IdentityStore/Types/Email.hs b/gen/Amazonka/IdentityStore/Types/Email.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/Email.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IdentityStore.Types.Email
+-- 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.IdentityStore.Types.Email 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 email address associated with the user.
+--
+-- /See:/ 'newEmail' smart constructor.
+data Email = Email'
+  { -- | A Boolean value representing whether this is the primary email address
+    -- for the associated resource.
+    primary :: Prelude.Maybe (Data.Sensitive Prelude.Bool),
+    -- | A string representing the type of address. For example, \"Work.\"
+    type' :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing an email address. For example,
+    -- \"johndoe\@amazon.com.\"
+    value :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Email' 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:
+--
+-- 'primary', 'email_primary' - A Boolean value representing whether this is the primary email address
+-- for the associated resource.
+--
+-- 'type'', 'email_type' - A string representing the type of address. For example, \"Work.\"
+--
+-- 'value', 'email_value' - A string containing an email address. For example,
+-- \"johndoe\@amazon.com.\"
+newEmail ::
+  Email
+newEmail =
+  Email'
+    { primary = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | A Boolean value representing whether this is the primary email address
+-- for the associated resource.
+email_primary :: Lens.Lens' Email (Prelude.Maybe Prelude.Bool)
+email_primary = Lens.lens (\Email' {primary} -> primary) (\s@Email' {} a -> s {primary = a} :: Email) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string representing the type of address. For example, \"Work.\"
+email_type :: Lens.Lens' Email (Prelude.Maybe Prelude.Text)
+email_type = Lens.lens (\Email' {type'} -> type') (\s@Email' {} a -> s {type' = a} :: Email) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing an email address. For example,
+-- \"johndoe\@amazon.com.\"
+email_value :: Lens.Lens' Email (Prelude.Maybe Prelude.Text)
+email_value = Lens.lens (\Email' {value} -> value) (\s@Email' {} a -> s {value = a} :: Email) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON Email where
+  parseJSON =
+    Data.withObject
+      "Email"
+      ( \x ->
+          Email'
+            Prelude.<$> (x Data..:? "Primary")
+            Prelude.<*> (x Data..:? "Type")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Email where
+  hashWithSalt _salt Email' {..} =
+    _salt
+      `Prelude.hashWithSalt` primary
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Email where
+  rnf Email' {..} =
+    Prelude.rnf primary
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Email where
+  toJSON Email' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Primary" Data..=) Prelude.<$> primary,
+            ("Type" Data..=) Prelude.<$> type',
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/ExternalId.hs b/gen/Amazonka/IdentityStore/Types/ExternalId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/ExternalId.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.IdentityStore.Types.ExternalId
+-- 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.IdentityStore.Types.ExternalId 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 identifier issued to this resource by an external identity provider.
+--
+-- /See:/ 'newExternalId' smart constructor.
+data ExternalId = ExternalId'
+  { -- | The issuer for an external identifier.
+    issuer :: Data.Sensitive Prelude.Text,
+    -- | The identifier issued to this resource by an external identity provider.
+    id :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExternalId' 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:
+--
+-- 'issuer', 'externalId_issuer' - The issuer for an external identifier.
+--
+-- 'id', 'externalId_id' - The identifier issued to this resource by an external identity provider.
+newExternalId ::
+  -- | 'issuer'
+  Prelude.Text ->
+  -- | 'id'
+  Prelude.Text ->
+  ExternalId
+newExternalId pIssuer_ pId_ =
+  ExternalId'
+    { issuer =
+        Data._Sensitive Lens.# pIssuer_,
+      id = Data._Sensitive Lens.# pId_
+    }
+
+-- | The issuer for an external identifier.
+externalId_issuer :: Lens.Lens' ExternalId Prelude.Text
+externalId_issuer = Lens.lens (\ExternalId' {issuer} -> issuer) (\s@ExternalId' {} a -> s {issuer = a} :: ExternalId) Prelude.. Data._Sensitive
+
+-- | The identifier issued to this resource by an external identity provider.
+externalId_id :: Lens.Lens' ExternalId Prelude.Text
+externalId_id = Lens.lens (\ExternalId' {id} -> id) (\s@ExternalId' {} a -> s {id = a} :: ExternalId) Prelude.. Data._Sensitive
+
+instance Data.FromJSON ExternalId where
+  parseJSON =
+    Data.withObject
+      "ExternalId"
+      ( \x ->
+          ExternalId'
+            Prelude.<$> (x Data..: "Issuer")
+            Prelude.<*> (x Data..: "Id")
+      )
+
+instance Prelude.Hashable ExternalId where
+  hashWithSalt _salt ExternalId' {..} =
+    _salt
+      `Prelude.hashWithSalt` issuer
+      `Prelude.hashWithSalt` id
+
+instance Prelude.NFData ExternalId where
+  rnf ExternalId' {..} =
+    Prelude.rnf issuer `Prelude.seq` Prelude.rnf id
+
+instance Data.ToJSON ExternalId where
+  toJSON ExternalId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Issuer" Data..= issuer),
+            Prelude.Just ("Id" Data..= id)
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/Filter.hs b/gen/Amazonka/IdentityStore/Types/Filter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/Filter.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.IdentityStore.Types.Filter
+-- 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.IdentityStore.Types.Filter 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 query filter used by @ListUsers@ and @ListGroups@. This filter object
+-- provides the attribute name and attribute value to search users or
+-- groups.
+--
+-- /See:/ 'newFilter' smart constructor.
+data Filter = Filter'
+  { -- | The attribute path that is used to specify which attribute name to
+    -- search. Length limit is 255 characters. For example, @UserName@ is a
+    -- valid attribute path for the @ListUsers@ API, and @DisplayName@ is a
+    -- valid attribute path for the @ListGroups@ API.
+    attributePath :: Prelude.Text,
+    -- | Represents the data for an attribute. Each attribute value is described
+    -- as a name-value pair.
+    attributeValue :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Filter' 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:
+--
+-- 'attributePath', 'filter_attributePath' - The attribute path that is used to specify which attribute name to
+-- search. Length limit is 255 characters. For example, @UserName@ is a
+-- valid attribute path for the @ListUsers@ API, and @DisplayName@ is a
+-- valid attribute path for the @ListGroups@ API.
+--
+-- 'attributeValue', 'filter_attributeValue' - Represents the data for an attribute. Each attribute value is described
+-- as a name-value pair.
+newFilter ::
+  -- | 'attributePath'
+  Prelude.Text ->
+  -- | 'attributeValue'
+  Prelude.Text ->
+  Filter
+newFilter pAttributePath_ pAttributeValue_ =
+  Filter'
+    { attributePath = pAttributePath_,
+      attributeValue =
+        Data._Sensitive Lens.# pAttributeValue_
+    }
+
+-- | The attribute path that is used to specify which attribute name to
+-- search. Length limit is 255 characters. For example, @UserName@ is a
+-- valid attribute path for the @ListUsers@ API, and @DisplayName@ is a
+-- valid attribute path for the @ListGroups@ API.
+filter_attributePath :: Lens.Lens' Filter Prelude.Text
+filter_attributePath = Lens.lens (\Filter' {attributePath} -> attributePath) (\s@Filter' {} a -> s {attributePath = a} :: Filter)
+
+-- | Represents the data for an attribute. Each attribute value is described
+-- as a name-value pair.
+filter_attributeValue :: Lens.Lens' Filter Prelude.Text
+filter_attributeValue = Lens.lens (\Filter' {attributeValue} -> attributeValue) (\s@Filter' {} a -> s {attributeValue = a} :: Filter) Prelude.. Data._Sensitive
+
+instance Prelude.Hashable Filter where
+  hashWithSalt _salt Filter' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributePath
+      `Prelude.hashWithSalt` attributeValue
+
+instance Prelude.NFData Filter where
+  rnf Filter' {..} =
+    Prelude.rnf attributePath
+      `Prelude.seq` Prelude.rnf attributeValue
+
+instance Data.ToJSON Filter where
+  toJSON Filter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("AttributePath" Data..= attributePath),
+            Prelude.Just
+              ("AttributeValue" Data..= attributeValue)
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/Group.hs b/gen/Amazonka/IdentityStore/Types/Group.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/Group.hs
@@ -0,0 +1,144 @@
+{-# 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.IdentityStore.Types.Group
+-- 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.IdentityStore.Types.Group where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.ExternalId
+import qualified Amazonka.Prelude as Prelude
+
+-- | A group object that contains a specified group’s metadata and
+-- attributes.
+--
+-- /See:/ 'newGroup' smart constructor.
+data Group = Group'
+  { -- | A string containing a description of the specified group.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The group’s display name value. The length limit is 1,024 characters.
+    -- This value can consist of letters, accented characters, symbols,
+    -- numbers, punctuation, tab, new line, carriage return, space, and
+    -- nonbreaking space in this attribute. This value is specified at the time
+    -- the group is created and stored as an attribute of the group object in
+    -- the identity store.
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @ExternalId@ objects that contains the identifiers issued to
+    -- this resource by an external identity provider.
+    externalIds :: Prelude.Maybe (Prelude.NonEmpty ExternalId),
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Group' 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', 'group_description' - A string containing a description of the specified group.
+--
+-- 'displayName', 'group_displayName' - The group’s display name value. The length limit is 1,024 characters.
+-- This value can consist of letters, accented characters, symbols,
+-- numbers, punctuation, tab, new line, carriage return, space, and
+-- nonbreaking space in this attribute. This value is specified at the time
+-- the group is created and stored as an attribute of the group object in
+-- the identity store.
+--
+-- 'externalIds', 'group_externalIds' - A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+--
+-- 'groupId', 'group_groupId' - The identifier for a group in the identity store.
+--
+-- 'identityStoreId', 'group_identityStoreId' - The globally unique identifier for the identity store.
+newGroup ::
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  Group
+newGroup pGroupId_ pIdentityStoreId_ =
+  Group'
+    { description = Prelude.Nothing,
+      displayName = Prelude.Nothing,
+      externalIds = Prelude.Nothing,
+      groupId = pGroupId_,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A string containing a description of the specified group.
+group_description :: Lens.Lens' Group (Prelude.Maybe Prelude.Text)
+group_description = Lens.lens (\Group' {description} -> description) (\s@Group' {} a -> s {description = a} :: Group) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The group’s display name value. The length limit is 1,024 characters.
+-- This value can consist of letters, accented characters, symbols,
+-- numbers, punctuation, tab, new line, carriage return, space, and
+-- nonbreaking space in this attribute. This value is specified at the time
+-- the group is created and stored as an attribute of the group object in
+-- the identity store.
+group_displayName :: Lens.Lens' Group (Prelude.Maybe Prelude.Text)
+group_displayName = Lens.lens (\Group' {displayName} -> displayName) (\s@Group' {} a -> s {displayName = a} :: Group) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+group_externalIds :: Lens.Lens' Group (Prelude.Maybe (Prelude.NonEmpty ExternalId))
+group_externalIds = Lens.lens (\Group' {externalIds} -> externalIds) (\s@Group' {} a -> s {externalIds = a} :: Group) Prelude.. Lens.mapping Lens.coerced
+
+-- | The identifier for a group in the identity store.
+group_groupId :: Lens.Lens' Group Prelude.Text
+group_groupId = Lens.lens (\Group' {groupId} -> groupId) (\s@Group' {} a -> s {groupId = a} :: Group)
+
+-- | The globally unique identifier for the identity store.
+group_identityStoreId :: Lens.Lens' Group Prelude.Text
+group_identityStoreId = Lens.lens (\Group' {identityStoreId} -> identityStoreId) (\s@Group' {} a -> s {identityStoreId = a} :: Group)
+
+instance Data.FromJSON Group where
+  parseJSON =
+    Data.withObject
+      "Group"
+      ( \x ->
+          Group'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "DisplayName")
+            Prelude.<*> (x Data..:? "ExternalIds")
+            Prelude.<*> (x Data..: "GroupId")
+            Prelude.<*> (x Data..: "IdentityStoreId")
+      )
+
+instance Prelude.Hashable Group where
+  hashWithSalt _salt Group' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` externalIds
+      `Prelude.hashWithSalt` groupId
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData Group where
+  rnf Group' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf externalIds
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/Types/GroupMembership.hs b/gen/Amazonka/IdentityStore/Types/GroupMembership.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/GroupMembership.hs
@@ -0,0 +1,118 @@
+{-# 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.IdentityStore.Types.GroupMembership
+-- 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.IdentityStore.Types.GroupMembership where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.MemberId
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the identifiers for a group, a group member, and a
+-- @GroupMembership@ object in the identity store.
+--
+-- /See:/ 'newGroupMembership' smart constructor.
+data GroupMembership = GroupMembership'
+  { -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Maybe Prelude.Text,
+    -- | An object that contains the identifier of a group member. Setting the
+    -- @UserID@ field to the specific identifier for a user indicates that the
+    -- user is a member of the group.
+    memberId :: Prelude.Maybe MemberId,
+    -- | The identifier for a @GroupMembership@ object in an identity store.
+    membershipId :: Prelude.Maybe Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GroupMembership' 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:
+--
+-- 'groupId', 'groupMembership_groupId' - The identifier for a group in the identity store.
+--
+-- 'memberId', 'groupMembership_memberId' - An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+--
+-- 'membershipId', 'groupMembership_membershipId' - The identifier for a @GroupMembership@ object in an identity store.
+--
+-- 'identityStoreId', 'groupMembership_identityStoreId' - The globally unique identifier for the identity store.
+newGroupMembership ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  GroupMembership
+newGroupMembership pIdentityStoreId_ =
+  GroupMembership'
+    { groupId = Prelude.Nothing,
+      memberId = Prelude.Nothing,
+      membershipId = Prelude.Nothing,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | The identifier for a group in the identity store.
+groupMembership_groupId :: Lens.Lens' GroupMembership (Prelude.Maybe Prelude.Text)
+groupMembership_groupId = Lens.lens (\GroupMembership' {groupId} -> groupId) (\s@GroupMembership' {} a -> s {groupId = a} :: GroupMembership)
+
+-- | An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+groupMembership_memberId :: Lens.Lens' GroupMembership (Prelude.Maybe MemberId)
+groupMembership_memberId = Lens.lens (\GroupMembership' {memberId} -> memberId) (\s@GroupMembership' {} a -> s {memberId = a} :: GroupMembership)
+
+-- | The identifier for a @GroupMembership@ object in an identity store.
+groupMembership_membershipId :: Lens.Lens' GroupMembership (Prelude.Maybe Prelude.Text)
+groupMembership_membershipId = Lens.lens (\GroupMembership' {membershipId} -> membershipId) (\s@GroupMembership' {} a -> s {membershipId = a} :: GroupMembership)
+
+-- | The globally unique identifier for the identity store.
+groupMembership_identityStoreId :: Lens.Lens' GroupMembership Prelude.Text
+groupMembership_identityStoreId = Lens.lens (\GroupMembership' {identityStoreId} -> identityStoreId) (\s@GroupMembership' {} a -> s {identityStoreId = a} :: GroupMembership)
+
+instance Data.FromJSON GroupMembership where
+  parseJSON =
+    Data.withObject
+      "GroupMembership"
+      ( \x ->
+          GroupMembership'
+            Prelude.<$> (x Data..:? "GroupId")
+            Prelude.<*> (x Data..:? "MemberId")
+            Prelude.<*> (x Data..:? "MembershipId")
+            Prelude.<*> (x Data..: "IdentityStoreId")
+      )
+
+instance Prelude.Hashable GroupMembership where
+  hashWithSalt _salt GroupMembership' {..} =
+    _salt
+      `Prelude.hashWithSalt` groupId
+      `Prelude.hashWithSalt` memberId
+      `Prelude.hashWithSalt` membershipId
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData GroupMembership where
+  rnf GroupMembership' {..} =
+    Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf memberId
+      `Prelude.seq` Prelude.rnf membershipId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/Types/GroupMembershipExistenceResult.hs b/gen/Amazonka/IdentityStore/Types/GroupMembershipExistenceResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/GroupMembershipExistenceResult.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.IdentityStore.Types.GroupMembershipExistenceResult
+-- 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.IdentityStore.Types.GroupMembershipExistenceResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.MemberId
+import qualified Amazonka.Prelude as Prelude
+
+-- | Indicates whether a resource is a member of a group in the identity
+-- store.
+--
+-- /See:/ 'newGroupMembershipExistenceResult' smart constructor.
+data GroupMembershipExistenceResult = GroupMembershipExistenceResult'
+  { -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Maybe Prelude.Text,
+    -- | An object that contains the identifier of a group member. Setting the
+    -- @UserID@ field to the specific identifier for a user indicates that the
+    -- user is a member of the group.
+    memberId :: Prelude.Maybe MemberId,
+    -- | Indicates whether a membership relation exists or not.
+    membershipExists :: Prelude.Maybe (Data.Sensitive Prelude.Bool)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GroupMembershipExistenceResult' 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:
+--
+-- 'groupId', 'groupMembershipExistenceResult_groupId' - The identifier for a group in the identity store.
+--
+-- 'memberId', 'groupMembershipExistenceResult_memberId' - An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+--
+-- 'membershipExists', 'groupMembershipExistenceResult_membershipExists' - Indicates whether a membership relation exists or not.
+newGroupMembershipExistenceResult ::
+  GroupMembershipExistenceResult
+newGroupMembershipExistenceResult =
+  GroupMembershipExistenceResult'
+    { groupId =
+        Prelude.Nothing,
+      memberId = Prelude.Nothing,
+      membershipExists = Prelude.Nothing
+    }
+
+-- | The identifier for a group in the identity store.
+groupMembershipExistenceResult_groupId :: Lens.Lens' GroupMembershipExistenceResult (Prelude.Maybe Prelude.Text)
+groupMembershipExistenceResult_groupId = Lens.lens (\GroupMembershipExistenceResult' {groupId} -> groupId) (\s@GroupMembershipExistenceResult' {} a -> s {groupId = a} :: GroupMembershipExistenceResult)
+
+-- | An object that contains the identifier of a group member. Setting the
+-- @UserID@ field to the specific identifier for a user indicates that the
+-- user is a member of the group.
+groupMembershipExistenceResult_memberId :: Lens.Lens' GroupMembershipExistenceResult (Prelude.Maybe MemberId)
+groupMembershipExistenceResult_memberId = Lens.lens (\GroupMembershipExistenceResult' {memberId} -> memberId) (\s@GroupMembershipExistenceResult' {} a -> s {memberId = a} :: GroupMembershipExistenceResult)
+
+-- | Indicates whether a membership relation exists or not.
+groupMembershipExistenceResult_membershipExists :: Lens.Lens' GroupMembershipExistenceResult (Prelude.Maybe Prelude.Bool)
+groupMembershipExistenceResult_membershipExists = Lens.lens (\GroupMembershipExistenceResult' {membershipExists} -> membershipExists) (\s@GroupMembershipExistenceResult' {} a -> s {membershipExists = a} :: GroupMembershipExistenceResult) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON GroupMembershipExistenceResult where
+  parseJSON =
+    Data.withObject
+      "GroupMembershipExistenceResult"
+      ( \x ->
+          GroupMembershipExistenceResult'
+            Prelude.<$> (x Data..:? "GroupId")
+            Prelude.<*> (x Data..:? "MemberId")
+            Prelude.<*> (x Data..:? "MembershipExists")
+      )
+
+instance
+  Prelude.Hashable
+    GroupMembershipExistenceResult
+  where
+  hashWithSalt
+    _salt
+    GroupMembershipExistenceResult' {..} =
+      _salt
+        `Prelude.hashWithSalt` groupId
+        `Prelude.hashWithSalt` memberId
+        `Prelude.hashWithSalt` membershipExists
+
+instance
+  Prelude.NFData
+    GroupMembershipExistenceResult
+  where
+  rnf GroupMembershipExistenceResult' {..} =
+    Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf memberId
+      `Prelude.seq` Prelude.rnf membershipExists
diff --git a/gen/Amazonka/IdentityStore/Types/MemberId.hs b/gen/Amazonka/IdentityStore/Types/MemberId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/MemberId.hs
@@ -0,0 +1,71 @@
+{-# 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.IdentityStore.Types.MemberId
+-- 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.IdentityStore.Types.MemberId 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 containing the identifier of a group member.
+--
+-- /See:/ 'newMemberId' smart constructor.
+data MemberId = MemberId'
+  { -- | An object containing the identifiers of resources that can be members.
+    userId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MemberId' 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:
+--
+-- 'userId', 'memberId_userId' - An object containing the identifiers of resources that can be members.
+newMemberId ::
+  MemberId
+newMemberId = MemberId' {userId = Prelude.Nothing}
+
+-- | An object containing the identifiers of resources that can be members.
+memberId_userId :: Lens.Lens' MemberId (Prelude.Maybe Prelude.Text)
+memberId_userId = Lens.lens (\MemberId' {userId} -> userId) (\s@MemberId' {} a -> s {userId = a} :: MemberId)
+
+instance Data.FromJSON MemberId where
+  parseJSON =
+    Data.withObject
+      "MemberId"
+      (\x -> MemberId' Prelude.<$> (x Data..:? "UserId"))
+
+instance Prelude.Hashable MemberId where
+  hashWithSalt _salt MemberId' {..} =
+    _salt `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData MemberId where
+  rnf MemberId' {..} = Prelude.rnf userId
+
+instance Data.ToJSON MemberId where
+  toJSON MemberId' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("UserId" Data..=) Prelude.<$> userId]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/Name.hs b/gen/Amazonka/IdentityStore/Types/Name.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/Name.hs
@@ -0,0 +1,147 @@
+{-# 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.IdentityStore.Types.Name
+-- 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.IdentityStore.Types.Name 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 full name of the user.
+--
+-- /See:/ 'newName' smart constructor.
+data Name = Name'
+  { -- | The family name of the user.
+    familyName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing a formatted version of the name for display.
+    formatted :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The given name of the user.
+    givenName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The honorific prefix of the user. For example, \"Dr.\"
+    honorificPrefix :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The honorific suffix of the user. For example, \"M.D.\"
+    honorificSuffix :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The middle name of the user.
+    middleName :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Name' 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:
+--
+-- 'familyName', 'name_familyName' - The family name of the user.
+--
+-- 'formatted', 'name_formatted' - A string containing a formatted version of the name for display.
+--
+-- 'givenName', 'name_givenName' - The given name of the user.
+--
+-- 'honorificPrefix', 'name_honorificPrefix' - The honorific prefix of the user. For example, \"Dr.\"
+--
+-- 'honorificSuffix', 'name_honorificSuffix' - The honorific suffix of the user. For example, \"M.D.\"
+--
+-- 'middleName', 'name_middleName' - The middle name of the user.
+newName ::
+  Name
+newName =
+  Name'
+    { familyName = Prelude.Nothing,
+      formatted = Prelude.Nothing,
+      givenName = Prelude.Nothing,
+      honorificPrefix = Prelude.Nothing,
+      honorificSuffix = Prelude.Nothing,
+      middleName = Prelude.Nothing
+    }
+
+-- | The family name of the user.
+name_familyName :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_familyName = Lens.lens (\Name' {familyName} -> familyName) (\s@Name' {} a -> s {familyName = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing a formatted version of the name for display.
+name_formatted :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_formatted = Lens.lens (\Name' {formatted} -> formatted) (\s@Name' {} a -> s {formatted = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The given name of the user.
+name_givenName :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_givenName = Lens.lens (\Name' {givenName} -> givenName) (\s@Name' {} a -> s {givenName = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The honorific prefix of the user. For example, \"Dr.\"
+name_honorificPrefix :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_honorificPrefix = Lens.lens (\Name' {honorificPrefix} -> honorificPrefix) (\s@Name' {} a -> s {honorificPrefix = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The honorific suffix of the user. For example, \"M.D.\"
+name_honorificSuffix :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_honorificSuffix = Lens.lens (\Name' {honorificSuffix} -> honorificSuffix) (\s@Name' {} a -> s {honorificSuffix = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The middle name of the user.
+name_middleName :: Lens.Lens' Name (Prelude.Maybe Prelude.Text)
+name_middleName = Lens.lens (\Name' {middleName} -> middleName) (\s@Name' {} a -> s {middleName = a} :: Name) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON Name where
+  parseJSON =
+    Data.withObject
+      "Name"
+      ( \x ->
+          Name'
+            Prelude.<$> (x Data..:? "FamilyName")
+            Prelude.<*> (x Data..:? "Formatted")
+            Prelude.<*> (x Data..:? "GivenName")
+            Prelude.<*> (x Data..:? "HonorificPrefix")
+            Prelude.<*> (x Data..:? "HonorificSuffix")
+            Prelude.<*> (x Data..:? "MiddleName")
+      )
+
+instance Prelude.Hashable Name where
+  hashWithSalt _salt Name' {..} =
+    _salt
+      `Prelude.hashWithSalt` familyName
+      `Prelude.hashWithSalt` formatted
+      `Prelude.hashWithSalt` givenName
+      `Prelude.hashWithSalt` honorificPrefix
+      `Prelude.hashWithSalt` honorificSuffix
+      `Prelude.hashWithSalt` middleName
+
+instance Prelude.NFData Name where
+  rnf Name' {..} =
+    Prelude.rnf familyName
+      `Prelude.seq` Prelude.rnf formatted
+      `Prelude.seq` Prelude.rnf givenName
+      `Prelude.seq` Prelude.rnf honorificPrefix
+      `Prelude.seq` Prelude.rnf honorificSuffix
+      `Prelude.seq` Prelude.rnf middleName
+
+instance Data.ToJSON Name where
+  toJSON Name' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("FamilyName" Data..=) Prelude.<$> familyName,
+            ("Formatted" Data..=) Prelude.<$> formatted,
+            ("GivenName" Data..=) Prelude.<$> givenName,
+            ("HonorificPrefix" Data..=)
+              Prelude.<$> honorificPrefix,
+            ("HonorificSuffix" Data..=)
+              Prelude.<$> honorificSuffix,
+            ("MiddleName" Data..=) Prelude.<$> middleName
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/PhoneNumber.hs b/gen/Amazonka/IdentityStore/Types/PhoneNumber.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/PhoneNumber.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.IdentityStore.Types.PhoneNumber
+-- 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.IdentityStore.Types.PhoneNumber 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 phone number associated with the user.
+--
+-- /See:/ 'newPhoneNumber' smart constructor.
+data PhoneNumber = PhoneNumber'
+  { -- | A Boolean value representing whether this is the primary phone number
+    -- for the associated resource.
+    primary :: Prelude.Maybe (Data.Sensitive Prelude.Bool),
+    -- | A string representing the type of a phone number. For example,
+    -- \"Mobile.\"
+    type' :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing a phone number. For example, \"8675309\" or \"+1
+    -- (800) 123-4567\".
+    value :: Prelude.Maybe (Data.Sensitive Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PhoneNumber' 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:
+--
+-- 'primary', 'phoneNumber_primary' - A Boolean value representing whether this is the primary phone number
+-- for the associated resource.
+--
+-- 'type'', 'phoneNumber_type' - A string representing the type of a phone number. For example,
+-- \"Mobile.\"
+--
+-- 'value', 'phoneNumber_value' - A string containing a phone number. For example, \"8675309\" or \"+1
+-- (800) 123-4567\".
+newPhoneNumber ::
+  PhoneNumber
+newPhoneNumber =
+  PhoneNumber'
+    { primary = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | A Boolean value representing whether this is the primary phone number
+-- for the associated resource.
+phoneNumber_primary :: Lens.Lens' PhoneNumber (Prelude.Maybe Prelude.Bool)
+phoneNumber_primary = Lens.lens (\PhoneNumber' {primary} -> primary) (\s@PhoneNumber' {} a -> s {primary = a} :: PhoneNumber) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string representing the type of a phone number. For example,
+-- \"Mobile.\"
+phoneNumber_type :: Lens.Lens' PhoneNumber (Prelude.Maybe Prelude.Text)
+phoneNumber_type = Lens.lens (\PhoneNumber' {type'} -> type') (\s@PhoneNumber' {} a -> s {type' = a} :: PhoneNumber) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing a phone number. For example, \"8675309\" or \"+1
+-- (800) 123-4567\".
+phoneNumber_value :: Lens.Lens' PhoneNumber (Prelude.Maybe Prelude.Text)
+phoneNumber_value = Lens.lens (\PhoneNumber' {value} -> value) (\s@PhoneNumber' {} a -> s {value = a} :: PhoneNumber) Prelude.. Lens.mapping Data._Sensitive
+
+instance Data.FromJSON PhoneNumber where
+  parseJSON =
+    Data.withObject
+      "PhoneNumber"
+      ( \x ->
+          PhoneNumber'
+            Prelude.<$> (x Data..:? "Primary")
+            Prelude.<*> (x Data..:? "Type")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable PhoneNumber where
+  hashWithSalt _salt PhoneNumber' {..} =
+    _salt
+      `Prelude.hashWithSalt` primary
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData PhoneNumber where
+  rnf PhoneNumber' {..} =
+    Prelude.rnf primary
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON PhoneNumber where
+  toJSON PhoneNumber' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Primary" Data..=) Prelude.<$> primary,
+            ("Type" Data..=) Prelude.<$> type',
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/UniqueAttribute.hs b/gen/Amazonka/IdentityStore/Types/UniqueAttribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/UniqueAttribute.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.IdentityStore.Types.UniqueAttribute
+-- 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.IdentityStore.Types.UniqueAttribute where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.AttributeValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | An entity attribute that\'s unique to a specific entity.
+--
+-- /See:/ 'newUniqueAttribute' smart constructor.
+data UniqueAttribute = UniqueAttribute'
+  { -- | A string representation of the path to a given attribute or
+    -- sub-attribute. Supports JMESPath.
+    attributePath :: Prelude.Text,
+    -- | The value of the attribute. This is a @Document@ type. This type is not
+    -- supported by Java V1, Go V1, and older versions of the AWS CLI.
+    attributeValue :: AttributeValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UniqueAttribute' 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:
+--
+-- 'attributePath', 'uniqueAttribute_attributePath' - A string representation of the path to a given attribute or
+-- sub-attribute. Supports JMESPath.
+--
+-- 'attributeValue', 'uniqueAttribute_attributeValue' - The value of the attribute. This is a @Document@ type. This type is not
+-- supported by Java V1, Go V1, and older versions of the AWS CLI.
+newUniqueAttribute ::
+  -- | 'attributePath'
+  Prelude.Text ->
+  -- | 'attributeValue'
+  AttributeValue ->
+  UniqueAttribute
+newUniqueAttribute pAttributePath_ pAttributeValue_ =
+  UniqueAttribute'
+    { attributePath = pAttributePath_,
+      attributeValue = pAttributeValue_
+    }
+
+-- | A string representation of the path to a given attribute or
+-- sub-attribute. Supports JMESPath.
+uniqueAttribute_attributePath :: Lens.Lens' UniqueAttribute Prelude.Text
+uniqueAttribute_attributePath = Lens.lens (\UniqueAttribute' {attributePath} -> attributePath) (\s@UniqueAttribute' {} a -> s {attributePath = a} :: UniqueAttribute)
+
+-- | The value of the attribute. This is a @Document@ type. This type is not
+-- supported by Java V1, Go V1, and older versions of the AWS CLI.
+uniqueAttribute_attributeValue :: Lens.Lens' UniqueAttribute AttributeValue
+uniqueAttribute_attributeValue = Lens.lens (\UniqueAttribute' {attributeValue} -> attributeValue) (\s@UniqueAttribute' {} a -> s {attributeValue = a} :: UniqueAttribute)
+
+instance Prelude.Hashable UniqueAttribute where
+  hashWithSalt _salt UniqueAttribute' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributePath
+      `Prelude.hashWithSalt` attributeValue
+
+instance Prelude.NFData UniqueAttribute where
+  rnf UniqueAttribute' {..} =
+    Prelude.rnf attributePath
+      `Prelude.seq` Prelude.rnf attributeValue
+
+instance Data.ToJSON UniqueAttribute where
+  toJSON UniqueAttribute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("AttributePath" Data..= attributePath),
+            Prelude.Just
+              ("AttributeValue" Data..= attributeValue)
+          ]
+      )
diff --git a/gen/Amazonka/IdentityStore/Types/User.hs b/gen/Amazonka/IdentityStore/Types/User.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/Types/User.hs
@@ -0,0 +1,297 @@
+{-# 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.IdentityStore.Types.User
+-- 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.IdentityStore.Types.User where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types.Address
+import Amazonka.IdentityStore.Types.Email
+import Amazonka.IdentityStore.Types.ExternalId
+import Amazonka.IdentityStore.Types.Name
+import Amazonka.IdentityStore.Types.PhoneNumber
+import qualified Amazonka.Prelude as Prelude
+
+-- | A user object that contains a specified user’s metadata and attributes.
+--
+-- /See:/ 'newUser' smart constructor.
+data User = User'
+  { -- | A list of @Address@ objects containing addresses associated with the
+    -- user.
+    addresses :: Prelude.Maybe (Prelude.NonEmpty Address),
+    -- | A string containing the user\'s name that\'s formatted for display when
+    -- the user is referenced. For example, \"John Doe.\"
+    displayName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @Email@ objects containing email addresses associated with the
+    -- user.
+    emails :: Prelude.Maybe (Prelude.NonEmpty Email),
+    -- | A list of @ExternalId@ objects that contains the identifiers issued to
+    -- this resource by an external identity provider.
+    externalIds :: Prelude.Maybe (Prelude.NonEmpty ExternalId),
+    -- | A string containing the user\'s geographical region or location.
+    locale :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | An object containing the user\'s name.
+    name :: Prelude.Maybe Name,
+    -- | A string containing an alternate name for the user.
+    nickName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of @PhoneNumber@ objects containing phone numbers associated with
+    -- the user.
+    phoneNumbers :: Prelude.Maybe (Prelude.NonEmpty PhoneNumber),
+    -- | A string containing the preferred language of the user. For example,
+    -- \"American English\" or \"en-us.\"
+    preferredLanguage :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing a URL that may be associated with the user.
+    profileUrl :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the user\'s time zone.
+    timezone :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string containing the user\'s title. Possible values depend on each
+    -- customer\'s specific needs, so they are left unspecified.
+    title :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A unique string used to identify the user. The length limit is 128
+    -- characters. This value can consist of letters, accented characters,
+    -- symbols, numbers, and punctuation. This value is specified at the time
+    -- the user is created and stored as an attribute of the user object in the
+    -- identity store.
+    userName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A string indicating the user\'s type. Possible values depend on each
+    -- customer\'s specific needs, so they are left unspecified.
+    userType :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text,
+    -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'User' 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:
+--
+-- 'addresses', 'user_addresses' - A list of @Address@ objects containing addresses associated with the
+-- user.
+--
+-- 'displayName', 'user_displayName' - A string containing the user\'s name that\'s formatted for display when
+-- the user is referenced. For example, \"John Doe.\"
+--
+-- 'emails', 'user_emails' - A list of @Email@ objects containing email addresses associated with the
+-- user.
+--
+-- 'externalIds', 'user_externalIds' - A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+--
+-- 'locale', 'user_locale' - A string containing the user\'s geographical region or location.
+--
+-- 'name', 'user_name' - An object containing the user\'s name.
+--
+-- 'nickName', 'user_nickName' - A string containing an alternate name for the user.
+--
+-- 'phoneNumbers', 'user_phoneNumbers' - A list of @PhoneNumber@ objects containing phone numbers associated with
+-- the user.
+--
+-- 'preferredLanguage', 'user_preferredLanguage' - A string containing the preferred language of the user. For example,
+-- \"American English\" or \"en-us.\"
+--
+-- 'profileUrl', 'user_profileUrl' - A string containing a URL that may be associated with the user.
+--
+-- 'timezone', 'user_timezone' - A string containing the user\'s time zone.
+--
+-- 'title', 'user_title' - A string containing the user\'s title. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+--
+-- 'userName', 'user_userName' - A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+--
+-- 'userType', 'user_userType' - A string indicating the user\'s type. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+--
+-- 'userId', 'user_userId' - The identifier for a user in the identity store.
+--
+-- 'identityStoreId', 'user_identityStoreId' - The globally unique identifier for the identity store.
+newUser ::
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  User
+newUser pUserId_ pIdentityStoreId_ =
+  User'
+    { addresses = Prelude.Nothing,
+      displayName = Prelude.Nothing,
+      emails = Prelude.Nothing,
+      externalIds = Prelude.Nothing,
+      locale = Prelude.Nothing,
+      name = Prelude.Nothing,
+      nickName = Prelude.Nothing,
+      phoneNumbers = Prelude.Nothing,
+      preferredLanguage = Prelude.Nothing,
+      profileUrl = Prelude.Nothing,
+      timezone = Prelude.Nothing,
+      title = Prelude.Nothing,
+      userName = Prelude.Nothing,
+      userType = Prelude.Nothing,
+      userId = pUserId_,
+      identityStoreId = pIdentityStoreId_
+    }
+
+-- | A list of @Address@ objects containing addresses associated with the
+-- user.
+user_addresses :: Lens.Lens' User (Prelude.Maybe (Prelude.NonEmpty Address))
+user_addresses = Lens.lens (\User' {addresses} -> addresses) (\s@User' {} a -> s {addresses = a} :: User) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the user\'s name that\'s formatted for display when
+-- the user is referenced. For example, \"John Doe.\"
+user_displayName :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_displayName = Lens.lens (\User' {displayName} -> displayName) (\s@User' {} a -> s {displayName = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @Email@ objects containing email addresses associated with the
+-- user.
+user_emails :: Lens.Lens' User (Prelude.Maybe (Prelude.NonEmpty Email))
+user_emails = Lens.lens (\User' {emails} -> emails) (\s@User' {} a -> s {emails = a} :: User) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of @ExternalId@ objects that contains the identifiers issued to
+-- this resource by an external identity provider.
+user_externalIds :: Lens.Lens' User (Prelude.Maybe (Prelude.NonEmpty ExternalId))
+user_externalIds = Lens.lens (\User' {externalIds} -> externalIds) (\s@User' {} a -> s {externalIds = a} :: User) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the user\'s geographical region or location.
+user_locale :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_locale = Lens.lens (\User' {locale} -> locale) (\s@User' {} a -> s {locale = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | An object containing the user\'s name.
+user_name :: Lens.Lens' User (Prelude.Maybe Name)
+user_name = Lens.lens (\User' {name} -> name) (\s@User' {} a -> s {name = a} :: User)
+
+-- | A string containing an alternate name for the user.
+user_nickName :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_nickName = Lens.lens (\User' {nickName} -> nickName) (\s@User' {} a -> s {nickName = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of @PhoneNumber@ objects containing phone numbers associated with
+-- the user.
+user_phoneNumbers :: Lens.Lens' User (Prelude.Maybe (Prelude.NonEmpty PhoneNumber))
+user_phoneNumbers = Lens.lens (\User' {phoneNumbers} -> phoneNumbers) (\s@User' {} a -> s {phoneNumbers = a} :: User) Prelude.. Lens.mapping Lens.coerced
+
+-- | A string containing the preferred language of the user. For example,
+-- \"American English\" or \"en-us.\"
+user_preferredLanguage :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_preferredLanguage = Lens.lens (\User' {preferredLanguage} -> preferredLanguage) (\s@User' {} a -> s {preferredLanguage = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing a URL that may be associated with the user.
+user_profileUrl :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_profileUrl = Lens.lens (\User' {profileUrl} -> profileUrl) (\s@User' {} a -> s {profileUrl = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the user\'s time zone.
+user_timezone :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_timezone = Lens.lens (\User' {timezone} -> timezone) (\s@User' {} a -> s {timezone = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string containing the user\'s title. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+user_title :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_title = Lens.lens (\User' {title} -> title) (\s@User' {} a -> s {title = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A unique string used to identify the user. The length limit is 128
+-- characters. This value can consist of letters, accented characters,
+-- symbols, numbers, and punctuation. This value is specified at the time
+-- the user is created and stored as an attribute of the user object in the
+-- identity store.
+user_userName :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_userName = Lens.lens (\User' {userName} -> userName) (\s@User' {} a -> s {userName = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A string indicating the user\'s type. Possible values depend on each
+-- customer\'s specific needs, so they are left unspecified.
+user_userType :: Lens.Lens' User (Prelude.Maybe Prelude.Text)
+user_userType = Lens.lens (\User' {userType} -> userType) (\s@User' {} a -> s {userType = a} :: User) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The identifier for a user in the identity store.
+user_userId :: Lens.Lens' User Prelude.Text
+user_userId = Lens.lens (\User' {userId} -> userId) (\s@User' {} a -> s {userId = a} :: User)
+
+-- | The globally unique identifier for the identity store.
+user_identityStoreId :: Lens.Lens' User Prelude.Text
+user_identityStoreId = Lens.lens (\User' {identityStoreId} -> identityStoreId) (\s@User' {} a -> s {identityStoreId = a} :: User)
+
+instance Data.FromJSON User where
+  parseJSON =
+    Data.withObject
+      "User"
+      ( \x ->
+          User'
+            Prelude.<$> (x Data..:? "Addresses")
+            Prelude.<*> (x Data..:? "DisplayName")
+            Prelude.<*> (x Data..:? "Emails")
+            Prelude.<*> (x Data..:? "ExternalIds")
+            Prelude.<*> (x Data..:? "Locale")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "NickName")
+            Prelude.<*> (x Data..:? "PhoneNumbers")
+            Prelude.<*> (x Data..:? "PreferredLanguage")
+            Prelude.<*> (x Data..:? "ProfileUrl")
+            Prelude.<*> (x Data..:? "Timezone")
+            Prelude.<*> (x Data..:? "Title")
+            Prelude.<*> (x Data..:? "UserName")
+            Prelude.<*> (x Data..:? "UserType")
+            Prelude.<*> (x Data..: "UserId")
+            Prelude.<*> (x Data..: "IdentityStoreId")
+      )
+
+instance Prelude.Hashable User where
+  hashWithSalt _salt User' {..} =
+    _salt
+      `Prelude.hashWithSalt` addresses
+      `Prelude.hashWithSalt` displayName
+      `Prelude.hashWithSalt` emails
+      `Prelude.hashWithSalt` externalIds
+      `Prelude.hashWithSalt` locale
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nickName
+      `Prelude.hashWithSalt` phoneNumbers
+      `Prelude.hashWithSalt` preferredLanguage
+      `Prelude.hashWithSalt` profileUrl
+      `Prelude.hashWithSalt` timezone
+      `Prelude.hashWithSalt` title
+      `Prelude.hashWithSalt` userName
+      `Prelude.hashWithSalt` userType
+      `Prelude.hashWithSalt` userId
+      `Prelude.hashWithSalt` identityStoreId
+
+instance Prelude.NFData User where
+  rnf User' {..} =
+    Prelude.rnf addresses
+      `Prelude.seq` Prelude.rnf displayName
+      `Prelude.seq` Prelude.rnf emails
+      `Prelude.seq` Prelude.rnf externalIds
+      `Prelude.seq` Prelude.rnf locale
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nickName
+      `Prelude.seq` Prelude.rnf phoneNumbers
+      `Prelude.seq` Prelude.rnf preferredLanguage
+      `Prelude.seq` Prelude.rnf profileUrl
+      `Prelude.seq` Prelude.rnf timezone
+      `Prelude.seq` Prelude.rnf title
+      `Prelude.seq` Prelude.rnf userName
+      `Prelude.seq` Prelude.rnf userType
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf identityStoreId
diff --git a/gen/Amazonka/IdentityStore/UpdateGroup.hs b/gen/Amazonka/IdentityStore/UpdateGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/UpdateGroup.hs
@@ -0,0 +1,193 @@
+{-# 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.IdentityStore.UpdateGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For the specified group in the specified identity store, updates the
+-- group metadata and attributes.
+module Amazonka.IdentityStore.UpdateGroup
+  ( -- * Creating a Request
+    UpdateGroup (..),
+    newUpdateGroup,
+
+    -- * Request Lenses
+    updateGroup_identityStoreId,
+    updateGroup_groupId,
+    updateGroup_operations,
+
+    -- * Destructuring the Response
+    UpdateGroupResponse (..),
+    newUpdateGroupResponse,
+
+    -- * Response Lenses
+    updateGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateGroup' smart constructor.
+data UpdateGroup = UpdateGroup'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a group in the identity store.
+    groupId :: Prelude.Text,
+    -- | A list of @AttributeOperation@ objects to apply to the requested group.
+    -- These operations might add, replace, or remove an attribute.
+    operations :: Prelude.NonEmpty AttributeOperation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGroup' 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:
+--
+-- 'identityStoreId', 'updateGroup_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'groupId', 'updateGroup_groupId' - The identifier for a group in the identity store.
+--
+-- 'operations', 'updateGroup_operations' - A list of @AttributeOperation@ objects to apply to the requested group.
+-- These operations might add, replace, or remove an attribute.
+newUpdateGroup ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'groupId'
+  Prelude.Text ->
+  -- | 'operations'
+  Prelude.NonEmpty AttributeOperation ->
+  UpdateGroup
+newUpdateGroup
+  pIdentityStoreId_
+  pGroupId_
+  pOperations_ =
+    UpdateGroup'
+      { identityStoreId = pIdentityStoreId_,
+        groupId = pGroupId_,
+        operations = Lens.coerced Lens.# pOperations_
+      }
+
+-- | The globally unique identifier for the identity store.
+updateGroup_identityStoreId :: Lens.Lens' UpdateGroup Prelude.Text
+updateGroup_identityStoreId = Lens.lens (\UpdateGroup' {identityStoreId} -> identityStoreId) (\s@UpdateGroup' {} a -> s {identityStoreId = a} :: UpdateGroup)
+
+-- | The identifier for a group in the identity store.
+updateGroup_groupId :: Lens.Lens' UpdateGroup Prelude.Text
+updateGroup_groupId = Lens.lens (\UpdateGroup' {groupId} -> groupId) (\s@UpdateGroup' {} a -> s {groupId = a} :: UpdateGroup)
+
+-- | A list of @AttributeOperation@ objects to apply to the requested group.
+-- These operations might add, replace, or remove an attribute.
+updateGroup_operations :: Lens.Lens' UpdateGroup (Prelude.NonEmpty AttributeOperation)
+updateGroup_operations = Lens.lens (\UpdateGroup' {operations} -> operations) (\s@UpdateGroup' {} a -> s {operations = a} :: UpdateGroup) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateGroup where
+  type AWSResponse UpdateGroup = UpdateGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateGroup where
+  hashWithSalt _salt UpdateGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` groupId
+      `Prelude.hashWithSalt` operations
+
+instance Prelude.NFData UpdateGroup where
+  rnf UpdateGroup' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf groupId
+      `Prelude.seq` Prelude.rnf operations
+
+instance Data.ToHeaders UpdateGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.UpdateGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateGroup where
+  toJSON UpdateGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("GroupId" Data..= groupId),
+            Prelude.Just ("Operations" Data..= operations)
+          ]
+      )
+
+instance Data.ToPath UpdateGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateGroupResponse' smart constructor.
+data UpdateGroupResponse = UpdateGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGroupResponse' 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', 'updateGroupResponse_httpStatus' - The response's http status code.
+newUpdateGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateGroupResponse
+newUpdateGroupResponse pHttpStatus_ =
+  UpdateGroupResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateGroupResponse_httpStatus :: Lens.Lens' UpdateGroupResponse Prelude.Int
+updateGroupResponse_httpStatus = Lens.lens (\UpdateGroupResponse' {httpStatus} -> httpStatus) (\s@UpdateGroupResponse' {} a -> s {httpStatus = a} :: UpdateGroupResponse)
+
+instance Prelude.NFData UpdateGroupResponse where
+  rnf UpdateGroupResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IdentityStore/UpdateUser.hs b/gen/Amazonka/IdentityStore/UpdateUser.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/UpdateUser.hs
@@ -0,0 +1,190 @@
+{-# 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.IdentityStore.UpdateUser
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For the specified user in the specified identity store, updates the user
+-- metadata and attributes.
+module Amazonka.IdentityStore.UpdateUser
+  ( -- * Creating a Request
+    UpdateUser (..),
+    newUpdateUser,
+
+    -- * Request Lenses
+    updateUser_identityStoreId,
+    updateUser_userId,
+    updateUser_operations,
+
+    -- * Destructuring the Response
+    UpdateUserResponse (..),
+    newUpdateUserResponse,
+
+    -- * Response Lenses
+    updateUserResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateUser' smart constructor.
+data UpdateUser = UpdateUser'
+  { -- | The globally unique identifier for the identity store.
+    identityStoreId :: Prelude.Text,
+    -- | The identifier for a user in the identity store.
+    userId :: Prelude.Text,
+    -- | A list of @AttributeOperation@ objects to apply to the requested user.
+    -- These operations might add, replace, or remove an attribute.
+    operations :: Prelude.NonEmpty AttributeOperation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateUser' 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:
+--
+-- 'identityStoreId', 'updateUser_identityStoreId' - The globally unique identifier for the identity store.
+--
+-- 'userId', 'updateUser_userId' - The identifier for a user in the identity store.
+--
+-- 'operations', 'updateUser_operations' - A list of @AttributeOperation@ objects to apply to the requested user.
+-- These operations might add, replace, or remove an attribute.
+newUpdateUser ::
+  -- | 'identityStoreId'
+  Prelude.Text ->
+  -- | 'userId'
+  Prelude.Text ->
+  -- | 'operations'
+  Prelude.NonEmpty AttributeOperation ->
+  UpdateUser
+newUpdateUser pIdentityStoreId_ pUserId_ pOperations_ =
+  UpdateUser'
+    { identityStoreId = pIdentityStoreId_,
+      userId = pUserId_,
+      operations = Lens.coerced Lens.# pOperations_
+    }
+
+-- | The globally unique identifier for the identity store.
+updateUser_identityStoreId :: Lens.Lens' UpdateUser Prelude.Text
+updateUser_identityStoreId = Lens.lens (\UpdateUser' {identityStoreId} -> identityStoreId) (\s@UpdateUser' {} a -> s {identityStoreId = a} :: UpdateUser)
+
+-- | The identifier for a user in the identity store.
+updateUser_userId :: Lens.Lens' UpdateUser Prelude.Text
+updateUser_userId = Lens.lens (\UpdateUser' {userId} -> userId) (\s@UpdateUser' {} a -> s {userId = a} :: UpdateUser)
+
+-- | A list of @AttributeOperation@ objects to apply to the requested user.
+-- These operations might add, replace, or remove an attribute.
+updateUser_operations :: Lens.Lens' UpdateUser (Prelude.NonEmpty AttributeOperation)
+updateUser_operations = Lens.lens (\UpdateUser' {operations} -> operations) (\s@UpdateUser' {} a -> s {operations = a} :: UpdateUser) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateUser where
+  type AWSResponse UpdateUser = UpdateUserResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateUserResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateUser where
+  hashWithSalt _salt UpdateUser' {..} =
+    _salt
+      `Prelude.hashWithSalt` identityStoreId
+      `Prelude.hashWithSalt` userId
+      `Prelude.hashWithSalt` operations
+
+instance Prelude.NFData UpdateUser where
+  rnf UpdateUser' {..} =
+    Prelude.rnf identityStoreId
+      `Prelude.seq` Prelude.rnf userId
+      `Prelude.seq` Prelude.rnf operations
+
+instance Data.ToHeaders UpdateUser where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AWSIdentityStore.UpdateUser" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateUser where
+  toJSON UpdateUser' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("IdentityStoreId" Data..= identityStoreId),
+            Prelude.Just ("UserId" Data..= userId),
+            Prelude.Just ("Operations" Data..= operations)
+          ]
+      )
+
+instance Data.ToPath UpdateUser where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateUser where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateUserResponse' smart constructor.
+data UpdateUserResponse = UpdateUserResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateUserResponse' 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', 'updateUserResponse_httpStatus' - The response's http status code.
+newUpdateUserResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateUserResponse
+newUpdateUserResponse pHttpStatus_ =
+  UpdateUserResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateUserResponse_httpStatus :: Lens.Lens' UpdateUserResponse Prelude.Int
+updateUserResponse_httpStatus = Lens.lens (\UpdateUserResponse' {httpStatus} -> httpStatus) (\s@UpdateUserResponse' {} a -> s {httpStatus = a} :: UpdateUserResponse)
+
+instance Prelude.NFData UpdateUserResponse where
+  rnf UpdateUserResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IdentityStore/Waiters.hs b/gen/Amazonka/IdentityStore/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IdentityStore/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.IdentityStore.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.IdentityStore.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IdentityStore.Lens
+import Amazonka.IdentityStore.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.IdentityStore
+import Test.Amazonka.IdentityStore.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "IdentityStore"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/IdentityStore.hs b/test/Test/Amazonka/Gen/IdentityStore.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/IdentityStore.hs
@@ -0,0 +1,418 @@
+{-# 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.IdentityStore
+-- 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.IdentityStore where
+
+import Amazonka.IdentityStore
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.IdentityStore.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"
+--         [ requestCreateGroup $
+--             newCreateGroup
+--
+--         , requestCreateGroupMembership $
+--             newCreateGroupMembership
+--
+--         , requestCreateUser $
+--             newCreateUser
+--
+--         , requestDeleteGroup $
+--             newDeleteGroup
+--
+--         , requestDeleteGroupMembership $
+--             newDeleteGroupMembership
+--
+--         , requestDeleteUser $
+--             newDeleteUser
+--
+--         , requestDescribeGroup $
+--             newDescribeGroup
+--
+--         , requestDescribeGroupMembership $
+--             newDescribeGroupMembership
+--
+--         , requestDescribeUser $
+--             newDescribeUser
+--
+--         , requestGetGroupId $
+--             newGetGroupId
+--
+--         , requestGetGroupMembershipId $
+--             newGetGroupMembershipId
+--
+--         , requestGetUserId $
+--             newGetUserId
+--
+--         , requestIsMemberInGroups $
+--             newIsMemberInGroups
+--
+--         , requestListGroupMemberships $
+--             newListGroupMemberships
+--
+--         , requestListGroupMembershipsForMember $
+--             newListGroupMembershipsForMember
+--
+--         , requestListGroups $
+--             newListGroups
+--
+--         , requestListUsers $
+--             newListUsers
+--
+--         , requestUpdateGroup $
+--             newUpdateGroup
+--
+--         , requestUpdateUser $
+--             newUpdateUser
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateGroup $
+--             newCreateGroupResponse
+--
+--         , responseCreateGroupMembership $
+--             newCreateGroupMembershipResponse
+--
+--         , responseCreateUser $
+--             newCreateUserResponse
+--
+--         , responseDeleteGroup $
+--             newDeleteGroupResponse
+--
+--         , responseDeleteGroupMembership $
+--             newDeleteGroupMembershipResponse
+--
+--         , responseDeleteUser $
+--             newDeleteUserResponse
+--
+--         , responseDescribeGroup $
+--             newDescribeGroupResponse
+--
+--         , responseDescribeGroupMembership $
+--             newDescribeGroupMembershipResponse
+--
+--         , responseDescribeUser $
+--             newDescribeUserResponse
+--
+--         , responseGetGroupId $
+--             newGetGroupIdResponse
+--
+--         , responseGetGroupMembershipId $
+--             newGetGroupMembershipIdResponse
+--
+--         , responseGetUserId $
+--             newGetUserIdResponse
+--
+--         , responseIsMemberInGroups $
+--             newIsMemberInGroupsResponse
+--
+--         , responseListGroupMemberships $
+--             newListGroupMembershipsResponse
+--
+--         , responseListGroupMembershipsForMember $
+--             newListGroupMembershipsForMemberResponse
+--
+--         , responseListGroups $
+--             newListGroupsResponse
+--
+--         , responseListUsers $
+--             newListUsersResponse
+--
+--         , responseUpdateGroup $
+--             newUpdateGroupResponse
+--
+--         , responseUpdateUser $
+--             newUpdateUserResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateGroup :: CreateGroup -> TestTree
+requestCreateGroup =
+  req
+    "CreateGroup"
+    "fixture/CreateGroup.yaml"
+
+requestCreateGroupMembership :: CreateGroupMembership -> TestTree
+requestCreateGroupMembership =
+  req
+    "CreateGroupMembership"
+    "fixture/CreateGroupMembership.yaml"
+
+requestCreateUser :: CreateUser -> TestTree
+requestCreateUser =
+  req
+    "CreateUser"
+    "fixture/CreateUser.yaml"
+
+requestDeleteGroup :: DeleteGroup -> TestTree
+requestDeleteGroup =
+  req
+    "DeleteGroup"
+    "fixture/DeleteGroup.yaml"
+
+requestDeleteGroupMembership :: DeleteGroupMembership -> TestTree
+requestDeleteGroupMembership =
+  req
+    "DeleteGroupMembership"
+    "fixture/DeleteGroupMembership.yaml"
+
+requestDeleteUser :: DeleteUser -> TestTree
+requestDeleteUser =
+  req
+    "DeleteUser"
+    "fixture/DeleteUser.yaml"
+
+requestDescribeGroup :: DescribeGroup -> TestTree
+requestDescribeGroup =
+  req
+    "DescribeGroup"
+    "fixture/DescribeGroup.yaml"
+
+requestDescribeGroupMembership :: DescribeGroupMembership -> TestTree
+requestDescribeGroupMembership =
+  req
+    "DescribeGroupMembership"
+    "fixture/DescribeGroupMembership.yaml"
+
+requestDescribeUser :: DescribeUser -> TestTree
+requestDescribeUser =
+  req
+    "DescribeUser"
+    "fixture/DescribeUser.yaml"
+
+requestGetGroupId :: GetGroupId -> TestTree
+requestGetGroupId =
+  req
+    "GetGroupId"
+    "fixture/GetGroupId.yaml"
+
+requestGetGroupMembershipId :: GetGroupMembershipId -> TestTree
+requestGetGroupMembershipId =
+  req
+    "GetGroupMembershipId"
+    "fixture/GetGroupMembershipId.yaml"
+
+requestGetUserId :: GetUserId -> TestTree
+requestGetUserId =
+  req
+    "GetUserId"
+    "fixture/GetUserId.yaml"
+
+requestIsMemberInGroups :: IsMemberInGroups -> TestTree
+requestIsMemberInGroups =
+  req
+    "IsMemberInGroups"
+    "fixture/IsMemberInGroups.yaml"
+
+requestListGroupMemberships :: ListGroupMemberships -> TestTree
+requestListGroupMemberships =
+  req
+    "ListGroupMemberships"
+    "fixture/ListGroupMemberships.yaml"
+
+requestListGroupMembershipsForMember :: ListGroupMembershipsForMember -> TestTree
+requestListGroupMembershipsForMember =
+  req
+    "ListGroupMembershipsForMember"
+    "fixture/ListGroupMembershipsForMember.yaml"
+
+requestListGroups :: ListGroups -> TestTree
+requestListGroups =
+  req
+    "ListGroups"
+    "fixture/ListGroups.yaml"
+
+requestListUsers :: ListUsers -> TestTree
+requestListUsers =
+  req
+    "ListUsers"
+    "fixture/ListUsers.yaml"
+
+requestUpdateGroup :: UpdateGroup -> TestTree
+requestUpdateGroup =
+  req
+    "UpdateGroup"
+    "fixture/UpdateGroup.yaml"
+
+requestUpdateUser :: UpdateUser -> TestTree
+requestUpdateUser =
+  req
+    "UpdateUser"
+    "fixture/UpdateUser.yaml"
+
+-- Responses
+
+responseCreateGroup :: CreateGroupResponse -> TestTree
+responseCreateGroup =
+  res
+    "CreateGroupResponse"
+    "fixture/CreateGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateGroup)
+
+responseCreateGroupMembership :: CreateGroupMembershipResponse -> TestTree
+responseCreateGroupMembership =
+  res
+    "CreateGroupMembershipResponse"
+    "fixture/CreateGroupMembershipResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateGroupMembership)
+
+responseCreateUser :: CreateUserResponse -> TestTree
+responseCreateUser =
+  res
+    "CreateUserResponse"
+    "fixture/CreateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateUser)
+
+responseDeleteGroup :: DeleteGroupResponse -> TestTree
+responseDeleteGroup =
+  res
+    "DeleteGroupResponse"
+    "fixture/DeleteGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteGroup)
+
+responseDeleteGroupMembership :: DeleteGroupMembershipResponse -> TestTree
+responseDeleteGroupMembership =
+  res
+    "DeleteGroupMembershipResponse"
+    "fixture/DeleteGroupMembershipResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteGroupMembership)
+
+responseDeleteUser :: DeleteUserResponse -> TestTree
+responseDeleteUser =
+  res
+    "DeleteUserResponse"
+    "fixture/DeleteUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteUser)
+
+responseDescribeGroup :: DescribeGroupResponse -> TestTree
+responseDescribeGroup =
+  res
+    "DescribeGroupResponse"
+    "fixture/DescribeGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeGroup)
+
+responseDescribeGroupMembership :: DescribeGroupMembershipResponse -> TestTree
+responseDescribeGroupMembership =
+  res
+    "DescribeGroupMembershipResponse"
+    "fixture/DescribeGroupMembershipResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeGroupMembership)
+
+responseDescribeUser :: DescribeUserResponse -> TestTree
+responseDescribeUser =
+  res
+    "DescribeUserResponse"
+    "fixture/DescribeUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeUser)
+
+responseGetGroupId :: GetGroupIdResponse -> TestTree
+responseGetGroupId =
+  res
+    "GetGroupIdResponse"
+    "fixture/GetGroupIdResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetGroupId)
+
+responseGetGroupMembershipId :: GetGroupMembershipIdResponse -> TestTree
+responseGetGroupMembershipId =
+  res
+    "GetGroupMembershipIdResponse"
+    "fixture/GetGroupMembershipIdResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetGroupMembershipId)
+
+responseGetUserId :: GetUserIdResponse -> TestTree
+responseGetUserId =
+  res
+    "GetUserIdResponse"
+    "fixture/GetUserIdResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetUserId)
+
+responseIsMemberInGroups :: IsMemberInGroupsResponse -> TestTree
+responseIsMemberInGroups =
+  res
+    "IsMemberInGroupsResponse"
+    "fixture/IsMemberInGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy IsMemberInGroups)
+
+responseListGroupMemberships :: ListGroupMembershipsResponse -> TestTree
+responseListGroupMemberships =
+  res
+    "ListGroupMembershipsResponse"
+    "fixture/ListGroupMembershipsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGroupMemberships)
+
+responseListGroupMembershipsForMember :: ListGroupMembershipsForMemberResponse -> TestTree
+responseListGroupMembershipsForMember =
+  res
+    "ListGroupMembershipsForMemberResponse"
+    "fixture/ListGroupMembershipsForMemberResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGroupMembershipsForMember)
+
+responseListGroups :: ListGroupsResponse -> TestTree
+responseListGroups =
+  res
+    "ListGroupsResponse"
+    "fixture/ListGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGroups)
+
+responseListUsers :: ListUsersResponse -> TestTree
+responseListUsers =
+  res
+    "ListUsersResponse"
+    "fixture/ListUsersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListUsers)
+
+responseUpdateGroup :: UpdateGroupResponse -> TestTree
+responseUpdateGroup =
+  res
+    "UpdateGroupResponse"
+    "fixture/UpdateGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateGroup)
+
+responseUpdateUser :: UpdateUserResponse -> TestTree
+responseUpdateUser =
+  res
+    "UpdateUserResponse"
+    "fixture/UpdateUserResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateUser)
diff --git a/test/Test/Amazonka/IdentityStore.hs b/test/Test/Amazonka/IdentityStore.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IdentityStore.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.IdentityStore
+-- 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.IdentityStore
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/IdentityStore/Internal.hs b/test/Test/Amazonka/IdentityStore/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IdentityStore/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.IdentityStore.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.IdentityStore.Internal where
