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 Route53 Recovery Control Config SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-11-02@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-route53-recovery-control-config)
+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.Route53RecoveryControlConfig](http://hackage.haskell.org/package/amazonka-route53-recovery-control-config/docs/Amazonka-Route53RecoveryControlConfig.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-route53-recovery-control-config` 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-route53-recovery-control-config.cabal b/amazonka-route53-recovery-control-config.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-route53-recovery-control-config.cabal
@@ -0,0 +1,120 @@
+cabal-version:      2.2
+name:               amazonka-route53-recovery-control-config
+version:            2.0
+synopsis:           Amazon Route53 Recovery Control Config 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-11-02@ 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.Route53RecoveryControlConfig.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.Route53RecoveryControlConfig" 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-route53-recovery-control-config
+
+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.Route53RecoveryControlConfig
+    Amazonka.Route53RecoveryControlConfig.CreateCluster
+    Amazonka.Route53RecoveryControlConfig.CreateControlPanel
+    Amazonka.Route53RecoveryControlConfig.CreateRoutingControl
+    Amazonka.Route53RecoveryControlConfig.CreateSafetyRule
+    Amazonka.Route53RecoveryControlConfig.DeleteCluster
+    Amazonka.Route53RecoveryControlConfig.DeleteControlPanel
+    Amazonka.Route53RecoveryControlConfig.DeleteRoutingControl
+    Amazonka.Route53RecoveryControlConfig.DeleteSafetyRule
+    Amazonka.Route53RecoveryControlConfig.DescribeCluster
+    Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+    Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl
+    Amazonka.Route53RecoveryControlConfig.DescribeSafetyRule
+    Amazonka.Route53RecoveryControlConfig.Lens
+    Amazonka.Route53RecoveryControlConfig.ListAssociatedRoute53HealthChecks
+    Amazonka.Route53RecoveryControlConfig.ListClusters
+    Amazonka.Route53RecoveryControlConfig.ListControlPanels
+    Amazonka.Route53RecoveryControlConfig.ListRoutingControls
+    Amazonka.Route53RecoveryControlConfig.ListSafetyRules
+    Amazonka.Route53RecoveryControlConfig.ListTagsForResource
+    Amazonka.Route53RecoveryControlConfig.TagResource
+    Amazonka.Route53RecoveryControlConfig.Types
+    Amazonka.Route53RecoveryControlConfig.Types.AssertionRule
+    Amazonka.Route53RecoveryControlConfig.Types.AssertionRuleUpdate
+    Amazonka.Route53RecoveryControlConfig.Types.Cluster
+    Amazonka.Route53RecoveryControlConfig.Types.ClusterEndpoint
+    Amazonka.Route53RecoveryControlConfig.Types.ControlPanel
+    Amazonka.Route53RecoveryControlConfig.Types.GatingRule
+    Amazonka.Route53RecoveryControlConfig.Types.GatingRuleUpdate
+    Amazonka.Route53RecoveryControlConfig.Types.NewAssertionRule
+    Amazonka.Route53RecoveryControlConfig.Types.NewGatingRule
+    Amazonka.Route53RecoveryControlConfig.Types.RoutingControl
+    Amazonka.Route53RecoveryControlConfig.Types.Rule
+    Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+    Amazonka.Route53RecoveryControlConfig.Types.RuleType
+    Amazonka.Route53RecoveryControlConfig.Types.Status
+    Amazonka.Route53RecoveryControlConfig.UntagResource
+    Amazonka.Route53RecoveryControlConfig.UpdateControlPanel
+    Amazonka.Route53RecoveryControlConfig.UpdateRoutingControl
+    Amazonka.Route53RecoveryControlConfig.UpdateSafetyRule
+    Amazonka.Route53RecoveryControlConfig.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-route53-recovery-control-config-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.Route53RecoveryControlConfig
+    Test.Amazonka.Route53RecoveryControlConfig
+    Test.Amazonka.Route53RecoveryControlConfig.Internal
+
+  build-depends:
+    , amazonka-core                             >=2.0 && <2.1
+    , amazonka-route53-recovery-control-config
+    , amazonka-test                             >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateCluster.yaml b/fixture/CreateCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/CreateClusterResponse.proto b/fixture/CreateClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateClusterResponse.proto
diff --git a/fixture/CreateControlPanel.yaml b/fixture/CreateControlPanel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateControlPanel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/CreateControlPanelResponse.proto b/fixture/CreateControlPanelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateControlPanelResponse.proto
diff --git a/fixture/CreateRoutingControl.yaml b/fixture/CreateRoutingControl.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRoutingControl.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/CreateRoutingControlResponse.proto b/fixture/CreateRoutingControlResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRoutingControlResponse.proto
diff --git a/fixture/CreateSafetyRule.yaml b/fixture/CreateSafetyRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSafetyRule.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/CreateSafetyRuleResponse.proto b/fixture/CreateSafetyRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSafetyRuleResponse.proto
diff --git a/fixture/DeleteCluster.yaml b/fixture/DeleteCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DeleteClusterResponse.proto b/fixture/DeleteClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteClusterResponse.proto
diff --git a/fixture/DeleteControlPanel.yaml b/fixture/DeleteControlPanel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteControlPanel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DeleteControlPanelResponse.proto b/fixture/DeleteControlPanelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteControlPanelResponse.proto
diff --git a/fixture/DeleteRoutingControl.yaml b/fixture/DeleteRoutingControl.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoutingControl.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DeleteRoutingControlResponse.proto b/fixture/DeleteRoutingControlResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRoutingControlResponse.proto
diff --git a/fixture/DeleteSafetyRule.yaml b/fixture/DeleteSafetyRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSafetyRule.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DeleteSafetyRuleResponse.proto b/fixture/DeleteSafetyRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSafetyRuleResponse.proto
diff --git a/fixture/DescribeCluster.yaml b/fixture/DescribeCluster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeCluster.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DescribeClusterResponse.proto b/fixture/DescribeClusterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeClusterResponse.proto
diff --git a/fixture/DescribeControlPanel.yaml b/fixture/DescribeControlPanel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeControlPanel.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DescribeControlPanelResponse.proto b/fixture/DescribeControlPanelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeControlPanelResponse.proto
diff --git a/fixture/DescribeRoutingControl.yaml b/fixture/DescribeRoutingControl.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRoutingControl.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DescribeRoutingControlResponse.proto b/fixture/DescribeRoutingControlResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRoutingControlResponse.proto
diff --git a/fixture/DescribeSafetyRule.yaml b/fixture/DescribeSafetyRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSafetyRule.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/DescribeSafetyRuleResponse.proto b/fixture/DescribeSafetyRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSafetyRuleResponse.proto
diff --git a/fixture/ListAssociatedRoute53HealthChecks.yaml b/fixture/ListAssociatedRoute53HealthChecks.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedRoute53HealthChecks.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/ListAssociatedRoute53HealthChecksResponse.proto b/fixture/ListAssociatedRoute53HealthChecksResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedRoute53HealthChecksResponse.proto
diff --git a/fixture/ListClusters.yaml b/fixture/ListClusters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListClusters.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/ListClustersResponse.proto b/fixture/ListClustersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListClustersResponse.proto
diff --git a/fixture/ListControlPanels.yaml b/fixture/ListControlPanels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListControlPanels.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/ListControlPanelsResponse.proto b/fixture/ListControlPanelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListControlPanelsResponse.proto
diff --git a/fixture/ListRoutingControls.yaml b/fixture/ListRoutingControls.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRoutingControls.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/ListRoutingControlsResponse.proto b/fixture/ListRoutingControlsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRoutingControlsResponse.proto
diff --git a/fixture/ListSafetyRules.yaml b/fixture/ListSafetyRules.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSafetyRules.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/ListSafetyRulesResponse.proto b/fixture/ListSafetyRulesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSafetyRulesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateControlPanel.yaml b/fixture/UpdateControlPanel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateControlPanel.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/UpdateControlPanelResponse.proto b/fixture/UpdateControlPanelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateControlPanelResponse.proto
diff --git a/fixture/UpdateRoutingControl.yaml b/fixture/UpdateRoutingControl.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRoutingControl.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/UpdateRoutingControlResponse.proto b/fixture/UpdateRoutingControlResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRoutingControlResponse.proto
diff --git a/fixture/UpdateSafetyRule.yaml b/fixture/UpdateSafetyRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSafetyRule.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/route53-recovery-control-config/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  route53-recovery-control-config.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/UpdateSafetyRuleResponse.proto b/fixture/UpdateSafetyRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateSafetyRuleResponse.proto
diff --git a/gen/Amazonka/Route53RecoveryControlConfig.hs b/gen/Amazonka/Route53RecoveryControlConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig.hs
@@ -0,0 +1,316 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig
+-- 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-11-02@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Recovery Control Configuration API Reference for Amazon Route 53
+-- Application Recovery Controller
+module Amazonka.Route53RecoveryControlConfig
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- ** ClusterCreated
+    newClusterCreated,
+
+    -- ** ClusterDeleted
+    newClusterDeleted,
+
+    -- ** ControlPanelCreated
+    newControlPanelCreated,
+
+    -- ** ControlPanelDeleted
+    newControlPanelDeleted,
+
+    -- ** RoutingControlCreated
+    newRoutingControlCreated,
+
+    -- ** RoutingControlDeleted
+    newRoutingControlDeleted,
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateCluster
+    CreateCluster (CreateCluster'),
+    newCreateCluster,
+    CreateClusterResponse (CreateClusterResponse'),
+    newCreateClusterResponse,
+
+    -- ** CreateControlPanel
+    CreateControlPanel (CreateControlPanel'),
+    newCreateControlPanel,
+    CreateControlPanelResponse (CreateControlPanelResponse'),
+    newCreateControlPanelResponse,
+
+    -- ** CreateRoutingControl
+    CreateRoutingControl (CreateRoutingControl'),
+    newCreateRoutingControl,
+    CreateRoutingControlResponse (CreateRoutingControlResponse'),
+    newCreateRoutingControlResponse,
+
+    -- ** CreateSafetyRule
+    CreateSafetyRule (CreateSafetyRule'),
+    newCreateSafetyRule,
+    CreateSafetyRuleResponse (CreateSafetyRuleResponse'),
+    newCreateSafetyRuleResponse,
+
+    -- ** DeleteCluster
+    DeleteCluster (DeleteCluster'),
+    newDeleteCluster,
+    DeleteClusterResponse (DeleteClusterResponse'),
+    newDeleteClusterResponse,
+
+    -- ** DeleteControlPanel
+    DeleteControlPanel (DeleteControlPanel'),
+    newDeleteControlPanel,
+    DeleteControlPanelResponse (DeleteControlPanelResponse'),
+    newDeleteControlPanelResponse,
+
+    -- ** DeleteRoutingControl
+    DeleteRoutingControl (DeleteRoutingControl'),
+    newDeleteRoutingControl,
+    DeleteRoutingControlResponse (DeleteRoutingControlResponse'),
+    newDeleteRoutingControlResponse,
+
+    -- ** DeleteSafetyRule
+    DeleteSafetyRule (DeleteSafetyRule'),
+    newDeleteSafetyRule,
+    DeleteSafetyRuleResponse (DeleteSafetyRuleResponse'),
+    newDeleteSafetyRuleResponse,
+
+    -- ** DescribeCluster
+    DescribeCluster (DescribeCluster'),
+    newDescribeCluster,
+    DescribeClusterResponse (DescribeClusterResponse'),
+    newDescribeClusterResponse,
+
+    -- ** DescribeControlPanel
+    DescribeControlPanel (DescribeControlPanel'),
+    newDescribeControlPanel,
+    DescribeControlPanelResponse (DescribeControlPanelResponse'),
+    newDescribeControlPanelResponse,
+
+    -- ** DescribeRoutingControl
+    DescribeRoutingControl (DescribeRoutingControl'),
+    newDescribeRoutingControl,
+    DescribeRoutingControlResponse (DescribeRoutingControlResponse'),
+    newDescribeRoutingControlResponse,
+
+    -- ** DescribeSafetyRule
+    DescribeSafetyRule (DescribeSafetyRule'),
+    newDescribeSafetyRule,
+    DescribeSafetyRuleResponse (DescribeSafetyRuleResponse'),
+    newDescribeSafetyRuleResponse,
+
+    -- ** ListAssociatedRoute53HealthChecks (Paginated)
+    ListAssociatedRoute53HealthChecks (ListAssociatedRoute53HealthChecks'),
+    newListAssociatedRoute53HealthChecks,
+    ListAssociatedRoute53HealthChecksResponse (ListAssociatedRoute53HealthChecksResponse'),
+    newListAssociatedRoute53HealthChecksResponse,
+
+    -- ** ListClusters (Paginated)
+    ListClusters (ListClusters'),
+    newListClusters,
+    ListClustersResponse (ListClustersResponse'),
+    newListClustersResponse,
+
+    -- ** ListControlPanels (Paginated)
+    ListControlPanels (ListControlPanels'),
+    newListControlPanels,
+    ListControlPanelsResponse (ListControlPanelsResponse'),
+    newListControlPanelsResponse,
+
+    -- ** ListRoutingControls (Paginated)
+    ListRoutingControls (ListRoutingControls'),
+    newListRoutingControls,
+    ListRoutingControlsResponse (ListRoutingControlsResponse'),
+    newListRoutingControlsResponse,
+
+    -- ** ListSafetyRules (Paginated)
+    ListSafetyRules (ListSafetyRules'),
+    newListSafetyRules,
+    ListSafetyRulesResponse (ListSafetyRulesResponse'),
+    newListSafetyRulesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateControlPanel
+    UpdateControlPanel (UpdateControlPanel'),
+    newUpdateControlPanel,
+    UpdateControlPanelResponse (UpdateControlPanelResponse'),
+    newUpdateControlPanelResponse,
+
+    -- ** UpdateRoutingControl
+    UpdateRoutingControl (UpdateRoutingControl'),
+    newUpdateRoutingControl,
+    UpdateRoutingControlResponse (UpdateRoutingControlResponse'),
+    newUpdateRoutingControlResponse,
+
+    -- ** UpdateSafetyRule
+    UpdateSafetyRule (UpdateSafetyRule'),
+    newUpdateSafetyRule,
+    UpdateSafetyRuleResponse (UpdateSafetyRuleResponse'),
+    newUpdateSafetyRuleResponse,
+
+    -- * Types
+
+    -- ** RuleType
+    RuleType (..),
+
+    -- ** Status
+    Status (..),
+
+    -- ** AssertionRule
+    AssertionRule (AssertionRule'),
+    newAssertionRule,
+
+    -- ** AssertionRuleUpdate
+    AssertionRuleUpdate (AssertionRuleUpdate'),
+    newAssertionRuleUpdate,
+
+    -- ** Cluster
+    Cluster (Cluster'),
+    newCluster,
+
+    -- ** ClusterEndpoint
+    ClusterEndpoint (ClusterEndpoint'),
+    newClusterEndpoint,
+
+    -- ** ControlPanel
+    ControlPanel (ControlPanel'),
+    newControlPanel,
+
+    -- ** GatingRule
+    GatingRule (GatingRule'),
+    newGatingRule,
+
+    -- ** GatingRuleUpdate
+    GatingRuleUpdate (GatingRuleUpdate'),
+    newGatingRuleUpdate,
+
+    -- ** NewAssertionRule
+    NewAssertionRule (NewAssertionRule'),
+    newNewAssertionRule,
+
+    -- ** NewGatingRule
+    NewGatingRule (NewGatingRule'),
+    newNewGatingRule,
+
+    -- ** RoutingControl
+    RoutingControl (RoutingControl'),
+    newRoutingControl,
+
+    -- ** Rule
+    Rule (Rule'),
+    newRule,
+
+    -- ** RuleConfig
+    RuleConfig (RuleConfig'),
+    newRuleConfig,
+  )
+where
+
+import Amazonka.Route53RecoveryControlConfig.CreateCluster
+import Amazonka.Route53RecoveryControlConfig.CreateControlPanel
+import Amazonka.Route53RecoveryControlConfig.CreateRoutingControl
+import Amazonka.Route53RecoveryControlConfig.CreateSafetyRule
+import Amazonka.Route53RecoveryControlConfig.DeleteCluster
+import Amazonka.Route53RecoveryControlConfig.DeleteControlPanel
+import Amazonka.Route53RecoveryControlConfig.DeleteRoutingControl
+import Amazonka.Route53RecoveryControlConfig.DeleteSafetyRule
+import Amazonka.Route53RecoveryControlConfig.DescribeCluster
+import Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+import Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl
+import Amazonka.Route53RecoveryControlConfig.DescribeSafetyRule
+import Amazonka.Route53RecoveryControlConfig.Lens
+import Amazonka.Route53RecoveryControlConfig.ListAssociatedRoute53HealthChecks
+import Amazonka.Route53RecoveryControlConfig.ListClusters
+import Amazonka.Route53RecoveryControlConfig.ListControlPanels
+import Amazonka.Route53RecoveryControlConfig.ListRoutingControls
+import Amazonka.Route53RecoveryControlConfig.ListSafetyRules
+import Amazonka.Route53RecoveryControlConfig.ListTagsForResource
+import Amazonka.Route53RecoveryControlConfig.TagResource
+import Amazonka.Route53RecoveryControlConfig.Types
+import Amazonka.Route53RecoveryControlConfig.UntagResource
+import Amazonka.Route53RecoveryControlConfig.UpdateControlPanel
+import Amazonka.Route53RecoveryControlConfig.UpdateRoutingControl
+import Amazonka.Route53RecoveryControlConfig.UpdateSafetyRule
+import Amazonka.Route53RecoveryControlConfig.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 'Route53RecoveryControlConfig'.
+
+-- $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/Route53RecoveryControlConfig/CreateCluster.hs b/gen/Amazonka/Route53RecoveryControlConfig/CreateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/CreateCluster.hs
@@ -0,0 +1,207 @@
+{-# 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.Route53RecoveryControlConfig.CreateCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Create a new cluster. A cluster is a set of redundant Regional endpoints
+-- against which you can run API calls to update or get the state of one or
+-- more routing controls. Each cluster has a name, status, Amazon Resource
+-- Name (ARN), and an array of the five cluster endpoints (one for each
+-- supported Amazon Web Services Region) that you can use with API calls to
+-- the cluster data plane.
+module Amazonka.Route53RecoveryControlConfig.CreateCluster
+  ( -- * Creating a Request
+    CreateCluster (..),
+    newCreateCluster,
+
+    -- * Request Lenses
+    createCluster_clientToken,
+    createCluster_tags,
+    createCluster_clusterName,
+
+    -- * Destructuring the Response
+    CreateClusterResponse (..),
+    newCreateClusterResponse,
+
+    -- * Response Lenses
+    createClusterResponse_cluster,
+    createClusterResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | Creates a cluster.
+--
+-- /See:/ 'newCreateCluster' smart constructor.
+data CreateCluster = CreateCluster'
+  { -- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+    -- idempotent API request with an action, specify a client token in the
+    -- request.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The tags associated with the cluster.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of the cluster.
+    clusterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCluster' 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:
+--
+-- 'clientToken', 'createCluster_clientToken' - A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+--
+-- 'tags', 'createCluster_tags' - The tags associated with the cluster.
+--
+-- 'clusterName', 'createCluster_clusterName' - The name of the cluster.
+newCreateCluster ::
+  -- | 'clusterName'
+  Prelude.Text ->
+  CreateCluster
+newCreateCluster pClusterName_ =
+  CreateCluster'
+    { clientToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      clusterName = pClusterName_
+    }
+
+-- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+createCluster_clientToken :: Lens.Lens' CreateCluster (Prelude.Maybe Prelude.Text)
+createCluster_clientToken = Lens.lens (\CreateCluster' {clientToken} -> clientToken) (\s@CreateCluster' {} a -> s {clientToken = a} :: CreateCluster)
+
+-- | The tags associated with the cluster.
+createCluster_tags :: Lens.Lens' CreateCluster (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createCluster_tags = Lens.lens (\CreateCluster' {tags} -> tags) (\s@CreateCluster' {} a -> s {tags = a} :: CreateCluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the cluster.
+createCluster_clusterName :: Lens.Lens' CreateCluster Prelude.Text
+createCluster_clusterName = Lens.lens (\CreateCluster' {clusterName} -> clusterName) (\s@CreateCluster' {} a -> s {clusterName = a} :: CreateCluster)
+
+instance Core.AWSRequest CreateCluster where
+  type
+    AWSResponse CreateCluster =
+      CreateClusterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateClusterResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateCluster where
+  hashWithSalt _salt CreateCluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clusterName
+
+instance Prelude.NFData CreateCluster where
+  rnf CreateCluster' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clusterName
+
+instance Data.ToHeaders CreateCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateCluster where
+  toJSON CreateCluster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("ClusterName" Data..= clusterName)
+          ]
+      )
+
+instance Data.ToPath CreateCluster where
+  toPath = Prelude.const "/cluster"
+
+instance Data.ToQuery CreateCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateClusterResponse' smart constructor.
+data CreateClusterResponse = CreateClusterResponse'
+  { -- | The cluster that was created.
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateClusterResponse' 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:
+--
+-- 'cluster', 'createClusterResponse_cluster' - The cluster that was created.
+--
+-- 'httpStatus', 'createClusterResponse_httpStatus' - The response's http status code.
+newCreateClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateClusterResponse
+newCreateClusterResponse pHttpStatus_ =
+  CreateClusterResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster that was created.
+createClusterResponse_cluster :: Lens.Lens' CreateClusterResponse (Prelude.Maybe Cluster)
+createClusterResponse_cluster = Lens.lens (\CreateClusterResponse' {cluster} -> cluster) (\s@CreateClusterResponse' {} a -> s {cluster = a} :: CreateClusterResponse)
+
+-- | The response's http status code.
+createClusterResponse_httpStatus :: Lens.Lens' CreateClusterResponse Prelude.Int
+createClusterResponse_httpStatus = Lens.lens (\CreateClusterResponse' {httpStatus} -> httpStatus) (\s@CreateClusterResponse' {} a -> s {httpStatus = a} :: CreateClusterResponse)
+
+instance Prelude.NFData CreateClusterResponse where
+  rnf CreateClusterResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/CreateControlPanel.hs b/gen/Amazonka/Route53RecoveryControlConfig/CreateControlPanel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/CreateControlPanel.hs
@@ -0,0 +1,224 @@
+{-# 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.Route53RecoveryControlConfig.CreateControlPanel
+-- 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 control panel. A control panel represents a group of
+-- routing controls that can be changed together in a single transaction.
+-- You can use a control panel to centrally view the operational status of
+-- applications across your organization, and trigger multi-app failovers
+-- in a single transaction, for example, to fail over an Availability Zone
+-- or Amazon Web Services Region.
+module Amazonka.Route53RecoveryControlConfig.CreateControlPanel
+  ( -- * Creating a Request
+    CreateControlPanel (..),
+    newCreateControlPanel,
+
+    -- * Request Lenses
+    createControlPanel_clientToken,
+    createControlPanel_tags,
+    createControlPanel_clusterArn,
+    createControlPanel_controlPanelName,
+
+    -- * Destructuring the Response
+    CreateControlPanelResponse (..),
+    newCreateControlPanelResponse,
+
+    -- * Response Lenses
+    createControlPanelResponse_controlPanel,
+    createControlPanelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | The details of the control panel that you\'re creating.
+--
+-- /See:/ 'newCreateControlPanel' smart constructor.
+data CreateControlPanel = CreateControlPanel'
+  { -- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+    -- idempotent API request with an action, specify a client token in the
+    -- request.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The tags associated with the control panel.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Name (ARN) of the cluster for the control panel.
+    clusterArn :: Prelude.Text,
+    -- | The name of the control panel.
+    controlPanelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateControlPanel' 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:
+--
+-- 'clientToken', 'createControlPanel_clientToken' - A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+--
+-- 'tags', 'createControlPanel_tags' - The tags associated with the control panel.
+--
+-- 'clusterArn', 'createControlPanel_clusterArn' - The Amazon Resource Name (ARN) of the cluster for the control panel.
+--
+-- 'controlPanelName', 'createControlPanel_controlPanelName' - The name of the control panel.
+newCreateControlPanel ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'controlPanelName'
+  Prelude.Text ->
+  CreateControlPanel
+newCreateControlPanel pClusterArn_ pControlPanelName_ =
+  CreateControlPanel'
+    { clientToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      clusterArn = pClusterArn_,
+      controlPanelName = pControlPanelName_
+    }
+
+-- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+createControlPanel_clientToken :: Lens.Lens' CreateControlPanel (Prelude.Maybe Prelude.Text)
+createControlPanel_clientToken = Lens.lens (\CreateControlPanel' {clientToken} -> clientToken) (\s@CreateControlPanel' {} a -> s {clientToken = a} :: CreateControlPanel)
+
+-- | The tags associated with the control panel.
+createControlPanel_tags :: Lens.Lens' CreateControlPanel (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createControlPanel_tags = Lens.lens (\CreateControlPanel' {tags} -> tags) (\s@CreateControlPanel' {} a -> s {tags = a} :: CreateControlPanel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the cluster for the control panel.
+createControlPanel_clusterArn :: Lens.Lens' CreateControlPanel Prelude.Text
+createControlPanel_clusterArn = Lens.lens (\CreateControlPanel' {clusterArn} -> clusterArn) (\s@CreateControlPanel' {} a -> s {clusterArn = a} :: CreateControlPanel)
+
+-- | The name of the control panel.
+createControlPanel_controlPanelName :: Lens.Lens' CreateControlPanel Prelude.Text
+createControlPanel_controlPanelName = Lens.lens (\CreateControlPanel' {controlPanelName} -> controlPanelName) (\s@CreateControlPanel' {} a -> s {controlPanelName = a} :: CreateControlPanel)
+
+instance Core.AWSRequest CreateControlPanel where
+  type
+    AWSResponse CreateControlPanel =
+      CreateControlPanelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateControlPanelResponse'
+            Prelude.<$> (x Data..?> "ControlPanel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateControlPanel where
+  hashWithSalt _salt CreateControlPanel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` controlPanelName
+
+instance Prelude.NFData CreateControlPanel where
+  rnf CreateControlPanel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf controlPanelName
+
+instance Data.ToHeaders CreateControlPanel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateControlPanel where
+  toJSON CreateControlPanel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("ClusterArn" Data..= clusterArn),
+            Prelude.Just
+              ("ControlPanelName" Data..= controlPanelName)
+          ]
+      )
+
+instance Data.ToPath CreateControlPanel where
+  toPath = Prelude.const "/controlpanel"
+
+instance Data.ToQuery CreateControlPanel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateControlPanelResponse' smart constructor.
+data CreateControlPanelResponse = CreateControlPanelResponse'
+  { -- | Information about a control panel.
+    controlPanel :: Prelude.Maybe ControlPanel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateControlPanelResponse' 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:
+--
+-- 'controlPanel', 'createControlPanelResponse_controlPanel' - Information about a control panel.
+--
+-- 'httpStatus', 'createControlPanelResponse_httpStatus' - The response's http status code.
+newCreateControlPanelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateControlPanelResponse
+newCreateControlPanelResponse pHttpStatus_ =
+  CreateControlPanelResponse'
+    { controlPanel =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about a control panel.
+createControlPanelResponse_controlPanel :: Lens.Lens' CreateControlPanelResponse (Prelude.Maybe ControlPanel)
+createControlPanelResponse_controlPanel = Lens.lens (\CreateControlPanelResponse' {controlPanel} -> controlPanel) (\s@CreateControlPanelResponse' {} a -> s {controlPanel = a} :: CreateControlPanelResponse)
+
+-- | The response's http status code.
+createControlPanelResponse_httpStatus :: Lens.Lens' CreateControlPanelResponse Prelude.Int
+createControlPanelResponse_httpStatus = Lens.lens (\CreateControlPanelResponse' {httpStatus} -> httpStatus) (\s@CreateControlPanelResponse' {} a -> s {httpStatus = a} :: CreateControlPanelResponse)
+
+instance Prelude.NFData CreateControlPanelResponse where
+  rnf CreateControlPanelResponse' {..} =
+    Prelude.rnf controlPanel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/CreateRoutingControl.hs b/gen/Amazonka/Route53RecoveryControlConfig/CreateRoutingControl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/CreateRoutingControl.hs
@@ -0,0 +1,237 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.CreateRoutingControl
+-- 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 routing control.
+--
+-- A routing control has one of two states: ON and OFF. You can map the
+-- routing control state to the state of an Amazon Route 53 health check,
+-- which can be used to control traffic routing.
+--
+-- To get or update the routing control state, see the Recovery Cluster
+-- (data plane) API actions for Amazon Route 53 Application Recovery
+-- Controller.
+module Amazonka.Route53RecoveryControlConfig.CreateRoutingControl
+  ( -- * Creating a Request
+    CreateRoutingControl (..),
+    newCreateRoutingControl,
+
+    -- * Request Lenses
+    createRoutingControl_clientToken,
+    createRoutingControl_controlPanelArn,
+    createRoutingControl_clusterArn,
+    createRoutingControl_routingControlName,
+
+    -- * Destructuring the Response
+    CreateRoutingControlResponse (..),
+    newCreateRoutingControlResponse,
+
+    -- * Response Lenses
+    createRoutingControlResponse_routingControl,
+    createRoutingControlResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | The details of the routing control that you\'re creating.
+--
+-- /See:/ 'newCreateRoutingControl' smart constructor.
+data CreateRoutingControl = CreateRoutingControl'
+  { -- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+    -- idempotent API request with an action, specify a client token in the
+    -- request.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the control panel that includes the
+    -- routing control.
+    controlPanelArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the cluster that includes the routing
+    -- control.
+    clusterArn :: Prelude.Text,
+    -- | The name of the routing control.
+    routingControlName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRoutingControl' 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:
+--
+-- 'clientToken', 'createRoutingControl_clientToken' - A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+--
+-- 'controlPanelArn', 'createRoutingControl_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel that includes the
+-- routing control.
+--
+-- 'clusterArn', 'createRoutingControl_clusterArn' - The Amazon Resource Name (ARN) of the cluster that includes the routing
+-- control.
+--
+-- 'routingControlName', 'createRoutingControl_routingControlName' - The name of the routing control.
+newCreateRoutingControl ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  -- | 'routingControlName'
+  Prelude.Text ->
+  CreateRoutingControl
+newCreateRoutingControl
+  pClusterArn_
+  pRoutingControlName_ =
+    CreateRoutingControl'
+      { clientToken =
+          Prelude.Nothing,
+        controlPanelArn = Prelude.Nothing,
+        clusterArn = pClusterArn_,
+        routingControlName = pRoutingControlName_
+      }
+
+-- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+createRoutingControl_clientToken :: Lens.Lens' CreateRoutingControl (Prelude.Maybe Prelude.Text)
+createRoutingControl_clientToken = Lens.lens (\CreateRoutingControl' {clientToken} -> clientToken) (\s@CreateRoutingControl' {} a -> s {clientToken = a} :: CreateRoutingControl)
+
+-- | The Amazon Resource Name (ARN) of the control panel that includes the
+-- routing control.
+createRoutingControl_controlPanelArn :: Lens.Lens' CreateRoutingControl (Prelude.Maybe Prelude.Text)
+createRoutingControl_controlPanelArn = Lens.lens (\CreateRoutingControl' {controlPanelArn} -> controlPanelArn) (\s@CreateRoutingControl' {} a -> s {controlPanelArn = a} :: CreateRoutingControl)
+
+-- | The Amazon Resource Name (ARN) of the cluster that includes the routing
+-- control.
+createRoutingControl_clusterArn :: Lens.Lens' CreateRoutingControl Prelude.Text
+createRoutingControl_clusterArn = Lens.lens (\CreateRoutingControl' {clusterArn} -> clusterArn) (\s@CreateRoutingControl' {} a -> s {clusterArn = a} :: CreateRoutingControl)
+
+-- | The name of the routing control.
+createRoutingControl_routingControlName :: Lens.Lens' CreateRoutingControl Prelude.Text
+createRoutingControl_routingControlName = Lens.lens (\CreateRoutingControl' {routingControlName} -> routingControlName) (\s@CreateRoutingControl' {} a -> s {routingControlName = a} :: CreateRoutingControl)
+
+instance Core.AWSRequest CreateRoutingControl where
+  type
+    AWSResponse CreateRoutingControl =
+      CreateRoutingControlResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRoutingControlResponse'
+            Prelude.<$> (x Data..?> "RoutingControl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateRoutingControl where
+  hashWithSalt _salt CreateRoutingControl' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` routingControlName
+
+instance Prelude.NFData CreateRoutingControl where
+  rnf CreateRoutingControl' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf routingControlName
+
+instance Data.ToHeaders CreateRoutingControl where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRoutingControl where
+  toJSON CreateRoutingControl' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("ControlPanelArn" Data..=)
+              Prelude.<$> controlPanelArn,
+            Prelude.Just ("ClusterArn" Data..= clusterArn),
+            Prelude.Just
+              ("RoutingControlName" Data..= routingControlName)
+          ]
+      )
+
+instance Data.ToPath CreateRoutingControl where
+  toPath = Prelude.const "/routingcontrol"
+
+instance Data.ToQuery CreateRoutingControl where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateRoutingControlResponse' smart constructor.
+data CreateRoutingControlResponse = CreateRoutingControlResponse'
+  { -- | The routing control that is created.
+    routingControl :: Prelude.Maybe RoutingControl,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRoutingControlResponse' 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:
+--
+-- 'routingControl', 'createRoutingControlResponse_routingControl' - The routing control that is created.
+--
+-- 'httpStatus', 'createRoutingControlResponse_httpStatus' - The response's http status code.
+newCreateRoutingControlResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateRoutingControlResponse
+newCreateRoutingControlResponse pHttpStatus_ =
+  CreateRoutingControlResponse'
+    { routingControl =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The routing control that is created.
+createRoutingControlResponse_routingControl :: Lens.Lens' CreateRoutingControlResponse (Prelude.Maybe RoutingControl)
+createRoutingControlResponse_routingControl = Lens.lens (\CreateRoutingControlResponse' {routingControl} -> routingControl) (\s@CreateRoutingControlResponse' {} a -> s {routingControl = a} :: CreateRoutingControlResponse)
+
+-- | The response's http status code.
+createRoutingControlResponse_httpStatus :: Lens.Lens' CreateRoutingControlResponse Prelude.Int
+createRoutingControlResponse_httpStatus = Lens.lens (\CreateRoutingControlResponse' {httpStatus} -> httpStatus) (\s@CreateRoutingControlResponse' {} a -> s {httpStatus = a} :: CreateRoutingControlResponse)
+
+instance Prelude.NFData CreateRoutingControlResponse where
+  rnf CreateRoutingControlResponse' {..} =
+    Prelude.rnf routingControl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/CreateSafetyRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/CreateSafetyRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/CreateSafetyRule.hs
@@ -0,0 +1,245 @@
+{-# 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.Route53RecoveryControlConfig.CreateSafetyRule
+-- 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 safety rule in a control panel. Safety rules let you add
+-- safeguards around changing routing control states, and for enabling and
+-- disabling routing controls, to help prevent unexpected outcomes.
+--
+-- There are two types of safety rules: assertion rules and gating rules.
+--
+-- Assertion rule: An assertion rule enforces that, when you change a
+-- routing control state, that a certain criteria is met. For example, the
+-- criteria might be that at least one routing control state is On after
+-- the transaction so that traffic continues to flow to at least one cell
+-- for the application. This ensures that you avoid a fail-open scenario.
+--
+-- Gating rule: A gating rule lets you configure a gating routing control
+-- as an overall \"on\/off\" switch for a group of routing controls. Or,
+-- you can configure more complex gating scenarios, for example by
+-- configuring multiple gating routing controls.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.safety-rules.html Safety rules>
+-- in the Amazon Route 53 Application Recovery Controller Developer Guide.
+module Amazonka.Route53RecoveryControlConfig.CreateSafetyRule
+  ( -- * Creating a Request
+    CreateSafetyRule (..),
+    newCreateSafetyRule,
+
+    -- * Request Lenses
+    createSafetyRule_assertionRule,
+    createSafetyRule_clientToken,
+    createSafetyRule_gatingRule,
+    createSafetyRule_tags,
+
+    -- * Destructuring the Response
+    CreateSafetyRuleResponse (..),
+    newCreateSafetyRuleResponse,
+
+    -- * Response Lenses
+    createSafetyRuleResponse_assertionRule,
+    createSafetyRuleResponse_gatingRule,
+    createSafetyRuleResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | The request body that you include when you create a safety rule.
+--
+-- /See:/ 'newCreateSafetyRule' smart constructor.
+data CreateSafetyRule = CreateSafetyRule'
+  { -- | The assertion rule requested.
+    assertionRule :: Prelude.Maybe NewAssertionRule,
+    -- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+    -- idempotent API request with an action, specify a client token in the
+    -- request.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The gating rule requested.
+    gatingRule :: Prelude.Maybe NewGatingRule,
+    -- | The tags associated with the safety rule.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSafetyRule' 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:
+--
+-- 'assertionRule', 'createSafetyRule_assertionRule' - The assertion rule requested.
+--
+-- 'clientToken', 'createSafetyRule_clientToken' - A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+--
+-- 'gatingRule', 'createSafetyRule_gatingRule' - The gating rule requested.
+--
+-- 'tags', 'createSafetyRule_tags' - The tags associated with the safety rule.
+newCreateSafetyRule ::
+  CreateSafetyRule
+newCreateSafetyRule =
+  CreateSafetyRule'
+    { assertionRule = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      gatingRule = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The assertion rule requested.
+createSafetyRule_assertionRule :: Lens.Lens' CreateSafetyRule (Prelude.Maybe NewAssertionRule)
+createSafetyRule_assertionRule = Lens.lens (\CreateSafetyRule' {assertionRule} -> assertionRule) (\s@CreateSafetyRule' {} a -> s {assertionRule = a} :: CreateSafetyRule)
+
+-- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
+-- idempotent API request with an action, specify a client token in the
+-- request.
+createSafetyRule_clientToken :: Lens.Lens' CreateSafetyRule (Prelude.Maybe Prelude.Text)
+createSafetyRule_clientToken = Lens.lens (\CreateSafetyRule' {clientToken} -> clientToken) (\s@CreateSafetyRule' {} a -> s {clientToken = a} :: CreateSafetyRule)
+
+-- | The gating rule requested.
+createSafetyRule_gatingRule :: Lens.Lens' CreateSafetyRule (Prelude.Maybe NewGatingRule)
+createSafetyRule_gatingRule = Lens.lens (\CreateSafetyRule' {gatingRule} -> gatingRule) (\s@CreateSafetyRule' {} a -> s {gatingRule = a} :: CreateSafetyRule)
+
+-- | The tags associated with the safety rule.
+createSafetyRule_tags :: Lens.Lens' CreateSafetyRule (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createSafetyRule_tags = Lens.lens (\CreateSafetyRule' {tags} -> tags) (\s@CreateSafetyRule' {} a -> s {tags = a} :: CreateSafetyRule) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSRequest CreateSafetyRule where
+  type
+    AWSResponse CreateSafetyRule =
+      CreateSafetyRuleResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSafetyRuleResponse'
+            Prelude.<$> (x Data..?> "AssertionRule")
+            Prelude.<*> (x Data..?> "GatingRule")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSafetyRule where
+  hashWithSalt _salt CreateSafetyRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` assertionRule
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` gatingRule
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData CreateSafetyRule where
+  rnf CreateSafetyRule' {..} =
+    Prelude.rnf assertionRule
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf gatingRule
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders CreateSafetyRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSafetyRule where
+  toJSON CreateSafetyRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AssertionRule" Data..=) Prelude.<$> assertionRule,
+            ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("GatingRule" Data..=) Prelude.<$> gatingRule,
+            ("Tags" Data..=) Prelude.<$> tags
+          ]
+      )
+
+instance Data.ToPath CreateSafetyRule where
+  toPath = Prelude.const "/safetyrule"
+
+instance Data.ToQuery CreateSafetyRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSafetyRuleResponse' smart constructor.
+data CreateSafetyRuleResponse = CreateSafetyRuleResponse'
+  { -- | The assertion rule created.
+    assertionRule :: Prelude.Maybe AssertionRule,
+    -- | The gating rule created.
+    gatingRule :: Prelude.Maybe GatingRule,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSafetyRuleResponse' 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:
+--
+-- 'assertionRule', 'createSafetyRuleResponse_assertionRule' - The assertion rule created.
+--
+-- 'gatingRule', 'createSafetyRuleResponse_gatingRule' - The gating rule created.
+--
+-- 'httpStatus', 'createSafetyRuleResponse_httpStatus' - The response's http status code.
+newCreateSafetyRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSafetyRuleResponse
+newCreateSafetyRuleResponse pHttpStatus_ =
+  CreateSafetyRuleResponse'
+    { assertionRule =
+        Prelude.Nothing,
+      gatingRule = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The assertion rule created.
+createSafetyRuleResponse_assertionRule :: Lens.Lens' CreateSafetyRuleResponse (Prelude.Maybe AssertionRule)
+createSafetyRuleResponse_assertionRule = Lens.lens (\CreateSafetyRuleResponse' {assertionRule} -> assertionRule) (\s@CreateSafetyRuleResponse' {} a -> s {assertionRule = a} :: CreateSafetyRuleResponse)
+
+-- | The gating rule created.
+createSafetyRuleResponse_gatingRule :: Lens.Lens' CreateSafetyRuleResponse (Prelude.Maybe GatingRule)
+createSafetyRuleResponse_gatingRule = Lens.lens (\CreateSafetyRuleResponse' {gatingRule} -> gatingRule) (\s@CreateSafetyRuleResponse' {} a -> s {gatingRule = a} :: CreateSafetyRuleResponse)
+
+-- | The response's http status code.
+createSafetyRuleResponse_httpStatus :: Lens.Lens' CreateSafetyRuleResponse Prelude.Int
+createSafetyRuleResponse_httpStatus = Lens.lens (\CreateSafetyRuleResponse' {httpStatus} -> httpStatus) (\s@CreateSafetyRuleResponse' {} a -> s {httpStatus = a} :: CreateSafetyRuleResponse)
+
+instance Prelude.NFData CreateSafetyRuleResponse where
+  rnf CreateSafetyRuleResponse' {..} =
+    Prelude.rnf assertionRule
+      `Prelude.seq` Prelude.rnf gatingRule
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DeleteCluster.hs b/gen/Amazonka/Route53RecoveryControlConfig/DeleteCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DeleteCluster.hs
@@ -0,0 +1,143 @@
+{-# 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.Route53RecoveryControlConfig.DeleteCluster
+-- 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 cluster.
+module Amazonka.Route53RecoveryControlConfig.DeleteCluster
+  ( -- * Creating a Request
+    DeleteCluster (..),
+    newDeleteCluster,
+
+    -- * Request Lenses
+    deleteCluster_clusterArn,
+
+    -- * Destructuring the Response
+    DeleteClusterResponse (..),
+    newDeleteClusterResponse,
+
+    -- * Response Lenses
+    deleteClusterResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDeleteCluster' smart constructor.
+data DeleteCluster = DeleteCluster'
+  { -- | The Amazon Resource Name (ARN) of the cluster that you\'re deleting.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCluster' 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:
+--
+-- 'clusterArn', 'deleteCluster_clusterArn' - The Amazon Resource Name (ARN) of the cluster that you\'re deleting.
+newDeleteCluster ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  DeleteCluster
+newDeleteCluster pClusterArn_ =
+  DeleteCluster' {clusterArn = pClusterArn_}
+
+-- | The Amazon Resource Name (ARN) of the cluster that you\'re deleting.
+deleteCluster_clusterArn :: Lens.Lens' DeleteCluster Prelude.Text
+deleteCluster_clusterArn = Lens.lens (\DeleteCluster' {clusterArn} -> clusterArn) (\s@DeleteCluster' {} a -> s {clusterArn = a} :: DeleteCluster)
+
+instance Core.AWSRequest DeleteCluster where
+  type
+    AWSResponse DeleteCluster =
+      DeleteClusterResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteClusterResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteCluster where
+  hashWithSalt _salt DeleteCluster' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData DeleteCluster where
+  rnf DeleteCluster' {..} = Prelude.rnf clusterArn
+
+instance Data.ToHeaders DeleteCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteCluster where
+  toPath DeleteCluster' {..} =
+    Prelude.mconcat ["/cluster/", Data.toBS clusterArn]
+
+instance Data.ToQuery DeleteCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteClusterResponse' smart constructor.
+data DeleteClusterResponse = DeleteClusterResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteClusterResponse' 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', 'deleteClusterResponse_httpStatus' - The response's http status code.
+newDeleteClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteClusterResponse
+newDeleteClusterResponse pHttpStatus_ =
+  DeleteClusterResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteClusterResponse_httpStatus :: Lens.Lens' DeleteClusterResponse Prelude.Int
+deleteClusterResponse_httpStatus = Lens.lens (\DeleteClusterResponse' {httpStatus} -> httpStatus) (\s@DeleteClusterResponse' {} a -> s {httpStatus = a} :: DeleteClusterResponse)
+
+instance Prelude.NFData DeleteClusterResponse where
+  rnf DeleteClusterResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DeleteControlPanel.hs b/gen/Amazonka/Route53RecoveryControlConfig/DeleteControlPanel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DeleteControlPanel.hs
@@ -0,0 +1,151 @@
+{-# 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.Route53RecoveryControlConfig.DeleteControlPanel
+-- 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 control panel.
+module Amazonka.Route53RecoveryControlConfig.DeleteControlPanel
+  ( -- * Creating a Request
+    DeleteControlPanel (..),
+    newDeleteControlPanel,
+
+    -- * Request Lenses
+    deleteControlPanel_controlPanelArn,
+
+    -- * Destructuring the Response
+    DeleteControlPanelResponse (..),
+    newDeleteControlPanelResponse,
+
+    -- * Response Lenses
+    deleteControlPanelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDeleteControlPanel' smart constructor.
+data DeleteControlPanel = DeleteControlPanel'
+  { -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteControlPanel' 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:
+--
+-- 'controlPanelArn', 'deleteControlPanel_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+newDeleteControlPanel ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  DeleteControlPanel
+newDeleteControlPanel pControlPanelArn_ =
+  DeleteControlPanel'
+    { controlPanelArn =
+        pControlPanelArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+deleteControlPanel_controlPanelArn :: Lens.Lens' DeleteControlPanel Prelude.Text
+deleteControlPanel_controlPanelArn = Lens.lens (\DeleteControlPanel' {controlPanelArn} -> controlPanelArn) (\s@DeleteControlPanel' {} a -> s {controlPanelArn = a} :: DeleteControlPanel)
+
+instance Core.AWSRequest DeleteControlPanel where
+  type
+    AWSResponse DeleteControlPanel =
+      DeleteControlPanelResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteControlPanelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteControlPanel where
+  hashWithSalt _salt DeleteControlPanel' {..} =
+    _salt `Prelude.hashWithSalt` controlPanelArn
+
+instance Prelude.NFData DeleteControlPanel where
+  rnf DeleteControlPanel' {..} =
+    Prelude.rnf controlPanelArn
+
+instance Data.ToHeaders DeleteControlPanel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteControlPanel where
+  toPath DeleteControlPanel' {..} =
+    Prelude.mconcat
+      ["/controlpanel/", Data.toBS controlPanelArn]
+
+instance Data.ToQuery DeleteControlPanel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteControlPanelResponse' smart constructor.
+data DeleteControlPanelResponse = DeleteControlPanelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteControlPanelResponse' 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', 'deleteControlPanelResponse_httpStatus' - The response's http status code.
+newDeleteControlPanelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteControlPanelResponse
+newDeleteControlPanelResponse pHttpStatus_ =
+  DeleteControlPanelResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteControlPanelResponse_httpStatus :: Lens.Lens' DeleteControlPanelResponse Prelude.Int
+deleteControlPanelResponse_httpStatus = Lens.lens (\DeleteControlPanelResponse' {httpStatus} -> httpStatus) (\s@DeleteControlPanelResponse' {} a -> s {httpStatus = a} :: DeleteControlPanelResponse)
+
+instance Prelude.NFData DeleteControlPanelResponse where
+  rnf DeleteControlPanelResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DeleteRoutingControl.hs b/gen/Amazonka/Route53RecoveryControlConfig/DeleteRoutingControl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DeleteRoutingControl.hs
@@ -0,0 +1,154 @@
+{-# 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.Route53RecoveryControlConfig.DeleteRoutingControl
+-- 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 routing control.
+module Amazonka.Route53RecoveryControlConfig.DeleteRoutingControl
+  ( -- * Creating a Request
+    DeleteRoutingControl (..),
+    newDeleteRoutingControl,
+
+    -- * Request Lenses
+    deleteRoutingControl_routingControlArn,
+
+    -- * Destructuring the Response
+    DeleteRoutingControlResponse (..),
+    newDeleteRoutingControlResponse,
+
+    -- * Response Lenses
+    deleteRoutingControlResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDeleteRoutingControl' smart constructor.
+data DeleteRoutingControl = DeleteRoutingControl'
+  { -- | The Amazon Resource Name (ARN) of the routing control that you\'re
+    -- deleting.
+    routingControlArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRoutingControl' 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:
+--
+-- 'routingControlArn', 'deleteRoutingControl_routingControlArn' - The Amazon Resource Name (ARN) of the routing control that you\'re
+-- deleting.
+newDeleteRoutingControl ::
+  -- | 'routingControlArn'
+  Prelude.Text ->
+  DeleteRoutingControl
+newDeleteRoutingControl pRoutingControlArn_ =
+  DeleteRoutingControl'
+    { routingControlArn =
+        pRoutingControlArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the routing control that you\'re
+-- deleting.
+deleteRoutingControl_routingControlArn :: Lens.Lens' DeleteRoutingControl Prelude.Text
+deleteRoutingControl_routingControlArn = Lens.lens (\DeleteRoutingControl' {routingControlArn} -> routingControlArn) (\s@DeleteRoutingControl' {} a -> s {routingControlArn = a} :: DeleteRoutingControl)
+
+instance Core.AWSRequest DeleteRoutingControl where
+  type
+    AWSResponse DeleteRoutingControl =
+      DeleteRoutingControlResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteRoutingControlResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRoutingControl where
+  hashWithSalt _salt DeleteRoutingControl' {..} =
+    _salt `Prelude.hashWithSalt` routingControlArn
+
+instance Prelude.NFData DeleteRoutingControl where
+  rnf DeleteRoutingControl' {..} =
+    Prelude.rnf routingControlArn
+
+instance Data.ToHeaders DeleteRoutingControl where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteRoutingControl where
+  toPath DeleteRoutingControl' {..} =
+    Prelude.mconcat
+      ["/routingcontrol/", Data.toBS routingControlArn]
+
+instance Data.ToQuery DeleteRoutingControl where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRoutingControlResponse' smart constructor.
+data DeleteRoutingControlResponse = DeleteRoutingControlResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRoutingControlResponse' 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', 'deleteRoutingControlResponse_httpStatus' - The response's http status code.
+newDeleteRoutingControlResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRoutingControlResponse
+newDeleteRoutingControlResponse pHttpStatus_ =
+  DeleteRoutingControlResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteRoutingControlResponse_httpStatus :: Lens.Lens' DeleteRoutingControlResponse Prelude.Int
+deleteRoutingControlResponse_httpStatus = Lens.lens (\DeleteRoutingControlResponse' {httpStatus} -> httpStatus) (\s@DeleteRoutingControlResponse' {} a -> s {httpStatus = a} :: DeleteRoutingControlResponse)
+
+instance Prelude.NFData DeleteRoutingControlResponse where
+  rnf DeleteRoutingControlResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DeleteSafetyRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/DeleteSafetyRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DeleteSafetyRule.hs
@@ -0,0 +1,149 @@
+{-# 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.Route53RecoveryControlConfig.DeleteSafetyRule
+-- 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 safety rule.
+--
+-- \/>
+module Amazonka.Route53RecoveryControlConfig.DeleteSafetyRule
+  ( -- * Creating a Request
+    DeleteSafetyRule (..),
+    newDeleteSafetyRule,
+
+    -- * Request Lenses
+    deleteSafetyRule_safetyRuleArn,
+
+    -- * Destructuring the Response
+    DeleteSafetyRuleResponse (..),
+    newDeleteSafetyRuleResponse,
+
+    -- * Response Lenses
+    deleteSafetyRuleResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDeleteSafetyRule' smart constructor.
+data DeleteSafetyRule = DeleteSafetyRule'
+  { -- | The ARN of the safety rule.
+    safetyRuleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSafetyRule' 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:
+--
+-- 'safetyRuleArn', 'deleteSafetyRule_safetyRuleArn' - The ARN of the safety rule.
+newDeleteSafetyRule ::
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  DeleteSafetyRule
+newDeleteSafetyRule pSafetyRuleArn_ =
+  DeleteSafetyRule' {safetyRuleArn = pSafetyRuleArn_}
+
+-- | The ARN of the safety rule.
+deleteSafetyRule_safetyRuleArn :: Lens.Lens' DeleteSafetyRule Prelude.Text
+deleteSafetyRule_safetyRuleArn = Lens.lens (\DeleteSafetyRule' {safetyRuleArn} -> safetyRuleArn) (\s@DeleteSafetyRule' {} a -> s {safetyRuleArn = a} :: DeleteSafetyRule)
+
+instance Core.AWSRequest DeleteSafetyRule where
+  type
+    AWSResponse DeleteSafetyRule =
+      DeleteSafetyRuleResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteSafetyRuleResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteSafetyRule where
+  hashWithSalt _salt DeleteSafetyRule' {..} =
+    _salt `Prelude.hashWithSalt` safetyRuleArn
+
+instance Prelude.NFData DeleteSafetyRule where
+  rnf DeleteSafetyRule' {..} = Prelude.rnf safetyRuleArn
+
+instance Data.ToHeaders DeleteSafetyRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteSafetyRule where
+  toPath DeleteSafetyRule' {..} =
+    Prelude.mconcat
+      ["/safetyrule/", Data.toBS safetyRuleArn]
+
+instance Data.ToQuery DeleteSafetyRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSafetyRuleResponse' smart constructor.
+data DeleteSafetyRuleResponse = DeleteSafetyRuleResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSafetyRuleResponse' 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', 'deleteSafetyRuleResponse_httpStatus' - The response's http status code.
+newDeleteSafetyRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteSafetyRuleResponse
+newDeleteSafetyRuleResponse pHttpStatus_ =
+  DeleteSafetyRuleResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteSafetyRuleResponse_httpStatus :: Lens.Lens' DeleteSafetyRuleResponse Prelude.Int
+deleteSafetyRuleResponse_httpStatus = Lens.lens (\DeleteSafetyRuleResponse' {httpStatus} -> httpStatus) (\s@DeleteSafetyRuleResponse' {} a -> s {httpStatus = a} :: DeleteSafetyRuleResponse)
+
+instance Prelude.NFData DeleteSafetyRuleResponse where
+  rnf DeleteSafetyRuleResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DescribeCluster.hs b/gen/Amazonka/Route53RecoveryControlConfig/DescribeCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DescribeCluster.hs
@@ -0,0 +1,158 @@
+{-# 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.Route53RecoveryControlConfig.DescribeCluster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Display the details about a cluster. The response includes the cluster
+-- name, endpoints, status, and Amazon Resource Name (ARN).
+module Amazonka.Route53RecoveryControlConfig.DescribeCluster
+  ( -- * Creating a Request
+    DescribeCluster (..),
+    newDescribeCluster,
+
+    -- * Request Lenses
+    describeCluster_clusterArn,
+
+    -- * Destructuring the Response
+    DescribeClusterResponse (..),
+    newDescribeClusterResponse,
+
+    -- * Response Lenses
+    describeClusterResponse_cluster,
+    describeClusterResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDescribeCluster' smart constructor.
+data DescribeCluster = DescribeCluster'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeCluster' 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:
+--
+-- 'clusterArn', 'describeCluster_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+newDescribeCluster ::
+  -- | 'clusterArn'
+  Prelude.Text ->
+  DescribeCluster
+newDescribeCluster pClusterArn_ =
+  DescribeCluster' {clusterArn = pClusterArn_}
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+describeCluster_clusterArn :: Lens.Lens' DescribeCluster Prelude.Text
+describeCluster_clusterArn = Lens.lens (\DescribeCluster' {clusterArn} -> clusterArn) (\s@DescribeCluster' {} a -> s {clusterArn = a} :: DescribeCluster)
+
+instance Core.AWSRequest DescribeCluster where
+  type
+    AWSResponse DescribeCluster =
+      DescribeClusterResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeClusterResponse'
+            Prelude.<$> (x Data..?> "Cluster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeCluster where
+  hashWithSalt _salt DescribeCluster' {..} =
+    _salt `Prelude.hashWithSalt` clusterArn
+
+instance Prelude.NFData DescribeCluster where
+  rnf DescribeCluster' {..} = Prelude.rnf clusterArn
+
+instance Data.ToHeaders DescribeCluster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeCluster where
+  toPath DescribeCluster' {..} =
+    Prelude.mconcat ["/cluster/", Data.toBS clusterArn]
+
+instance Data.ToQuery DescribeCluster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeClusterResponse' smart constructor.
+data DescribeClusterResponse = DescribeClusterResponse'
+  { -- | The cluster for the DescribeCluster request.
+    cluster :: Prelude.Maybe Cluster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeClusterResponse' 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:
+--
+-- 'cluster', 'describeClusterResponse_cluster' - The cluster for the DescribeCluster request.
+--
+-- 'httpStatus', 'describeClusterResponse_httpStatus' - The response's http status code.
+newDescribeClusterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeClusterResponse
+newDescribeClusterResponse pHttpStatus_ =
+  DescribeClusterResponse'
+    { cluster = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The cluster for the DescribeCluster request.
+describeClusterResponse_cluster :: Lens.Lens' DescribeClusterResponse (Prelude.Maybe Cluster)
+describeClusterResponse_cluster = Lens.lens (\DescribeClusterResponse' {cluster} -> cluster) (\s@DescribeClusterResponse' {} a -> s {cluster = a} :: DescribeClusterResponse)
+
+-- | The response's http status code.
+describeClusterResponse_httpStatus :: Lens.Lens' DescribeClusterResponse Prelude.Int
+describeClusterResponse_httpStatus = Lens.lens (\DescribeClusterResponse' {httpStatus} -> httpStatus) (\s@DescribeClusterResponse' {} a -> s {httpStatus = a} :: DescribeClusterResponse)
+
+instance Prelude.NFData DescribeClusterResponse where
+  rnf DescribeClusterResponse' {..} =
+    Prelude.rnf cluster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DescribeControlPanel.hs b/gen/Amazonka/Route53RecoveryControlConfig/DescribeControlPanel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DescribeControlPanel.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays details about a control panel.
+module Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+  ( -- * Creating a Request
+    DescribeControlPanel (..),
+    newDescribeControlPanel,
+
+    -- * Request Lenses
+    describeControlPanel_controlPanelArn,
+
+    -- * Destructuring the Response
+    DescribeControlPanelResponse (..),
+    newDescribeControlPanelResponse,
+
+    -- * Response Lenses
+    describeControlPanelResponse_controlPanel,
+    describeControlPanelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDescribeControlPanel' smart constructor.
+data DescribeControlPanel = DescribeControlPanel'
+  { -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeControlPanel' 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:
+--
+-- 'controlPanelArn', 'describeControlPanel_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+newDescribeControlPanel ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  DescribeControlPanel
+newDescribeControlPanel pControlPanelArn_ =
+  DescribeControlPanel'
+    { controlPanelArn =
+        pControlPanelArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+describeControlPanel_controlPanelArn :: Lens.Lens' DescribeControlPanel Prelude.Text
+describeControlPanel_controlPanelArn = Lens.lens (\DescribeControlPanel' {controlPanelArn} -> controlPanelArn) (\s@DescribeControlPanel' {} a -> s {controlPanelArn = a} :: DescribeControlPanel)
+
+instance Core.AWSRequest DescribeControlPanel where
+  type
+    AWSResponse DescribeControlPanel =
+      DescribeControlPanelResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeControlPanelResponse'
+            Prelude.<$> (x Data..?> "ControlPanel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeControlPanel where
+  hashWithSalt _salt DescribeControlPanel' {..} =
+    _salt `Prelude.hashWithSalt` controlPanelArn
+
+instance Prelude.NFData DescribeControlPanel where
+  rnf DescribeControlPanel' {..} =
+    Prelude.rnf controlPanelArn
+
+instance Data.ToHeaders DescribeControlPanel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeControlPanel where
+  toPath DescribeControlPanel' {..} =
+    Prelude.mconcat
+      ["/controlpanel/", Data.toBS controlPanelArn]
+
+instance Data.ToQuery DescribeControlPanel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeControlPanelResponse' smart constructor.
+data DescribeControlPanelResponse = DescribeControlPanelResponse'
+  { -- | Information about the control panel.
+    controlPanel :: Prelude.Maybe ControlPanel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeControlPanelResponse' 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:
+--
+-- 'controlPanel', 'describeControlPanelResponse_controlPanel' - Information about the control panel.
+--
+-- 'httpStatus', 'describeControlPanelResponse_httpStatus' - The response's http status code.
+newDescribeControlPanelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeControlPanelResponse
+newDescribeControlPanelResponse pHttpStatus_ =
+  DescribeControlPanelResponse'
+    { controlPanel =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the control panel.
+describeControlPanelResponse_controlPanel :: Lens.Lens' DescribeControlPanelResponse (Prelude.Maybe ControlPanel)
+describeControlPanelResponse_controlPanel = Lens.lens (\DescribeControlPanelResponse' {controlPanel} -> controlPanel) (\s@DescribeControlPanelResponse' {} a -> s {controlPanel = a} :: DescribeControlPanelResponse)
+
+-- | The response's http status code.
+describeControlPanelResponse_httpStatus :: Lens.Lens' DescribeControlPanelResponse Prelude.Int
+describeControlPanelResponse_httpStatus = Lens.lens (\DescribeControlPanelResponse' {httpStatus} -> httpStatus) (\s@DescribeControlPanelResponse' {} a -> s {httpStatus = a} :: DescribeControlPanelResponse)
+
+instance Prelude.NFData DescribeControlPanelResponse where
+  rnf DescribeControlPanelResponse' {..} =
+    Prelude.rnf controlPanel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DescribeRoutingControl.hs b/gen/Amazonka/Route53RecoveryControlConfig/DescribeRoutingControl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DescribeRoutingControl.hs
@@ -0,0 +1,173 @@
+{-# 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.Route53RecoveryControlConfig.DescribeRoutingControl
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Displays details about a routing control. A routing control has one of
+-- two states: ON and OFF. You can map the routing control state to the
+-- state of an Amazon Route 53 health check, which can be used to control
+-- routing.
+--
+-- To get or update the routing control state, see the Recovery Cluster
+-- (data plane) API actions for Amazon Route 53 Application Recovery
+-- Controller.
+module Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl
+  ( -- * Creating a Request
+    DescribeRoutingControl (..),
+    newDescribeRoutingControl,
+
+    -- * Request Lenses
+    describeRoutingControl_routingControlArn,
+
+    -- * Destructuring the Response
+    DescribeRoutingControlResponse (..),
+    newDescribeRoutingControlResponse,
+
+    -- * Response Lenses
+    describeRoutingControlResponse_routingControl,
+    describeRoutingControlResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDescribeRoutingControl' smart constructor.
+data DescribeRoutingControl = DescribeRoutingControl'
+  { -- | The Amazon Resource Name (ARN) of the routing control.
+    routingControlArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRoutingControl' 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:
+--
+-- 'routingControlArn', 'describeRoutingControl_routingControlArn' - The Amazon Resource Name (ARN) of the routing control.
+newDescribeRoutingControl ::
+  -- | 'routingControlArn'
+  Prelude.Text ->
+  DescribeRoutingControl
+newDescribeRoutingControl pRoutingControlArn_ =
+  DescribeRoutingControl'
+    { routingControlArn =
+        pRoutingControlArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the routing control.
+describeRoutingControl_routingControlArn :: Lens.Lens' DescribeRoutingControl Prelude.Text
+describeRoutingControl_routingControlArn = Lens.lens (\DescribeRoutingControl' {routingControlArn} -> routingControlArn) (\s@DescribeRoutingControl' {} a -> s {routingControlArn = a} :: DescribeRoutingControl)
+
+instance Core.AWSRequest DescribeRoutingControl where
+  type
+    AWSResponse DescribeRoutingControl =
+      DescribeRoutingControlResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRoutingControlResponse'
+            Prelude.<$> (x Data..?> "RoutingControl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRoutingControl where
+  hashWithSalt _salt DescribeRoutingControl' {..} =
+    _salt `Prelude.hashWithSalt` routingControlArn
+
+instance Prelude.NFData DescribeRoutingControl where
+  rnf DescribeRoutingControl' {..} =
+    Prelude.rnf routingControlArn
+
+instance Data.ToHeaders DescribeRoutingControl where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeRoutingControl where
+  toPath DescribeRoutingControl' {..} =
+    Prelude.mconcat
+      ["/routingcontrol/", Data.toBS routingControlArn]
+
+instance Data.ToQuery DescribeRoutingControl where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRoutingControlResponse' smart constructor.
+data DescribeRoutingControlResponse = DescribeRoutingControlResponse'
+  { -- | Information about the routing control.
+    routingControl :: Prelude.Maybe RoutingControl,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRoutingControlResponse' 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:
+--
+-- 'routingControl', 'describeRoutingControlResponse_routingControl' - Information about the routing control.
+--
+-- 'httpStatus', 'describeRoutingControlResponse_httpStatus' - The response's http status code.
+newDescribeRoutingControlResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRoutingControlResponse
+newDescribeRoutingControlResponse pHttpStatus_ =
+  DescribeRoutingControlResponse'
+    { routingControl =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the routing control.
+describeRoutingControlResponse_routingControl :: Lens.Lens' DescribeRoutingControlResponse (Prelude.Maybe RoutingControl)
+describeRoutingControlResponse_routingControl = Lens.lens (\DescribeRoutingControlResponse' {routingControl} -> routingControl) (\s@DescribeRoutingControlResponse' {} a -> s {routingControl = a} :: DescribeRoutingControlResponse)
+
+-- | The response's http status code.
+describeRoutingControlResponse_httpStatus :: Lens.Lens' DescribeRoutingControlResponse Prelude.Int
+describeRoutingControlResponse_httpStatus = Lens.lens (\DescribeRoutingControlResponse' {httpStatus} -> httpStatus) (\s@DescribeRoutingControlResponse' {} a -> s {httpStatus = a} :: DescribeRoutingControlResponse)
+
+instance
+  Prelude.NFData
+    DescribeRoutingControlResponse
+  where
+  rnf DescribeRoutingControlResponse' {..} =
+    Prelude.rnf routingControl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/DescribeSafetyRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/DescribeSafetyRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/DescribeSafetyRule.hs
@@ -0,0 +1,175 @@
+{-# 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.Route53RecoveryControlConfig.DescribeSafetyRule
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns information about a safety rule.
+module Amazonka.Route53RecoveryControlConfig.DescribeSafetyRule
+  ( -- * Creating a Request
+    DescribeSafetyRule (..),
+    newDescribeSafetyRule,
+
+    -- * Request Lenses
+    describeSafetyRule_safetyRuleArn,
+
+    -- * Destructuring the Response
+    DescribeSafetyRuleResponse (..),
+    newDescribeSafetyRuleResponse,
+
+    -- * Response Lenses
+    describeSafetyRuleResponse_assertionRule,
+    describeSafetyRuleResponse_gatingRule,
+    describeSafetyRuleResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newDescribeSafetyRule' smart constructor.
+data DescribeSafetyRule = DescribeSafetyRule'
+  { -- | The ARN of the safety rule.
+    safetyRuleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSafetyRule' 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:
+--
+-- 'safetyRuleArn', 'describeSafetyRule_safetyRuleArn' - The ARN of the safety rule.
+newDescribeSafetyRule ::
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  DescribeSafetyRule
+newDescribeSafetyRule pSafetyRuleArn_ =
+  DescribeSafetyRule'
+    { safetyRuleArn =
+        pSafetyRuleArn_
+    }
+
+-- | The ARN of the safety rule.
+describeSafetyRule_safetyRuleArn :: Lens.Lens' DescribeSafetyRule Prelude.Text
+describeSafetyRule_safetyRuleArn = Lens.lens (\DescribeSafetyRule' {safetyRuleArn} -> safetyRuleArn) (\s@DescribeSafetyRule' {} a -> s {safetyRuleArn = a} :: DescribeSafetyRule)
+
+instance Core.AWSRequest DescribeSafetyRule where
+  type
+    AWSResponse DescribeSafetyRule =
+      DescribeSafetyRuleResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSafetyRuleResponse'
+            Prelude.<$> (x Data..?> "AssertionRule")
+            Prelude.<*> (x Data..?> "GatingRule")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSafetyRule where
+  hashWithSalt _salt DescribeSafetyRule' {..} =
+    _salt `Prelude.hashWithSalt` safetyRuleArn
+
+instance Prelude.NFData DescribeSafetyRule where
+  rnf DescribeSafetyRule' {..} =
+    Prelude.rnf safetyRuleArn
+
+instance Data.ToHeaders DescribeSafetyRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeSafetyRule where
+  toPath DescribeSafetyRule' {..} =
+    Prelude.mconcat
+      ["/safetyrule/", Data.toBS safetyRuleArn]
+
+instance Data.ToQuery DescribeSafetyRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSafetyRuleResponse' smart constructor.
+data DescribeSafetyRuleResponse = DescribeSafetyRuleResponse'
+  { -- | The assertion rule in the response.
+    assertionRule :: Prelude.Maybe AssertionRule,
+    -- | The gating rule in the response.
+    gatingRule :: Prelude.Maybe GatingRule,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSafetyRuleResponse' 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:
+--
+-- 'assertionRule', 'describeSafetyRuleResponse_assertionRule' - The assertion rule in the response.
+--
+-- 'gatingRule', 'describeSafetyRuleResponse_gatingRule' - The gating rule in the response.
+--
+-- 'httpStatus', 'describeSafetyRuleResponse_httpStatus' - The response's http status code.
+newDescribeSafetyRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSafetyRuleResponse
+newDescribeSafetyRuleResponse pHttpStatus_ =
+  DescribeSafetyRuleResponse'
+    { assertionRule =
+        Prelude.Nothing,
+      gatingRule = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The assertion rule in the response.
+describeSafetyRuleResponse_assertionRule :: Lens.Lens' DescribeSafetyRuleResponse (Prelude.Maybe AssertionRule)
+describeSafetyRuleResponse_assertionRule = Lens.lens (\DescribeSafetyRuleResponse' {assertionRule} -> assertionRule) (\s@DescribeSafetyRuleResponse' {} a -> s {assertionRule = a} :: DescribeSafetyRuleResponse)
+
+-- | The gating rule in the response.
+describeSafetyRuleResponse_gatingRule :: Lens.Lens' DescribeSafetyRuleResponse (Prelude.Maybe GatingRule)
+describeSafetyRuleResponse_gatingRule = Lens.lens (\DescribeSafetyRuleResponse' {gatingRule} -> gatingRule) (\s@DescribeSafetyRuleResponse' {} a -> s {gatingRule = a} :: DescribeSafetyRuleResponse)
+
+-- | The response's http status code.
+describeSafetyRuleResponse_httpStatus :: Lens.Lens' DescribeSafetyRuleResponse Prelude.Int
+describeSafetyRuleResponse_httpStatus = Lens.lens (\DescribeSafetyRuleResponse' {httpStatus} -> httpStatus) (\s@DescribeSafetyRuleResponse' {} a -> s {httpStatus = a} :: DescribeSafetyRuleResponse)
+
+instance Prelude.NFData DescribeSafetyRuleResponse where
+  rnf DescribeSafetyRuleResponse' {..} =
+    Prelude.rnf assertionRule
+      `Prelude.seq` Prelude.rnf gatingRule
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Lens.hs b/gen/Amazonka/Route53RecoveryControlConfig/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Lens.hs
@@ -0,0 +1,274 @@
+{-# 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.Route53RecoveryControlConfig.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.Route53RecoveryControlConfig.Lens
+  ( -- * Operations
+
+    -- ** CreateCluster
+    createCluster_clientToken,
+    createCluster_tags,
+    createCluster_clusterName,
+    createClusterResponse_cluster,
+    createClusterResponse_httpStatus,
+
+    -- ** CreateControlPanel
+    createControlPanel_clientToken,
+    createControlPanel_tags,
+    createControlPanel_clusterArn,
+    createControlPanel_controlPanelName,
+    createControlPanelResponse_controlPanel,
+    createControlPanelResponse_httpStatus,
+
+    -- ** CreateRoutingControl
+    createRoutingControl_clientToken,
+    createRoutingControl_controlPanelArn,
+    createRoutingControl_clusterArn,
+    createRoutingControl_routingControlName,
+    createRoutingControlResponse_routingControl,
+    createRoutingControlResponse_httpStatus,
+
+    -- ** CreateSafetyRule
+    createSafetyRule_assertionRule,
+    createSafetyRule_clientToken,
+    createSafetyRule_gatingRule,
+    createSafetyRule_tags,
+    createSafetyRuleResponse_assertionRule,
+    createSafetyRuleResponse_gatingRule,
+    createSafetyRuleResponse_httpStatus,
+
+    -- ** DeleteCluster
+    deleteCluster_clusterArn,
+    deleteClusterResponse_httpStatus,
+
+    -- ** DeleteControlPanel
+    deleteControlPanel_controlPanelArn,
+    deleteControlPanelResponse_httpStatus,
+
+    -- ** DeleteRoutingControl
+    deleteRoutingControl_routingControlArn,
+    deleteRoutingControlResponse_httpStatus,
+
+    -- ** DeleteSafetyRule
+    deleteSafetyRule_safetyRuleArn,
+    deleteSafetyRuleResponse_httpStatus,
+
+    -- ** DescribeCluster
+    describeCluster_clusterArn,
+    describeClusterResponse_cluster,
+    describeClusterResponse_httpStatus,
+
+    -- ** DescribeControlPanel
+    describeControlPanel_controlPanelArn,
+    describeControlPanelResponse_controlPanel,
+    describeControlPanelResponse_httpStatus,
+
+    -- ** DescribeRoutingControl
+    describeRoutingControl_routingControlArn,
+    describeRoutingControlResponse_routingControl,
+    describeRoutingControlResponse_httpStatus,
+
+    -- ** DescribeSafetyRule
+    describeSafetyRule_safetyRuleArn,
+    describeSafetyRuleResponse_assertionRule,
+    describeSafetyRuleResponse_gatingRule,
+    describeSafetyRuleResponse_httpStatus,
+
+    -- ** ListAssociatedRoute53HealthChecks
+    listAssociatedRoute53HealthChecks_maxResults,
+    listAssociatedRoute53HealthChecks_nextToken,
+    listAssociatedRoute53HealthChecks_routingControlArn,
+    listAssociatedRoute53HealthChecksResponse_healthCheckIds,
+    listAssociatedRoute53HealthChecksResponse_nextToken,
+    listAssociatedRoute53HealthChecksResponse_httpStatus,
+
+    -- ** ListClusters
+    listClusters_maxResults,
+    listClusters_nextToken,
+    listClustersResponse_clusters,
+    listClustersResponse_nextToken,
+    listClustersResponse_httpStatus,
+
+    -- ** ListControlPanels
+    listControlPanels_clusterArn,
+    listControlPanels_maxResults,
+    listControlPanels_nextToken,
+    listControlPanelsResponse_controlPanels,
+    listControlPanelsResponse_nextToken,
+    listControlPanelsResponse_httpStatus,
+
+    -- ** ListRoutingControls
+    listRoutingControls_maxResults,
+    listRoutingControls_nextToken,
+    listRoutingControls_controlPanelArn,
+    listRoutingControlsResponse_nextToken,
+    listRoutingControlsResponse_routingControls,
+    listRoutingControlsResponse_httpStatus,
+
+    -- ** ListSafetyRules
+    listSafetyRules_maxResults,
+    listSafetyRules_nextToken,
+    listSafetyRules_controlPanelArn,
+    listSafetyRulesResponse_nextToken,
+    listSafetyRulesResponse_safetyRules,
+    listSafetyRulesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateControlPanel
+    updateControlPanel_controlPanelArn,
+    updateControlPanel_controlPanelName,
+    updateControlPanelResponse_controlPanel,
+    updateControlPanelResponse_httpStatus,
+
+    -- ** UpdateRoutingControl
+    updateRoutingControl_routingControlName,
+    updateRoutingControl_routingControlArn,
+    updateRoutingControlResponse_routingControl,
+    updateRoutingControlResponse_httpStatus,
+
+    -- ** UpdateSafetyRule
+    updateSafetyRule_assertionRuleUpdate,
+    updateSafetyRule_gatingRuleUpdate,
+    updateSafetyRuleResponse_assertionRule,
+    updateSafetyRuleResponse_gatingRule,
+    updateSafetyRuleResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AssertionRule
+    assertionRule_status,
+    assertionRule_controlPanelArn,
+    assertionRule_safetyRuleArn,
+    assertionRule_assertedControls,
+    assertionRule_ruleConfig,
+    assertionRule_waitPeriodMs,
+    assertionRule_name,
+
+    -- ** AssertionRuleUpdate
+    assertionRuleUpdate_safetyRuleArn,
+    assertionRuleUpdate_waitPeriodMs,
+    assertionRuleUpdate_name,
+
+    -- ** Cluster
+    cluster_clusterArn,
+    cluster_clusterEndpoints,
+    cluster_name,
+    cluster_status,
+
+    -- ** ClusterEndpoint
+    clusterEndpoint_endpoint,
+    clusterEndpoint_region,
+
+    -- ** ControlPanel
+    controlPanel_clusterArn,
+    controlPanel_controlPanelArn,
+    controlPanel_defaultControlPanel,
+    controlPanel_name,
+    controlPanel_routingControlCount,
+    controlPanel_status,
+
+    -- ** GatingRule
+    gatingRule_status,
+    gatingRule_targetControls,
+    gatingRule_controlPanelArn,
+    gatingRule_safetyRuleArn,
+    gatingRule_gatingControls,
+    gatingRule_ruleConfig,
+    gatingRule_waitPeriodMs,
+    gatingRule_name,
+
+    -- ** GatingRuleUpdate
+    gatingRuleUpdate_safetyRuleArn,
+    gatingRuleUpdate_waitPeriodMs,
+    gatingRuleUpdate_name,
+
+    -- ** NewAssertionRule
+    newAssertionRule_controlPanelArn,
+    newAssertionRule_assertedControls,
+    newAssertionRule_ruleConfig,
+    newAssertionRule_waitPeriodMs,
+    newAssertionRule_name,
+
+    -- ** NewGatingRule
+    newGatingRule_targetControls,
+    newGatingRule_controlPanelArn,
+    newGatingRule_gatingControls,
+    newGatingRule_ruleConfig,
+    newGatingRule_waitPeriodMs,
+    newGatingRule_name,
+
+    -- ** RoutingControl
+    routingControl_controlPanelArn,
+    routingControl_name,
+    routingControl_routingControlArn,
+    routingControl_status,
+
+    -- ** Rule
+    rule_assertion,
+    rule_gating,
+
+    -- ** RuleConfig
+    ruleConfig_type,
+    ruleConfig_inverted,
+    ruleConfig_threshold,
+  )
+where
+
+import Amazonka.Route53RecoveryControlConfig.CreateCluster
+import Amazonka.Route53RecoveryControlConfig.CreateControlPanel
+import Amazonka.Route53RecoveryControlConfig.CreateRoutingControl
+import Amazonka.Route53RecoveryControlConfig.CreateSafetyRule
+import Amazonka.Route53RecoveryControlConfig.DeleteCluster
+import Amazonka.Route53RecoveryControlConfig.DeleteControlPanel
+import Amazonka.Route53RecoveryControlConfig.DeleteRoutingControl
+import Amazonka.Route53RecoveryControlConfig.DeleteSafetyRule
+import Amazonka.Route53RecoveryControlConfig.DescribeCluster
+import Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+import Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl
+import Amazonka.Route53RecoveryControlConfig.DescribeSafetyRule
+import Amazonka.Route53RecoveryControlConfig.ListAssociatedRoute53HealthChecks
+import Amazonka.Route53RecoveryControlConfig.ListClusters
+import Amazonka.Route53RecoveryControlConfig.ListControlPanels
+import Amazonka.Route53RecoveryControlConfig.ListRoutingControls
+import Amazonka.Route53RecoveryControlConfig.ListSafetyRules
+import Amazonka.Route53RecoveryControlConfig.ListTagsForResource
+import Amazonka.Route53RecoveryControlConfig.TagResource
+import Amazonka.Route53RecoveryControlConfig.Types.AssertionRule
+import Amazonka.Route53RecoveryControlConfig.Types.AssertionRuleUpdate
+import Amazonka.Route53RecoveryControlConfig.Types.Cluster
+import Amazonka.Route53RecoveryControlConfig.Types.ClusterEndpoint
+import Amazonka.Route53RecoveryControlConfig.Types.ControlPanel
+import Amazonka.Route53RecoveryControlConfig.Types.GatingRule
+import Amazonka.Route53RecoveryControlConfig.Types.GatingRuleUpdate
+import Amazonka.Route53RecoveryControlConfig.Types.NewAssertionRule
+import Amazonka.Route53RecoveryControlConfig.Types.NewGatingRule
+import Amazonka.Route53RecoveryControlConfig.Types.RoutingControl
+import Amazonka.Route53RecoveryControlConfig.Types.Rule
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+import Amazonka.Route53RecoveryControlConfig.UntagResource
+import Amazonka.Route53RecoveryControlConfig.UpdateControlPanel
+import Amazonka.Route53RecoveryControlConfig.UpdateRoutingControl
+import Amazonka.Route53RecoveryControlConfig.UpdateSafetyRule
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListAssociatedRoute53HealthChecks.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListAssociatedRoute53HealthChecks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListAssociatedRoute53HealthChecks.hs
@@ -0,0 +1,260 @@
+{-# 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.Route53RecoveryControlConfig.ListAssociatedRoute53HealthChecks
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns an array of all Amazon Route 53 health checks associated with a
+-- specific routing control.
+--
+-- This operation returns paginated results.
+module Amazonka.Route53RecoveryControlConfig.ListAssociatedRoute53HealthChecks
+  ( -- * Creating a Request
+    ListAssociatedRoute53HealthChecks (..),
+    newListAssociatedRoute53HealthChecks,
+
+    -- * Request Lenses
+    listAssociatedRoute53HealthChecks_maxResults,
+    listAssociatedRoute53HealthChecks_nextToken,
+    listAssociatedRoute53HealthChecks_routingControlArn,
+
+    -- * Destructuring the Response
+    ListAssociatedRoute53HealthChecksResponse (..),
+    newListAssociatedRoute53HealthChecksResponse,
+
+    -- * Response Lenses
+    listAssociatedRoute53HealthChecksResponse_healthCheckIds,
+    listAssociatedRoute53HealthChecksResponse_nextToken,
+    listAssociatedRoute53HealthChecksResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListAssociatedRoute53HealthChecks' smart constructor.
+data ListAssociatedRoute53HealthChecks = ListAssociatedRoute53HealthChecks'
+  { -- | The number of objects that you want to return with this call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the routing control.
+    routingControlArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssociatedRoute53HealthChecks' 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', 'listAssociatedRoute53HealthChecks_maxResults' - The number of objects that you want to return with this call.
+--
+-- 'nextToken', 'listAssociatedRoute53HealthChecks_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'routingControlArn', 'listAssociatedRoute53HealthChecks_routingControlArn' - The Amazon Resource Name (ARN) of the routing control.
+newListAssociatedRoute53HealthChecks ::
+  -- | 'routingControlArn'
+  Prelude.Text ->
+  ListAssociatedRoute53HealthChecks
+newListAssociatedRoute53HealthChecks
+  pRoutingControlArn_ =
+    ListAssociatedRoute53HealthChecks'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        routingControlArn = pRoutingControlArn_
+      }
+
+-- | The number of objects that you want to return with this call.
+listAssociatedRoute53HealthChecks_maxResults :: Lens.Lens' ListAssociatedRoute53HealthChecks (Prelude.Maybe Prelude.Natural)
+listAssociatedRoute53HealthChecks_maxResults = Lens.lens (\ListAssociatedRoute53HealthChecks' {maxResults} -> maxResults) (\s@ListAssociatedRoute53HealthChecks' {} a -> s {maxResults = a} :: ListAssociatedRoute53HealthChecks)
+
+-- | The token that identifies which batch of results you want to see.
+listAssociatedRoute53HealthChecks_nextToken :: Lens.Lens' ListAssociatedRoute53HealthChecks (Prelude.Maybe Prelude.Text)
+listAssociatedRoute53HealthChecks_nextToken = Lens.lens (\ListAssociatedRoute53HealthChecks' {nextToken} -> nextToken) (\s@ListAssociatedRoute53HealthChecks' {} a -> s {nextToken = a} :: ListAssociatedRoute53HealthChecks)
+
+-- | The Amazon Resource Name (ARN) of the routing control.
+listAssociatedRoute53HealthChecks_routingControlArn :: Lens.Lens' ListAssociatedRoute53HealthChecks Prelude.Text
+listAssociatedRoute53HealthChecks_routingControlArn = Lens.lens (\ListAssociatedRoute53HealthChecks' {routingControlArn} -> routingControlArn) (\s@ListAssociatedRoute53HealthChecks' {} a -> s {routingControlArn = a} :: ListAssociatedRoute53HealthChecks)
+
+instance
+  Core.AWSPager
+    ListAssociatedRoute53HealthChecks
+  where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssociatedRoute53HealthChecksResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listAssociatedRoute53HealthChecksResponse_healthCheckIds
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssociatedRoute53HealthChecks_nextToken
+          Lens..~ rs
+          Lens.^? listAssociatedRoute53HealthChecksResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    ListAssociatedRoute53HealthChecks
+  where
+  type
+    AWSResponse ListAssociatedRoute53HealthChecks =
+      ListAssociatedRoute53HealthChecksResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssociatedRoute53HealthChecksResponse'
+            Prelude.<$> (x Data..?> "HealthCheckIds" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListAssociatedRoute53HealthChecks
+  where
+  hashWithSalt
+    _salt
+    ListAssociatedRoute53HealthChecks' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` routingControlArn
+
+instance
+  Prelude.NFData
+    ListAssociatedRoute53HealthChecks
+  where
+  rnf ListAssociatedRoute53HealthChecks' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf routingControlArn
+
+instance
+  Data.ToHeaders
+    ListAssociatedRoute53HealthChecks
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    ListAssociatedRoute53HealthChecks
+  where
+  toPath ListAssociatedRoute53HealthChecks' {..} =
+    Prelude.mconcat
+      [ "/routingcontrol/",
+        Data.toBS routingControlArn,
+        "/associatedRoute53HealthChecks"
+      ]
+
+instance
+  Data.ToQuery
+    ListAssociatedRoute53HealthChecks
+  where
+  toQuery ListAssociatedRoute53HealthChecks' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAssociatedRoute53HealthChecksResponse' smart constructor.
+data ListAssociatedRoute53HealthChecksResponse = ListAssociatedRoute53HealthChecksResponse'
+  { -- | Identifiers for the health checks.
+    healthCheckIds :: Prelude.Maybe [Prelude.Text],
+    -- | Next token for listing health checks.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssociatedRoute53HealthChecksResponse' 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:
+--
+-- 'healthCheckIds', 'listAssociatedRoute53HealthChecksResponse_healthCheckIds' - Identifiers for the health checks.
+--
+-- 'nextToken', 'listAssociatedRoute53HealthChecksResponse_nextToken' - Next token for listing health checks.
+--
+-- 'httpStatus', 'listAssociatedRoute53HealthChecksResponse_httpStatus' - The response's http status code.
+newListAssociatedRoute53HealthChecksResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssociatedRoute53HealthChecksResponse
+newListAssociatedRoute53HealthChecksResponse
+  pHttpStatus_ =
+    ListAssociatedRoute53HealthChecksResponse'
+      { healthCheckIds =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | Identifiers for the health checks.
+listAssociatedRoute53HealthChecksResponse_healthCheckIds :: Lens.Lens' ListAssociatedRoute53HealthChecksResponse (Prelude.Maybe [Prelude.Text])
+listAssociatedRoute53HealthChecksResponse_healthCheckIds = Lens.lens (\ListAssociatedRoute53HealthChecksResponse' {healthCheckIds} -> healthCheckIds) (\s@ListAssociatedRoute53HealthChecksResponse' {} a -> s {healthCheckIds = a} :: ListAssociatedRoute53HealthChecksResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token for listing health checks.
+listAssociatedRoute53HealthChecksResponse_nextToken :: Lens.Lens' ListAssociatedRoute53HealthChecksResponse (Prelude.Maybe Prelude.Text)
+listAssociatedRoute53HealthChecksResponse_nextToken = Lens.lens (\ListAssociatedRoute53HealthChecksResponse' {nextToken} -> nextToken) (\s@ListAssociatedRoute53HealthChecksResponse' {} a -> s {nextToken = a} :: ListAssociatedRoute53HealthChecksResponse)
+
+-- | The response's http status code.
+listAssociatedRoute53HealthChecksResponse_httpStatus :: Lens.Lens' ListAssociatedRoute53HealthChecksResponse Prelude.Int
+listAssociatedRoute53HealthChecksResponse_httpStatus = Lens.lens (\ListAssociatedRoute53HealthChecksResponse' {httpStatus} -> httpStatus) (\s@ListAssociatedRoute53HealthChecksResponse' {} a -> s {httpStatus = a} :: ListAssociatedRoute53HealthChecksResponse)
+
+instance
+  Prelude.NFData
+    ListAssociatedRoute53HealthChecksResponse
+  where
+  rnf ListAssociatedRoute53HealthChecksResponse' {..} =
+    Prelude.rnf healthCheckIds
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListClusters.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListClusters.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.ListClusters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns an array of all the clusters in an account.
+--
+-- This operation returns paginated results.
+module Amazonka.Route53RecoveryControlConfig.ListClusters
+  ( -- * Creating a Request
+    ListClusters (..),
+    newListClusters,
+
+    -- * Request Lenses
+    listClusters_maxResults,
+    listClusters_nextToken,
+
+    -- * Destructuring the Response
+    ListClustersResponse (..),
+    newListClustersResponse,
+
+    -- * Response Lenses
+    listClustersResponse_clusters,
+    listClustersResponse_nextToken,
+    listClustersResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListClusters' smart constructor.
+data ListClusters = ListClusters'
+  { -- | The number of objects that you want to return with this call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClusters' 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', 'listClusters_maxResults' - The number of objects that you want to return with this call.
+--
+-- 'nextToken', 'listClusters_nextToken' - The token that identifies which batch of results you want to see.
+newListClusters ::
+  ListClusters
+newListClusters =
+  ListClusters'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The number of objects that you want to return with this call.
+listClusters_maxResults :: Lens.Lens' ListClusters (Prelude.Maybe Prelude.Natural)
+listClusters_maxResults = Lens.lens (\ListClusters' {maxResults} -> maxResults) (\s@ListClusters' {} a -> s {maxResults = a} :: ListClusters)
+
+-- | The token that identifies which batch of results you want to see.
+listClusters_nextToken :: Lens.Lens' ListClusters (Prelude.Maybe Prelude.Text)
+listClusters_nextToken = Lens.lens (\ListClusters' {nextToken} -> nextToken) (\s@ListClusters' {} a -> s {nextToken = a} :: ListClusters)
+
+instance Core.AWSPager ListClusters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listClustersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listClustersResponse_clusters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listClusters_nextToken
+          Lens..~ rs
+          Lens.^? listClustersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListClusters where
+  type AWSResponse ListClusters = ListClustersResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListClustersResponse'
+            Prelude.<$> (x Data..?> "Clusters" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListClusters where
+  hashWithSalt _salt ListClusters' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListClusters where
+  rnf ListClusters' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListClusters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListClusters where
+  toPath = Prelude.const "/cluster"
+
+instance Data.ToQuery ListClusters where
+  toQuery ListClusters' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListClustersResponse' smart constructor.
+data ListClustersResponse = ListClustersResponse'
+  { -- | An array of the clusters in an account.
+    clusters :: Prelude.Maybe [Cluster],
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListClustersResponse' 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:
+--
+-- 'clusters', 'listClustersResponse_clusters' - An array of the clusters in an account.
+--
+-- 'nextToken', 'listClustersResponse_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'httpStatus', 'listClustersResponse_httpStatus' - The response's http status code.
+newListClustersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListClustersResponse
+newListClustersResponse pHttpStatus_ =
+  ListClustersResponse'
+    { clusters = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of the clusters in an account.
+listClustersResponse_clusters :: Lens.Lens' ListClustersResponse (Prelude.Maybe [Cluster])
+listClustersResponse_clusters = Lens.lens (\ListClustersResponse' {clusters} -> clusters) (\s@ListClustersResponse' {} a -> s {clusters = a} :: ListClustersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token that identifies which batch of results you want to see.
+listClustersResponse_nextToken :: Lens.Lens' ListClustersResponse (Prelude.Maybe Prelude.Text)
+listClustersResponse_nextToken = Lens.lens (\ListClustersResponse' {nextToken} -> nextToken) (\s@ListClustersResponse' {} a -> s {nextToken = a} :: ListClustersResponse)
+
+-- | The response's http status code.
+listClustersResponse_httpStatus :: Lens.Lens' ListClustersResponse Prelude.Int
+listClustersResponse_httpStatus = Lens.lens (\ListClustersResponse' {httpStatus} -> httpStatus) (\s@ListClustersResponse' {} a -> s {httpStatus = a} :: ListClustersResponse)
+
+instance Prelude.NFData ListClustersResponse where
+  rnf ListClustersResponse' {..} =
+    Prelude.rnf clusters
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListControlPanels.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListControlPanels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListControlPanels.hs
@@ -0,0 +1,224 @@
+{-# 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.Route53RecoveryControlConfig.ListControlPanels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns an array of control panels in an account or in a cluster.
+--
+-- This operation returns paginated results.
+module Amazonka.Route53RecoveryControlConfig.ListControlPanels
+  ( -- * Creating a Request
+    ListControlPanels (..),
+    newListControlPanels,
+
+    -- * Request Lenses
+    listControlPanels_clusterArn,
+    listControlPanels_maxResults,
+    listControlPanels_nextToken,
+
+    -- * Destructuring the Response
+    ListControlPanelsResponse (..),
+    newListControlPanelsResponse,
+
+    -- * Response Lenses
+    listControlPanelsResponse_controlPanels,
+    listControlPanelsResponse_nextToken,
+    listControlPanelsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListControlPanels' smart constructor.
+data ListControlPanels = ListControlPanels'
+  { -- | The Amazon Resource Name (ARN) of a cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The number of objects that you want to return with this call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListControlPanels' 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:
+--
+-- 'clusterArn', 'listControlPanels_clusterArn' - The Amazon Resource Name (ARN) of a cluster.
+--
+-- 'maxResults', 'listControlPanels_maxResults' - The number of objects that you want to return with this call.
+--
+-- 'nextToken', 'listControlPanels_nextToken' - The token that identifies which batch of results you want to see.
+newListControlPanels ::
+  ListControlPanels
+newListControlPanels =
+  ListControlPanels'
+    { clusterArn = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of a cluster.
+listControlPanels_clusterArn :: Lens.Lens' ListControlPanels (Prelude.Maybe Prelude.Text)
+listControlPanels_clusterArn = Lens.lens (\ListControlPanels' {clusterArn} -> clusterArn) (\s@ListControlPanels' {} a -> s {clusterArn = a} :: ListControlPanels)
+
+-- | The number of objects that you want to return with this call.
+listControlPanels_maxResults :: Lens.Lens' ListControlPanels (Prelude.Maybe Prelude.Natural)
+listControlPanels_maxResults = Lens.lens (\ListControlPanels' {maxResults} -> maxResults) (\s@ListControlPanels' {} a -> s {maxResults = a} :: ListControlPanels)
+
+-- | The token that identifies which batch of results you want to see.
+listControlPanels_nextToken :: Lens.Lens' ListControlPanels (Prelude.Maybe Prelude.Text)
+listControlPanels_nextToken = Lens.lens (\ListControlPanels' {nextToken} -> nextToken) (\s@ListControlPanels' {} a -> s {nextToken = a} :: ListControlPanels)
+
+instance Core.AWSPager ListControlPanels where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listControlPanelsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listControlPanelsResponse_controlPanels
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listControlPanels_nextToken
+          Lens..~ rs
+          Lens.^? listControlPanelsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListControlPanels where
+  type
+    AWSResponse ListControlPanels =
+      ListControlPanelsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListControlPanelsResponse'
+            Prelude.<$> (x Data..?> "ControlPanels" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListControlPanels where
+  hashWithSalt _salt ListControlPanels' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListControlPanels where
+  rnf ListControlPanels' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListControlPanels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListControlPanels where
+  toPath = Prelude.const "/controlpanels"
+
+instance Data.ToQuery ListControlPanels where
+  toQuery ListControlPanels' {..} =
+    Prelude.mconcat
+      [ "ClusterArn" Data.=: clusterArn,
+        "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListControlPanelsResponse' smart constructor.
+data ListControlPanelsResponse = ListControlPanelsResponse'
+  { -- | The result of a successful ListControlPanel request.
+    controlPanels :: Prelude.Maybe [ControlPanel],
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListControlPanelsResponse' 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:
+--
+-- 'controlPanels', 'listControlPanelsResponse_controlPanels' - The result of a successful ListControlPanel request.
+--
+-- 'nextToken', 'listControlPanelsResponse_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'httpStatus', 'listControlPanelsResponse_httpStatus' - The response's http status code.
+newListControlPanelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListControlPanelsResponse
+newListControlPanelsResponse pHttpStatus_ =
+  ListControlPanelsResponse'
+    { controlPanels =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The result of a successful ListControlPanel request.
+listControlPanelsResponse_controlPanels :: Lens.Lens' ListControlPanelsResponse (Prelude.Maybe [ControlPanel])
+listControlPanelsResponse_controlPanels = Lens.lens (\ListControlPanelsResponse' {controlPanels} -> controlPanels) (\s@ListControlPanelsResponse' {} a -> s {controlPanels = a} :: ListControlPanelsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token that identifies which batch of results you want to see.
+listControlPanelsResponse_nextToken :: Lens.Lens' ListControlPanelsResponse (Prelude.Maybe Prelude.Text)
+listControlPanelsResponse_nextToken = Lens.lens (\ListControlPanelsResponse' {nextToken} -> nextToken) (\s@ListControlPanelsResponse' {} a -> s {nextToken = a} :: ListControlPanelsResponse)
+
+-- | The response's http status code.
+listControlPanelsResponse_httpStatus :: Lens.Lens' ListControlPanelsResponse Prelude.Int
+listControlPanelsResponse_httpStatus = Lens.lens (\ListControlPanelsResponse' {httpStatus} -> httpStatus) (\s@ListControlPanelsResponse' {} a -> s {httpStatus = a} :: ListControlPanelsResponse)
+
+instance Prelude.NFData ListControlPanelsResponse where
+  rnf ListControlPanelsResponse' {..} =
+    Prelude.rnf controlPanels
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListRoutingControls.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListRoutingControls.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListRoutingControls.hs
@@ -0,0 +1,237 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.ListRoutingControls
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns an array of routing controls for a control panel. A routing
+-- control is an Amazon Route 53 Application Recovery Controller construct
+-- that has one of two states: ON and OFF. You can map the routing control
+-- state to the state of an Amazon Route 53 health check, which can be used
+-- to control routing.
+--
+-- This operation returns paginated results.
+module Amazonka.Route53RecoveryControlConfig.ListRoutingControls
+  ( -- * Creating a Request
+    ListRoutingControls (..),
+    newListRoutingControls,
+
+    -- * Request Lenses
+    listRoutingControls_maxResults,
+    listRoutingControls_nextToken,
+    listRoutingControls_controlPanelArn,
+
+    -- * Destructuring the Response
+    ListRoutingControlsResponse (..),
+    newListRoutingControlsResponse,
+
+    -- * Response Lenses
+    listRoutingControlsResponse_nextToken,
+    listRoutingControlsResponse_routingControls,
+    listRoutingControlsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListRoutingControls' smart constructor.
+data ListRoutingControls = ListRoutingControls'
+  { -- | The number of objects that you want to return with this call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRoutingControls' 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', 'listRoutingControls_maxResults' - The number of objects that you want to return with this call.
+--
+-- 'nextToken', 'listRoutingControls_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'controlPanelArn', 'listRoutingControls_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+newListRoutingControls ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  ListRoutingControls
+newListRoutingControls pControlPanelArn_ =
+  ListRoutingControls'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      controlPanelArn = pControlPanelArn_
+    }
+
+-- | The number of objects that you want to return with this call.
+listRoutingControls_maxResults :: Lens.Lens' ListRoutingControls (Prelude.Maybe Prelude.Natural)
+listRoutingControls_maxResults = Lens.lens (\ListRoutingControls' {maxResults} -> maxResults) (\s@ListRoutingControls' {} a -> s {maxResults = a} :: ListRoutingControls)
+
+-- | The token that identifies which batch of results you want to see.
+listRoutingControls_nextToken :: Lens.Lens' ListRoutingControls (Prelude.Maybe Prelude.Text)
+listRoutingControls_nextToken = Lens.lens (\ListRoutingControls' {nextToken} -> nextToken) (\s@ListRoutingControls' {} a -> s {nextToken = a} :: ListRoutingControls)
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+listRoutingControls_controlPanelArn :: Lens.Lens' ListRoutingControls Prelude.Text
+listRoutingControls_controlPanelArn = Lens.lens (\ListRoutingControls' {controlPanelArn} -> controlPanelArn) (\s@ListRoutingControls' {} a -> s {controlPanelArn = a} :: ListRoutingControls)
+
+instance Core.AWSPager ListRoutingControls where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRoutingControlsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listRoutingControlsResponse_routingControls
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRoutingControls_nextToken
+          Lens..~ rs
+          Lens.^? listRoutingControlsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRoutingControls where
+  type
+    AWSResponse ListRoutingControls =
+      ListRoutingControlsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRoutingControlsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "RoutingControls"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListRoutingControls where
+  hashWithSalt _salt ListRoutingControls' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` controlPanelArn
+
+instance Prelude.NFData ListRoutingControls where
+  rnf ListRoutingControls' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf controlPanelArn
+
+instance Data.ToHeaders ListRoutingControls where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListRoutingControls where
+  toPath ListRoutingControls' {..} =
+    Prelude.mconcat
+      [ "/controlpanel/",
+        Data.toBS controlPanelArn,
+        "/routingcontrols"
+      ]
+
+instance Data.ToQuery ListRoutingControls where
+  toQuery ListRoutingControls' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListRoutingControlsResponse' smart constructor.
+data ListRoutingControlsResponse = ListRoutingControlsResponse'
+  { -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | An array of routing controls.
+    routingControls :: Prelude.Maybe [RoutingControl],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRoutingControlsResponse' 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', 'listRoutingControlsResponse_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'routingControls', 'listRoutingControlsResponse_routingControls' - An array of routing controls.
+--
+-- 'httpStatus', 'listRoutingControlsResponse_httpStatus' - The response's http status code.
+newListRoutingControlsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRoutingControlsResponse
+newListRoutingControlsResponse pHttpStatus_ =
+  ListRoutingControlsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      routingControls = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token that identifies which batch of results you want to see.
+listRoutingControlsResponse_nextToken :: Lens.Lens' ListRoutingControlsResponse (Prelude.Maybe Prelude.Text)
+listRoutingControlsResponse_nextToken = Lens.lens (\ListRoutingControlsResponse' {nextToken} -> nextToken) (\s@ListRoutingControlsResponse' {} a -> s {nextToken = a} :: ListRoutingControlsResponse)
+
+-- | An array of routing controls.
+listRoutingControlsResponse_routingControls :: Lens.Lens' ListRoutingControlsResponse (Prelude.Maybe [RoutingControl])
+listRoutingControlsResponse_routingControls = Lens.lens (\ListRoutingControlsResponse' {routingControls} -> routingControls) (\s@ListRoutingControlsResponse' {} a -> s {routingControls = a} :: ListRoutingControlsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listRoutingControlsResponse_httpStatus :: Lens.Lens' ListRoutingControlsResponse Prelude.Int
+listRoutingControlsResponse_httpStatus = Lens.lens (\ListRoutingControlsResponse' {httpStatus} -> httpStatus) (\s@ListRoutingControlsResponse' {} a -> s {httpStatus = a} :: ListRoutingControlsResponse)
+
+instance Prelude.NFData ListRoutingControlsResponse where
+  rnf ListRoutingControlsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf routingControls
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListSafetyRules.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListSafetyRules.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListSafetyRules.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.ListSafetyRules
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List the safety rules (the assertion rules and gating rules) that
+-- you\'ve defined for the routing controls in a control panel.
+--
+-- This operation returns paginated results.
+module Amazonka.Route53RecoveryControlConfig.ListSafetyRules
+  ( -- * Creating a Request
+    ListSafetyRules (..),
+    newListSafetyRules,
+
+    -- * Request Lenses
+    listSafetyRules_maxResults,
+    listSafetyRules_nextToken,
+    listSafetyRules_controlPanelArn,
+
+    -- * Destructuring the Response
+    ListSafetyRulesResponse (..),
+    newListSafetyRulesResponse,
+
+    -- * Response Lenses
+    listSafetyRulesResponse_nextToken,
+    listSafetyRulesResponse_safetyRules,
+    listSafetyRulesResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListSafetyRules' smart constructor.
+data ListSafetyRules = ListSafetyRules'
+  { -- | The number of objects that you want to return with this call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSafetyRules' 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', 'listSafetyRules_maxResults' - The number of objects that you want to return with this call.
+--
+-- 'nextToken', 'listSafetyRules_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'controlPanelArn', 'listSafetyRules_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+newListSafetyRules ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  ListSafetyRules
+newListSafetyRules pControlPanelArn_ =
+  ListSafetyRules'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      controlPanelArn = pControlPanelArn_
+    }
+
+-- | The number of objects that you want to return with this call.
+listSafetyRules_maxResults :: Lens.Lens' ListSafetyRules (Prelude.Maybe Prelude.Natural)
+listSafetyRules_maxResults = Lens.lens (\ListSafetyRules' {maxResults} -> maxResults) (\s@ListSafetyRules' {} a -> s {maxResults = a} :: ListSafetyRules)
+
+-- | The token that identifies which batch of results you want to see.
+listSafetyRules_nextToken :: Lens.Lens' ListSafetyRules (Prelude.Maybe Prelude.Text)
+listSafetyRules_nextToken = Lens.lens (\ListSafetyRules' {nextToken} -> nextToken) (\s@ListSafetyRules' {} a -> s {nextToken = a} :: ListSafetyRules)
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+listSafetyRules_controlPanelArn :: Lens.Lens' ListSafetyRules Prelude.Text
+listSafetyRules_controlPanelArn = Lens.lens (\ListSafetyRules' {controlPanelArn} -> controlPanelArn) (\s@ListSafetyRules' {} a -> s {controlPanelArn = a} :: ListSafetyRules)
+
+instance Core.AWSPager ListSafetyRules where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSafetyRulesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSafetyRulesResponse_safetyRules
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSafetyRules_nextToken
+          Lens..~ rs
+          Lens.^? listSafetyRulesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSafetyRules where
+  type
+    AWSResponse ListSafetyRules =
+      ListSafetyRulesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSafetyRulesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "SafetyRules" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSafetyRules where
+  hashWithSalt _salt ListSafetyRules' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` controlPanelArn
+
+instance Prelude.NFData ListSafetyRules where
+  rnf ListSafetyRules' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf controlPanelArn
+
+instance Data.ToHeaders ListSafetyRules where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListSafetyRules where
+  toPath ListSafetyRules' {..} =
+    Prelude.mconcat
+      [ "/controlpanel/",
+        Data.toBS controlPanelArn,
+        "/safetyrules"
+      ]
+
+instance Data.ToQuery ListSafetyRules where
+  toQuery ListSafetyRules' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListSafetyRulesResponse' smart constructor.
+data ListSafetyRulesResponse = ListSafetyRulesResponse'
+  { -- | The token that identifies which batch of results you want to see.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of safety rules in a control panel.
+    safetyRules :: Prelude.Maybe [Rule],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSafetyRulesResponse' 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', 'listSafetyRulesResponse_nextToken' - The token that identifies which batch of results you want to see.
+--
+-- 'safetyRules', 'listSafetyRulesResponse_safetyRules' - The list of safety rules in a control panel.
+--
+-- 'httpStatus', 'listSafetyRulesResponse_httpStatus' - The response's http status code.
+newListSafetyRulesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSafetyRulesResponse
+newListSafetyRulesResponse pHttpStatus_ =
+  ListSafetyRulesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      safetyRules = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token that identifies which batch of results you want to see.
+listSafetyRulesResponse_nextToken :: Lens.Lens' ListSafetyRulesResponse (Prelude.Maybe Prelude.Text)
+listSafetyRulesResponse_nextToken = Lens.lens (\ListSafetyRulesResponse' {nextToken} -> nextToken) (\s@ListSafetyRulesResponse' {} a -> s {nextToken = a} :: ListSafetyRulesResponse)
+
+-- | The list of safety rules in a control panel.
+listSafetyRulesResponse_safetyRules :: Lens.Lens' ListSafetyRulesResponse (Prelude.Maybe [Rule])
+listSafetyRulesResponse_safetyRules = Lens.lens (\ListSafetyRulesResponse' {safetyRules} -> safetyRules) (\s@ListSafetyRulesResponse' {} a -> s {safetyRules = a} :: ListSafetyRulesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSafetyRulesResponse_httpStatus :: Lens.Lens' ListSafetyRulesResponse Prelude.Int
+listSafetyRulesResponse_httpStatus = Lens.lens (\ListSafetyRulesResponse' {httpStatus} -> httpStatus) (\s@ListSafetyRulesResponse' {} a -> s {httpStatus = a} :: ListSafetyRulesResponse)
+
+instance Prelude.NFData ListSafetyRulesResponse where
+  rnf ListSafetyRulesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf safetyRules
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/ListTagsForResource.hs b/gen/Amazonka/Route53RecoveryControlConfig/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/ListTagsForResource.hs
@@ -0,0 +1,159 @@
+{-# 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.Route53RecoveryControlConfig.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the tags for a resource.
+module Amazonka.Route53RecoveryControlConfig.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) for the resource that\'s tagged.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The tags associated with the resource.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags associated with the resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags associated with the resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/TagResource.hs b/gen/Amazonka/Route53RecoveryControlConfig/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/TagResource.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds a tag to a resource.
+module Amazonka.Route53RecoveryControlConfig.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | Request of adding tag to the resource
+--
+-- /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+    resourceArn :: Prelude.Text,
+    -- | The tags associated with the resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) for the resource that\'s tagged.
+--
+-- 'tags', 'tagResource_tags' - The tags associated with the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags associated with the resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types.hs
@@ -0,0 +1,290 @@
+{-# 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.Route53RecoveryControlConfig.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.Route53RecoveryControlConfig.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * RuleType
+    RuleType (..),
+
+    -- * Status
+    Status (..),
+
+    -- * AssertionRule
+    AssertionRule (..),
+    newAssertionRule,
+    assertionRule_status,
+    assertionRule_controlPanelArn,
+    assertionRule_safetyRuleArn,
+    assertionRule_assertedControls,
+    assertionRule_ruleConfig,
+    assertionRule_waitPeriodMs,
+    assertionRule_name,
+
+    -- * AssertionRuleUpdate
+    AssertionRuleUpdate (..),
+    newAssertionRuleUpdate,
+    assertionRuleUpdate_safetyRuleArn,
+    assertionRuleUpdate_waitPeriodMs,
+    assertionRuleUpdate_name,
+
+    -- * Cluster
+    Cluster (..),
+    newCluster,
+    cluster_clusterArn,
+    cluster_clusterEndpoints,
+    cluster_name,
+    cluster_status,
+
+    -- * ClusterEndpoint
+    ClusterEndpoint (..),
+    newClusterEndpoint,
+    clusterEndpoint_endpoint,
+    clusterEndpoint_region,
+
+    -- * ControlPanel
+    ControlPanel (..),
+    newControlPanel,
+    controlPanel_clusterArn,
+    controlPanel_controlPanelArn,
+    controlPanel_defaultControlPanel,
+    controlPanel_name,
+    controlPanel_routingControlCount,
+    controlPanel_status,
+
+    -- * GatingRule
+    GatingRule (..),
+    newGatingRule,
+    gatingRule_status,
+    gatingRule_targetControls,
+    gatingRule_controlPanelArn,
+    gatingRule_safetyRuleArn,
+    gatingRule_gatingControls,
+    gatingRule_ruleConfig,
+    gatingRule_waitPeriodMs,
+    gatingRule_name,
+
+    -- * GatingRuleUpdate
+    GatingRuleUpdate (..),
+    newGatingRuleUpdate,
+    gatingRuleUpdate_safetyRuleArn,
+    gatingRuleUpdate_waitPeriodMs,
+    gatingRuleUpdate_name,
+
+    -- * NewAssertionRule
+    NewAssertionRule (..),
+    newNewAssertionRule,
+    newAssertionRule_controlPanelArn,
+    newAssertionRule_assertedControls,
+    newAssertionRule_ruleConfig,
+    newAssertionRule_waitPeriodMs,
+    newAssertionRule_name,
+
+    -- * NewGatingRule
+    NewGatingRule (..),
+    newNewGatingRule,
+    newGatingRule_targetControls,
+    newGatingRule_controlPanelArn,
+    newGatingRule_gatingControls,
+    newGatingRule_ruleConfig,
+    newGatingRule_waitPeriodMs,
+    newGatingRule_name,
+
+    -- * RoutingControl
+    RoutingControl (..),
+    newRoutingControl,
+    routingControl_controlPanelArn,
+    routingControl_name,
+    routingControl_routingControlArn,
+    routingControl_status,
+
+    -- * Rule
+    Rule (..),
+    newRule,
+    rule_assertion,
+    rule_gating,
+
+    -- * RuleConfig
+    RuleConfig (..),
+    newRuleConfig,
+    ruleConfig_type,
+    ruleConfig_inverted,
+    ruleConfig_threshold,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Route53RecoveryControlConfig.Types.AssertionRule
+import Amazonka.Route53RecoveryControlConfig.Types.AssertionRuleUpdate
+import Amazonka.Route53RecoveryControlConfig.Types.Cluster
+import Amazonka.Route53RecoveryControlConfig.Types.ClusterEndpoint
+import Amazonka.Route53RecoveryControlConfig.Types.ControlPanel
+import Amazonka.Route53RecoveryControlConfig.Types.GatingRule
+import Amazonka.Route53RecoveryControlConfig.Types.GatingRuleUpdate
+import Amazonka.Route53RecoveryControlConfig.Types.NewAssertionRule
+import Amazonka.Route53RecoveryControlConfig.Types.NewGatingRule
+import Amazonka.Route53RecoveryControlConfig.Types.RoutingControl
+import Amazonka.Route53RecoveryControlConfig.Types.Rule
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+import Amazonka.Route53RecoveryControlConfig.Types.RuleType
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-11-02@ of the Amazon Route53 Recovery Control Config SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev =
+        "Route53RecoveryControlConfig",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix =
+        "route53-recovery-control-config",
+      Core.signingName = "route53-recovery-control-config",
+      Core.version = "2020-11-02",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error =
+        Core.parseJSONError "Route53RecoveryControlConfig",
+      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
+
+-- | 403 response - You do not have sufficient access to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | 409 response - ConflictException. You might be using a predefined
+-- variable.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | 500 response - InternalServiceError. Temporary service error. Retry the
+-- request.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | 404 response - MalformedQueryString. The query string contains a syntax
+-- error or resource not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | 402 response - You attempted to create more resources than the service
+-- allows based on service quotas.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | 429 response - LimitExceededException or TooManyRequestsException.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | 400 response - Multiple causes. For example, you might have a malformed
+-- query string and input parameter might be out of range, or you might
+-- have used parameters together incorrectly.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRule.hs
@@ -0,0 +1,215 @@
+{-# 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.Route53RecoveryControlConfig.Types.AssertionRule
+-- 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.Route53RecoveryControlConfig.Types.AssertionRule 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
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+
+-- | An assertion rule enforces that, when you change a routing control
+-- state, that the criteria that you set in the rule configuration is met.
+-- Otherwise, the change to the routing control is not accepted. For
+-- example, the criteria might be that at least one routing control state
+-- is On after the transaction so that traffic continues to flow to at
+-- least one cell for the application. This ensures that you avoid a
+-- fail-open scenario.
+--
+-- /See:/ 'newAssertionRule' smart constructor.
+data AssertionRule = AssertionRule'
+  { -- | The deployment status of an assertion rule. Status can be one of the
+    -- following: PENDING, DEPLOYED, PENDING_DELETION.
+    status :: Status,
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the assertion rule.
+    safetyRuleArn :: Prelude.Text,
+    -- | The routing controls that are part of transactions that are evaluated to
+    -- determine if a request to change a routing control state is allowed. For
+    -- example, you might include three routing controls, one for each of three
+    -- Amazon Web Services Regions.
+    assertedControls :: [Prelude.Text],
+    -- | The criteria that you set for specific assertion routing controls
+    -- (AssertedControls) that designate how many routing control states must
+    -- be ON as the result of a transaction. For example, if you have three
+    -- assertion routing controls, you might specify ATLEAST 2 for your rule
+    -- configuration. This means that at least two assertion routing control
+    -- states must be ON, so that at least two Amazon Web Services Regions have
+    -- traffic flowing to them.
+    ruleConfig :: RuleConfig,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | Name of the assertion rule. You can use any non-white space character in
+    -- the name.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssertionRule' 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:
+--
+-- 'status', 'assertionRule_status' - The deployment status of an assertion rule. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+--
+-- 'controlPanelArn', 'assertionRule_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+--
+-- 'safetyRuleArn', 'assertionRule_safetyRuleArn' - The Amazon Resource Name (ARN) of the assertion rule.
+--
+-- 'assertedControls', 'assertionRule_assertedControls' - The routing controls that are part of transactions that are evaluated to
+-- determine if a request to change a routing control state is allowed. For
+-- example, you might include three routing controls, one for each of three
+-- Amazon Web Services Regions.
+--
+-- 'ruleConfig', 'assertionRule_ruleConfig' - The criteria that you set for specific assertion routing controls
+-- (AssertedControls) that designate how many routing control states must
+-- be ON as the result of a transaction. For example, if you have three
+-- assertion routing controls, you might specify ATLEAST 2 for your rule
+-- configuration. This means that at least two assertion routing control
+-- states must be ON, so that at least two Amazon Web Services Regions have
+-- traffic flowing to them.
+--
+-- 'waitPeriodMs', 'assertionRule_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'assertionRule_name' - Name of the assertion rule. You can use any non-white space character in
+-- the name.
+newAssertionRule ::
+  -- | 'status'
+  Status ->
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  -- | 'ruleConfig'
+  RuleConfig ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  AssertionRule
+newAssertionRule
+  pStatus_
+  pControlPanelArn_
+  pSafetyRuleArn_
+  pRuleConfig_
+  pWaitPeriodMs_
+  pName_ =
+    AssertionRule'
+      { status = pStatus_,
+        controlPanelArn = pControlPanelArn_,
+        safetyRuleArn = pSafetyRuleArn_,
+        assertedControls = Prelude.mempty,
+        ruleConfig = pRuleConfig_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | The deployment status of an assertion rule. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+assertionRule_status :: Lens.Lens' AssertionRule Status
+assertionRule_status = Lens.lens (\AssertionRule' {status} -> status) (\s@AssertionRule' {} a -> s {status = a} :: AssertionRule)
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+assertionRule_controlPanelArn :: Lens.Lens' AssertionRule Prelude.Text
+assertionRule_controlPanelArn = Lens.lens (\AssertionRule' {controlPanelArn} -> controlPanelArn) (\s@AssertionRule' {} a -> s {controlPanelArn = a} :: AssertionRule)
+
+-- | The Amazon Resource Name (ARN) of the assertion rule.
+assertionRule_safetyRuleArn :: Lens.Lens' AssertionRule Prelude.Text
+assertionRule_safetyRuleArn = Lens.lens (\AssertionRule' {safetyRuleArn} -> safetyRuleArn) (\s@AssertionRule' {} a -> s {safetyRuleArn = a} :: AssertionRule)
+
+-- | The routing controls that are part of transactions that are evaluated to
+-- determine if a request to change a routing control state is allowed. For
+-- example, you might include three routing controls, one for each of three
+-- Amazon Web Services Regions.
+assertionRule_assertedControls :: Lens.Lens' AssertionRule [Prelude.Text]
+assertionRule_assertedControls = Lens.lens (\AssertionRule' {assertedControls} -> assertedControls) (\s@AssertionRule' {} a -> s {assertedControls = a} :: AssertionRule) Prelude.. Lens.coerced
+
+-- | The criteria that you set for specific assertion routing controls
+-- (AssertedControls) that designate how many routing control states must
+-- be ON as the result of a transaction. For example, if you have three
+-- assertion routing controls, you might specify ATLEAST 2 for your rule
+-- configuration. This means that at least two assertion routing control
+-- states must be ON, so that at least two Amazon Web Services Regions have
+-- traffic flowing to them.
+assertionRule_ruleConfig :: Lens.Lens' AssertionRule RuleConfig
+assertionRule_ruleConfig = Lens.lens (\AssertionRule' {ruleConfig} -> ruleConfig) (\s@AssertionRule' {} a -> s {ruleConfig = a} :: AssertionRule)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+assertionRule_waitPeriodMs :: Lens.Lens' AssertionRule Prelude.Int
+assertionRule_waitPeriodMs = Lens.lens (\AssertionRule' {waitPeriodMs} -> waitPeriodMs) (\s@AssertionRule' {} a -> s {waitPeriodMs = a} :: AssertionRule)
+
+-- | Name of the assertion rule. You can use any non-white space character in
+-- the name.
+assertionRule_name :: Lens.Lens' AssertionRule Prelude.Text
+assertionRule_name = Lens.lens (\AssertionRule' {name} -> name) (\s@AssertionRule' {} a -> s {name = a} :: AssertionRule)
+
+instance Data.FromJSON AssertionRule where
+  parseJSON =
+    Data.withObject
+      "AssertionRule"
+      ( \x ->
+          AssertionRule'
+            Prelude.<$> (x Data..: "Status")
+            Prelude.<*> (x Data..: "ControlPanelArn")
+            Prelude.<*> (x Data..: "SafetyRuleArn")
+            Prelude.<*> ( x
+                            Data..:? "AssertedControls"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "RuleConfig")
+            Prelude.<*> (x Data..: "WaitPeriodMs")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable AssertionRule where
+  hashWithSalt _salt AssertionRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` safetyRuleArn
+      `Prelude.hashWithSalt` assertedControls
+      `Prelude.hashWithSalt` ruleConfig
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData AssertionRule where
+  rnf AssertionRule' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf safetyRuleArn
+      `Prelude.seq` Prelude.rnf assertedControls
+      `Prelude.seq` Prelude.rnf ruleConfig
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRuleUpdate.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRuleUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/AssertionRuleUpdate.hs
@@ -0,0 +1,120 @@
+{-# 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.Route53RecoveryControlConfig.Types.AssertionRuleUpdate
+-- 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.Route53RecoveryControlConfig.Types.AssertionRuleUpdate 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 update to an assertion rule. You can update the name or the
+-- evaluation period (wait period). If you don\'t specify one of the items
+-- to update, the item is unchanged.
+--
+-- /See:/ 'newAssertionRuleUpdate' smart constructor.
+data AssertionRuleUpdate = AssertionRuleUpdate'
+  { -- | The Amazon Resource Name (ARN) of the assertion rule.
+    safetyRuleArn :: Prelude.Text,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | The name of the assertion rule. You can use any non-white space
+    -- character in the name.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssertionRuleUpdate' 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:
+--
+-- 'safetyRuleArn', 'assertionRuleUpdate_safetyRuleArn' - The Amazon Resource Name (ARN) of the assertion rule.
+--
+-- 'waitPeriodMs', 'assertionRuleUpdate_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'assertionRuleUpdate_name' - The name of the assertion rule. You can use any non-white space
+-- character in the name.
+newAssertionRuleUpdate ::
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  AssertionRuleUpdate
+newAssertionRuleUpdate
+  pSafetyRuleArn_
+  pWaitPeriodMs_
+  pName_ =
+    AssertionRuleUpdate'
+      { safetyRuleArn =
+          pSafetyRuleArn_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | The Amazon Resource Name (ARN) of the assertion rule.
+assertionRuleUpdate_safetyRuleArn :: Lens.Lens' AssertionRuleUpdate Prelude.Text
+assertionRuleUpdate_safetyRuleArn = Lens.lens (\AssertionRuleUpdate' {safetyRuleArn} -> safetyRuleArn) (\s@AssertionRuleUpdate' {} a -> s {safetyRuleArn = a} :: AssertionRuleUpdate)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+assertionRuleUpdate_waitPeriodMs :: Lens.Lens' AssertionRuleUpdate Prelude.Int
+assertionRuleUpdate_waitPeriodMs = Lens.lens (\AssertionRuleUpdate' {waitPeriodMs} -> waitPeriodMs) (\s@AssertionRuleUpdate' {} a -> s {waitPeriodMs = a} :: AssertionRuleUpdate)
+
+-- | The name of the assertion rule. You can use any non-white space
+-- character in the name.
+assertionRuleUpdate_name :: Lens.Lens' AssertionRuleUpdate Prelude.Text
+assertionRuleUpdate_name = Lens.lens (\AssertionRuleUpdate' {name} -> name) (\s@AssertionRuleUpdate' {} a -> s {name = a} :: AssertionRuleUpdate)
+
+instance Prelude.Hashable AssertionRuleUpdate where
+  hashWithSalt _salt AssertionRuleUpdate' {..} =
+    _salt
+      `Prelude.hashWithSalt` safetyRuleArn
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData AssertionRuleUpdate where
+  rnf AssertionRuleUpdate' {..} =
+    Prelude.rnf safetyRuleArn
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON AssertionRuleUpdate where
+  toJSON AssertionRuleUpdate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("SafetyRuleArn" Data..= safetyRuleArn),
+            Prelude.Just ("WaitPeriodMs" Data..= waitPeriodMs),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/Cluster.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/Cluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/Cluster.hs
@@ -0,0 +1,130 @@
+{-# 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.Route53RecoveryControlConfig.Types.Cluster
+-- 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.Route53RecoveryControlConfig.Types.Cluster 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
+import Amazonka.Route53RecoveryControlConfig.Types.ClusterEndpoint
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+
+-- | A set of five redundant Regional endpoints against which you can execute
+-- API calls to update or get the state of routing controls. You can host
+-- multiple control panels and routing controls on one cluster.
+--
+-- /See:/ 'newCluster' smart constructor.
+data Cluster = Cluster'
+  { -- | The Amazon Resource Name (ARN) of the cluster.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | Endpoints for a cluster. Specify one of these endpoints when you want to
+    -- set or retrieve a routing control state in the cluster.
+    --
+    -- To get or update the routing control state, see the Amazon Route 53
+    -- Application Recovery Controller Routing Control Actions.
+    clusterEndpoints :: Prelude.Maybe [ClusterEndpoint],
+    -- | The name of the cluster.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Deployment status of a resource. Status can be one of the following:
+    -- PENDING, DEPLOYED, PENDING_DELETION.
+    status :: Prelude.Maybe Status
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Cluster' 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:
+--
+-- 'clusterArn', 'cluster_clusterArn' - The Amazon Resource Name (ARN) of the cluster.
+--
+-- 'clusterEndpoints', 'cluster_clusterEndpoints' - Endpoints for a cluster. Specify one of these endpoints when you want to
+-- set or retrieve a routing control state in the cluster.
+--
+-- To get or update the routing control state, see the Amazon Route 53
+-- Application Recovery Controller Routing Control Actions.
+--
+-- 'name', 'cluster_name' - The name of the cluster.
+--
+-- 'status', 'cluster_status' - Deployment status of a resource. Status can be one of the following:
+-- PENDING, DEPLOYED, PENDING_DELETION.
+newCluster ::
+  Cluster
+newCluster =
+  Cluster'
+    { clusterArn = Prelude.Nothing,
+      clusterEndpoints = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster.
+cluster_clusterArn :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_clusterArn = Lens.lens (\Cluster' {clusterArn} -> clusterArn) (\s@Cluster' {} a -> s {clusterArn = a} :: Cluster)
+
+-- | Endpoints for a cluster. Specify one of these endpoints when you want to
+-- set or retrieve a routing control state in the cluster.
+--
+-- To get or update the routing control state, see the Amazon Route 53
+-- Application Recovery Controller Routing Control Actions.
+cluster_clusterEndpoints :: Lens.Lens' Cluster (Prelude.Maybe [ClusterEndpoint])
+cluster_clusterEndpoints = Lens.lens (\Cluster' {clusterEndpoints} -> clusterEndpoints) (\s@Cluster' {} a -> s {clusterEndpoints = a} :: Cluster) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the cluster.
+cluster_name :: Lens.Lens' Cluster (Prelude.Maybe Prelude.Text)
+cluster_name = Lens.lens (\Cluster' {name} -> name) (\s@Cluster' {} a -> s {name = a} :: Cluster)
+
+-- | Deployment status of a resource. Status can be one of the following:
+-- PENDING, DEPLOYED, PENDING_DELETION.
+cluster_status :: Lens.Lens' Cluster (Prelude.Maybe Status)
+cluster_status = Lens.lens (\Cluster' {status} -> status) (\s@Cluster' {} a -> s {status = a} :: Cluster)
+
+instance Data.FromJSON Cluster where
+  parseJSON =
+    Data.withObject
+      "Cluster"
+      ( \x ->
+          Cluster'
+            Prelude.<$> (x Data..:? "ClusterArn")
+            Prelude.<*> ( x
+                            Data..:? "ClusterEndpoints"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable Cluster where
+  hashWithSalt _salt Cluster' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` clusterEndpoints
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Cluster where
+  rnf Cluster' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf clusterEndpoints
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/ClusterEndpoint.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/ClusterEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/ClusterEndpoint.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.Route53RecoveryControlConfig.Types.ClusterEndpoint
+-- 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.Route53RecoveryControlConfig.Types.ClusterEndpoint 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 cluster endpoint. Specify an endpoint when you want to set or retrieve
+-- a routing control state in the cluster.
+--
+-- /See:/ 'newClusterEndpoint' smart constructor.
+data ClusterEndpoint = ClusterEndpoint'
+  { -- | A cluster endpoint. Specify an endpoint and Amazon Web Services Region
+    -- when you want to set or retrieve a routing control state in the cluster.
+    --
+    -- To get or update the routing control state, see the Amazon Route 53
+    -- Application Recovery Controller Routing Control Actions.
+    endpoint :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services Region for a cluster endpoint.
+    region :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ClusterEndpoint' 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:
+--
+-- 'endpoint', 'clusterEndpoint_endpoint' - A cluster endpoint. Specify an endpoint and Amazon Web Services Region
+-- when you want to set or retrieve a routing control state in the cluster.
+--
+-- To get or update the routing control state, see the Amazon Route 53
+-- Application Recovery Controller Routing Control Actions.
+--
+-- 'region', 'clusterEndpoint_region' - The Amazon Web Services Region for a cluster endpoint.
+newClusterEndpoint ::
+  ClusterEndpoint
+newClusterEndpoint =
+  ClusterEndpoint'
+    { endpoint = Prelude.Nothing,
+      region = Prelude.Nothing
+    }
+
+-- | A cluster endpoint. Specify an endpoint and Amazon Web Services Region
+-- when you want to set or retrieve a routing control state in the cluster.
+--
+-- To get or update the routing control state, see the Amazon Route 53
+-- Application Recovery Controller Routing Control Actions.
+clusterEndpoint_endpoint :: Lens.Lens' ClusterEndpoint (Prelude.Maybe Prelude.Text)
+clusterEndpoint_endpoint = Lens.lens (\ClusterEndpoint' {endpoint} -> endpoint) (\s@ClusterEndpoint' {} a -> s {endpoint = a} :: ClusterEndpoint)
+
+-- | The Amazon Web Services Region for a cluster endpoint.
+clusterEndpoint_region :: Lens.Lens' ClusterEndpoint (Prelude.Maybe Prelude.Text)
+clusterEndpoint_region = Lens.lens (\ClusterEndpoint' {region} -> region) (\s@ClusterEndpoint' {} a -> s {region = a} :: ClusterEndpoint)
+
+instance Data.FromJSON ClusterEndpoint where
+  parseJSON =
+    Data.withObject
+      "ClusterEndpoint"
+      ( \x ->
+          ClusterEndpoint'
+            Prelude.<$> (x Data..:? "Endpoint")
+            Prelude.<*> (x Data..:? "Region")
+      )
+
+instance Prelude.Hashable ClusterEndpoint where
+  hashWithSalt _salt ClusterEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` endpoint
+      `Prelude.hashWithSalt` region
+
+instance Prelude.NFData ClusterEndpoint where
+  rnf ClusterEndpoint' {..} =
+    Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf region
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/ControlPanel.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/ControlPanel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/ControlPanel.hs
@@ -0,0 +1,155 @@
+{-# 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.Route53RecoveryControlConfig.Types.ControlPanel
+-- 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.Route53RecoveryControlConfig.Types.ControlPanel 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
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+
+-- | A control panel represents a group of routing controls that can be
+-- changed together in a single transaction.
+--
+-- /See:/ 'newControlPanel' smart constructor.
+data ControlPanel = ControlPanel'
+  { -- | The Amazon Resource Name (ARN) of the cluster that includes the control
+    -- panel.
+    clusterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Maybe Prelude.Text,
+    -- | A flag that Amazon Route 53 Application Recovery Controller sets to true
+    -- to designate the default control panel for a cluster. When you create a
+    -- cluster, Amazon Route 53 Application Recovery Controller creates a
+    -- control panel, and sets this flag for that control panel. If you create
+    -- a control panel yourself, this flag is set to false.
+    defaultControlPanel :: Prelude.Maybe Prelude.Bool,
+    -- | The name of the control panel. You can use any non-white space character
+    -- in the name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The number of routing controls in the control panel.
+    routingControlCount :: Prelude.Maybe Prelude.Int,
+    -- | The deployment status of control panel. Status can be one of the
+    -- following: PENDING, DEPLOYED, PENDING_DELETION.
+    status :: Prelude.Maybe Status
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ControlPanel' 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:
+--
+-- 'clusterArn', 'controlPanel_clusterArn' - The Amazon Resource Name (ARN) of the cluster that includes the control
+-- panel.
+--
+-- 'controlPanelArn', 'controlPanel_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+--
+-- 'defaultControlPanel', 'controlPanel_defaultControlPanel' - A flag that Amazon Route 53 Application Recovery Controller sets to true
+-- to designate the default control panel for a cluster. When you create a
+-- cluster, Amazon Route 53 Application Recovery Controller creates a
+-- control panel, and sets this flag for that control panel. If you create
+-- a control panel yourself, this flag is set to false.
+--
+-- 'name', 'controlPanel_name' - The name of the control panel. You can use any non-white space character
+-- in the name.
+--
+-- 'routingControlCount', 'controlPanel_routingControlCount' - The number of routing controls in the control panel.
+--
+-- 'status', 'controlPanel_status' - The deployment status of control panel. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+newControlPanel ::
+  ControlPanel
+newControlPanel =
+  ControlPanel'
+    { clusterArn = Prelude.Nothing,
+      controlPanelArn = Prelude.Nothing,
+      defaultControlPanel = Prelude.Nothing,
+      name = Prelude.Nothing,
+      routingControlCount = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the cluster that includes the control
+-- panel.
+controlPanel_clusterArn :: Lens.Lens' ControlPanel (Prelude.Maybe Prelude.Text)
+controlPanel_clusterArn = Lens.lens (\ControlPanel' {clusterArn} -> clusterArn) (\s@ControlPanel' {} a -> s {clusterArn = a} :: ControlPanel)
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+controlPanel_controlPanelArn :: Lens.Lens' ControlPanel (Prelude.Maybe Prelude.Text)
+controlPanel_controlPanelArn = Lens.lens (\ControlPanel' {controlPanelArn} -> controlPanelArn) (\s@ControlPanel' {} a -> s {controlPanelArn = a} :: ControlPanel)
+
+-- | A flag that Amazon Route 53 Application Recovery Controller sets to true
+-- to designate the default control panel for a cluster. When you create a
+-- cluster, Amazon Route 53 Application Recovery Controller creates a
+-- control panel, and sets this flag for that control panel. If you create
+-- a control panel yourself, this flag is set to false.
+controlPanel_defaultControlPanel :: Lens.Lens' ControlPanel (Prelude.Maybe Prelude.Bool)
+controlPanel_defaultControlPanel = Lens.lens (\ControlPanel' {defaultControlPanel} -> defaultControlPanel) (\s@ControlPanel' {} a -> s {defaultControlPanel = a} :: ControlPanel)
+
+-- | The name of the control panel. You can use any non-white space character
+-- in the name.
+controlPanel_name :: Lens.Lens' ControlPanel (Prelude.Maybe Prelude.Text)
+controlPanel_name = Lens.lens (\ControlPanel' {name} -> name) (\s@ControlPanel' {} a -> s {name = a} :: ControlPanel)
+
+-- | The number of routing controls in the control panel.
+controlPanel_routingControlCount :: Lens.Lens' ControlPanel (Prelude.Maybe Prelude.Int)
+controlPanel_routingControlCount = Lens.lens (\ControlPanel' {routingControlCount} -> routingControlCount) (\s@ControlPanel' {} a -> s {routingControlCount = a} :: ControlPanel)
+
+-- | The deployment status of control panel. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+controlPanel_status :: Lens.Lens' ControlPanel (Prelude.Maybe Status)
+controlPanel_status = Lens.lens (\ControlPanel' {status} -> status) (\s@ControlPanel' {} a -> s {status = a} :: ControlPanel)
+
+instance Data.FromJSON ControlPanel where
+  parseJSON =
+    Data.withObject
+      "ControlPanel"
+      ( \x ->
+          ControlPanel'
+            Prelude.<$> (x Data..:? "ClusterArn")
+            Prelude.<*> (x Data..:? "ControlPanelArn")
+            Prelude.<*> (x Data..:? "DefaultControlPanel")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "RoutingControlCount")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable ControlPanel where
+  hashWithSalt _salt ControlPanel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clusterArn
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` defaultControlPanel
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` routingControlCount
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ControlPanel where
+  rnf ControlPanel' {..} =
+    Prelude.rnf clusterArn
+      `Prelude.seq` Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf defaultControlPanel
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf routingControlCount
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRule.hs
@@ -0,0 +1,234 @@
+{-# 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.Route53RecoveryControlConfig.Types.GatingRule
+-- 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.Route53RecoveryControlConfig.Types.GatingRule 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
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+
+-- | A gating rule verifies that a gating routing control or set of gating
+-- routing controls, evaluates as true, based on a rule configuration that
+-- you specify, which allows a set of routing control state changes to
+-- complete.
+--
+-- For example, if you specify one gating routing control and you set the
+-- Type in the rule configuration to OR, that indicates that you must set
+-- the gating routing control to On for the rule to evaluate as true; that
+-- is, for the gating control \"switch\" to be \"On\". When you do that,
+-- then you can update the routing control states for the target routing
+-- controls that you specify in the gating rule.
+--
+-- /See:/ 'newGatingRule' smart constructor.
+data GatingRule = GatingRule'
+  { -- | The deployment status of a gating rule. Status can be one of the
+    -- following: PENDING, DEPLOYED, PENDING_DELETION.
+    status :: Status,
+    -- | An array of target routing control Amazon Resource Names (ARNs) for
+    -- which the states can only be updated if the rule configuration that you
+    -- specify evaluates to true for the gating routing control. As a simple
+    -- example, if you have a single gating control, it acts as an overall
+    -- \"on\/off\" switch for a set of target routing controls. You can use
+    -- this to manually override automated failover, for example.
+    targetControls :: [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the gating rule.
+    safetyRuleArn :: Prelude.Text,
+    -- | An array of gating routing control Amazon Resource Names (ARNs). For a
+    -- simple \"on\/off\" switch, specify the ARN for one routing control. The
+    -- gating routing controls are evaluated by the rule configuration that you
+    -- specify to determine if the target routing control states can be
+    -- changed.
+    gatingControls :: [Prelude.Text],
+    -- | The criteria that you set for gating routing controls that designate how
+    -- many of the routing control states must be ON to allow you to update
+    -- target routing control states.
+    ruleConfig :: RuleConfig,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | The name for the gating rule. You can use any non-white space character
+    -- in the name.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatingRule' 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:
+--
+-- 'status', 'gatingRule_status' - The deployment status of a gating rule. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+--
+-- 'targetControls', 'gatingRule_targetControls' - An array of target routing control Amazon Resource Names (ARNs) for
+-- which the states can only be updated if the rule configuration that you
+-- specify evaluates to true for the gating routing control. As a simple
+-- example, if you have a single gating control, it acts as an overall
+-- \"on\/off\" switch for a set of target routing controls. You can use
+-- this to manually override automated failover, for example.
+--
+-- 'controlPanelArn', 'gatingRule_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+--
+-- 'safetyRuleArn', 'gatingRule_safetyRuleArn' - The Amazon Resource Name (ARN) of the gating rule.
+--
+-- 'gatingControls', 'gatingRule_gatingControls' - An array of gating routing control Amazon Resource Names (ARNs). For a
+-- simple \"on\/off\" switch, specify the ARN for one routing control. The
+-- gating routing controls are evaluated by the rule configuration that you
+-- specify to determine if the target routing control states can be
+-- changed.
+--
+-- 'ruleConfig', 'gatingRule_ruleConfig' - The criteria that you set for gating routing controls that designate how
+-- many of the routing control states must be ON to allow you to update
+-- target routing control states.
+--
+-- 'waitPeriodMs', 'gatingRule_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'gatingRule_name' - The name for the gating rule. You can use any non-white space character
+-- in the name.
+newGatingRule ::
+  -- | 'status'
+  Status ->
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  -- | 'ruleConfig'
+  RuleConfig ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  GatingRule
+newGatingRule
+  pStatus_
+  pControlPanelArn_
+  pSafetyRuleArn_
+  pRuleConfig_
+  pWaitPeriodMs_
+  pName_ =
+    GatingRule'
+      { status = pStatus_,
+        targetControls = Prelude.mempty,
+        controlPanelArn = pControlPanelArn_,
+        safetyRuleArn = pSafetyRuleArn_,
+        gatingControls = Prelude.mempty,
+        ruleConfig = pRuleConfig_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | The deployment status of a gating rule. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+gatingRule_status :: Lens.Lens' GatingRule Status
+gatingRule_status = Lens.lens (\GatingRule' {status} -> status) (\s@GatingRule' {} a -> s {status = a} :: GatingRule)
+
+-- | An array of target routing control Amazon Resource Names (ARNs) for
+-- which the states can only be updated if the rule configuration that you
+-- specify evaluates to true for the gating routing control. As a simple
+-- example, if you have a single gating control, it acts as an overall
+-- \"on\/off\" switch for a set of target routing controls. You can use
+-- this to manually override automated failover, for example.
+gatingRule_targetControls :: Lens.Lens' GatingRule [Prelude.Text]
+gatingRule_targetControls = Lens.lens (\GatingRule' {targetControls} -> targetControls) (\s@GatingRule' {} a -> s {targetControls = a} :: GatingRule) Prelude.. Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+gatingRule_controlPanelArn :: Lens.Lens' GatingRule Prelude.Text
+gatingRule_controlPanelArn = Lens.lens (\GatingRule' {controlPanelArn} -> controlPanelArn) (\s@GatingRule' {} a -> s {controlPanelArn = a} :: GatingRule)
+
+-- | The Amazon Resource Name (ARN) of the gating rule.
+gatingRule_safetyRuleArn :: Lens.Lens' GatingRule Prelude.Text
+gatingRule_safetyRuleArn = Lens.lens (\GatingRule' {safetyRuleArn} -> safetyRuleArn) (\s@GatingRule' {} a -> s {safetyRuleArn = a} :: GatingRule)
+
+-- | An array of gating routing control Amazon Resource Names (ARNs). For a
+-- simple \"on\/off\" switch, specify the ARN for one routing control. The
+-- gating routing controls are evaluated by the rule configuration that you
+-- specify to determine if the target routing control states can be
+-- changed.
+gatingRule_gatingControls :: Lens.Lens' GatingRule [Prelude.Text]
+gatingRule_gatingControls = Lens.lens (\GatingRule' {gatingControls} -> gatingControls) (\s@GatingRule' {} a -> s {gatingControls = a} :: GatingRule) Prelude.. Lens.coerced
+
+-- | The criteria that you set for gating routing controls that designate how
+-- many of the routing control states must be ON to allow you to update
+-- target routing control states.
+gatingRule_ruleConfig :: Lens.Lens' GatingRule RuleConfig
+gatingRule_ruleConfig = Lens.lens (\GatingRule' {ruleConfig} -> ruleConfig) (\s@GatingRule' {} a -> s {ruleConfig = a} :: GatingRule)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+gatingRule_waitPeriodMs :: Lens.Lens' GatingRule Prelude.Int
+gatingRule_waitPeriodMs = Lens.lens (\GatingRule' {waitPeriodMs} -> waitPeriodMs) (\s@GatingRule' {} a -> s {waitPeriodMs = a} :: GatingRule)
+
+-- | The name for the gating rule. You can use any non-white space character
+-- in the name.
+gatingRule_name :: Lens.Lens' GatingRule Prelude.Text
+gatingRule_name = Lens.lens (\GatingRule' {name} -> name) (\s@GatingRule' {} a -> s {name = a} :: GatingRule)
+
+instance Data.FromJSON GatingRule where
+  parseJSON =
+    Data.withObject
+      "GatingRule"
+      ( \x ->
+          GatingRule'
+            Prelude.<$> (x Data..: "Status")
+            Prelude.<*> (x Data..:? "TargetControls" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "ControlPanelArn")
+            Prelude.<*> (x Data..: "SafetyRuleArn")
+            Prelude.<*> (x Data..:? "GatingControls" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "RuleConfig")
+            Prelude.<*> (x Data..: "WaitPeriodMs")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable GatingRule where
+  hashWithSalt _salt GatingRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` targetControls
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` safetyRuleArn
+      `Prelude.hashWithSalt` gatingControls
+      `Prelude.hashWithSalt` ruleConfig
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData GatingRule where
+  rnf GatingRule' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf targetControls
+      `Prelude.seq` Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf safetyRuleArn
+      `Prelude.seq` Prelude.rnf gatingControls
+      `Prelude.seq` Prelude.rnf ruleConfig
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRuleUpdate.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRuleUpdate.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/GatingRuleUpdate.hs
@@ -0,0 +1,119 @@
+{-# 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.Route53RecoveryControlConfig.Types.GatingRuleUpdate
+-- 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.Route53RecoveryControlConfig.Types.GatingRuleUpdate 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
+
+-- | Update to a gating rule. You can update the name or the evaluation
+-- period (wait period). If you don\'t specify one of the items to update,
+-- the item is unchanged.
+--
+-- /See:/ 'newGatingRuleUpdate' smart constructor.
+data GatingRuleUpdate = GatingRuleUpdate'
+  { -- | The Amazon Resource Name (ARN) of the gating rule.
+    safetyRuleArn :: Prelude.Text,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | The name for the gating rule. You can use any non-white space character
+    -- in the name.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatingRuleUpdate' 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:
+--
+-- 'safetyRuleArn', 'gatingRuleUpdate_safetyRuleArn' - The Amazon Resource Name (ARN) of the gating rule.
+--
+-- 'waitPeriodMs', 'gatingRuleUpdate_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'gatingRuleUpdate_name' - The name for the gating rule. You can use any non-white space character
+-- in the name.
+newGatingRuleUpdate ::
+  -- | 'safetyRuleArn'
+  Prelude.Text ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  GatingRuleUpdate
+newGatingRuleUpdate
+  pSafetyRuleArn_
+  pWaitPeriodMs_
+  pName_ =
+    GatingRuleUpdate'
+      { safetyRuleArn = pSafetyRuleArn_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | The Amazon Resource Name (ARN) of the gating rule.
+gatingRuleUpdate_safetyRuleArn :: Lens.Lens' GatingRuleUpdate Prelude.Text
+gatingRuleUpdate_safetyRuleArn = Lens.lens (\GatingRuleUpdate' {safetyRuleArn} -> safetyRuleArn) (\s@GatingRuleUpdate' {} a -> s {safetyRuleArn = a} :: GatingRuleUpdate)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+gatingRuleUpdate_waitPeriodMs :: Lens.Lens' GatingRuleUpdate Prelude.Int
+gatingRuleUpdate_waitPeriodMs = Lens.lens (\GatingRuleUpdate' {waitPeriodMs} -> waitPeriodMs) (\s@GatingRuleUpdate' {} a -> s {waitPeriodMs = a} :: GatingRuleUpdate)
+
+-- | The name for the gating rule. You can use any non-white space character
+-- in the name.
+gatingRuleUpdate_name :: Lens.Lens' GatingRuleUpdate Prelude.Text
+gatingRuleUpdate_name = Lens.lens (\GatingRuleUpdate' {name} -> name) (\s@GatingRuleUpdate' {} a -> s {name = a} :: GatingRuleUpdate)
+
+instance Prelude.Hashable GatingRuleUpdate where
+  hashWithSalt _salt GatingRuleUpdate' {..} =
+    _salt
+      `Prelude.hashWithSalt` safetyRuleArn
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData GatingRuleUpdate where
+  rnf GatingRuleUpdate' {..} =
+    Prelude.rnf safetyRuleArn
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON GatingRuleUpdate where
+  toJSON GatingRuleUpdate' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("SafetyRuleArn" Data..= safetyRuleArn),
+            Prelude.Just ("WaitPeriodMs" Data..= waitPeriodMs),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/NewAssertionRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/NewAssertionRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/NewAssertionRule.hs
@@ -0,0 +1,171 @@
+{-# 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.Route53RecoveryControlConfig.Types.NewAssertionRule
+-- 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.Route53RecoveryControlConfig.Types.NewAssertionRule 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
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+
+-- | A new assertion rule for a control panel.
+--
+-- /See:/ 'newNewAssertionRule' smart constructor.
+data NewAssertionRule = NewAssertionRule'
+  { -- | The Amazon Resource Name (ARN) for the control panel.
+    controlPanelArn :: Prelude.Text,
+    -- | The routing controls that are part of transactions that are evaluated to
+    -- determine if a request to change a routing control state is allowed. For
+    -- example, you might include three routing controls, one for each of three
+    -- Amazon Web Services Regions.
+    assertedControls :: [Prelude.Text],
+    -- | The criteria that you set for specific assertion controls (routing
+    -- controls) that designate how many control states must be ON as the
+    -- result of a transaction. For example, if you have three assertion
+    -- controls, you might specify ATLEAST 2 for your rule configuration. This
+    -- means that at least two assertion controls must be ON, so that at least
+    -- two Amazon Web Services Regions have traffic flowing to them.
+    ruleConfig :: RuleConfig,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | The name of the assertion rule. You can use any non-white space
+    -- character in the name.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NewAssertionRule' 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:
+--
+-- 'controlPanelArn', 'newAssertionRule_controlPanelArn' - The Amazon Resource Name (ARN) for the control panel.
+--
+-- 'assertedControls', 'newAssertionRule_assertedControls' - The routing controls that are part of transactions that are evaluated to
+-- determine if a request to change a routing control state is allowed. For
+-- example, you might include three routing controls, one for each of three
+-- Amazon Web Services Regions.
+--
+-- 'ruleConfig', 'newAssertionRule_ruleConfig' - The criteria that you set for specific assertion controls (routing
+-- controls) that designate how many control states must be ON as the
+-- result of a transaction. For example, if you have three assertion
+-- controls, you might specify ATLEAST 2 for your rule configuration. This
+-- means that at least two assertion controls must be ON, so that at least
+-- two Amazon Web Services Regions have traffic flowing to them.
+--
+-- 'waitPeriodMs', 'newAssertionRule_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'newAssertionRule_name' - The name of the assertion rule. You can use any non-white space
+-- character in the name.
+newNewAssertionRule ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  -- | 'ruleConfig'
+  RuleConfig ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  NewAssertionRule
+newNewAssertionRule
+  pControlPanelArn_
+  pRuleConfig_
+  pWaitPeriodMs_
+  pName_ =
+    NewAssertionRule'
+      { controlPanelArn =
+          pControlPanelArn_,
+        assertedControls = Prelude.mempty,
+        ruleConfig = pRuleConfig_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | The Amazon Resource Name (ARN) for the control panel.
+newAssertionRule_controlPanelArn :: Lens.Lens' NewAssertionRule Prelude.Text
+newAssertionRule_controlPanelArn = Lens.lens (\NewAssertionRule' {controlPanelArn} -> controlPanelArn) (\s@NewAssertionRule' {} a -> s {controlPanelArn = a} :: NewAssertionRule)
+
+-- | The routing controls that are part of transactions that are evaluated to
+-- determine if a request to change a routing control state is allowed. For
+-- example, you might include three routing controls, one for each of three
+-- Amazon Web Services Regions.
+newAssertionRule_assertedControls :: Lens.Lens' NewAssertionRule [Prelude.Text]
+newAssertionRule_assertedControls = Lens.lens (\NewAssertionRule' {assertedControls} -> assertedControls) (\s@NewAssertionRule' {} a -> s {assertedControls = a} :: NewAssertionRule) Prelude.. Lens.coerced
+
+-- | The criteria that you set for specific assertion controls (routing
+-- controls) that designate how many control states must be ON as the
+-- result of a transaction. For example, if you have three assertion
+-- controls, you might specify ATLEAST 2 for your rule configuration. This
+-- means that at least two assertion controls must be ON, so that at least
+-- two Amazon Web Services Regions have traffic flowing to them.
+newAssertionRule_ruleConfig :: Lens.Lens' NewAssertionRule RuleConfig
+newAssertionRule_ruleConfig = Lens.lens (\NewAssertionRule' {ruleConfig} -> ruleConfig) (\s@NewAssertionRule' {} a -> s {ruleConfig = a} :: NewAssertionRule)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+newAssertionRule_waitPeriodMs :: Lens.Lens' NewAssertionRule Prelude.Int
+newAssertionRule_waitPeriodMs = Lens.lens (\NewAssertionRule' {waitPeriodMs} -> waitPeriodMs) (\s@NewAssertionRule' {} a -> s {waitPeriodMs = a} :: NewAssertionRule)
+
+-- | The name of the assertion rule. You can use any non-white space
+-- character in the name.
+newAssertionRule_name :: Lens.Lens' NewAssertionRule Prelude.Text
+newAssertionRule_name = Lens.lens (\NewAssertionRule' {name} -> name) (\s@NewAssertionRule' {} a -> s {name = a} :: NewAssertionRule)
+
+instance Prelude.Hashable NewAssertionRule where
+  hashWithSalt _salt NewAssertionRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` assertedControls
+      `Prelude.hashWithSalt` ruleConfig
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData NewAssertionRule where
+  rnf NewAssertionRule' {..} =
+    Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf assertedControls
+      `Prelude.seq` Prelude.rnf ruleConfig
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON NewAssertionRule where
+  toJSON NewAssertionRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ControlPanelArn" Data..= controlPanelArn),
+            Prelude.Just
+              ("AssertedControls" Data..= assertedControls),
+            Prelude.Just ("RuleConfig" Data..= ruleConfig),
+            Prelude.Just ("WaitPeriodMs" Data..= waitPeriodMs),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/NewGatingRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/NewGatingRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/NewGatingRule.hs
@@ -0,0 +1,195 @@
+{-# 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.Route53RecoveryControlConfig.Types.NewGatingRule
+-- 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.Route53RecoveryControlConfig.Types.NewGatingRule 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
+import Amazonka.Route53RecoveryControlConfig.Types.RuleConfig
+
+-- | A new gating rule for a control panel.
+--
+-- /See:/ 'newNewGatingRule' smart constructor.
+data NewGatingRule = NewGatingRule'
+  { -- | Routing controls that can only be set or unset if the specified
+    -- RuleConfig evaluates to true for the specified GatingControls. For
+    -- example, say you have three gating controls, one for each of three
+    -- Amazon Web Services Regions. Now you specify ATLEAST 2 as your
+    -- RuleConfig. With these settings, you can only change (set or unset) the
+    -- routing controls that you have specified as TargetControls if that rule
+    -- evaluates to true.
+    --
+    -- In other words, your ability to change the routing controls that you
+    -- have specified as TargetControls is gated by the rule that you set for
+    -- the routing controls in GatingControls.
+    targetControls :: [Prelude.Text],
+    -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text,
+    -- | The gating controls for the new gating rule. That is, routing controls
+    -- that are evaluated by the rule configuration that you specify.
+    gatingControls :: [Prelude.Text],
+    -- | The criteria that you set for specific gating controls (routing
+    -- controls) that designate how many control states must be ON to allow you
+    -- to change (set or unset) the target control states.
+    ruleConfig :: RuleConfig,
+    -- | An evaluation period, in milliseconds (ms), during which any request
+    -- against the target routing controls will fail. This helps prevent
+    -- \"flapping\" of state. The wait period is 5000 ms by default, but you
+    -- can choose a custom value.
+    waitPeriodMs :: Prelude.Int,
+    -- | The name for the new gating rule.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NewGatingRule' 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:
+--
+-- 'targetControls', 'newGatingRule_targetControls' - Routing controls that can only be set or unset if the specified
+-- RuleConfig evaluates to true for the specified GatingControls. For
+-- example, say you have three gating controls, one for each of three
+-- Amazon Web Services Regions. Now you specify ATLEAST 2 as your
+-- RuleConfig. With these settings, you can only change (set or unset) the
+-- routing controls that you have specified as TargetControls if that rule
+-- evaluates to true.
+--
+-- In other words, your ability to change the routing controls that you
+-- have specified as TargetControls is gated by the rule that you set for
+-- the routing controls in GatingControls.
+--
+-- 'controlPanelArn', 'newGatingRule_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+--
+-- 'gatingControls', 'newGatingRule_gatingControls' - The gating controls for the new gating rule. That is, routing controls
+-- that are evaluated by the rule configuration that you specify.
+--
+-- 'ruleConfig', 'newGatingRule_ruleConfig' - The criteria that you set for specific gating controls (routing
+-- controls) that designate how many control states must be ON to allow you
+-- to change (set or unset) the target control states.
+--
+-- 'waitPeriodMs', 'newGatingRule_waitPeriodMs' - An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+--
+-- 'name', 'newGatingRule_name' - The name for the new gating rule.
+newNewGatingRule ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  -- | 'ruleConfig'
+  RuleConfig ->
+  -- | 'waitPeriodMs'
+  Prelude.Int ->
+  -- | 'name'
+  Prelude.Text ->
+  NewGatingRule
+newNewGatingRule
+  pControlPanelArn_
+  pRuleConfig_
+  pWaitPeriodMs_
+  pName_ =
+    NewGatingRule'
+      { targetControls = Prelude.mempty,
+        controlPanelArn = pControlPanelArn_,
+        gatingControls = Prelude.mempty,
+        ruleConfig = pRuleConfig_,
+        waitPeriodMs = pWaitPeriodMs_,
+        name = pName_
+      }
+
+-- | Routing controls that can only be set or unset if the specified
+-- RuleConfig evaluates to true for the specified GatingControls. For
+-- example, say you have three gating controls, one for each of three
+-- Amazon Web Services Regions. Now you specify ATLEAST 2 as your
+-- RuleConfig. With these settings, you can only change (set or unset) the
+-- routing controls that you have specified as TargetControls if that rule
+-- evaluates to true.
+--
+-- In other words, your ability to change the routing controls that you
+-- have specified as TargetControls is gated by the rule that you set for
+-- the routing controls in GatingControls.
+newGatingRule_targetControls :: Lens.Lens' NewGatingRule [Prelude.Text]
+newGatingRule_targetControls = Lens.lens (\NewGatingRule' {targetControls} -> targetControls) (\s@NewGatingRule' {} a -> s {targetControls = a} :: NewGatingRule) Prelude.. Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+newGatingRule_controlPanelArn :: Lens.Lens' NewGatingRule Prelude.Text
+newGatingRule_controlPanelArn = Lens.lens (\NewGatingRule' {controlPanelArn} -> controlPanelArn) (\s@NewGatingRule' {} a -> s {controlPanelArn = a} :: NewGatingRule)
+
+-- | The gating controls for the new gating rule. That is, routing controls
+-- that are evaluated by the rule configuration that you specify.
+newGatingRule_gatingControls :: Lens.Lens' NewGatingRule [Prelude.Text]
+newGatingRule_gatingControls = Lens.lens (\NewGatingRule' {gatingControls} -> gatingControls) (\s@NewGatingRule' {} a -> s {gatingControls = a} :: NewGatingRule) Prelude.. Lens.coerced
+
+-- | The criteria that you set for specific gating controls (routing
+-- controls) that designate how many control states must be ON to allow you
+-- to change (set or unset) the target control states.
+newGatingRule_ruleConfig :: Lens.Lens' NewGatingRule RuleConfig
+newGatingRule_ruleConfig = Lens.lens (\NewGatingRule' {ruleConfig} -> ruleConfig) (\s@NewGatingRule' {} a -> s {ruleConfig = a} :: NewGatingRule)
+
+-- | An evaluation period, in milliseconds (ms), during which any request
+-- against the target routing controls will fail. This helps prevent
+-- \"flapping\" of state. The wait period is 5000 ms by default, but you
+-- can choose a custom value.
+newGatingRule_waitPeriodMs :: Lens.Lens' NewGatingRule Prelude.Int
+newGatingRule_waitPeriodMs = Lens.lens (\NewGatingRule' {waitPeriodMs} -> waitPeriodMs) (\s@NewGatingRule' {} a -> s {waitPeriodMs = a} :: NewGatingRule)
+
+-- | The name for the new gating rule.
+newGatingRule_name :: Lens.Lens' NewGatingRule Prelude.Text
+newGatingRule_name = Lens.lens (\NewGatingRule' {name} -> name) (\s@NewGatingRule' {} a -> s {name = a} :: NewGatingRule)
+
+instance Prelude.Hashable NewGatingRule where
+  hashWithSalt _salt NewGatingRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` targetControls
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` gatingControls
+      `Prelude.hashWithSalt` ruleConfig
+      `Prelude.hashWithSalt` waitPeriodMs
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData NewGatingRule where
+  rnf NewGatingRule' {..} =
+    Prelude.rnf targetControls
+      `Prelude.seq` Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf gatingControls
+      `Prelude.seq` Prelude.rnf ruleConfig
+      `Prelude.seq` Prelude.rnf waitPeriodMs
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON NewGatingRule where
+  toJSON NewGatingRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("TargetControls" Data..= targetControls),
+            Prelude.Just
+              ("ControlPanelArn" Data..= controlPanelArn),
+            Prelude.Just
+              ("GatingControls" Data..= gatingControls),
+            Prelude.Just ("RuleConfig" Data..= ruleConfig),
+            Prelude.Just ("WaitPeriodMs" Data..= waitPeriodMs),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/RoutingControl.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/RoutingControl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/RoutingControl.hs
@@ -0,0 +1,117 @@
+{-# 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.Route53RecoveryControlConfig.Types.RoutingControl
+-- 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.Route53RecoveryControlConfig.Types.RoutingControl 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
+import Amazonka.Route53RecoveryControlConfig.Types.Status
+
+-- | A routing control has one of two states: ON and OFF. You can map the
+-- routing control state to the state of an Amazon Route 53 health check,
+-- which can be used to control traffic routing.
+--
+-- /See:/ 'newRoutingControl' smart constructor.
+data RoutingControl = RoutingControl'
+  { -- | The Amazon Resource Name (ARN) of the control panel that includes the
+    -- routing control.
+    controlPanelArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the routing control.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the routing control.
+    routingControlArn :: Prelude.Maybe Prelude.Text,
+    -- | The deployment status of a routing control. Status can be one of the
+    -- following: PENDING, DEPLOYED, PENDING_DELETION.
+    status :: Prelude.Maybe Status
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RoutingControl' 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:
+--
+-- 'controlPanelArn', 'routingControl_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel that includes the
+-- routing control.
+--
+-- 'name', 'routingControl_name' - The name of the routing control.
+--
+-- 'routingControlArn', 'routingControl_routingControlArn' - The Amazon Resource Name (ARN) of the routing control.
+--
+-- 'status', 'routingControl_status' - The deployment status of a routing control. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+newRoutingControl ::
+  RoutingControl
+newRoutingControl =
+  RoutingControl'
+    { controlPanelArn = Prelude.Nothing,
+      name = Prelude.Nothing,
+      routingControlArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the control panel that includes the
+-- routing control.
+routingControl_controlPanelArn :: Lens.Lens' RoutingControl (Prelude.Maybe Prelude.Text)
+routingControl_controlPanelArn = Lens.lens (\RoutingControl' {controlPanelArn} -> controlPanelArn) (\s@RoutingControl' {} a -> s {controlPanelArn = a} :: RoutingControl)
+
+-- | The name of the routing control.
+routingControl_name :: Lens.Lens' RoutingControl (Prelude.Maybe Prelude.Text)
+routingControl_name = Lens.lens (\RoutingControl' {name} -> name) (\s@RoutingControl' {} a -> s {name = a} :: RoutingControl)
+
+-- | The Amazon Resource Name (ARN) of the routing control.
+routingControl_routingControlArn :: Lens.Lens' RoutingControl (Prelude.Maybe Prelude.Text)
+routingControl_routingControlArn = Lens.lens (\RoutingControl' {routingControlArn} -> routingControlArn) (\s@RoutingControl' {} a -> s {routingControlArn = a} :: RoutingControl)
+
+-- | The deployment status of a routing control. Status can be one of the
+-- following: PENDING, DEPLOYED, PENDING_DELETION.
+routingControl_status :: Lens.Lens' RoutingControl (Prelude.Maybe Status)
+routingControl_status = Lens.lens (\RoutingControl' {status} -> status) (\s@RoutingControl' {} a -> s {status = a} :: RoutingControl)
+
+instance Data.FromJSON RoutingControl where
+  parseJSON =
+    Data.withObject
+      "RoutingControl"
+      ( \x ->
+          RoutingControl'
+            Prelude.<$> (x Data..:? "ControlPanelArn")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "RoutingControlArn")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable RoutingControl where
+  hashWithSalt _salt RoutingControl' {..} =
+    _salt
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` routingControlArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData RoutingControl where
+  rnf RoutingControl' {..} =
+    Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf routingControlArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/Rule.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/Rule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/Rule.hs
@@ -0,0 +1,134 @@
+{-# 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.Route53RecoveryControlConfig.Types.Rule
+-- 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.Route53RecoveryControlConfig.Types.Rule 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
+import Amazonka.Route53RecoveryControlConfig.Types.AssertionRule
+import Amazonka.Route53RecoveryControlConfig.Types.GatingRule
+
+-- | A safety rule. A safety rule can be an assertion rule or a gating rule.
+--
+-- /See:/ 'newRule' smart constructor.
+data Rule = Rule'
+  { -- | An assertion rule enforces that, when a routing control state is
+    -- changed, the criteria set by the rule configuration is met. Otherwise,
+    -- the change to the routing control state is not accepted. For example,
+    -- the criteria might be that at least one routing control state is On
+    -- after the transaction so that traffic continues to flow to at least one
+    -- cell for the application. This ensures that you avoid a fail-open
+    -- scenario.
+    assertion :: Prelude.Maybe AssertionRule,
+    -- | A gating rule verifies that a gating routing control or set of gating
+    -- routing controls, evaluates as true, based on a rule configuration that
+    -- you specify, which allows a set of routing control state changes to
+    -- complete.
+    --
+    -- For example, if you specify one gating routing control and you set the
+    -- Type in the rule configuration to OR, that indicates that you must set
+    -- the gating routing control to On for the rule to evaluate as true; that
+    -- is, for the gating control \"switch\" to be \"On\". When you do that,
+    -- then you can update the routing control states for the target routing
+    -- controls that you specify in the gating rule.
+    gating :: Prelude.Maybe GatingRule
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Rule' 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:
+--
+-- 'assertion', 'rule_assertion' - An assertion rule enforces that, when a routing control state is
+-- changed, the criteria set by the rule configuration is met. Otherwise,
+-- the change to the routing control state is not accepted. For example,
+-- the criteria might be that at least one routing control state is On
+-- after the transaction so that traffic continues to flow to at least one
+-- cell for the application. This ensures that you avoid a fail-open
+-- scenario.
+--
+-- 'gating', 'rule_gating' - A gating rule verifies that a gating routing control or set of gating
+-- routing controls, evaluates as true, based on a rule configuration that
+-- you specify, which allows a set of routing control state changes to
+-- complete.
+--
+-- For example, if you specify one gating routing control and you set the
+-- Type in the rule configuration to OR, that indicates that you must set
+-- the gating routing control to On for the rule to evaluate as true; that
+-- is, for the gating control \"switch\" to be \"On\". When you do that,
+-- then you can update the routing control states for the target routing
+-- controls that you specify in the gating rule.
+newRule ::
+  Rule
+newRule =
+  Rule'
+    { assertion = Prelude.Nothing,
+      gating = Prelude.Nothing
+    }
+
+-- | An assertion rule enforces that, when a routing control state is
+-- changed, the criteria set by the rule configuration is met. Otherwise,
+-- the change to the routing control state is not accepted. For example,
+-- the criteria might be that at least one routing control state is On
+-- after the transaction so that traffic continues to flow to at least one
+-- cell for the application. This ensures that you avoid a fail-open
+-- scenario.
+rule_assertion :: Lens.Lens' Rule (Prelude.Maybe AssertionRule)
+rule_assertion = Lens.lens (\Rule' {assertion} -> assertion) (\s@Rule' {} a -> s {assertion = a} :: Rule)
+
+-- | A gating rule verifies that a gating routing control or set of gating
+-- routing controls, evaluates as true, based on a rule configuration that
+-- you specify, which allows a set of routing control state changes to
+-- complete.
+--
+-- For example, if you specify one gating routing control and you set the
+-- Type in the rule configuration to OR, that indicates that you must set
+-- the gating routing control to On for the rule to evaluate as true; that
+-- is, for the gating control \"switch\" to be \"On\". When you do that,
+-- then you can update the routing control states for the target routing
+-- controls that you specify in the gating rule.
+rule_gating :: Lens.Lens' Rule (Prelude.Maybe GatingRule)
+rule_gating = Lens.lens (\Rule' {gating} -> gating) (\s@Rule' {} a -> s {gating = a} :: Rule)
+
+instance Data.FromJSON Rule where
+  parseJSON =
+    Data.withObject
+      "Rule"
+      ( \x ->
+          Rule'
+            Prelude.<$> (x Data..:? "ASSERTION")
+            Prelude.<*> (x Data..:? "GATING")
+      )
+
+instance Prelude.Hashable Rule where
+  hashWithSalt _salt Rule' {..} =
+    _salt
+      `Prelude.hashWithSalt` assertion
+      `Prelude.hashWithSalt` gating
+
+instance Prelude.NFData Rule where
+  rnf Rule' {..} =
+    Prelude.rnf assertion
+      `Prelude.seq` Prelude.rnf gating
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleConfig.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleConfig.hs
@@ -0,0 +1,124 @@
+{-# 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.Route53RecoveryControlConfig.Types.RuleConfig
+-- 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.Route53RecoveryControlConfig.Types.RuleConfig 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
+import Amazonka.Route53RecoveryControlConfig.Types.RuleType
+
+-- | The rule configuration for an assertion rule. That is, the criteria that
+-- you set for specific assertion controls (routing controls) that specify
+-- how many control states must be ON after a transaction completes.
+--
+-- /See:/ 'newRuleConfig' smart constructor.
+data RuleConfig = RuleConfig'
+  { -- | A rule can be one of the following: ATLEAST, AND, or OR.
+    type' :: RuleType,
+    -- | Logical negation of the rule. If the rule would usually evaluate true,
+    -- it\'s evaluated as false, and vice versa.
+    inverted :: Prelude.Bool,
+    -- | The value of N, when you specify an ATLEAST rule type. That is,
+    -- Threshold is the number of controls that must be set when you specify an
+    -- ATLEAST type.
+    threshold :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RuleConfig' 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:
+--
+-- 'type'', 'ruleConfig_type' - A rule can be one of the following: ATLEAST, AND, or OR.
+--
+-- 'inverted', 'ruleConfig_inverted' - Logical negation of the rule. If the rule would usually evaluate true,
+-- it\'s evaluated as false, and vice versa.
+--
+-- 'threshold', 'ruleConfig_threshold' - The value of N, when you specify an ATLEAST rule type. That is,
+-- Threshold is the number of controls that must be set when you specify an
+-- ATLEAST type.
+newRuleConfig ::
+  -- | 'type''
+  RuleType ->
+  -- | 'inverted'
+  Prelude.Bool ->
+  -- | 'threshold'
+  Prelude.Int ->
+  RuleConfig
+newRuleConfig pType_ pInverted_ pThreshold_ =
+  RuleConfig'
+    { type' = pType_,
+      inverted = pInverted_,
+      threshold = pThreshold_
+    }
+
+-- | A rule can be one of the following: ATLEAST, AND, or OR.
+ruleConfig_type :: Lens.Lens' RuleConfig RuleType
+ruleConfig_type = Lens.lens (\RuleConfig' {type'} -> type') (\s@RuleConfig' {} a -> s {type' = a} :: RuleConfig)
+
+-- | Logical negation of the rule. If the rule would usually evaluate true,
+-- it\'s evaluated as false, and vice versa.
+ruleConfig_inverted :: Lens.Lens' RuleConfig Prelude.Bool
+ruleConfig_inverted = Lens.lens (\RuleConfig' {inverted} -> inverted) (\s@RuleConfig' {} a -> s {inverted = a} :: RuleConfig)
+
+-- | The value of N, when you specify an ATLEAST rule type. That is,
+-- Threshold is the number of controls that must be set when you specify an
+-- ATLEAST type.
+ruleConfig_threshold :: Lens.Lens' RuleConfig Prelude.Int
+ruleConfig_threshold = Lens.lens (\RuleConfig' {threshold} -> threshold) (\s@RuleConfig' {} a -> s {threshold = a} :: RuleConfig)
+
+instance Data.FromJSON RuleConfig where
+  parseJSON =
+    Data.withObject
+      "RuleConfig"
+      ( \x ->
+          RuleConfig'
+            Prelude.<$> (x Data..: "Type")
+            Prelude.<*> (x Data..: "Inverted")
+            Prelude.<*> (x Data..: "Threshold")
+      )
+
+instance Prelude.Hashable RuleConfig where
+  hashWithSalt _salt RuleConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` inverted
+      `Prelude.hashWithSalt` threshold
+
+instance Prelude.NFData RuleConfig where
+  rnf RuleConfig' {..} =
+    Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf inverted
+      `Prelude.seq` Prelude.rnf threshold
+
+instance Data.ToJSON RuleConfig where
+  toJSON RuleConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Type" Data..= type'),
+            Prelude.Just ("Inverted" Data..= inverted),
+            Prelude.Just ("Threshold" Data..= threshold)
+          ]
+      )
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleType.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/RuleType.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.Types.RuleType
+-- 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.Route53RecoveryControlConfig.Types.RuleType
+  ( RuleType
+      ( ..,
+        RuleType_AND,
+        RuleType_ATLEAST,
+        RuleType_OR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An enumerated type that determines how the evaluated rules are
+-- processed. RuleType can be one of the following:
+--
+-- ATLEAST - At least N routing controls must be set. You specify N as the
+-- Threshold in the rule configuration.
+--
+-- AND - All routing controls must be set. This is a shortcut for \"At
+-- least N,\" where N is the total number of controls in the rule.
+--
+-- OR - Any control must be set. This is a shortcut for \"At least N,\"
+-- where N is 1.
+newtype RuleType = RuleType'
+  { fromRuleType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RuleType_AND :: RuleType
+pattern RuleType_AND = RuleType' "AND"
+
+pattern RuleType_ATLEAST :: RuleType
+pattern RuleType_ATLEAST = RuleType' "ATLEAST"
+
+pattern RuleType_OR :: RuleType
+pattern RuleType_OR = RuleType' "OR"
+
+{-# COMPLETE
+  RuleType_AND,
+  RuleType_ATLEAST,
+  RuleType_OR,
+  RuleType'
+  #-}
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Types/Status.hs b/gen/Amazonka/Route53RecoveryControlConfig/Types/Status.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Types/Status.hs
@@ -0,0 +1,82 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.Types.Status
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Route53RecoveryControlConfig.Types.Status
+  ( Status
+      ( ..,
+        Status_DEPLOYED,
+        Status_PENDING,
+        Status_PENDING_DELETION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The deployment status of a resource. Status can be one of the following:
+--
+-- PENDING: Amazon Route 53 Application Recovery Controller is creating the
+-- resource.
+--
+-- DEPLOYED: The resource is deployed and ready to use.
+--
+-- PENDING_DELETION: Amazon Route 53 Application Recovery Controller is
+-- deleting the resource.
+newtype Status = Status' {fromStatus :: Data.Text}
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern Status_DEPLOYED :: Status
+pattern Status_DEPLOYED = Status' "DEPLOYED"
+
+pattern Status_PENDING :: Status
+pattern Status_PENDING = Status' "PENDING"
+
+pattern Status_PENDING_DELETION :: Status
+pattern Status_PENDING_DELETION = Status' "PENDING_DELETION"
+
+{-# COMPLETE
+  Status_DEPLOYED,
+  Status_PENDING,
+  Status_PENDING_DELETION,
+  Status'
+  #-}
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/UntagResource.hs b/gen/Amazonka/Route53RecoveryControlConfig/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/UntagResource.hs
@@ -0,0 +1,161 @@
+{-# 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.Route53RecoveryControlConfig.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes a tag from a resource.
+module Amazonka.Route53RecoveryControlConfig.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+    resourceArn :: Prelude.Text,
+    -- | Keys for the tags to be removed.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) for the resource that\'s tagged.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Keys for the tags to be removed.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) for the resource that\'s tagged.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Keys for the tags to be removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["TagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/UpdateControlPanel.hs b/gen/Amazonka/Route53RecoveryControlConfig/UpdateControlPanel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/UpdateControlPanel.hs
@@ -0,0 +1,192 @@
+{-# 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.Route53RecoveryControlConfig.UpdateControlPanel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a control panel. The only update you can make to a control panel
+-- is to change the name of the control panel.
+module Amazonka.Route53RecoveryControlConfig.UpdateControlPanel
+  ( -- * Creating a Request
+    UpdateControlPanel (..),
+    newUpdateControlPanel,
+
+    -- * Request Lenses
+    updateControlPanel_controlPanelArn,
+    updateControlPanel_controlPanelName,
+
+    -- * Destructuring the Response
+    UpdateControlPanelResponse (..),
+    newUpdateControlPanelResponse,
+
+    -- * Response Lenses
+    updateControlPanelResponse_controlPanel,
+    updateControlPanelResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | The details of the control panel that you\'re updating.
+--
+-- /See:/ 'newUpdateControlPanel' smart constructor.
+data UpdateControlPanel = UpdateControlPanel'
+  { -- | The Amazon Resource Name (ARN) of the control panel.
+    controlPanelArn :: Prelude.Text,
+    -- | The name of the control panel.
+    controlPanelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateControlPanel' 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:
+--
+-- 'controlPanelArn', 'updateControlPanel_controlPanelArn' - The Amazon Resource Name (ARN) of the control panel.
+--
+-- 'controlPanelName', 'updateControlPanel_controlPanelName' - The name of the control panel.
+newUpdateControlPanel ::
+  -- | 'controlPanelArn'
+  Prelude.Text ->
+  -- | 'controlPanelName'
+  Prelude.Text ->
+  UpdateControlPanel
+newUpdateControlPanel
+  pControlPanelArn_
+  pControlPanelName_ =
+    UpdateControlPanel'
+      { controlPanelArn =
+          pControlPanelArn_,
+        controlPanelName = pControlPanelName_
+      }
+
+-- | The Amazon Resource Name (ARN) of the control panel.
+updateControlPanel_controlPanelArn :: Lens.Lens' UpdateControlPanel Prelude.Text
+updateControlPanel_controlPanelArn = Lens.lens (\UpdateControlPanel' {controlPanelArn} -> controlPanelArn) (\s@UpdateControlPanel' {} a -> s {controlPanelArn = a} :: UpdateControlPanel)
+
+-- | The name of the control panel.
+updateControlPanel_controlPanelName :: Lens.Lens' UpdateControlPanel Prelude.Text
+updateControlPanel_controlPanelName = Lens.lens (\UpdateControlPanel' {controlPanelName} -> controlPanelName) (\s@UpdateControlPanel' {} a -> s {controlPanelName = a} :: UpdateControlPanel)
+
+instance Core.AWSRequest UpdateControlPanel where
+  type
+    AWSResponse UpdateControlPanel =
+      UpdateControlPanelResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateControlPanelResponse'
+            Prelude.<$> (x Data..?> "ControlPanel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateControlPanel where
+  hashWithSalt _salt UpdateControlPanel' {..} =
+    _salt
+      `Prelude.hashWithSalt` controlPanelArn
+      `Prelude.hashWithSalt` controlPanelName
+
+instance Prelude.NFData UpdateControlPanel where
+  rnf UpdateControlPanel' {..} =
+    Prelude.rnf controlPanelArn
+      `Prelude.seq` Prelude.rnf controlPanelName
+
+instance Data.ToHeaders UpdateControlPanel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateControlPanel where
+  toJSON UpdateControlPanel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("ControlPanelArn" Data..= controlPanelArn),
+            Prelude.Just
+              ("ControlPanelName" Data..= controlPanelName)
+          ]
+      )
+
+instance Data.ToPath UpdateControlPanel where
+  toPath = Prelude.const "/controlpanel"
+
+instance Data.ToQuery UpdateControlPanel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateControlPanelResponse' smart constructor.
+data UpdateControlPanelResponse = UpdateControlPanelResponse'
+  { -- | The control panel to update.
+    controlPanel :: Prelude.Maybe ControlPanel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateControlPanelResponse' 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:
+--
+-- 'controlPanel', 'updateControlPanelResponse_controlPanel' - The control panel to update.
+--
+-- 'httpStatus', 'updateControlPanelResponse_httpStatus' - The response's http status code.
+newUpdateControlPanelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateControlPanelResponse
+newUpdateControlPanelResponse pHttpStatus_ =
+  UpdateControlPanelResponse'
+    { controlPanel =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The control panel to update.
+updateControlPanelResponse_controlPanel :: Lens.Lens' UpdateControlPanelResponse (Prelude.Maybe ControlPanel)
+updateControlPanelResponse_controlPanel = Lens.lens (\UpdateControlPanelResponse' {controlPanel} -> controlPanel) (\s@UpdateControlPanelResponse' {} a -> s {controlPanel = a} :: UpdateControlPanelResponse)
+
+-- | The response's http status code.
+updateControlPanelResponse_httpStatus :: Lens.Lens' UpdateControlPanelResponse Prelude.Int
+updateControlPanelResponse_httpStatus = Lens.lens (\UpdateControlPanelResponse' {httpStatus} -> httpStatus) (\s@UpdateControlPanelResponse' {} a -> s {httpStatus = a} :: UpdateControlPanelResponse)
+
+instance Prelude.NFData UpdateControlPanelResponse where
+  rnf UpdateControlPanelResponse' {..} =
+    Prelude.rnf controlPanel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/UpdateRoutingControl.hs b/gen/Amazonka/Route53RecoveryControlConfig/UpdateRoutingControl.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/UpdateRoutingControl.hs
@@ -0,0 +1,194 @@
+{-# 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.Route53RecoveryControlConfig.UpdateRoutingControl
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a routing control. You can only update the name of the routing
+-- control. To get or update the routing control state, see the Recovery
+-- Cluster (data plane) API actions for Amazon Route 53 Application
+-- Recovery Controller.
+module Amazonka.Route53RecoveryControlConfig.UpdateRoutingControl
+  ( -- * Creating a Request
+    UpdateRoutingControl (..),
+    newUpdateRoutingControl,
+
+    -- * Request Lenses
+    updateRoutingControl_routingControlName,
+    updateRoutingControl_routingControlArn,
+
+    -- * Destructuring the Response
+    UpdateRoutingControlResponse (..),
+    newUpdateRoutingControlResponse,
+
+    -- * Response Lenses
+    updateRoutingControlResponse_routingControl,
+    updateRoutingControlResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | The details of the routing control that you\'re updating.
+--
+-- /See:/ 'newUpdateRoutingControl' smart constructor.
+data UpdateRoutingControl = UpdateRoutingControl'
+  { -- | The name of the routing control.
+    routingControlName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the routing control.
+    routingControlArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRoutingControl' 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:
+--
+-- 'routingControlName', 'updateRoutingControl_routingControlName' - The name of the routing control.
+--
+-- 'routingControlArn', 'updateRoutingControl_routingControlArn' - The Amazon Resource Name (ARN) of the routing control.
+newUpdateRoutingControl ::
+  -- | 'routingControlName'
+  Prelude.Text ->
+  -- | 'routingControlArn'
+  Prelude.Text ->
+  UpdateRoutingControl
+newUpdateRoutingControl
+  pRoutingControlName_
+  pRoutingControlArn_ =
+    UpdateRoutingControl'
+      { routingControlName =
+          pRoutingControlName_,
+        routingControlArn = pRoutingControlArn_
+      }
+
+-- | The name of the routing control.
+updateRoutingControl_routingControlName :: Lens.Lens' UpdateRoutingControl Prelude.Text
+updateRoutingControl_routingControlName = Lens.lens (\UpdateRoutingControl' {routingControlName} -> routingControlName) (\s@UpdateRoutingControl' {} a -> s {routingControlName = a} :: UpdateRoutingControl)
+
+-- | The Amazon Resource Name (ARN) of the routing control.
+updateRoutingControl_routingControlArn :: Lens.Lens' UpdateRoutingControl Prelude.Text
+updateRoutingControl_routingControlArn = Lens.lens (\UpdateRoutingControl' {routingControlArn} -> routingControlArn) (\s@UpdateRoutingControl' {} a -> s {routingControlArn = a} :: UpdateRoutingControl)
+
+instance Core.AWSRequest UpdateRoutingControl where
+  type
+    AWSResponse UpdateRoutingControl =
+      UpdateRoutingControlResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateRoutingControlResponse'
+            Prelude.<$> (x Data..?> "RoutingControl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateRoutingControl where
+  hashWithSalt _salt UpdateRoutingControl' {..} =
+    _salt
+      `Prelude.hashWithSalt` routingControlName
+      `Prelude.hashWithSalt` routingControlArn
+
+instance Prelude.NFData UpdateRoutingControl where
+  rnf UpdateRoutingControl' {..} =
+    Prelude.rnf routingControlName
+      `Prelude.seq` Prelude.rnf routingControlArn
+
+instance Data.ToHeaders UpdateRoutingControl where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateRoutingControl where
+  toJSON UpdateRoutingControl' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("RoutingControlName" Data..= routingControlName),
+            Prelude.Just
+              ("RoutingControlArn" Data..= routingControlArn)
+          ]
+      )
+
+instance Data.ToPath UpdateRoutingControl where
+  toPath = Prelude.const "/routingcontrol"
+
+instance Data.ToQuery UpdateRoutingControl where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateRoutingControlResponse' smart constructor.
+data UpdateRoutingControlResponse = UpdateRoutingControlResponse'
+  { -- | The routing control that was updated.
+    routingControl :: Prelude.Maybe RoutingControl,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRoutingControlResponse' 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:
+--
+-- 'routingControl', 'updateRoutingControlResponse_routingControl' - The routing control that was updated.
+--
+-- 'httpStatus', 'updateRoutingControlResponse_httpStatus' - The response's http status code.
+newUpdateRoutingControlResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateRoutingControlResponse
+newUpdateRoutingControlResponse pHttpStatus_ =
+  UpdateRoutingControlResponse'
+    { routingControl =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The routing control that was updated.
+updateRoutingControlResponse_routingControl :: Lens.Lens' UpdateRoutingControlResponse (Prelude.Maybe RoutingControl)
+updateRoutingControlResponse_routingControl = Lens.lens (\UpdateRoutingControlResponse' {routingControl} -> routingControl) (\s@UpdateRoutingControlResponse' {} a -> s {routingControl = a} :: UpdateRoutingControlResponse)
+
+-- | The response's http status code.
+updateRoutingControlResponse_httpStatus :: Lens.Lens' UpdateRoutingControlResponse Prelude.Int
+updateRoutingControlResponse_httpStatus = Lens.lens (\UpdateRoutingControlResponse' {httpStatus} -> httpStatus) (\s@UpdateRoutingControlResponse' {} a -> s {httpStatus = a} :: UpdateRoutingControlResponse)
+
+instance Prelude.NFData UpdateRoutingControlResponse where
+  rnf UpdateRoutingControlResponse' {..} =
+    Prelude.rnf routingControl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/UpdateSafetyRule.hs b/gen/Amazonka/Route53RecoveryControlConfig/UpdateSafetyRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/UpdateSafetyRule.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Route53RecoveryControlConfig.UpdateSafetyRule
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Update a safety rule (an assertion rule or gating rule). You can only
+-- update the name and the waiting period for a safety rule. To make other
+-- updates, delete the safety rule and create a new one.
+module Amazonka.Route53RecoveryControlConfig.UpdateSafetyRule
+  ( -- * Creating a Request
+    UpdateSafetyRule (..),
+    newUpdateSafetyRule,
+
+    -- * Request Lenses
+    updateSafetyRule_assertionRuleUpdate,
+    updateSafetyRule_gatingRuleUpdate,
+
+    -- * Destructuring the Response
+    UpdateSafetyRuleResponse (..),
+    newUpdateSafetyRuleResponse,
+
+    -- * Response Lenses
+    updateSafetyRuleResponse_assertionRule,
+    updateSafetyRuleResponse_gatingRule,
+    updateSafetyRuleResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | A rule that you add to Application Recovery Controller to ensure that
+-- recovery actions don\'t accidentally impair your application\'s
+-- availability.
+--
+-- /See:/ 'newUpdateSafetyRule' smart constructor.
+data UpdateSafetyRule = UpdateSafetyRule'
+  { -- | The assertion rule to update.
+    assertionRuleUpdate :: Prelude.Maybe AssertionRuleUpdate,
+    -- | The gating rule to update.
+    gatingRuleUpdate :: Prelude.Maybe GatingRuleUpdate
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSafetyRule' 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:
+--
+-- 'assertionRuleUpdate', 'updateSafetyRule_assertionRuleUpdate' - The assertion rule to update.
+--
+-- 'gatingRuleUpdate', 'updateSafetyRule_gatingRuleUpdate' - The gating rule to update.
+newUpdateSafetyRule ::
+  UpdateSafetyRule
+newUpdateSafetyRule =
+  UpdateSafetyRule'
+    { assertionRuleUpdate =
+        Prelude.Nothing,
+      gatingRuleUpdate = Prelude.Nothing
+    }
+
+-- | The assertion rule to update.
+updateSafetyRule_assertionRuleUpdate :: Lens.Lens' UpdateSafetyRule (Prelude.Maybe AssertionRuleUpdate)
+updateSafetyRule_assertionRuleUpdate = Lens.lens (\UpdateSafetyRule' {assertionRuleUpdate} -> assertionRuleUpdate) (\s@UpdateSafetyRule' {} a -> s {assertionRuleUpdate = a} :: UpdateSafetyRule)
+
+-- | The gating rule to update.
+updateSafetyRule_gatingRuleUpdate :: Lens.Lens' UpdateSafetyRule (Prelude.Maybe GatingRuleUpdate)
+updateSafetyRule_gatingRuleUpdate = Lens.lens (\UpdateSafetyRule' {gatingRuleUpdate} -> gatingRuleUpdate) (\s@UpdateSafetyRule' {} a -> s {gatingRuleUpdate = a} :: UpdateSafetyRule)
+
+instance Core.AWSRequest UpdateSafetyRule where
+  type
+    AWSResponse UpdateSafetyRule =
+      UpdateSafetyRuleResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateSafetyRuleResponse'
+            Prelude.<$> (x Data..?> "AssertionRule")
+            Prelude.<*> (x Data..?> "GatingRule")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateSafetyRule where
+  hashWithSalt _salt UpdateSafetyRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` assertionRuleUpdate
+      `Prelude.hashWithSalt` gatingRuleUpdate
+
+instance Prelude.NFData UpdateSafetyRule where
+  rnf UpdateSafetyRule' {..} =
+    Prelude.rnf assertionRuleUpdate
+      `Prelude.seq` Prelude.rnf gatingRuleUpdate
+
+instance Data.ToHeaders UpdateSafetyRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateSafetyRule where
+  toJSON UpdateSafetyRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AssertionRuleUpdate" Data..=)
+              Prelude.<$> assertionRuleUpdate,
+            ("GatingRuleUpdate" Data..=)
+              Prelude.<$> gatingRuleUpdate
+          ]
+      )
+
+instance Data.ToPath UpdateSafetyRule where
+  toPath = Prelude.const "/safetyrule"
+
+instance Data.ToQuery UpdateSafetyRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateSafetyRuleResponse' smart constructor.
+data UpdateSafetyRuleResponse = UpdateSafetyRuleResponse'
+  { -- | The assertion rule updated.
+    assertionRule :: Prelude.Maybe AssertionRule,
+    -- | The gating rule updated.
+    gatingRule :: Prelude.Maybe GatingRule,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateSafetyRuleResponse' 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:
+--
+-- 'assertionRule', 'updateSafetyRuleResponse_assertionRule' - The assertion rule updated.
+--
+-- 'gatingRule', 'updateSafetyRuleResponse_gatingRule' - The gating rule updated.
+--
+-- 'httpStatus', 'updateSafetyRuleResponse_httpStatus' - The response's http status code.
+newUpdateSafetyRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateSafetyRuleResponse
+newUpdateSafetyRuleResponse pHttpStatus_ =
+  UpdateSafetyRuleResponse'
+    { assertionRule =
+        Prelude.Nothing,
+      gatingRule = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The assertion rule updated.
+updateSafetyRuleResponse_assertionRule :: Lens.Lens' UpdateSafetyRuleResponse (Prelude.Maybe AssertionRule)
+updateSafetyRuleResponse_assertionRule = Lens.lens (\UpdateSafetyRuleResponse' {assertionRule} -> assertionRule) (\s@UpdateSafetyRuleResponse' {} a -> s {assertionRule = a} :: UpdateSafetyRuleResponse)
+
+-- | The gating rule updated.
+updateSafetyRuleResponse_gatingRule :: Lens.Lens' UpdateSafetyRuleResponse (Prelude.Maybe GatingRule)
+updateSafetyRuleResponse_gatingRule = Lens.lens (\UpdateSafetyRuleResponse' {gatingRule} -> gatingRule) (\s@UpdateSafetyRuleResponse' {} a -> s {gatingRule = a} :: UpdateSafetyRuleResponse)
+
+-- | The response's http status code.
+updateSafetyRuleResponse_httpStatus :: Lens.Lens' UpdateSafetyRuleResponse Prelude.Int
+updateSafetyRuleResponse_httpStatus = Lens.lens (\UpdateSafetyRuleResponse' {httpStatus} -> httpStatus) (\s@UpdateSafetyRuleResponse' {} a -> s {httpStatus = a} :: UpdateSafetyRuleResponse)
+
+instance Prelude.NFData UpdateSafetyRuleResponse where
+  rnf UpdateSafetyRuleResponse' {..} =
+    Prelude.rnf assertionRule
+      `Prelude.seq` Prelude.rnf gatingRule
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Route53RecoveryControlConfig/Waiters.hs b/gen/Amazonka/Route53RecoveryControlConfig/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Route53RecoveryControlConfig/Waiters.hs
@@ -0,0 +1,183 @@
+{-# 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.Route53RecoveryControlConfig.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.Route53RecoveryControlConfig.Waiters 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
+import Amazonka.Route53RecoveryControlConfig.DescribeCluster
+import Amazonka.Route53RecoveryControlConfig.DescribeControlPanel
+import Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl
+import Amazonka.Route53RecoveryControlConfig.Lens
+import Amazonka.Route53RecoveryControlConfig.Types
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeCluster' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newClusterCreated :: Core.Wait DescribeCluster
+newClusterCreated =
+  Core.Wait
+    { Core.name = "ClusterCreated",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchAll
+            "DEPLOYED"
+            Core.AcceptSuccess
+            ( describeClusterResponse_cluster
+                Prelude.. Lens._Just
+                Prelude.. cluster_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "PENDING"
+            Core.AcceptRetry
+            ( describeClusterResponse_cluster
+                Prelude.. Lens._Just
+                Prelude.. cluster_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeCluster' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newClusterDeleted :: Core.Wait DescribeCluster
+newClusterDeleted =
+  Core.Wait
+    { Core.name = "ClusterDeleted",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchStatus 404 Core.AcceptSuccess,
+          Core.matchAll
+            "PENDING_DELETION"
+            Core.AcceptRetry
+            ( describeClusterResponse_cluster
+                Prelude.. Lens._Just
+                Prelude.. cluster_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeControlPanel' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newControlPanelCreated :: Core.Wait DescribeControlPanel
+newControlPanelCreated =
+  Core.Wait
+    { Core.name = "ControlPanelCreated",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchAll
+            "DEPLOYED"
+            Core.AcceptSuccess
+            ( describeControlPanelResponse_controlPanel
+                Prelude.. Lens._Just
+                Prelude.. controlPanel_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "PENDING"
+            Core.AcceptRetry
+            ( describeControlPanelResponse_controlPanel
+                Prelude.. Lens._Just
+                Prelude.. controlPanel_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeControlPanel' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newControlPanelDeleted :: Core.Wait DescribeControlPanel
+newControlPanelDeleted =
+  Core.Wait
+    { Core.name = "ControlPanelDeleted",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchStatus 404 Core.AcceptSuccess,
+          Core.matchAll
+            "PENDING_DELETION"
+            Core.AcceptRetry
+            ( describeControlPanelResponse_controlPanel
+                Prelude.. Lens._Just
+                Prelude.. controlPanel_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newRoutingControlCreated :: Core.Wait DescribeRoutingControl
+newRoutingControlCreated =
+  Core.Wait
+    { Core.name = "RoutingControlCreated",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchAll
+            "DEPLOYED"
+            Core.AcceptSuccess
+            ( describeRoutingControlResponse_routingControl
+                Prelude.. Lens._Just
+                Prelude.. routingControl_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "PENDING"
+            Core.AcceptRetry
+            ( describeRoutingControlResponse_routingControl
+                Prelude.. Lens._Just
+                Prelude.. routingControl_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
+
+-- | Polls 'Amazonka.Route53RecoveryControlConfig.DescribeRoutingControl' every 5 seconds until a successful state is reached. An error is returned after 26 failed checks.
+newRoutingControlDeleted :: Core.Wait DescribeRoutingControl
+newRoutingControlDeleted =
+  Core.Wait
+    { Core.name = "RoutingControlDeleted",
+      Core.attempts = 26,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchStatus 404 Core.AcceptSuccess,
+          Core.matchAll
+            "PENDING_DELETION"
+            Core.AcceptRetry
+            ( describeRoutingControlResponse_routingControl
+                Prelude.. Lens._Just
+                Prelude.. routingControl_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchStatus 500 Core.AcceptRetry
+        ]
+    }
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.Route53RecoveryControlConfig
+import Test.Amazonka.Route53RecoveryControlConfig.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Route53RecoveryControlConfig"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Route53RecoveryControlConfig.hs b/test/Test/Amazonka/Gen/Route53RecoveryControlConfig.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Route53RecoveryControlConfig.hs
@@ -0,0 +1,498 @@
+{-# 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.Route53RecoveryControlConfig
+-- 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.Route53RecoveryControlConfig where
+
+import Amazonka.Route53RecoveryControlConfig
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.Route53RecoveryControlConfig.Internal
+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"
+--         [ requestCreateCluster $
+--             newCreateCluster
+--
+--         , requestCreateControlPanel $
+--             newCreateControlPanel
+--
+--         , requestCreateRoutingControl $
+--             newCreateRoutingControl
+--
+--         , requestCreateSafetyRule $
+--             newCreateSafetyRule
+--
+--         , requestDeleteCluster $
+--             newDeleteCluster
+--
+--         , requestDeleteControlPanel $
+--             newDeleteControlPanel
+--
+--         , requestDeleteRoutingControl $
+--             newDeleteRoutingControl
+--
+--         , requestDeleteSafetyRule $
+--             newDeleteSafetyRule
+--
+--         , requestDescribeCluster $
+--             newDescribeCluster
+--
+--         , requestDescribeControlPanel $
+--             newDescribeControlPanel
+--
+--         , requestDescribeRoutingControl $
+--             newDescribeRoutingControl
+--
+--         , requestDescribeSafetyRule $
+--             newDescribeSafetyRule
+--
+--         , requestListAssociatedRoute53HealthChecks $
+--             newListAssociatedRoute53HealthChecks
+--
+--         , requestListClusters $
+--             newListClusters
+--
+--         , requestListControlPanels $
+--             newListControlPanels
+--
+--         , requestListRoutingControls $
+--             newListRoutingControls
+--
+--         , requestListSafetyRules $
+--             newListSafetyRules
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateControlPanel $
+--             newUpdateControlPanel
+--
+--         , requestUpdateRoutingControl $
+--             newUpdateRoutingControl
+--
+--         , requestUpdateSafetyRule $
+--             newUpdateSafetyRule
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateCluster $
+--             newCreateClusterResponse
+--
+--         , responseCreateControlPanel $
+--             newCreateControlPanelResponse
+--
+--         , responseCreateRoutingControl $
+--             newCreateRoutingControlResponse
+--
+--         , responseCreateSafetyRule $
+--             newCreateSafetyRuleResponse
+--
+--         , responseDeleteCluster $
+--             newDeleteClusterResponse
+--
+--         , responseDeleteControlPanel $
+--             newDeleteControlPanelResponse
+--
+--         , responseDeleteRoutingControl $
+--             newDeleteRoutingControlResponse
+--
+--         , responseDeleteSafetyRule $
+--             newDeleteSafetyRuleResponse
+--
+--         , responseDescribeCluster $
+--             newDescribeClusterResponse
+--
+--         , responseDescribeControlPanel $
+--             newDescribeControlPanelResponse
+--
+--         , responseDescribeRoutingControl $
+--             newDescribeRoutingControlResponse
+--
+--         , responseDescribeSafetyRule $
+--             newDescribeSafetyRuleResponse
+--
+--         , responseListAssociatedRoute53HealthChecks $
+--             newListAssociatedRoute53HealthChecksResponse
+--
+--         , responseListClusters $
+--             newListClustersResponse
+--
+--         , responseListControlPanels $
+--             newListControlPanelsResponse
+--
+--         , responseListRoutingControls $
+--             newListRoutingControlsResponse
+--
+--         , responseListSafetyRules $
+--             newListSafetyRulesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateControlPanel $
+--             newUpdateControlPanelResponse
+--
+--         , responseUpdateRoutingControl $
+--             newUpdateRoutingControlResponse
+--
+--         , responseUpdateSafetyRule $
+--             newUpdateSafetyRuleResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateCluster :: CreateCluster -> TestTree
+requestCreateCluster =
+  req
+    "CreateCluster"
+    "fixture/CreateCluster.yaml"
+
+requestCreateControlPanel :: CreateControlPanel -> TestTree
+requestCreateControlPanel =
+  req
+    "CreateControlPanel"
+    "fixture/CreateControlPanel.yaml"
+
+requestCreateRoutingControl :: CreateRoutingControl -> TestTree
+requestCreateRoutingControl =
+  req
+    "CreateRoutingControl"
+    "fixture/CreateRoutingControl.yaml"
+
+requestCreateSafetyRule :: CreateSafetyRule -> TestTree
+requestCreateSafetyRule =
+  req
+    "CreateSafetyRule"
+    "fixture/CreateSafetyRule.yaml"
+
+requestDeleteCluster :: DeleteCluster -> TestTree
+requestDeleteCluster =
+  req
+    "DeleteCluster"
+    "fixture/DeleteCluster.yaml"
+
+requestDeleteControlPanel :: DeleteControlPanel -> TestTree
+requestDeleteControlPanel =
+  req
+    "DeleteControlPanel"
+    "fixture/DeleteControlPanel.yaml"
+
+requestDeleteRoutingControl :: DeleteRoutingControl -> TestTree
+requestDeleteRoutingControl =
+  req
+    "DeleteRoutingControl"
+    "fixture/DeleteRoutingControl.yaml"
+
+requestDeleteSafetyRule :: DeleteSafetyRule -> TestTree
+requestDeleteSafetyRule =
+  req
+    "DeleteSafetyRule"
+    "fixture/DeleteSafetyRule.yaml"
+
+requestDescribeCluster :: DescribeCluster -> TestTree
+requestDescribeCluster =
+  req
+    "DescribeCluster"
+    "fixture/DescribeCluster.yaml"
+
+requestDescribeControlPanel :: DescribeControlPanel -> TestTree
+requestDescribeControlPanel =
+  req
+    "DescribeControlPanel"
+    "fixture/DescribeControlPanel.yaml"
+
+requestDescribeRoutingControl :: DescribeRoutingControl -> TestTree
+requestDescribeRoutingControl =
+  req
+    "DescribeRoutingControl"
+    "fixture/DescribeRoutingControl.yaml"
+
+requestDescribeSafetyRule :: DescribeSafetyRule -> TestTree
+requestDescribeSafetyRule =
+  req
+    "DescribeSafetyRule"
+    "fixture/DescribeSafetyRule.yaml"
+
+requestListAssociatedRoute53HealthChecks :: ListAssociatedRoute53HealthChecks -> TestTree
+requestListAssociatedRoute53HealthChecks =
+  req
+    "ListAssociatedRoute53HealthChecks"
+    "fixture/ListAssociatedRoute53HealthChecks.yaml"
+
+requestListClusters :: ListClusters -> TestTree
+requestListClusters =
+  req
+    "ListClusters"
+    "fixture/ListClusters.yaml"
+
+requestListControlPanels :: ListControlPanels -> TestTree
+requestListControlPanels =
+  req
+    "ListControlPanels"
+    "fixture/ListControlPanels.yaml"
+
+requestListRoutingControls :: ListRoutingControls -> TestTree
+requestListRoutingControls =
+  req
+    "ListRoutingControls"
+    "fixture/ListRoutingControls.yaml"
+
+requestListSafetyRules :: ListSafetyRules -> TestTree
+requestListSafetyRules =
+  req
+    "ListSafetyRules"
+    "fixture/ListSafetyRules.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateControlPanel :: UpdateControlPanel -> TestTree
+requestUpdateControlPanel =
+  req
+    "UpdateControlPanel"
+    "fixture/UpdateControlPanel.yaml"
+
+requestUpdateRoutingControl :: UpdateRoutingControl -> TestTree
+requestUpdateRoutingControl =
+  req
+    "UpdateRoutingControl"
+    "fixture/UpdateRoutingControl.yaml"
+
+requestUpdateSafetyRule :: UpdateSafetyRule -> TestTree
+requestUpdateSafetyRule =
+  req
+    "UpdateSafetyRule"
+    "fixture/UpdateSafetyRule.yaml"
+
+-- Responses
+
+responseCreateCluster :: CreateClusterResponse -> TestTree
+responseCreateCluster =
+  res
+    "CreateClusterResponse"
+    "fixture/CreateClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateCluster)
+
+responseCreateControlPanel :: CreateControlPanelResponse -> TestTree
+responseCreateControlPanel =
+  res
+    "CreateControlPanelResponse"
+    "fixture/CreateControlPanelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateControlPanel)
+
+responseCreateRoutingControl :: CreateRoutingControlResponse -> TestTree
+responseCreateRoutingControl =
+  res
+    "CreateRoutingControlResponse"
+    "fixture/CreateRoutingControlResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRoutingControl)
+
+responseCreateSafetyRule :: CreateSafetyRuleResponse -> TestTree
+responseCreateSafetyRule =
+  res
+    "CreateSafetyRuleResponse"
+    "fixture/CreateSafetyRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSafetyRule)
+
+responseDeleteCluster :: DeleteClusterResponse -> TestTree
+responseDeleteCluster =
+  res
+    "DeleteClusterResponse"
+    "fixture/DeleteClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCluster)
+
+responseDeleteControlPanel :: DeleteControlPanelResponse -> TestTree
+responseDeleteControlPanel =
+  res
+    "DeleteControlPanelResponse"
+    "fixture/DeleteControlPanelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteControlPanel)
+
+responseDeleteRoutingControl :: DeleteRoutingControlResponse -> TestTree
+responseDeleteRoutingControl =
+  res
+    "DeleteRoutingControlResponse"
+    "fixture/DeleteRoutingControlResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRoutingControl)
+
+responseDeleteSafetyRule :: DeleteSafetyRuleResponse -> TestTree
+responseDeleteSafetyRule =
+  res
+    "DeleteSafetyRuleResponse"
+    "fixture/DeleteSafetyRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSafetyRule)
+
+responseDescribeCluster :: DescribeClusterResponse -> TestTree
+responseDescribeCluster =
+  res
+    "DescribeClusterResponse"
+    "fixture/DescribeClusterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeCluster)
+
+responseDescribeControlPanel :: DescribeControlPanelResponse -> TestTree
+responseDescribeControlPanel =
+  res
+    "DescribeControlPanelResponse"
+    "fixture/DescribeControlPanelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeControlPanel)
+
+responseDescribeRoutingControl :: DescribeRoutingControlResponse -> TestTree
+responseDescribeRoutingControl =
+  res
+    "DescribeRoutingControlResponse"
+    "fixture/DescribeRoutingControlResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRoutingControl)
+
+responseDescribeSafetyRule :: DescribeSafetyRuleResponse -> TestTree
+responseDescribeSafetyRule =
+  res
+    "DescribeSafetyRuleResponse"
+    "fixture/DescribeSafetyRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSafetyRule)
+
+responseListAssociatedRoute53HealthChecks :: ListAssociatedRoute53HealthChecksResponse -> TestTree
+responseListAssociatedRoute53HealthChecks =
+  res
+    "ListAssociatedRoute53HealthChecksResponse"
+    "fixture/ListAssociatedRoute53HealthChecksResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssociatedRoute53HealthChecks)
+
+responseListClusters :: ListClustersResponse -> TestTree
+responseListClusters =
+  res
+    "ListClustersResponse"
+    "fixture/ListClustersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListClusters)
+
+responseListControlPanels :: ListControlPanelsResponse -> TestTree
+responseListControlPanels =
+  res
+    "ListControlPanelsResponse"
+    "fixture/ListControlPanelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListControlPanels)
+
+responseListRoutingControls :: ListRoutingControlsResponse -> TestTree
+responseListRoutingControls =
+  res
+    "ListRoutingControlsResponse"
+    "fixture/ListRoutingControlsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRoutingControls)
+
+responseListSafetyRules :: ListSafetyRulesResponse -> TestTree
+responseListSafetyRules =
+  res
+    "ListSafetyRulesResponse"
+    "fixture/ListSafetyRulesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSafetyRules)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateControlPanel :: UpdateControlPanelResponse -> TestTree
+responseUpdateControlPanel =
+  res
+    "UpdateControlPanelResponse"
+    "fixture/UpdateControlPanelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateControlPanel)
+
+responseUpdateRoutingControl :: UpdateRoutingControlResponse -> TestTree
+responseUpdateRoutingControl =
+  res
+    "UpdateRoutingControlResponse"
+    "fixture/UpdateRoutingControlResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateRoutingControl)
+
+responseUpdateSafetyRule :: UpdateSafetyRuleResponse -> TestTree
+responseUpdateSafetyRule =
+  res
+    "UpdateSafetyRuleResponse"
+    "fixture/UpdateSafetyRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateSafetyRule)
diff --git a/test/Test/Amazonka/Route53RecoveryControlConfig.hs b/test/Test/Amazonka/Route53RecoveryControlConfig.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Route53RecoveryControlConfig.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Route53RecoveryControlConfig
+-- 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.Route53RecoveryControlConfig
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Route53RecoveryControlConfig/Internal.hs b/test/Test/Amazonka/Route53RecoveryControlConfig/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Route53RecoveryControlConfig/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Route53RecoveryControlConfig.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.Route53RecoveryControlConfig.Internal where
