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 Ground Station SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2019-05-23@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-groundstation)
+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.GroundStation](http://hackage.haskell.org/package/amazonka-groundstation/docs/Amazonka-GroundStation.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-groundstation` 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-groundstation.cabal b/amazonka-groundstation.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-groundstation.cabal
@@ -0,0 +1,172 @@
+cabal-version:      2.2
+name:               amazonka-groundstation
+version:            2.0
+synopsis:           Amazon Ground Station 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 @2019-05-23@ 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.GroundStation.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.GroundStation" 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-groundstation
+
+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.GroundStation
+    Amazonka.GroundStation.CancelContact
+    Amazonka.GroundStation.CreateConfig
+    Amazonka.GroundStation.CreateDataflowEndpointGroup
+    Amazonka.GroundStation.CreateEphemeris
+    Amazonka.GroundStation.CreateMissionProfile
+    Amazonka.GroundStation.DeleteConfig
+    Amazonka.GroundStation.DeleteDataflowEndpointGroup
+    Amazonka.GroundStation.DeleteEphemeris
+    Amazonka.GroundStation.DeleteMissionProfile
+    Amazonka.GroundStation.DescribeContact
+    Amazonka.GroundStation.DescribeEphemeris
+    Amazonka.GroundStation.GetConfig
+    Amazonka.GroundStation.GetDataflowEndpointGroup
+    Amazonka.GroundStation.GetMinuteUsage
+    Amazonka.GroundStation.GetMissionProfile
+    Amazonka.GroundStation.GetSatellite
+    Amazonka.GroundStation.Lens
+    Amazonka.GroundStation.ListConfigs
+    Amazonka.GroundStation.ListContacts
+    Amazonka.GroundStation.ListDataflowEndpointGroups
+    Amazonka.GroundStation.ListEphemerides
+    Amazonka.GroundStation.ListGroundStations
+    Amazonka.GroundStation.ListMissionProfiles
+    Amazonka.GroundStation.ListSatellites
+    Amazonka.GroundStation.ListTagsForResource
+    Amazonka.GroundStation.ReserveContact
+    Amazonka.GroundStation.TagResource
+    Amazonka.GroundStation.Types
+    Amazonka.GroundStation.Types.AngleUnits
+    Amazonka.GroundStation.Types.AntennaDemodDecodeDetails
+    Amazonka.GroundStation.Types.AntennaDownlinkConfig
+    Amazonka.GroundStation.Types.AntennaDownlinkDemodDecodeConfig
+    Amazonka.GroundStation.Types.AntennaUplinkConfig
+    Amazonka.GroundStation.Types.BandwidthUnits
+    Amazonka.GroundStation.Types.ConfigCapabilityType
+    Amazonka.GroundStation.Types.ConfigDetails
+    Amazonka.GroundStation.Types.ConfigIdResponse
+    Amazonka.GroundStation.Types.ConfigListItem
+    Amazonka.GroundStation.Types.ConfigTypeData
+    Amazonka.GroundStation.Types.ContactData
+    Amazonka.GroundStation.Types.ContactIdResponse
+    Amazonka.GroundStation.Types.ContactStatus
+    Amazonka.GroundStation.Types.Criticality
+    Amazonka.GroundStation.Types.DataflowDetail
+    Amazonka.GroundStation.Types.DataflowEndpoint
+    Amazonka.GroundStation.Types.DataflowEndpointConfig
+    Amazonka.GroundStation.Types.DataflowEndpointGroupIdResponse
+    Amazonka.GroundStation.Types.DataflowEndpointListItem
+    Amazonka.GroundStation.Types.DecodeConfig
+    Amazonka.GroundStation.Types.DemodulationConfig
+    Amazonka.GroundStation.Types.Destination
+    Amazonka.GroundStation.Types.Eirp
+    Amazonka.GroundStation.Types.EirpUnits
+    Amazonka.GroundStation.Types.Elevation
+    Amazonka.GroundStation.Types.EndpointDetails
+    Amazonka.GroundStation.Types.EndpointStatus
+    Amazonka.GroundStation.Types.EphemerisData
+    Amazonka.GroundStation.Types.EphemerisDescription
+    Amazonka.GroundStation.Types.EphemerisIdResponse
+    Amazonka.GroundStation.Types.EphemerisInvalidReason
+    Amazonka.GroundStation.Types.EphemerisItem
+    Amazonka.GroundStation.Types.EphemerisMetaData
+    Amazonka.GroundStation.Types.EphemerisSource
+    Amazonka.GroundStation.Types.EphemerisStatus
+    Amazonka.GroundStation.Types.EphemerisTypeDescription
+    Amazonka.GroundStation.Types.Frequency
+    Amazonka.GroundStation.Types.FrequencyBandwidth
+    Amazonka.GroundStation.Types.FrequencyUnits
+    Amazonka.GroundStation.Types.GroundStationData
+    Amazonka.GroundStation.Types.MissionProfileIdResponse
+    Amazonka.GroundStation.Types.MissionProfileListItem
+    Amazonka.GroundStation.Types.OEMEphemeris
+    Amazonka.GroundStation.Types.Polarization
+    Amazonka.GroundStation.Types.S3Object
+    Amazonka.GroundStation.Types.S3RecordingConfig
+    Amazonka.GroundStation.Types.S3RecordingDetails
+    Amazonka.GroundStation.Types.SatelliteListItem
+    Amazonka.GroundStation.Types.SecurityDetails
+    Amazonka.GroundStation.Types.SocketAddress
+    Amazonka.GroundStation.Types.Source
+    Amazonka.GroundStation.Types.SpectrumConfig
+    Amazonka.GroundStation.Types.TimeRange
+    Amazonka.GroundStation.Types.TLEData
+    Amazonka.GroundStation.Types.TLEEphemeris
+    Amazonka.GroundStation.Types.TrackingConfig
+    Amazonka.GroundStation.Types.UplinkEchoConfig
+    Amazonka.GroundStation.Types.UplinkSpectrumConfig
+    Amazonka.GroundStation.UntagResource
+    Amazonka.GroundStation.UpdateConfig
+    Amazonka.GroundStation.UpdateEphemeris
+    Amazonka.GroundStation.UpdateMissionProfile
+    Amazonka.GroundStation.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-groundstation-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.GroundStation
+    Test.Amazonka.GroundStation
+    Test.Amazonka.GroundStation.Internal
+
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-groundstation
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CancelContact.yaml b/fixture/CancelContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CancelContact.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/CancelContactResponse.proto b/fixture/CancelContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CancelContactResponse.proto
diff --git a/fixture/CreateConfig.yaml b/fixture/CreateConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/CreateConfigResponse.proto b/fixture/CreateConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateConfigResponse.proto
diff --git a/fixture/CreateDataflowEndpointGroup.yaml b/fixture/CreateDataflowEndpointGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataflowEndpointGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/CreateDataflowEndpointGroupResponse.proto b/fixture/CreateDataflowEndpointGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataflowEndpointGroupResponse.proto
diff --git a/fixture/CreateEphemeris.yaml b/fixture/CreateEphemeris.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEphemeris.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/CreateEphemerisResponse.proto b/fixture/CreateEphemerisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEphemerisResponse.proto
diff --git a/fixture/CreateMissionProfile.yaml b/fixture/CreateMissionProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMissionProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/CreateMissionProfileResponse.proto b/fixture/CreateMissionProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMissionProfileResponse.proto
diff --git a/fixture/DeleteConfig.yaml b/fixture/DeleteConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DeleteConfigResponse.proto b/fixture/DeleteConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteConfigResponse.proto
diff --git a/fixture/DeleteDataflowEndpointGroup.yaml b/fixture/DeleteDataflowEndpointGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataflowEndpointGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DeleteDataflowEndpointGroupResponse.proto b/fixture/DeleteDataflowEndpointGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataflowEndpointGroupResponse.proto
diff --git a/fixture/DeleteEphemeris.yaml b/fixture/DeleteEphemeris.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEphemeris.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DeleteEphemerisResponse.proto b/fixture/DeleteEphemerisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEphemerisResponse.proto
diff --git a/fixture/DeleteMissionProfile.yaml b/fixture/DeleteMissionProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMissionProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DeleteMissionProfileResponse.proto b/fixture/DeleteMissionProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMissionProfileResponse.proto
diff --git a/fixture/DescribeContact.yaml b/fixture/DescribeContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeContact.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DescribeContactResponse.proto b/fixture/DescribeContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeContactResponse.proto
diff --git a/fixture/DescribeEphemeris.yaml b/fixture/DescribeEphemeris.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEphemeris.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/DescribeEphemerisResponse.proto b/fixture/DescribeEphemerisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEphemerisResponse.proto
diff --git a/fixture/GetConfig.yaml b/fixture/GetConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/GetConfigResponse.proto b/fixture/GetConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetConfigResponse.proto
diff --git a/fixture/GetDataflowEndpointGroup.yaml b/fixture/GetDataflowEndpointGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataflowEndpointGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/GetDataflowEndpointGroupResponse.proto b/fixture/GetDataflowEndpointGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDataflowEndpointGroupResponse.proto
diff --git a/fixture/GetMinuteUsage.yaml b/fixture/GetMinuteUsage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetMinuteUsage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/GetMinuteUsageResponse.proto b/fixture/GetMinuteUsageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetMinuteUsageResponse.proto
diff --git a/fixture/GetMissionProfile.yaml b/fixture/GetMissionProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetMissionProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/GetMissionProfileResponse.proto b/fixture/GetMissionProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetMissionProfileResponse.proto
diff --git a/fixture/GetSatellite.yaml b/fixture/GetSatellite.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSatellite.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/GetSatelliteResponse.proto b/fixture/GetSatelliteResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSatelliteResponse.proto
diff --git a/fixture/ListConfigs.yaml b/fixture/ListConfigs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListConfigsResponse.proto b/fixture/ListConfigsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListConfigsResponse.proto
diff --git a/fixture/ListContacts.yaml b/fixture/ListContacts.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListContacts.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListContactsResponse.proto b/fixture/ListContactsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListContactsResponse.proto
diff --git a/fixture/ListDataflowEndpointGroups.yaml b/fixture/ListDataflowEndpointGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataflowEndpointGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListDataflowEndpointGroupsResponse.proto b/fixture/ListDataflowEndpointGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDataflowEndpointGroupsResponse.proto
diff --git a/fixture/ListEphemerides.yaml b/fixture/ListEphemerides.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEphemerides.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListEphemeridesResponse.proto b/fixture/ListEphemeridesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEphemeridesResponse.proto
diff --git a/fixture/ListGroundStations.yaml b/fixture/ListGroundStations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroundStations.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListGroundStationsResponse.proto b/fixture/ListGroundStationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGroundStationsResponse.proto
diff --git a/fixture/ListMissionProfiles.yaml b/fixture/ListMissionProfiles.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMissionProfiles.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListMissionProfilesResponse.proto b/fixture/ListMissionProfilesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMissionProfilesResponse.proto
diff --git a/fixture/ListSatellites.yaml b/fixture/ListSatellites.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSatellites.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ListSatellitesResponse.proto b/fixture/ListSatellitesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSatellitesResponse.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/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ReserveContact.yaml b/fixture/ReserveContact.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ReserveContact.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/ReserveContactResponse.proto b/fixture/ReserveContactResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ReserveContactResponse.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/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/UpdateConfig.yaml b/fixture/UpdateConfig.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConfig.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/UpdateConfigResponse.proto b/fixture/UpdateConfigResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateConfigResponse.proto
diff --git a/fixture/UpdateEphemeris.yaml b/fixture/UpdateEphemeris.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEphemeris.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/UpdateEphemerisResponse.proto b/fixture/UpdateEphemerisResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateEphemerisResponse.proto
diff --git a/fixture/UpdateMissionProfile.yaml b/fixture/UpdateMissionProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMissionProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/groundstation/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  groundstation.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/UpdateMissionProfileResponse.proto b/fixture/UpdateMissionProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMissionProfileResponse.proto
diff --git a/gen/Amazonka/GroundStation.hs b/gen/Amazonka/GroundStation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation.hs
@@ -0,0 +1,511 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.GroundStation
+-- 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 @2019-05-23@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Welcome to the AWS Ground Station API Reference. AWS Ground Station is a
+-- fully managed service that enables you to control satellite
+-- communications, downlink and process satellite data, and scale your
+-- satellite operations efficiently and cost-effectively without having to
+-- build or manage your own ground station infrastructure.
+module Amazonka.GroundStation
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** DependencyException
+    _DependencyException,
+
+    -- ** InvalidParameterException
+    _InvalidParameterException,
+
+    -- ** ResourceLimitExceededException
+    _ResourceLimitExceededException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CancelContact
+    CancelContact (CancelContact'),
+    newCancelContact,
+    ContactIdResponse (ContactIdResponse'),
+    newContactIdResponse,
+
+    -- ** CreateConfig
+    CreateConfig (CreateConfig'),
+    newCreateConfig,
+    ConfigIdResponse (ConfigIdResponse'),
+    newConfigIdResponse,
+
+    -- ** CreateDataflowEndpointGroup
+    CreateDataflowEndpointGroup (CreateDataflowEndpointGroup'),
+    newCreateDataflowEndpointGroup,
+    DataflowEndpointGroupIdResponse (DataflowEndpointGroupIdResponse'),
+    newDataflowEndpointGroupIdResponse,
+
+    -- ** CreateEphemeris
+    CreateEphemeris (CreateEphemeris'),
+    newCreateEphemeris,
+    EphemerisIdResponse (EphemerisIdResponse'),
+    newEphemerisIdResponse,
+
+    -- ** CreateMissionProfile
+    CreateMissionProfile (CreateMissionProfile'),
+    newCreateMissionProfile,
+    MissionProfileIdResponse (MissionProfileIdResponse'),
+    newMissionProfileIdResponse,
+
+    -- ** DeleteConfig
+    DeleteConfig (DeleteConfig'),
+    newDeleteConfig,
+    ConfigIdResponse (ConfigIdResponse'),
+    newConfigIdResponse,
+
+    -- ** DeleteDataflowEndpointGroup
+    DeleteDataflowEndpointGroup (DeleteDataflowEndpointGroup'),
+    newDeleteDataflowEndpointGroup,
+    DataflowEndpointGroupIdResponse (DataflowEndpointGroupIdResponse'),
+    newDataflowEndpointGroupIdResponse,
+
+    -- ** DeleteEphemeris
+    DeleteEphemeris (DeleteEphemeris'),
+    newDeleteEphemeris,
+    EphemerisIdResponse (EphemerisIdResponse'),
+    newEphemerisIdResponse,
+
+    -- ** DeleteMissionProfile
+    DeleteMissionProfile (DeleteMissionProfile'),
+    newDeleteMissionProfile,
+    MissionProfileIdResponse (MissionProfileIdResponse'),
+    newMissionProfileIdResponse,
+
+    -- ** DescribeContact
+    DescribeContact (DescribeContact'),
+    newDescribeContact,
+    DescribeContactResponse (DescribeContactResponse'),
+    newDescribeContactResponse,
+
+    -- ** DescribeEphemeris
+    DescribeEphemeris (DescribeEphemeris'),
+    newDescribeEphemeris,
+    DescribeEphemerisResponse (DescribeEphemerisResponse'),
+    newDescribeEphemerisResponse,
+
+    -- ** GetConfig
+    GetConfig (GetConfig'),
+    newGetConfig,
+    GetConfigResponse (GetConfigResponse'),
+    newGetConfigResponse,
+
+    -- ** GetDataflowEndpointGroup
+    GetDataflowEndpointGroup (GetDataflowEndpointGroup'),
+    newGetDataflowEndpointGroup,
+    GetDataflowEndpointGroupResponse (GetDataflowEndpointGroupResponse'),
+    newGetDataflowEndpointGroupResponse,
+
+    -- ** GetMinuteUsage
+    GetMinuteUsage (GetMinuteUsage'),
+    newGetMinuteUsage,
+    GetMinuteUsageResponse (GetMinuteUsageResponse'),
+    newGetMinuteUsageResponse,
+
+    -- ** GetMissionProfile
+    GetMissionProfile (GetMissionProfile'),
+    newGetMissionProfile,
+    GetMissionProfileResponse (GetMissionProfileResponse'),
+    newGetMissionProfileResponse,
+
+    -- ** GetSatellite
+    GetSatellite (GetSatellite'),
+    newGetSatellite,
+    GetSatelliteResponse (GetSatelliteResponse'),
+    newGetSatelliteResponse,
+
+    -- ** ListConfigs (Paginated)
+    ListConfigs (ListConfigs'),
+    newListConfigs,
+    ListConfigsResponse (ListConfigsResponse'),
+    newListConfigsResponse,
+
+    -- ** ListContacts (Paginated)
+    ListContacts (ListContacts'),
+    newListContacts,
+    ListContactsResponse (ListContactsResponse'),
+    newListContactsResponse,
+
+    -- ** ListDataflowEndpointGroups (Paginated)
+    ListDataflowEndpointGroups (ListDataflowEndpointGroups'),
+    newListDataflowEndpointGroups,
+    ListDataflowEndpointGroupsResponse (ListDataflowEndpointGroupsResponse'),
+    newListDataflowEndpointGroupsResponse,
+
+    -- ** ListEphemerides (Paginated)
+    ListEphemerides (ListEphemerides'),
+    newListEphemerides,
+    ListEphemeridesResponse (ListEphemeridesResponse'),
+    newListEphemeridesResponse,
+
+    -- ** ListGroundStations (Paginated)
+    ListGroundStations (ListGroundStations'),
+    newListGroundStations,
+    ListGroundStationsResponse (ListGroundStationsResponse'),
+    newListGroundStationsResponse,
+
+    -- ** ListMissionProfiles (Paginated)
+    ListMissionProfiles (ListMissionProfiles'),
+    newListMissionProfiles,
+    ListMissionProfilesResponse (ListMissionProfilesResponse'),
+    newListMissionProfilesResponse,
+
+    -- ** ListSatellites (Paginated)
+    ListSatellites (ListSatellites'),
+    newListSatellites,
+    ListSatellitesResponse (ListSatellitesResponse'),
+    newListSatellitesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ReserveContact
+    ReserveContact (ReserveContact'),
+    newReserveContact,
+    ContactIdResponse (ContactIdResponse'),
+    newContactIdResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateConfig
+    UpdateConfig (UpdateConfig'),
+    newUpdateConfig,
+    ConfigIdResponse (ConfigIdResponse'),
+    newConfigIdResponse,
+
+    -- ** UpdateEphemeris
+    UpdateEphemeris (UpdateEphemeris'),
+    newUpdateEphemeris,
+    EphemerisIdResponse (EphemerisIdResponse'),
+    newEphemerisIdResponse,
+
+    -- ** UpdateMissionProfile
+    UpdateMissionProfile (UpdateMissionProfile'),
+    newUpdateMissionProfile,
+    MissionProfileIdResponse (MissionProfileIdResponse'),
+    newMissionProfileIdResponse,
+
+    -- * Types
+
+    -- ** AngleUnits
+    AngleUnits (..),
+
+    -- ** BandwidthUnits
+    BandwidthUnits (..),
+
+    -- ** ConfigCapabilityType
+    ConfigCapabilityType (..),
+
+    -- ** ContactStatus
+    ContactStatus (..),
+
+    -- ** Criticality
+    Criticality (..),
+
+    -- ** EirpUnits
+    EirpUnits (..),
+
+    -- ** EndpointStatus
+    EndpointStatus (..),
+
+    -- ** EphemerisInvalidReason
+    EphemerisInvalidReason (..),
+
+    -- ** EphemerisSource
+    EphemerisSource (..),
+
+    -- ** EphemerisStatus
+    EphemerisStatus (..),
+
+    -- ** FrequencyUnits
+    FrequencyUnits (..),
+
+    -- ** Polarization
+    Polarization (..),
+
+    -- ** AntennaDemodDecodeDetails
+    AntennaDemodDecodeDetails (AntennaDemodDecodeDetails'),
+    newAntennaDemodDecodeDetails,
+
+    -- ** AntennaDownlinkConfig
+    AntennaDownlinkConfig (AntennaDownlinkConfig'),
+    newAntennaDownlinkConfig,
+
+    -- ** AntennaDownlinkDemodDecodeConfig
+    AntennaDownlinkDemodDecodeConfig (AntennaDownlinkDemodDecodeConfig'),
+    newAntennaDownlinkDemodDecodeConfig,
+
+    -- ** AntennaUplinkConfig
+    AntennaUplinkConfig (AntennaUplinkConfig'),
+    newAntennaUplinkConfig,
+
+    -- ** ConfigDetails
+    ConfigDetails (ConfigDetails'),
+    newConfigDetails,
+
+    -- ** ConfigIdResponse
+    ConfigIdResponse (ConfigIdResponse'),
+    newConfigIdResponse,
+
+    -- ** ConfigListItem
+    ConfigListItem (ConfigListItem'),
+    newConfigListItem,
+
+    -- ** ConfigTypeData
+    ConfigTypeData (ConfigTypeData'),
+    newConfigTypeData,
+
+    -- ** ContactData
+    ContactData (ContactData'),
+    newContactData,
+
+    -- ** ContactIdResponse
+    ContactIdResponse (ContactIdResponse'),
+    newContactIdResponse,
+
+    -- ** DataflowDetail
+    DataflowDetail (DataflowDetail'),
+    newDataflowDetail,
+
+    -- ** DataflowEndpoint
+    DataflowEndpoint (DataflowEndpoint'),
+    newDataflowEndpoint,
+
+    -- ** DataflowEndpointConfig
+    DataflowEndpointConfig (DataflowEndpointConfig'),
+    newDataflowEndpointConfig,
+
+    -- ** DataflowEndpointGroupIdResponse
+    DataflowEndpointGroupIdResponse (DataflowEndpointGroupIdResponse'),
+    newDataflowEndpointGroupIdResponse,
+
+    -- ** DataflowEndpointListItem
+    DataflowEndpointListItem (DataflowEndpointListItem'),
+    newDataflowEndpointListItem,
+
+    -- ** DecodeConfig
+    DecodeConfig (DecodeConfig'),
+    newDecodeConfig,
+
+    -- ** DemodulationConfig
+    DemodulationConfig (DemodulationConfig'),
+    newDemodulationConfig,
+
+    -- ** Destination
+    Destination (Destination'),
+    newDestination,
+
+    -- ** Eirp
+    Eirp (Eirp'),
+    newEirp,
+
+    -- ** Elevation
+    Elevation (Elevation'),
+    newElevation,
+
+    -- ** EndpointDetails
+    EndpointDetails (EndpointDetails'),
+    newEndpointDetails,
+
+    -- ** EphemerisData
+    EphemerisData (EphemerisData'),
+    newEphemerisData,
+
+    -- ** EphemerisDescription
+    EphemerisDescription (EphemerisDescription'),
+    newEphemerisDescription,
+
+    -- ** EphemerisIdResponse
+    EphemerisIdResponse (EphemerisIdResponse'),
+    newEphemerisIdResponse,
+
+    -- ** EphemerisItem
+    EphemerisItem (EphemerisItem'),
+    newEphemerisItem,
+
+    -- ** EphemerisMetaData
+    EphemerisMetaData (EphemerisMetaData'),
+    newEphemerisMetaData,
+
+    -- ** EphemerisTypeDescription
+    EphemerisTypeDescription (EphemerisTypeDescription'),
+    newEphemerisTypeDescription,
+
+    -- ** Frequency
+    Frequency (Frequency'),
+    newFrequency,
+
+    -- ** FrequencyBandwidth
+    FrequencyBandwidth (FrequencyBandwidth'),
+    newFrequencyBandwidth,
+
+    -- ** GroundStationData
+    GroundStationData (GroundStationData'),
+    newGroundStationData,
+
+    -- ** MissionProfileIdResponse
+    MissionProfileIdResponse (MissionProfileIdResponse'),
+    newMissionProfileIdResponse,
+
+    -- ** MissionProfileListItem
+    MissionProfileListItem (MissionProfileListItem'),
+    newMissionProfileListItem,
+
+    -- ** OEMEphemeris
+    OEMEphemeris (OEMEphemeris'),
+    newOEMEphemeris,
+
+    -- ** S3Object
+    S3Object (S3Object'),
+    newS3Object,
+
+    -- ** S3RecordingConfig
+    S3RecordingConfig (S3RecordingConfig'),
+    newS3RecordingConfig,
+
+    -- ** S3RecordingDetails
+    S3RecordingDetails (S3RecordingDetails'),
+    newS3RecordingDetails,
+
+    -- ** SatelliteListItem
+    SatelliteListItem (SatelliteListItem'),
+    newSatelliteListItem,
+
+    -- ** SecurityDetails
+    SecurityDetails (SecurityDetails'),
+    newSecurityDetails,
+
+    -- ** SocketAddress
+    SocketAddress (SocketAddress'),
+    newSocketAddress,
+
+    -- ** Source
+    Source (Source'),
+    newSource,
+
+    -- ** SpectrumConfig
+    SpectrumConfig (SpectrumConfig'),
+    newSpectrumConfig,
+
+    -- ** TLEData
+    TLEData (TLEData'),
+    newTLEData,
+
+    -- ** TLEEphemeris
+    TLEEphemeris (TLEEphemeris'),
+    newTLEEphemeris,
+
+    -- ** TimeRange
+    TimeRange (TimeRange'),
+    newTimeRange,
+
+    -- ** TrackingConfig
+    TrackingConfig (TrackingConfig'),
+    newTrackingConfig,
+
+    -- ** UplinkEchoConfig
+    UplinkEchoConfig (UplinkEchoConfig'),
+    newUplinkEchoConfig,
+
+    -- ** UplinkSpectrumConfig
+    UplinkSpectrumConfig (UplinkSpectrumConfig'),
+    newUplinkSpectrumConfig,
+  )
+where
+
+import Amazonka.GroundStation.CancelContact
+import Amazonka.GroundStation.CreateConfig
+import Amazonka.GroundStation.CreateDataflowEndpointGroup
+import Amazonka.GroundStation.CreateEphemeris
+import Amazonka.GroundStation.CreateMissionProfile
+import Amazonka.GroundStation.DeleteConfig
+import Amazonka.GroundStation.DeleteDataflowEndpointGroup
+import Amazonka.GroundStation.DeleteEphemeris
+import Amazonka.GroundStation.DeleteMissionProfile
+import Amazonka.GroundStation.DescribeContact
+import Amazonka.GroundStation.DescribeEphemeris
+import Amazonka.GroundStation.GetConfig
+import Amazonka.GroundStation.GetDataflowEndpointGroup
+import Amazonka.GroundStation.GetMinuteUsage
+import Amazonka.GroundStation.GetMissionProfile
+import Amazonka.GroundStation.GetSatellite
+import Amazonka.GroundStation.Lens
+import Amazonka.GroundStation.ListConfigs
+import Amazonka.GroundStation.ListContacts
+import Amazonka.GroundStation.ListDataflowEndpointGroups
+import Amazonka.GroundStation.ListEphemerides
+import Amazonka.GroundStation.ListGroundStations
+import Amazonka.GroundStation.ListMissionProfiles
+import Amazonka.GroundStation.ListSatellites
+import Amazonka.GroundStation.ListTagsForResource
+import Amazonka.GroundStation.ReserveContact
+import Amazonka.GroundStation.TagResource
+import Amazonka.GroundStation.Types
+import Amazonka.GroundStation.UntagResource
+import Amazonka.GroundStation.UpdateConfig
+import Amazonka.GroundStation.UpdateEphemeris
+import Amazonka.GroundStation.UpdateMissionProfile
+import Amazonka.GroundStation.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 'GroundStation'.
+
+-- $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/GroundStation/CancelContact.hs b/gen/Amazonka/GroundStation/CancelContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/CancelContact.hs
@@ -0,0 +1,109 @@
+{-# 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.GroundStation.CancelContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Cancels a contact with a specified contact ID.
+module Amazonka.GroundStation.CancelContact
+  ( -- * Creating a Request
+    CancelContact (..),
+    newCancelContact,
+
+    -- * Request Lenses
+    cancelContact_contactId,
+
+    -- * Destructuring the Response
+    ContactIdResponse (..),
+    newContactIdResponse,
+
+    -- * Response Lenses
+    contactIdResponse_contactId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCancelContact' smart constructor.
+data CancelContact = CancelContact'
+  { -- | UUID of a contact.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CancelContact' 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:
+--
+-- 'contactId', 'cancelContact_contactId' - UUID of a contact.
+newCancelContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  CancelContact
+newCancelContact pContactId_ =
+  CancelContact' {contactId = pContactId_}
+
+-- | UUID of a contact.
+cancelContact_contactId :: Lens.Lens' CancelContact Prelude.Text
+cancelContact_contactId = Lens.lens (\CancelContact' {contactId} -> contactId) (\s@CancelContact' {} a -> s {contactId = a} :: CancelContact)
+
+instance Core.AWSRequest CancelContact where
+  type AWSResponse CancelContact = ContactIdResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable CancelContact where
+  hashWithSalt _salt CancelContact' {..} =
+    _salt `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData CancelContact where
+  rnf CancelContact' {..} = Prelude.rnf contactId
+
+instance Data.ToHeaders CancelContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath CancelContact where
+  toPath CancelContact' {..} =
+    Prelude.mconcat ["/contact/", Data.toBS contactId]
+
+instance Data.ToQuery CancelContact where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/CreateConfig.hs b/gen/Amazonka/GroundStation/CreateConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/CreateConfig.hs
@@ -0,0 +1,152 @@
+{-# 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.GroundStation.CreateConfig
+-- 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 @Config@ with the specified @configData@ parameters.
+--
+-- Only one type of @configData@ can be specified.
+module Amazonka.GroundStation.CreateConfig
+  ( -- * Creating a Request
+    CreateConfig (..),
+    newCreateConfig,
+
+    -- * Request Lenses
+    createConfig_tags,
+    createConfig_configData,
+    createConfig_name,
+
+    -- * Destructuring the Response
+    ConfigIdResponse (..),
+    newConfigIdResponse,
+
+    -- * Response Lenses
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateConfig' smart constructor.
+data CreateConfig = CreateConfig'
+  { -- | Tags assigned to a @Config@.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Parameters of a @Config@.
+    configData :: ConfigTypeData,
+    -- | Name of a @Config@.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateConfig' 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', 'createConfig_tags' - Tags assigned to a @Config@.
+--
+-- 'configData', 'createConfig_configData' - Parameters of a @Config@.
+--
+-- 'name', 'createConfig_name' - Name of a @Config@.
+newCreateConfig ::
+  -- | 'configData'
+  ConfigTypeData ->
+  -- | 'name'
+  Prelude.Text ->
+  CreateConfig
+newCreateConfig pConfigData_ pName_ =
+  CreateConfig'
+    { tags = Prelude.Nothing,
+      configData = pConfigData_,
+      name = pName_
+    }
+
+-- | Tags assigned to a @Config@.
+createConfig_tags :: Lens.Lens' CreateConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createConfig_tags = Lens.lens (\CreateConfig' {tags} -> tags) (\s@CreateConfig' {} a -> s {tags = a} :: CreateConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | Parameters of a @Config@.
+createConfig_configData :: Lens.Lens' CreateConfig ConfigTypeData
+createConfig_configData = Lens.lens (\CreateConfig' {configData} -> configData) (\s@CreateConfig' {} a -> s {configData = a} :: CreateConfig)
+
+-- | Name of a @Config@.
+createConfig_name :: Lens.Lens' CreateConfig Prelude.Text
+createConfig_name = Lens.lens (\CreateConfig' {name} -> name) (\s@CreateConfig' {} a -> s {name = a} :: CreateConfig)
+
+instance Core.AWSRequest CreateConfig where
+  type AWSResponse CreateConfig = ConfigIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable CreateConfig where
+  hashWithSalt _salt CreateConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` configData
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData CreateConfig where
+  rnf CreateConfig' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf configData
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders CreateConfig where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateConfig where
+  toJSON CreateConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("configData" Data..= configData),
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath CreateConfig where
+  toPath = Prelude.const "/config"
+
+instance Data.ToQuery CreateConfig where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/CreateDataflowEndpointGroup.hs b/gen/Amazonka/GroundStation/CreateDataflowEndpointGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/CreateDataflowEndpointGroup.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.GroundStation.CreateDataflowEndpointGroup
+-- 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 @DataflowEndpoint@ group containing the specified list of
+-- @DataflowEndpoint@ objects.
+--
+-- The @name@ field in each endpoint is used in your mission profile
+-- @DataflowEndpointConfig@ to specify which endpoints to use during a
+-- contact.
+--
+-- When a contact uses multiple @DataflowEndpointConfig@ objects, each
+-- @Config@ must match a @DataflowEndpoint@ in the same group.
+module Amazonka.GroundStation.CreateDataflowEndpointGroup
+  ( -- * Creating a Request
+    CreateDataflowEndpointGroup (..),
+    newCreateDataflowEndpointGroup,
+
+    -- * Request Lenses
+    createDataflowEndpointGroup_tags,
+    createDataflowEndpointGroup_endpointDetails,
+
+    -- * Destructuring the Response
+    DataflowEndpointGroupIdResponse (..),
+    newDataflowEndpointGroupIdResponse,
+
+    -- * Response Lenses
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateDataflowEndpointGroup' smart constructor.
+data CreateDataflowEndpointGroup = CreateDataflowEndpointGroup'
+  { -- | Tags of a dataflow endpoint group.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Endpoint details of each endpoint in the dataflow endpoint group.
+    endpointDetails :: [EndpointDetails]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataflowEndpointGroup' 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', 'createDataflowEndpointGroup_tags' - Tags of a dataflow endpoint group.
+--
+-- 'endpointDetails', 'createDataflowEndpointGroup_endpointDetails' - Endpoint details of each endpoint in the dataflow endpoint group.
+newCreateDataflowEndpointGroup ::
+  CreateDataflowEndpointGroup
+newCreateDataflowEndpointGroup =
+  CreateDataflowEndpointGroup'
+    { tags =
+        Prelude.Nothing,
+      endpointDetails = Prelude.mempty
+    }
+
+-- | Tags of a dataflow endpoint group.
+createDataflowEndpointGroup_tags :: Lens.Lens' CreateDataflowEndpointGroup (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createDataflowEndpointGroup_tags = Lens.lens (\CreateDataflowEndpointGroup' {tags} -> tags) (\s@CreateDataflowEndpointGroup' {} a -> s {tags = a} :: CreateDataflowEndpointGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | Endpoint details of each endpoint in the dataflow endpoint group.
+createDataflowEndpointGroup_endpointDetails :: Lens.Lens' CreateDataflowEndpointGroup [EndpointDetails]
+createDataflowEndpointGroup_endpointDetails = Lens.lens (\CreateDataflowEndpointGroup' {endpointDetails} -> endpointDetails) (\s@CreateDataflowEndpointGroup' {} a -> s {endpointDetails = a} :: CreateDataflowEndpointGroup) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateDataflowEndpointGroup where
+  type
+    AWSResponse CreateDataflowEndpointGroup =
+      DataflowEndpointGroupIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable CreateDataflowEndpointGroup where
+  hashWithSalt _salt CreateDataflowEndpointGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` endpointDetails
+
+instance Prelude.NFData CreateDataflowEndpointGroup where
+  rnf CreateDataflowEndpointGroup' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf endpointDetails
+
+instance Data.ToHeaders CreateDataflowEndpointGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDataflowEndpointGroup where
+  toJSON CreateDataflowEndpointGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("endpointDetails" Data..= endpointDetails)
+          ]
+      )
+
+instance Data.ToPath CreateDataflowEndpointGroup where
+  toPath = Prelude.const "/dataflowEndpointGroup"
+
+instance Data.ToQuery CreateDataflowEndpointGroup where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/CreateEphemeris.hs b/gen/Amazonka/GroundStation/CreateEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/CreateEphemeris.hs
@@ -0,0 +1,247 @@
+{-# 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.GroundStation.CreateEphemeris
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an Ephemeris with the specified @EphemerisData@.
+module Amazonka.GroundStation.CreateEphemeris
+  ( -- * Creating a Request
+    CreateEphemeris (..),
+    newCreateEphemeris,
+
+    -- * Request Lenses
+    createEphemeris_enabled,
+    createEphemeris_ephemeris,
+    createEphemeris_expirationTime,
+    createEphemeris_kmsKeyArn,
+    createEphemeris_priority,
+    createEphemeris_tags,
+    createEphemeris_name,
+    createEphemeris_satelliteId,
+
+    -- * Destructuring the Response
+    EphemerisIdResponse (..),
+    newEphemerisIdResponse,
+
+    -- * Response Lenses
+    ephemerisIdResponse_ephemerisId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateEphemeris' smart constructor.
+data CreateEphemeris = CreateEphemeris'
+  { -- | Whether to set the ephemeris status to @ENABLED@ after validation.
+    --
+    -- Setting this to false will set the ephemeris status to @DISABLED@ after
+    -- validation.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | Ephemeris data.
+    ephemeris :: Prelude.Maybe EphemerisData,
+    -- | An overall expiration time for the ephemeris in UTC, after which it will
+    -- become @EXPIRED@.
+    expirationTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of a KMS key used to encrypt the ephemeris in Ground Station.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | Customer-provided priority score to establish the order in which
+    -- overlapping ephemerides should be used.
+    --
+    -- The default for customer-provided ephemeris priority is 1, and higher
+    -- numbers take precedence.
+    --
+    -- Priority must be 1 or greater
+    priority :: Prelude.Maybe Prelude.Natural,
+    -- | Tags assigned to an ephemeris.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A name string associated with the ephemeris. Used as a human-readable
+    -- identifier for the ephemeris.
+    name :: Prelude.Text,
+    -- | AWS Ground Station satellite ID for this ephemeris.
+    satelliteId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEphemeris' 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:
+--
+-- 'enabled', 'createEphemeris_enabled' - Whether to set the ephemeris status to @ENABLED@ after validation.
+--
+-- Setting this to false will set the ephemeris status to @DISABLED@ after
+-- validation.
+--
+-- 'ephemeris', 'createEphemeris_ephemeris' - Ephemeris data.
+--
+-- 'expirationTime', 'createEphemeris_expirationTime' - An overall expiration time for the ephemeris in UTC, after which it will
+-- become @EXPIRED@.
+--
+-- 'kmsKeyArn', 'createEphemeris_kmsKeyArn' - The ARN of a KMS key used to encrypt the ephemeris in Ground Station.
+--
+-- 'priority', 'createEphemeris_priority' - Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+--
+-- 'tags', 'createEphemeris_tags' - Tags assigned to an ephemeris.
+--
+-- 'name', 'createEphemeris_name' - A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- 'satelliteId', 'createEphemeris_satelliteId' - AWS Ground Station satellite ID for this ephemeris.
+newCreateEphemeris ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'satelliteId'
+  Prelude.Text ->
+  CreateEphemeris
+newCreateEphemeris pName_ pSatelliteId_ =
+  CreateEphemeris'
+    { enabled = Prelude.Nothing,
+      ephemeris = Prelude.Nothing,
+      expirationTime = Prelude.Nothing,
+      kmsKeyArn = Prelude.Nothing,
+      priority = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_,
+      satelliteId = pSatelliteId_
+    }
+
+-- | Whether to set the ephemeris status to @ENABLED@ after validation.
+--
+-- Setting this to false will set the ephemeris status to @DISABLED@ after
+-- validation.
+createEphemeris_enabled :: Lens.Lens' CreateEphemeris (Prelude.Maybe Prelude.Bool)
+createEphemeris_enabled = Lens.lens (\CreateEphemeris' {enabled} -> enabled) (\s@CreateEphemeris' {} a -> s {enabled = a} :: CreateEphemeris)
+
+-- | Ephemeris data.
+createEphemeris_ephemeris :: Lens.Lens' CreateEphemeris (Prelude.Maybe EphemerisData)
+createEphemeris_ephemeris = Lens.lens (\CreateEphemeris' {ephemeris} -> ephemeris) (\s@CreateEphemeris' {} a -> s {ephemeris = a} :: CreateEphemeris)
+
+-- | An overall expiration time for the ephemeris in UTC, after which it will
+-- become @EXPIRED@.
+createEphemeris_expirationTime :: Lens.Lens' CreateEphemeris (Prelude.Maybe Prelude.UTCTime)
+createEphemeris_expirationTime = Lens.lens (\CreateEphemeris' {expirationTime} -> expirationTime) (\s@CreateEphemeris' {} a -> s {expirationTime = a} :: CreateEphemeris) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of a KMS key used to encrypt the ephemeris in Ground Station.
+createEphemeris_kmsKeyArn :: Lens.Lens' CreateEphemeris (Prelude.Maybe Prelude.Text)
+createEphemeris_kmsKeyArn = Lens.lens (\CreateEphemeris' {kmsKeyArn} -> kmsKeyArn) (\s@CreateEphemeris' {} a -> s {kmsKeyArn = a} :: CreateEphemeris)
+
+-- | Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+createEphemeris_priority :: Lens.Lens' CreateEphemeris (Prelude.Maybe Prelude.Natural)
+createEphemeris_priority = Lens.lens (\CreateEphemeris' {priority} -> priority) (\s@CreateEphemeris' {} a -> s {priority = a} :: CreateEphemeris)
+
+-- | Tags assigned to an ephemeris.
+createEphemeris_tags :: Lens.Lens' CreateEphemeris (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createEphemeris_tags = Lens.lens (\CreateEphemeris' {tags} -> tags) (\s@CreateEphemeris' {} a -> s {tags = a} :: CreateEphemeris) Prelude.. Lens.mapping Lens.coerced
+
+-- | A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+createEphemeris_name :: Lens.Lens' CreateEphemeris Prelude.Text
+createEphemeris_name = Lens.lens (\CreateEphemeris' {name} -> name) (\s@CreateEphemeris' {} a -> s {name = a} :: CreateEphemeris)
+
+-- | AWS Ground Station satellite ID for this ephemeris.
+createEphemeris_satelliteId :: Lens.Lens' CreateEphemeris Prelude.Text
+createEphemeris_satelliteId = Lens.lens (\CreateEphemeris' {satelliteId} -> satelliteId) (\s@CreateEphemeris' {} a -> s {satelliteId = a} :: CreateEphemeris)
+
+instance Core.AWSRequest CreateEphemeris where
+  type
+    AWSResponse CreateEphemeris =
+      EphemerisIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable CreateEphemeris where
+  hashWithSalt _salt CreateEphemeris' {..} =
+    _salt
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` ephemeris
+      `Prelude.hashWithSalt` expirationTime
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` priority
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` satelliteId
+
+instance Prelude.NFData CreateEphemeris where
+  rnf CreateEphemeris' {..} =
+    Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf ephemeris
+      `Prelude.seq` Prelude.rnf expirationTime
+      `Prelude.seq` Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf priority
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf satelliteId
+
+instance Data.ToHeaders CreateEphemeris where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateEphemeris where
+  toJSON CreateEphemeris' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("enabled" Data..=) Prelude.<$> enabled,
+            ("ephemeris" Data..=) Prelude.<$> ephemeris,
+            ("expirationTime" Data..=)
+              Prelude.<$> expirationTime,
+            ("kmsKeyArn" Data..=) Prelude.<$> kmsKeyArn,
+            ("priority" Data..=) Prelude.<$> priority,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("satelliteId" Data..= satelliteId)
+          ]
+      )
+
+instance Data.ToPath CreateEphemeris where
+  toPath = Prelude.const "/ephemeris"
+
+instance Data.ToQuery CreateEphemeris where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/CreateMissionProfile.hs b/gen/Amazonka/GroundStation/CreateMissionProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/CreateMissionProfile.hs
@@ -0,0 +1,233 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.CreateMissionProfile
+-- 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 mission profile.
+--
+-- @dataflowEdges@ is a list of lists of strings. Each lower level list of
+-- strings has two elements: a /from/ ARN and a /to/ ARN.
+module Amazonka.GroundStation.CreateMissionProfile
+  ( -- * Creating a Request
+    CreateMissionProfile (..),
+    newCreateMissionProfile,
+
+    -- * Request Lenses
+    createMissionProfile_contactPostPassDurationSeconds,
+    createMissionProfile_contactPrePassDurationSeconds,
+    createMissionProfile_tags,
+    createMissionProfile_dataflowEdges,
+    createMissionProfile_minimumViableContactDurationSeconds,
+    createMissionProfile_name,
+    createMissionProfile_trackingConfigArn,
+
+    -- * Destructuring the Response
+    MissionProfileIdResponse (..),
+    newMissionProfileIdResponse,
+
+    -- * Response Lenses
+    missionProfileIdResponse_missionProfileId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newCreateMissionProfile' smart constructor.
+data CreateMissionProfile = CreateMissionProfile'
+  { -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    contactPostPassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Amount of time prior to contact start you’d like to receive a CloudWatch
+    -- event indicating an upcoming pass.
+    contactPrePassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Tags assigned to a mission profile.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+    -- @Config@ and a /to/ @Config@.
+    dataflowEdges :: [Prelude.NonEmpty Prelude.Text],
+    -- | Smallest amount of time in seconds that you’d like to see for an
+    -- available contact. AWS Ground Station will not present you with contacts
+    -- shorter than this duration.
+    minimumViableContactDurationSeconds :: Prelude.Natural,
+    -- | Name of a mission profile.
+    name :: Prelude.Text,
+    -- | ARN of a tracking @Config@.
+    trackingConfigArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMissionProfile' 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:
+--
+-- 'contactPostPassDurationSeconds', 'createMissionProfile_contactPostPassDurationSeconds' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'contactPrePassDurationSeconds', 'createMissionProfile_contactPrePassDurationSeconds' - Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+--
+-- 'tags', 'createMissionProfile_tags' - Tags assigned to a mission profile.
+--
+-- 'dataflowEdges', 'createMissionProfile_dataflowEdges' - A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+--
+-- 'minimumViableContactDurationSeconds', 'createMissionProfile_minimumViableContactDurationSeconds' - Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+--
+-- 'name', 'createMissionProfile_name' - Name of a mission profile.
+--
+-- 'trackingConfigArn', 'createMissionProfile_trackingConfigArn' - ARN of a tracking @Config@.
+newCreateMissionProfile ::
+  -- | 'minimumViableContactDurationSeconds'
+  Prelude.Natural ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'trackingConfigArn'
+  Prelude.Text ->
+  CreateMissionProfile
+newCreateMissionProfile
+  pMinimumViableContactDurationSeconds_
+  pName_
+  pTrackingConfigArn_ =
+    CreateMissionProfile'
+      { contactPostPassDurationSeconds =
+          Prelude.Nothing,
+        contactPrePassDurationSeconds = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        dataflowEdges = Prelude.mempty,
+        minimumViableContactDurationSeconds =
+          pMinimumViableContactDurationSeconds_,
+        name = pName_,
+        trackingConfigArn = pTrackingConfigArn_
+      }
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+createMissionProfile_contactPostPassDurationSeconds :: Lens.Lens' CreateMissionProfile (Prelude.Maybe Prelude.Natural)
+createMissionProfile_contactPostPassDurationSeconds = Lens.lens (\CreateMissionProfile' {contactPostPassDurationSeconds} -> contactPostPassDurationSeconds) (\s@CreateMissionProfile' {} a -> s {contactPostPassDurationSeconds = a} :: CreateMissionProfile)
+
+-- | Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+createMissionProfile_contactPrePassDurationSeconds :: Lens.Lens' CreateMissionProfile (Prelude.Maybe Prelude.Natural)
+createMissionProfile_contactPrePassDurationSeconds = Lens.lens (\CreateMissionProfile' {contactPrePassDurationSeconds} -> contactPrePassDurationSeconds) (\s@CreateMissionProfile' {} a -> s {contactPrePassDurationSeconds = a} :: CreateMissionProfile)
+
+-- | Tags assigned to a mission profile.
+createMissionProfile_tags :: Lens.Lens' CreateMissionProfile (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createMissionProfile_tags = Lens.lens (\CreateMissionProfile' {tags} -> tags) (\s@CreateMissionProfile' {} a -> s {tags = a} :: CreateMissionProfile) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+createMissionProfile_dataflowEdges :: Lens.Lens' CreateMissionProfile [Prelude.NonEmpty Prelude.Text]
+createMissionProfile_dataflowEdges = Lens.lens (\CreateMissionProfile' {dataflowEdges} -> dataflowEdges) (\s@CreateMissionProfile' {} a -> s {dataflowEdges = a} :: CreateMissionProfile) Prelude.. Lens.coerced
+
+-- | Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+createMissionProfile_minimumViableContactDurationSeconds :: Lens.Lens' CreateMissionProfile Prelude.Natural
+createMissionProfile_minimumViableContactDurationSeconds = Lens.lens (\CreateMissionProfile' {minimumViableContactDurationSeconds} -> minimumViableContactDurationSeconds) (\s@CreateMissionProfile' {} a -> s {minimumViableContactDurationSeconds = a} :: CreateMissionProfile)
+
+-- | Name of a mission profile.
+createMissionProfile_name :: Lens.Lens' CreateMissionProfile Prelude.Text
+createMissionProfile_name = Lens.lens (\CreateMissionProfile' {name} -> name) (\s@CreateMissionProfile' {} a -> s {name = a} :: CreateMissionProfile)
+
+-- | ARN of a tracking @Config@.
+createMissionProfile_trackingConfigArn :: Lens.Lens' CreateMissionProfile Prelude.Text
+createMissionProfile_trackingConfigArn = Lens.lens (\CreateMissionProfile' {trackingConfigArn} -> trackingConfigArn) (\s@CreateMissionProfile' {} a -> s {trackingConfigArn = a} :: CreateMissionProfile)
+
+instance Core.AWSRequest CreateMissionProfile where
+  type
+    AWSResponse CreateMissionProfile =
+      MissionProfileIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable CreateMissionProfile where
+  hashWithSalt _salt CreateMissionProfile' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactPostPassDurationSeconds
+      `Prelude.hashWithSalt` contactPrePassDurationSeconds
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` dataflowEdges
+      `Prelude.hashWithSalt` minimumViableContactDurationSeconds
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` trackingConfigArn
+
+instance Prelude.NFData CreateMissionProfile where
+  rnf CreateMissionProfile' {..} =
+    Prelude.rnf contactPostPassDurationSeconds
+      `Prelude.seq` Prelude.rnf contactPrePassDurationSeconds
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf dataflowEdges
+      `Prelude.seq` Prelude.rnf minimumViableContactDurationSeconds
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf trackingConfigArn
+
+instance Data.ToHeaders CreateMissionProfile where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateMissionProfile where
+  toJSON CreateMissionProfile' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("contactPostPassDurationSeconds" Data..=)
+              Prelude.<$> contactPostPassDurationSeconds,
+            ("contactPrePassDurationSeconds" Data..=)
+              Prelude.<$> contactPrePassDurationSeconds,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("dataflowEdges" Data..= dataflowEdges),
+            Prelude.Just
+              ( "minimumViableContactDurationSeconds"
+                  Data..= minimumViableContactDurationSeconds
+              ),
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("trackingConfigArn" Data..= trackingConfigArn)
+          ]
+      )
+
+instance Data.ToPath CreateMissionProfile where
+  toPath = Prelude.const "/missionprofile"
+
+instance Data.ToQuery CreateMissionProfile where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/DeleteConfig.hs b/gen/Amazonka/GroundStation/DeleteConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DeleteConfig.hs
@@ -0,0 +1,134 @@
+{-# 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.GroundStation.DeleteConfig
+-- 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 @Config@.
+module Amazonka.GroundStation.DeleteConfig
+  ( -- * Creating a Request
+    DeleteConfig (..),
+    newDeleteConfig,
+
+    -- * Request Lenses
+    deleteConfig_configId,
+    deleteConfig_configType,
+
+    -- * Destructuring the Response
+    ConfigIdResponse (..),
+    newConfigIdResponse,
+
+    -- * Response Lenses
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteConfig' smart constructor.
+data DeleteConfig = DeleteConfig'
+  { -- | UUID of a @Config@.
+    configId :: Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: ConfigCapabilityType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteConfig' 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:
+--
+-- 'configId', 'deleteConfig_configId' - UUID of a @Config@.
+--
+-- 'configType', 'deleteConfig_configType' - Type of a @Config@.
+newDeleteConfig ::
+  -- | 'configId'
+  Prelude.Text ->
+  -- | 'configType'
+  ConfigCapabilityType ->
+  DeleteConfig
+newDeleteConfig pConfigId_ pConfigType_ =
+  DeleteConfig'
+    { configId = pConfigId_,
+      configType = pConfigType_
+    }
+
+-- | UUID of a @Config@.
+deleteConfig_configId :: Lens.Lens' DeleteConfig Prelude.Text
+deleteConfig_configId = Lens.lens (\DeleteConfig' {configId} -> configId) (\s@DeleteConfig' {} a -> s {configId = a} :: DeleteConfig)
+
+-- | Type of a @Config@.
+deleteConfig_configType :: Lens.Lens' DeleteConfig ConfigCapabilityType
+deleteConfig_configType = Lens.lens (\DeleteConfig' {configType} -> configType) (\s@DeleteConfig' {} a -> s {configType = a} :: DeleteConfig)
+
+instance Core.AWSRequest DeleteConfig where
+  type AWSResponse DeleteConfig = ConfigIdResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable DeleteConfig where
+  hashWithSalt _salt DeleteConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+
+instance Prelude.NFData DeleteConfig where
+  rnf DeleteConfig' {..} =
+    Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+
+instance Data.ToHeaders DeleteConfig where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteConfig where
+  toPath DeleteConfig' {..} =
+    Prelude.mconcat
+      [ "/config/",
+        Data.toBS configType,
+        "/",
+        Data.toBS configId
+      ]
+
+instance Data.ToQuery DeleteConfig where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/DeleteDataflowEndpointGroup.hs b/gen/Amazonka/GroundStation/DeleteDataflowEndpointGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DeleteDataflowEndpointGroup.hs
@@ -0,0 +1,120 @@
+{-# 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.GroundStation.DeleteDataflowEndpointGroup
+-- 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 dataflow endpoint group.
+module Amazonka.GroundStation.DeleteDataflowEndpointGroup
+  ( -- * Creating a Request
+    DeleteDataflowEndpointGroup (..),
+    newDeleteDataflowEndpointGroup,
+
+    -- * Request Lenses
+    deleteDataflowEndpointGroup_dataflowEndpointGroupId,
+
+    -- * Destructuring the Response
+    DataflowEndpointGroupIdResponse (..),
+    newDataflowEndpointGroupIdResponse,
+
+    -- * Response Lenses
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteDataflowEndpointGroup' smart constructor.
+data DeleteDataflowEndpointGroup = DeleteDataflowEndpointGroup'
+  { -- | UUID of a dataflow endpoint group.
+    dataflowEndpointGroupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDataflowEndpointGroup' 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:
+--
+-- 'dataflowEndpointGroupId', 'deleteDataflowEndpointGroup_dataflowEndpointGroupId' - UUID of a dataflow endpoint group.
+newDeleteDataflowEndpointGroup ::
+  -- | 'dataflowEndpointGroupId'
+  Prelude.Text ->
+  DeleteDataflowEndpointGroup
+newDeleteDataflowEndpointGroup
+  pDataflowEndpointGroupId_ =
+    DeleteDataflowEndpointGroup'
+      { dataflowEndpointGroupId =
+          pDataflowEndpointGroupId_
+      }
+
+-- | UUID of a dataflow endpoint group.
+deleteDataflowEndpointGroup_dataflowEndpointGroupId :: Lens.Lens' DeleteDataflowEndpointGroup Prelude.Text
+deleteDataflowEndpointGroup_dataflowEndpointGroupId = Lens.lens (\DeleteDataflowEndpointGroup' {dataflowEndpointGroupId} -> dataflowEndpointGroupId) (\s@DeleteDataflowEndpointGroup' {} a -> s {dataflowEndpointGroupId = a} :: DeleteDataflowEndpointGroup)
+
+instance Core.AWSRequest DeleteDataflowEndpointGroup where
+  type
+    AWSResponse DeleteDataflowEndpointGroup =
+      DataflowEndpointGroupIdResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable DeleteDataflowEndpointGroup where
+  hashWithSalt _salt DeleteDataflowEndpointGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataflowEndpointGroupId
+
+instance Prelude.NFData DeleteDataflowEndpointGroup where
+  rnf DeleteDataflowEndpointGroup' {..} =
+    Prelude.rnf dataflowEndpointGroupId
+
+instance Data.ToHeaders DeleteDataflowEndpointGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteDataflowEndpointGroup where
+  toPath DeleteDataflowEndpointGroup' {..} =
+    Prelude.mconcat
+      [ "/dataflowEndpointGroup/",
+        Data.toBS dataflowEndpointGroupId
+      ]
+
+instance Data.ToQuery DeleteDataflowEndpointGroup where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/DeleteEphemeris.hs b/gen/Amazonka/GroundStation/DeleteEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DeleteEphemeris.hs
@@ -0,0 +1,110 @@
+{-# 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.GroundStation.DeleteEphemeris
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an ephemeris
+module Amazonka.GroundStation.DeleteEphemeris
+  ( -- * Creating a Request
+    DeleteEphemeris (..),
+    newDeleteEphemeris,
+
+    -- * Request Lenses
+    deleteEphemeris_ephemerisId,
+
+    -- * Destructuring the Response
+    EphemerisIdResponse (..),
+    newEphemerisIdResponse,
+
+    -- * Response Lenses
+    ephemerisIdResponse_ephemerisId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteEphemeris' smart constructor.
+data DeleteEphemeris = DeleteEphemeris'
+  { -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEphemeris' 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:
+--
+-- 'ephemerisId', 'deleteEphemeris_ephemerisId' - The AWS Ground Station ephemeris ID.
+newDeleteEphemeris ::
+  -- | 'ephemerisId'
+  Prelude.Text ->
+  DeleteEphemeris
+newDeleteEphemeris pEphemerisId_ =
+  DeleteEphemeris' {ephemerisId = pEphemerisId_}
+
+-- | The AWS Ground Station ephemeris ID.
+deleteEphemeris_ephemerisId :: Lens.Lens' DeleteEphemeris Prelude.Text
+deleteEphemeris_ephemerisId = Lens.lens (\DeleteEphemeris' {ephemerisId} -> ephemerisId) (\s@DeleteEphemeris' {} a -> s {ephemerisId = a} :: DeleteEphemeris)
+
+instance Core.AWSRequest DeleteEphemeris where
+  type
+    AWSResponse DeleteEphemeris =
+      EphemerisIdResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable DeleteEphemeris where
+  hashWithSalt _salt DeleteEphemeris' {..} =
+    _salt `Prelude.hashWithSalt` ephemerisId
+
+instance Prelude.NFData DeleteEphemeris where
+  rnf DeleteEphemeris' {..} = Prelude.rnf ephemerisId
+
+instance Data.ToHeaders DeleteEphemeris where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteEphemeris where
+  toPath DeleteEphemeris' {..} =
+    Prelude.mconcat
+      ["/ephemeris/", Data.toBS ephemerisId]
+
+instance Data.ToQuery DeleteEphemeris where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/DeleteMissionProfile.hs b/gen/Amazonka/GroundStation/DeleteMissionProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DeleteMissionProfile.hs
@@ -0,0 +1,116 @@
+{-# 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.GroundStation.DeleteMissionProfile
+-- 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 mission profile.
+module Amazonka.GroundStation.DeleteMissionProfile
+  ( -- * Creating a Request
+    DeleteMissionProfile (..),
+    newDeleteMissionProfile,
+
+    -- * Request Lenses
+    deleteMissionProfile_missionProfileId,
+
+    -- * Destructuring the Response
+    MissionProfileIdResponse (..),
+    newMissionProfileIdResponse,
+
+    -- * Response Lenses
+    missionProfileIdResponse_missionProfileId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDeleteMissionProfile' smart constructor.
+data DeleteMissionProfile = DeleteMissionProfile'
+  { -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMissionProfile' 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:
+--
+-- 'missionProfileId', 'deleteMissionProfile_missionProfileId' - UUID of a mission profile.
+newDeleteMissionProfile ::
+  -- | 'missionProfileId'
+  Prelude.Text ->
+  DeleteMissionProfile
+newDeleteMissionProfile pMissionProfileId_ =
+  DeleteMissionProfile'
+    { missionProfileId =
+        pMissionProfileId_
+    }
+
+-- | UUID of a mission profile.
+deleteMissionProfile_missionProfileId :: Lens.Lens' DeleteMissionProfile Prelude.Text
+deleteMissionProfile_missionProfileId = Lens.lens (\DeleteMissionProfile' {missionProfileId} -> missionProfileId) (\s@DeleteMissionProfile' {} a -> s {missionProfileId = a} :: DeleteMissionProfile)
+
+instance Core.AWSRequest DeleteMissionProfile where
+  type
+    AWSResponse DeleteMissionProfile =
+      MissionProfileIdResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable DeleteMissionProfile where
+  hashWithSalt _salt DeleteMissionProfile' {..} =
+    _salt `Prelude.hashWithSalt` missionProfileId
+
+instance Prelude.NFData DeleteMissionProfile where
+  rnf DeleteMissionProfile' {..} =
+    Prelude.rnf missionProfileId
+
+instance Data.ToHeaders DeleteMissionProfile where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteMissionProfile where
+  toPath DeleteMissionProfile' {..} =
+    Prelude.mconcat
+      ["/missionprofile/", Data.toBS missionProfileId]
+
+instance Data.ToQuery DeleteMissionProfile where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/DescribeContact.hs b/gen/Amazonka/GroundStation/DescribeContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DescribeContact.hs
@@ -0,0 +1,324 @@
+{-# 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.GroundStation.DescribeContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing contact.
+module Amazonka.GroundStation.DescribeContact
+  ( -- * Creating a Request
+    DescribeContact (..),
+    newDescribeContact,
+
+    -- * Request Lenses
+    describeContact_contactId,
+
+    -- * Destructuring the Response
+    DescribeContactResponse (..),
+    newDescribeContactResponse,
+
+    -- * Response Lenses
+    describeContactResponse_contactId,
+    describeContactResponse_contactStatus,
+    describeContactResponse_dataflowList,
+    describeContactResponse_endTime,
+    describeContactResponse_errorMessage,
+    describeContactResponse_groundStation,
+    describeContactResponse_maximumElevation,
+    describeContactResponse_missionProfileArn,
+    describeContactResponse_postPassEndTime,
+    describeContactResponse_prePassStartTime,
+    describeContactResponse_region,
+    describeContactResponse_satelliteArn,
+    describeContactResponse_startTime,
+    describeContactResponse_tags,
+    describeContactResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newDescribeContact' smart constructor.
+data DescribeContact = DescribeContact'
+  { -- | UUID of a contact.
+    contactId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeContact' 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:
+--
+-- 'contactId', 'describeContact_contactId' - UUID of a contact.
+newDescribeContact ::
+  -- | 'contactId'
+  Prelude.Text ->
+  DescribeContact
+newDescribeContact pContactId_ =
+  DescribeContact' {contactId = pContactId_}
+
+-- | UUID of a contact.
+describeContact_contactId :: Lens.Lens' DescribeContact Prelude.Text
+describeContact_contactId = Lens.lens (\DescribeContact' {contactId} -> contactId) (\s@DescribeContact' {} a -> s {contactId = a} :: DescribeContact)
+
+instance Core.AWSRequest DescribeContact where
+  type
+    AWSResponse DescribeContact =
+      DescribeContactResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeContactResponse'
+            Prelude.<$> (x Data..?> "contactId")
+            Prelude.<*> (x Data..?> "contactStatus")
+            Prelude.<*> (x Data..?> "dataflowList" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "endTime")
+            Prelude.<*> (x Data..?> "errorMessage")
+            Prelude.<*> (x Data..?> "groundStation")
+            Prelude.<*> (x Data..?> "maximumElevation")
+            Prelude.<*> (x Data..?> "missionProfileArn")
+            Prelude.<*> (x Data..?> "postPassEndTime")
+            Prelude.<*> (x Data..?> "prePassStartTime")
+            Prelude.<*> (x Data..?> "region")
+            Prelude.<*> (x Data..?> "satelliteArn")
+            Prelude.<*> (x Data..?> "startTime")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeContact where
+  hashWithSalt _salt DescribeContact' {..} =
+    _salt `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData DescribeContact where
+  rnf DescribeContact' {..} = Prelude.rnf contactId
+
+instance Data.ToHeaders DescribeContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeContact where
+  toPath DescribeContact' {..} =
+    Prelude.mconcat ["/contact/", Data.toBS contactId]
+
+instance Data.ToQuery DescribeContact where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newDescribeContactResponse' smart constructor.
+data DescribeContactResponse = DescribeContactResponse'
+  { -- | UUID of a contact.
+    contactId :: Prelude.Maybe Prelude.Text,
+    -- | Status of a contact.
+    contactStatus :: Prelude.Maybe ContactStatus,
+    -- | List describing source and destination details for each dataflow edge.
+    dataflowList :: Prelude.Maybe [DataflowDetail],
+    -- | End time of a contact in UTC.
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | Error message for a contact.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | Ground station for a contact.
+    groundStation :: Prelude.Maybe Prelude.Text,
+    -- | Maximum elevation angle of a contact.
+    maximumElevation :: Prelude.Maybe Elevation,
+    -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Maybe Prelude.Text,
+    -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    postPassEndTime :: Prelude.Maybe Data.POSIX,
+    -- | Amount of time prior to contact start you’d like to receive a CloudWatch
+    -- event indicating an upcoming pass.
+    prePassStartTime :: Prelude.Maybe Data.POSIX,
+    -- | Region of a contact.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | ARN of a satellite.
+    satelliteArn :: Prelude.Maybe Prelude.Text,
+    -- | Start time of a contact in UTC.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | Tags assigned to a contact.
+    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 'DescribeContactResponse' 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:
+--
+-- 'contactId', 'describeContactResponse_contactId' - UUID of a contact.
+--
+-- 'contactStatus', 'describeContactResponse_contactStatus' - Status of a contact.
+--
+-- 'dataflowList', 'describeContactResponse_dataflowList' - List describing source and destination details for each dataflow edge.
+--
+-- 'endTime', 'describeContactResponse_endTime' - End time of a contact in UTC.
+--
+-- 'errorMessage', 'describeContactResponse_errorMessage' - Error message for a contact.
+--
+-- 'groundStation', 'describeContactResponse_groundStation' - Ground station for a contact.
+--
+-- 'maximumElevation', 'describeContactResponse_maximumElevation' - Maximum elevation angle of a contact.
+--
+-- 'missionProfileArn', 'describeContactResponse_missionProfileArn' - ARN of a mission profile.
+--
+-- 'postPassEndTime', 'describeContactResponse_postPassEndTime' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'prePassStartTime', 'describeContactResponse_prePassStartTime' - Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+--
+-- 'region', 'describeContactResponse_region' - Region of a contact.
+--
+-- 'satelliteArn', 'describeContactResponse_satelliteArn' - ARN of a satellite.
+--
+-- 'startTime', 'describeContactResponse_startTime' - Start time of a contact in UTC.
+--
+-- 'tags', 'describeContactResponse_tags' - Tags assigned to a contact.
+--
+-- 'httpStatus', 'describeContactResponse_httpStatus' - The response's http status code.
+newDescribeContactResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeContactResponse
+newDescribeContactResponse pHttpStatus_ =
+  DescribeContactResponse'
+    { contactId =
+        Prelude.Nothing,
+      contactStatus = Prelude.Nothing,
+      dataflowList = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      groundStation = Prelude.Nothing,
+      maximumElevation = Prelude.Nothing,
+      missionProfileArn = Prelude.Nothing,
+      postPassEndTime = Prelude.Nothing,
+      prePassStartTime = Prelude.Nothing,
+      region = Prelude.Nothing,
+      satelliteArn = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | UUID of a contact.
+describeContactResponse_contactId :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_contactId = Lens.lens (\DescribeContactResponse' {contactId} -> contactId) (\s@DescribeContactResponse' {} a -> s {contactId = a} :: DescribeContactResponse)
+
+-- | Status of a contact.
+describeContactResponse_contactStatus :: Lens.Lens' DescribeContactResponse (Prelude.Maybe ContactStatus)
+describeContactResponse_contactStatus = Lens.lens (\DescribeContactResponse' {contactStatus} -> contactStatus) (\s@DescribeContactResponse' {} a -> s {contactStatus = a} :: DescribeContactResponse)
+
+-- | List describing source and destination details for each dataflow edge.
+describeContactResponse_dataflowList :: Lens.Lens' DescribeContactResponse (Prelude.Maybe [DataflowDetail])
+describeContactResponse_dataflowList = Lens.lens (\DescribeContactResponse' {dataflowList} -> dataflowList) (\s@DescribeContactResponse' {} a -> s {dataflowList = a} :: DescribeContactResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | End time of a contact in UTC.
+describeContactResponse_endTime :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.UTCTime)
+describeContactResponse_endTime = Lens.lens (\DescribeContactResponse' {endTime} -> endTime) (\s@DescribeContactResponse' {} a -> s {endTime = a} :: DescribeContactResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Error message for a contact.
+describeContactResponse_errorMessage :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_errorMessage = Lens.lens (\DescribeContactResponse' {errorMessage} -> errorMessage) (\s@DescribeContactResponse' {} a -> s {errorMessage = a} :: DescribeContactResponse)
+
+-- | Ground station for a contact.
+describeContactResponse_groundStation :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_groundStation = Lens.lens (\DescribeContactResponse' {groundStation} -> groundStation) (\s@DescribeContactResponse' {} a -> s {groundStation = a} :: DescribeContactResponse)
+
+-- | Maximum elevation angle of a contact.
+describeContactResponse_maximumElevation :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Elevation)
+describeContactResponse_maximumElevation = Lens.lens (\DescribeContactResponse' {maximumElevation} -> maximumElevation) (\s@DescribeContactResponse' {} a -> s {maximumElevation = a} :: DescribeContactResponse)
+
+-- | ARN of a mission profile.
+describeContactResponse_missionProfileArn :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_missionProfileArn = Lens.lens (\DescribeContactResponse' {missionProfileArn} -> missionProfileArn) (\s@DescribeContactResponse' {} a -> s {missionProfileArn = a} :: DescribeContactResponse)
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+describeContactResponse_postPassEndTime :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.UTCTime)
+describeContactResponse_postPassEndTime = Lens.lens (\DescribeContactResponse' {postPassEndTime} -> postPassEndTime) (\s@DescribeContactResponse' {} a -> s {postPassEndTime = a} :: DescribeContactResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+describeContactResponse_prePassStartTime :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.UTCTime)
+describeContactResponse_prePassStartTime = Lens.lens (\DescribeContactResponse' {prePassStartTime} -> prePassStartTime) (\s@DescribeContactResponse' {} a -> s {prePassStartTime = a} :: DescribeContactResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Region of a contact.
+describeContactResponse_region :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_region = Lens.lens (\DescribeContactResponse' {region} -> region) (\s@DescribeContactResponse' {} a -> s {region = a} :: DescribeContactResponse)
+
+-- | ARN of a satellite.
+describeContactResponse_satelliteArn :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.Text)
+describeContactResponse_satelliteArn = Lens.lens (\DescribeContactResponse' {satelliteArn} -> satelliteArn) (\s@DescribeContactResponse' {} a -> s {satelliteArn = a} :: DescribeContactResponse)
+
+-- | Start time of a contact in UTC.
+describeContactResponse_startTime :: Lens.Lens' DescribeContactResponse (Prelude.Maybe Prelude.UTCTime)
+describeContactResponse_startTime = Lens.lens (\DescribeContactResponse' {startTime} -> startTime) (\s@DescribeContactResponse' {} a -> s {startTime = a} :: DescribeContactResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Tags assigned to a contact.
+describeContactResponse_tags :: Lens.Lens' DescribeContactResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeContactResponse_tags = Lens.lens (\DescribeContactResponse' {tags} -> tags) (\s@DescribeContactResponse' {} a -> s {tags = a} :: DescribeContactResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeContactResponse_httpStatus :: Lens.Lens' DescribeContactResponse Prelude.Int
+describeContactResponse_httpStatus = Lens.lens (\DescribeContactResponse' {httpStatus} -> httpStatus) (\s@DescribeContactResponse' {} a -> s {httpStatus = a} :: DescribeContactResponse)
+
+instance Prelude.NFData DescribeContactResponse where
+  rnf DescribeContactResponse' {..} =
+    Prelude.rnf contactId
+      `Prelude.seq` Prelude.rnf contactStatus
+      `Prelude.seq` Prelude.rnf dataflowList
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf groundStation
+      `Prelude.seq` Prelude.rnf maximumElevation
+      `Prelude.seq` Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf postPassEndTime
+      `Prelude.seq` Prelude.rnf prePassStartTime
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/DescribeEphemeris.hs b/gen/Amazonka/GroundStation/DescribeEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/DescribeEphemeris.hs
@@ -0,0 +1,291 @@
+{-# 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.GroundStation.DescribeEphemeris
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an existing ephemeris.
+module Amazonka.GroundStation.DescribeEphemeris
+  ( -- * Creating a Request
+    DescribeEphemeris (..),
+    newDescribeEphemeris,
+
+    -- * Request Lenses
+    describeEphemeris_ephemerisId,
+
+    -- * Destructuring the Response
+    DescribeEphemerisResponse (..),
+    newDescribeEphemerisResponse,
+
+    -- * Response Lenses
+    describeEphemerisResponse_creationTime,
+    describeEphemerisResponse_enabled,
+    describeEphemerisResponse_ephemerisId,
+    describeEphemerisResponse_invalidReason,
+    describeEphemerisResponse_name,
+    describeEphemerisResponse_priority,
+    describeEphemerisResponse_satelliteId,
+    describeEphemerisResponse_status,
+    describeEphemerisResponse_suppliedData,
+    describeEphemerisResponse_tags,
+    describeEphemerisResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeEphemeris' smart constructor.
+data DescribeEphemeris = DescribeEphemeris'
+  { -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEphemeris' 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:
+--
+-- 'ephemerisId', 'describeEphemeris_ephemerisId' - The AWS Ground Station ephemeris ID.
+newDescribeEphemeris ::
+  -- | 'ephemerisId'
+  Prelude.Text ->
+  DescribeEphemeris
+newDescribeEphemeris pEphemerisId_ =
+  DescribeEphemeris' {ephemerisId = pEphemerisId_}
+
+-- | The AWS Ground Station ephemeris ID.
+describeEphemeris_ephemerisId :: Lens.Lens' DescribeEphemeris Prelude.Text
+describeEphemeris_ephemerisId = Lens.lens (\DescribeEphemeris' {ephemerisId} -> ephemerisId) (\s@DescribeEphemeris' {} a -> s {ephemerisId = a} :: DescribeEphemeris)
+
+instance Core.AWSRequest DescribeEphemeris where
+  type
+    AWSResponse DescribeEphemeris =
+      DescribeEphemerisResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEphemerisResponse'
+            Prelude.<$> (x Data..?> "creationTime")
+            Prelude.<*> (x Data..?> "enabled")
+            Prelude.<*> (x Data..?> "ephemerisId")
+            Prelude.<*> (x Data..?> "invalidReason")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "priority")
+            Prelude.<*> (x Data..?> "satelliteId")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "suppliedData")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeEphemeris where
+  hashWithSalt _salt DescribeEphemeris' {..} =
+    _salt `Prelude.hashWithSalt` ephemerisId
+
+instance Prelude.NFData DescribeEphemeris where
+  rnf DescribeEphemeris' {..} = Prelude.rnf ephemerisId
+
+instance Data.ToHeaders DescribeEphemeris where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeEphemeris where
+  toPath DescribeEphemeris' {..} =
+    Prelude.mconcat
+      ["/ephemeris/", Data.toBS ephemerisId]
+
+instance Data.ToQuery DescribeEphemeris where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEphemerisResponse' smart constructor.
+data DescribeEphemerisResponse = DescribeEphemerisResponse'
+  { -- | The time the ephemeris was uploaded in UTC.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | Whether or not the ephemeris is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Maybe Prelude.Text,
+    -- | Reason that an ephemeris failed validation. Only provided for
+    -- ephemerides with @INVALID@ status.
+    invalidReason :: Prelude.Maybe EphemerisInvalidReason,
+    -- | A name string associated with the ephemeris. Used as a human-readable
+    -- identifier for the ephemeris.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Customer-provided priority score to establish the order in which
+    -- overlapping ephemerides should be used.
+    --
+    -- The default for customer-provided ephemeris priority is 1, and higher
+    -- numbers take precedence.
+    --
+    -- Priority must be 1 or greater
+    priority :: Prelude.Maybe Prelude.Natural,
+    -- | The AWS Ground Station satellite ID associated with ephemeris.
+    satelliteId :: Prelude.Maybe Prelude.Text,
+    -- | The status of the ephemeris.
+    status :: Prelude.Maybe EphemerisStatus,
+    -- | Supplied ephemeris data.
+    suppliedData :: Prelude.Maybe EphemerisTypeDescription,
+    -- | Tags assigned to an ephemeris.
+    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 'DescribeEphemerisResponse' 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:
+--
+-- 'creationTime', 'describeEphemerisResponse_creationTime' - The time the ephemeris was uploaded in UTC.
+--
+-- 'enabled', 'describeEphemerisResponse_enabled' - Whether or not the ephemeris is enabled.
+--
+-- 'ephemerisId', 'describeEphemerisResponse_ephemerisId' - The AWS Ground Station ephemeris ID.
+--
+-- 'invalidReason', 'describeEphemerisResponse_invalidReason' - Reason that an ephemeris failed validation. Only provided for
+-- ephemerides with @INVALID@ status.
+--
+-- 'name', 'describeEphemerisResponse_name' - A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- 'priority', 'describeEphemerisResponse_priority' - Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+--
+-- 'satelliteId', 'describeEphemerisResponse_satelliteId' - The AWS Ground Station satellite ID associated with ephemeris.
+--
+-- 'status', 'describeEphemerisResponse_status' - The status of the ephemeris.
+--
+-- 'suppliedData', 'describeEphemerisResponse_suppliedData' - Supplied ephemeris data.
+--
+-- 'tags', 'describeEphemerisResponse_tags' - Tags assigned to an ephemeris.
+--
+-- 'httpStatus', 'describeEphemerisResponse_httpStatus' - The response's http status code.
+newDescribeEphemerisResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeEphemerisResponse
+newDescribeEphemerisResponse pHttpStatus_ =
+  DescribeEphemerisResponse'
+    { creationTime =
+        Prelude.Nothing,
+      enabled = Prelude.Nothing,
+      ephemerisId = Prelude.Nothing,
+      invalidReason = Prelude.Nothing,
+      name = Prelude.Nothing,
+      priority = Prelude.Nothing,
+      satelliteId = Prelude.Nothing,
+      status = Prelude.Nothing,
+      suppliedData = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time the ephemeris was uploaded in UTC.
+describeEphemerisResponse_creationTime :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.UTCTime)
+describeEphemerisResponse_creationTime = Lens.lens (\DescribeEphemerisResponse' {creationTime} -> creationTime) (\s@DescribeEphemerisResponse' {} a -> s {creationTime = a} :: DescribeEphemerisResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Whether or not the ephemeris is enabled.
+describeEphemerisResponse_enabled :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.Bool)
+describeEphemerisResponse_enabled = Lens.lens (\DescribeEphemerisResponse' {enabled} -> enabled) (\s@DescribeEphemerisResponse' {} a -> s {enabled = a} :: DescribeEphemerisResponse)
+
+-- | The AWS Ground Station ephemeris ID.
+describeEphemerisResponse_ephemerisId :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.Text)
+describeEphemerisResponse_ephemerisId = Lens.lens (\DescribeEphemerisResponse' {ephemerisId} -> ephemerisId) (\s@DescribeEphemerisResponse' {} a -> s {ephemerisId = a} :: DescribeEphemerisResponse)
+
+-- | Reason that an ephemeris failed validation. Only provided for
+-- ephemerides with @INVALID@ status.
+describeEphemerisResponse_invalidReason :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe EphemerisInvalidReason)
+describeEphemerisResponse_invalidReason = Lens.lens (\DescribeEphemerisResponse' {invalidReason} -> invalidReason) (\s@DescribeEphemerisResponse' {} a -> s {invalidReason = a} :: DescribeEphemerisResponse)
+
+-- | A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+describeEphemerisResponse_name :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.Text)
+describeEphemerisResponse_name = Lens.lens (\DescribeEphemerisResponse' {name} -> name) (\s@DescribeEphemerisResponse' {} a -> s {name = a} :: DescribeEphemerisResponse)
+
+-- | Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+describeEphemerisResponse_priority :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.Natural)
+describeEphemerisResponse_priority = Lens.lens (\DescribeEphemerisResponse' {priority} -> priority) (\s@DescribeEphemerisResponse' {} a -> s {priority = a} :: DescribeEphemerisResponse)
+
+-- | The AWS Ground Station satellite ID associated with ephemeris.
+describeEphemerisResponse_satelliteId :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe Prelude.Text)
+describeEphemerisResponse_satelliteId = Lens.lens (\DescribeEphemerisResponse' {satelliteId} -> satelliteId) (\s@DescribeEphemerisResponse' {} a -> s {satelliteId = a} :: DescribeEphemerisResponse)
+
+-- | The status of the ephemeris.
+describeEphemerisResponse_status :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe EphemerisStatus)
+describeEphemerisResponse_status = Lens.lens (\DescribeEphemerisResponse' {status} -> status) (\s@DescribeEphemerisResponse' {} a -> s {status = a} :: DescribeEphemerisResponse)
+
+-- | Supplied ephemeris data.
+describeEphemerisResponse_suppliedData :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe EphemerisTypeDescription)
+describeEphemerisResponse_suppliedData = Lens.lens (\DescribeEphemerisResponse' {suppliedData} -> suppliedData) (\s@DescribeEphemerisResponse' {} a -> s {suppliedData = a} :: DescribeEphemerisResponse)
+
+-- | Tags assigned to an ephemeris.
+describeEphemerisResponse_tags :: Lens.Lens' DescribeEphemerisResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeEphemerisResponse_tags = Lens.lens (\DescribeEphemerisResponse' {tags} -> tags) (\s@DescribeEphemerisResponse' {} a -> s {tags = a} :: DescribeEphemerisResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeEphemerisResponse_httpStatus :: Lens.Lens' DescribeEphemerisResponse Prelude.Int
+describeEphemerisResponse_httpStatus = Lens.lens (\DescribeEphemerisResponse' {httpStatus} -> httpStatus) (\s@DescribeEphemerisResponse' {} a -> s {httpStatus = a} :: DescribeEphemerisResponse)
+
+instance Prelude.NFData DescribeEphemerisResponse where
+  rnf DescribeEphemerisResponse' {..} =
+    Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf ephemerisId
+      `Prelude.seq` Prelude.rnf invalidReason
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf priority
+      `Prelude.seq` Prelude.rnf satelliteId
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf suppliedData
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/GetConfig.hs b/gen/Amazonka/GroundStation/GetConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/GetConfig.hs
@@ -0,0 +1,257 @@
+{-# 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.GroundStation.GetConfig
+-- 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 @Config@ information.
+--
+-- Only one @Config@ response can be returned.
+module Amazonka.GroundStation.GetConfig
+  ( -- * Creating a Request
+    GetConfig (..),
+    newGetConfig,
+
+    -- * Request Lenses
+    getConfig_configId,
+    getConfig_configType,
+
+    -- * Destructuring the Response
+    GetConfigResponse (..),
+    newGetConfigResponse,
+
+    -- * Response Lenses
+    getConfigResponse_configType,
+    getConfigResponse_tags,
+    getConfigResponse_httpStatus,
+    getConfigResponse_configArn,
+    getConfigResponse_configData,
+    getConfigResponse_configId,
+    getConfigResponse_name,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newGetConfig' smart constructor.
+data GetConfig = GetConfig'
+  { -- | UUID of a @Config@.
+    configId :: Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: ConfigCapabilityType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetConfig' 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:
+--
+-- 'configId', 'getConfig_configId' - UUID of a @Config@.
+--
+-- 'configType', 'getConfig_configType' - Type of a @Config@.
+newGetConfig ::
+  -- | 'configId'
+  Prelude.Text ->
+  -- | 'configType'
+  ConfigCapabilityType ->
+  GetConfig
+newGetConfig pConfigId_ pConfigType_ =
+  GetConfig'
+    { configId = pConfigId_,
+      configType = pConfigType_
+    }
+
+-- | UUID of a @Config@.
+getConfig_configId :: Lens.Lens' GetConfig Prelude.Text
+getConfig_configId = Lens.lens (\GetConfig' {configId} -> configId) (\s@GetConfig' {} a -> s {configId = a} :: GetConfig)
+
+-- | Type of a @Config@.
+getConfig_configType :: Lens.Lens' GetConfig ConfigCapabilityType
+getConfig_configType = Lens.lens (\GetConfig' {configType} -> configType) (\s@GetConfig' {} a -> s {configType = a} :: GetConfig)
+
+instance Core.AWSRequest GetConfig where
+  type AWSResponse GetConfig = GetConfigResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetConfigResponse'
+            Prelude.<$> (x Data..?> "configType")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "configArn")
+            Prelude.<*> (x Data..:> "configData")
+            Prelude.<*> (x Data..:> "configId")
+            Prelude.<*> (x Data..:> "name")
+      )
+
+instance Prelude.Hashable GetConfig where
+  hashWithSalt _salt GetConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+
+instance Prelude.NFData GetConfig where
+  rnf GetConfig' {..} =
+    Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+
+instance Data.ToHeaders GetConfig where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetConfig where
+  toPath GetConfig' {..} =
+    Prelude.mconcat
+      [ "/config/",
+        Data.toBS configType,
+        "/",
+        Data.toBS configId
+      ]
+
+instance Data.ToQuery GetConfig where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newGetConfigResponse' smart constructor.
+data GetConfigResponse = GetConfigResponse'
+  { -- | Type of a @Config@.
+    configType :: Prelude.Maybe ConfigCapabilityType,
+    -- | Tags assigned to a @Config@.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | ARN of a @Config@
+    configArn :: Prelude.Text,
+    -- | Data elements in a @Config@.
+    configData :: ConfigTypeData,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Text,
+    -- | Name of a @Config@.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetConfigResponse' 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:
+--
+-- 'configType', 'getConfigResponse_configType' - Type of a @Config@.
+--
+-- 'tags', 'getConfigResponse_tags' - Tags assigned to a @Config@.
+--
+-- 'httpStatus', 'getConfigResponse_httpStatus' - The response's http status code.
+--
+-- 'configArn', 'getConfigResponse_configArn' - ARN of a @Config@
+--
+-- 'configData', 'getConfigResponse_configData' - Data elements in a @Config@.
+--
+-- 'configId', 'getConfigResponse_configId' - UUID of a @Config@.
+--
+-- 'name', 'getConfigResponse_name' - Name of a @Config@.
+newGetConfigResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'configArn'
+  Prelude.Text ->
+  -- | 'configData'
+  ConfigTypeData ->
+  -- | 'configId'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  GetConfigResponse
+newGetConfigResponse
+  pHttpStatus_
+  pConfigArn_
+  pConfigData_
+  pConfigId_
+  pName_ =
+    GetConfigResponse'
+      { configType = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        configArn = pConfigArn_,
+        configData = pConfigData_,
+        configId = pConfigId_,
+        name = pName_
+      }
+
+-- | Type of a @Config@.
+getConfigResponse_configType :: Lens.Lens' GetConfigResponse (Prelude.Maybe ConfigCapabilityType)
+getConfigResponse_configType = Lens.lens (\GetConfigResponse' {configType} -> configType) (\s@GetConfigResponse' {} a -> s {configType = a} :: GetConfigResponse)
+
+-- | Tags assigned to a @Config@.
+getConfigResponse_tags :: Lens.Lens' GetConfigResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getConfigResponse_tags = Lens.lens (\GetConfigResponse' {tags} -> tags) (\s@GetConfigResponse' {} a -> s {tags = a} :: GetConfigResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getConfigResponse_httpStatus :: Lens.Lens' GetConfigResponse Prelude.Int
+getConfigResponse_httpStatus = Lens.lens (\GetConfigResponse' {httpStatus} -> httpStatus) (\s@GetConfigResponse' {} a -> s {httpStatus = a} :: GetConfigResponse)
+
+-- | ARN of a @Config@
+getConfigResponse_configArn :: Lens.Lens' GetConfigResponse Prelude.Text
+getConfigResponse_configArn = Lens.lens (\GetConfigResponse' {configArn} -> configArn) (\s@GetConfigResponse' {} a -> s {configArn = a} :: GetConfigResponse)
+
+-- | Data elements in a @Config@.
+getConfigResponse_configData :: Lens.Lens' GetConfigResponse ConfigTypeData
+getConfigResponse_configData = Lens.lens (\GetConfigResponse' {configData} -> configData) (\s@GetConfigResponse' {} a -> s {configData = a} :: GetConfigResponse)
+
+-- | UUID of a @Config@.
+getConfigResponse_configId :: Lens.Lens' GetConfigResponse Prelude.Text
+getConfigResponse_configId = Lens.lens (\GetConfigResponse' {configId} -> configId) (\s@GetConfigResponse' {} a -> s {configId = a} :: GetConfigResponse)
+
+-- | Name of a @Config@.
+getConfigResponse_name :: Lens.Lens' GetConfigResponse Prelude.Text
+getConfigResponse_name = Lens.lens (\GetConfigResponse' {name} -> name) (\s@GetConfigResponse' {} a -> s {name = a} :: GetConfigResponse)
+
+instance Prelude.NFData GetConfigResponse where
+  rnf GetConfigResponse' {..} =
+    Prelude.rnf configType
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf configArn
+      `Prelude.seq` Prelude.rnf configData
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/GroundStation/GetDataflowEndpointGroup.hs b/gen/Amazonka/GroundStation/GetDataflowEndpointGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/GetDataflowEndpointGroup.hs
@@ -0,0 +1,212 @@
+{-# 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.GroundStation.GetDataflowEndpointGroup
+-- 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 the dataflow endpoint group.
+module Amazonka.GroundStation.GetDataflowEndpointGroup
+  ( -- * Creating a Request
+    GetDataflowEndpointGroup (..),
+    newGetDataflowEndpointGroup,
+
+    -- * Request Lenses
+    getDataflowEndpointGroup_dataflowEndpointGroupId,
+
+    -- * Destructuring the Response
+    GetDataflowEndpointGroupResponse (..),
+    newGetDataflowEndpointGroupResponse,
+
+    -- * Response Lenses
+    getDataflowEndpointGroupResponse_dataflowEndpointGroupArn,
+    getDataflowEndpointGroupResponse_dataflowEndpointGroupId,
+    getDataflowEndpointGroupResponse_endpointsDetails,
+    getDataflowEndpointGroupResponse_tags,
+    getDataflowEndpointGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newGetDataflowEndpointGroup' smart constructor.
+data GetDataflowEndpointGroup = GetDataflowEndpointGroup'
+  { -- | UUID of a dataflow endpoint group.
+    dataflowEndpointGroupId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDataflowEndpointGroup' 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:
+--
+-- 'dataflowEndpointGroupId', 'getDataflowEndpointGroup_dataflowEndpointGroupId' - UUID of a dataflow endpoint group.
+newGetDataflowEndpointGroup ::
+  -- | 'dataflowEndpointGroupId'
+  Prelude.Text ->
+  GetDataflowEndpointGroup
+newGetDataflowEndpointGroup pDataflowEndpointGroupId_ =
+  GetDataflowEndpointGroup'
+    { dataflowEndpointGroupId =
+        pDataflowEndpointGroupId_
+    }
+
+-- | UUID of a dataflow endpoint group.
+getDataflowEndpointGroup_dataflowEndpointGroupId :: Lens.Lens' GetDataflowEndpointGroup Prelude.Text
+getDataflowEndpointGroup_dataflowEndpointGroupId = Lens.lens (\GetDataflowEndpointGroup' {dataflowEndpointGroupId} -> dataflowEndpointGroupId) (\s@GetDataflowEndpointGroup' {} a -> s {dataflowEndpointGroupId = a} :: GetDataflowEndpointGroup)
+
+instance Core.AWSRequest GetDataflowEndpointGroup where
+  type
+    AWSResponse GetDataflowEndpointGroup =
+      GetDataflowEndpointGroupResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDataflowEndpointGroupResponse'
+            Prelude.<$> (x Data..?> "dataflowEndpointGroupArn")
+            Prelude.<*> (x Data..?> "dataflowEndpointGroupId")
+            Prelude.<*> ( x
+                            Data..?> "endpointsDetails"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDataflowEndpointGroup where
+  hashWithSalt _salt GetDataflowEndpointGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataflowEndpointGroupId
+
+instance Prelude.NFData GetDataflowEndpointGroup where
+  rnf GetDataflowEndpointGroup' {..} =
+    Prelude.rnf dataflowEndpointGroupId
+
+instance Data.ToHeaders GetDataflowEndpointGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetDataflowEndpointGroup where
+  toPath GetDataflowEndpointGroup' {..} =
+    Prelude.mconcat
+      [ "/dataflowEndpointGroup/",
+        Data.toBS dataflowEndpointGroupId
+      ]
+
+instance Data.ToQuery GetDataflowEndpointGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newGetDataflowEndpointGroupResponse' smart constructor.
+data GetDataflowEndpointGroupResponse = GetDataflowEndpointGroupResponse'
+  { -- | ARN of a dataflow endpoint group.
+    dataflowEndpointGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a dataflow endpoint group.
+    dataflowEndpointGroupId :: Prelude.Maybe Prelude.Text,
+    -- | Details of a dataflow endpoint.
+    endpointsDetails :: Prelude.Maybe [EndpointDetails],
+    -- | Tags assigned to a dataflow endpoint group.
+    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 'GetDataflowEndpointGroupResponse' 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:
+--
+-- 'dataflowEndpointGroupArn', 'getDataflowEndpointGroupResponse_dataflowEndpointGroupArn' - ARN of a dataflow endpoint group.
+--
+-- 'dataflowEndpointGroupId', 'getDataflowEndpointGroupResponse_dataflowEndpointGroupId' - UUID of a dataflow endpoint group.
+--
+-- 'endpointsDetails', 'getDataflowEndpointGroupResponse_endpointsDetails' - Details of a dataflow endpoint.
+--
+-- 'tags', 'getDataflowEndpointGroupResponse_tags' - Tags assigned to a dataflow endpoint group.
+--
+-- 'httpStatus', 'getDataflowEndpointGroupResponse_httpStatus' - The response's http status code.
+newGetDataflowEndpointGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDataflowEndpointGroupResponse
+newGetDataflowEndpointGroupResponse pHttpStatus_ =
+  GetDataflowEndpointGroupResponse'
+    { dataflowEndpointGroupArn =
+        Prelude.Nothing,
+      dataflowEndpointGroupId = Prelude.Nothing,
+      endpointsDetails = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | ARN of a dataflow endpoint group.
+getDataflowEndpointGroupResponse_dataflowEndpointGroupArn :: Lens.Lens' GetDataflowEndpointGroupResponse (Prelude.Maybe Prelude.Text)
+getDataflowEndpointGroupResponse_dataflowEndpointGroupArn = Lens.lens (\GetDataflowEndpointGroupResponse' {dataflowEndpointGroupArn} -> dataflowEndpointGroupArn) (\s@GetDataflowEndpointGroupResponse' {} a -> s {dataflowEndpointGroupArn = a} :: GetDataflowEndpointGroupResponse)
+
+-- | UUID of a dataflow endpoint group.
+getDataflowEndpointGroupResponse_dataflowEndpointGroupId :: Lens.Lens' GetDataflowEndpointGroupResponse (Prelude.Maybe Prelude.Text)
+getDataflowEndpointGroupResponse_dataflowEndpointGroupId = Lens.lens (\GetDataflowEndpointGroupResponse' {dataflowEndpointGroupId} -> dataflowEndpointGroupId) (\s@GetDataflowEndpointGroupResponse' {} a -> s {dataflowEndpointGroupId = a} :: GetDataflowEndpointGroupResponse)
+
+-- | Details of a dataflow endpoint.
+getDataflowEndpointGroupResponse_endpointsDetails :: Lens.Lens' GetDataflowEndpointGroupResponse (Prelude.Maybe [EndpointDetails])
+getDataflowEndpointGroupResponse_endpointsDetails = Lens.lens (\GetDataflowEndpointGroupResponse' {endpointsDetails} -> endpointsDetails) (\s@GetDataflowEndpointGroupResponse' {} a -> s {endpointsDetails = a} :: GetDataflowEndpointGroupResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Tags assigned to a dataflow endpoint group.
+getDataflowEndpointGroupResponse_tags :: Lens.Lens' GetDataflowEndpointGroupResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getDataflowEndpointGroupResponse_tags = Lens.lens (\GetDataflowEndpointGroupResponse' {tags} -> tags) (\s@GetDataflowEndpointGroupResponse' {} a -> s {tags = a} :: GetDataflowEndpointGroupResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getDataflowEndpointGroupResponse_httpStatus :: Lens.Lens' GetDataflowEndpointGroupResponse Prelude.Int
+getDataflowEndpointGroupResponse_httpStatus = Lens.lens (\GetDataflowEndpointGroupResponse' {httpStatus} -> httpStatus) (\s@GetDataflowEndpointGroupResponse' {} a -> s {httpStatus = a} :: GetDataflowEndpointGroupResponse)
+
+instance
+  Prelude.NFData
+    GetDataflowEndpointGroupResponse
+  where
+  rnf GetDataflowEndpointGroupResponse' {..} =
+    Prelude.rnf dataflowEndpointGroupArn
+      `Prelude.seq` Prelude.rnf dataflowEndpointGroupId
+      `Prelude.seq` Prelude.rnf endpointsDetails
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/GetMinuteUsage.hs b/gen/Amazonka/GroundStation/GetMinuteUsage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/GetMinuteUsage.hs
@@ -0,0 +1,247 @@
+{-# 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.GroundStation.GetMinuteUsage
+-- 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 the number of minutes used by account.
+module Amazonka.GroundStation.GetMinuteUsage
+  ( -- * Creating a Request
+    GetMinuteUsage (..),
+    newGetMinuteUsage,
+
+    -- * Request Lenses
+    getMinuteUsage_month,
+    getMinuteUsage_year,
+
+    -- * Destructuring the Response
+    GetMinuteUsageResponse (..),
+    newGetMinuteUsageResponse,
+
+    -- * Response Lenses
+    getMinuteUsageResponse_estimatedMinutesRemaining,
+    getMinuteUsageResponse_isReservedMinutesCustomer,
+    getMinuteUsageResponse_totalReservedMinuteAllocation,
+    getMinuteUsageResponse_totalScheduledMinutes,
+    getMinuteUsageResponse_upcomingMinutesScheduled,
+    getMinuteUsageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newGetMinuteUsage' smart constructor.
+data GetMinuteUsage = GetMinuteUsage'
+  { -- | The month being requested, with a value of 1-12.
+    month :: Prelude.Natural,
+    -- | The year being requested, in the format of YYYY.
+    year :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMinuteUsage' 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:
+--
+-- 'month', 'getMinuteUsage_month' - The month being requested, with a value of 1-12.
+--
+-- 'year', 'getMinuteUsage_year' - The year being requested, in the format of YYYY.
+newGetMinuteUsage ::
+  -- | 'month'
+  Prelude.Natural ->
+  -- | 'year'
+  Prelude.Natural ->
+  GetMinuteUsage
+newGetMinuteUsage pMonth_ pYear_ =
+  GetMinuteUsage' {month = pMonth_, year = pYear_}
+
+-- | The month being requested, with a value of 1-12.
+getMinuteUsage_month :: Lens.Lens' GetMinuteUsage Prelude.Natural
+getMinuteUsage_month = Lens.lens (\GetMinuteUsage' {month} -> month) (\s@GetMinuteUsage' {} a -> s {month = a} :: GetMinuteUsage)
+
+-- | The year being requested, in the format of YYYY.
+getMinuteUsage_year :: Lens.Lens' GetMinuteUsage Prelude.Natural
+getMinuteUsage_year = Lens.lens (\GetMinuteUsage' {year} -> year) (\s@GetMinuteUsage' {} a -> s {year = a} :: GetMinuteUsage)
+
+instance Core.AWSRequest GetMinuteUsage where
+  type
+    AWSResponse GetMinuteUsage =
+      GetMinuteUsageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetMinuteUsageResponse'
+            Prelude.<$> (x Data..?> "estimatedMinutesRemaining")
+            Prelude.<*> (x Data..?> "isReservedMinutesCustomer")
+            Prelude.<*> (x Data..?> "totalReservedMinuteAllocation")
+            Prelude.<*> (x Data..?> "totalScheduledMinutes")
+            Prelude.<*> (x Data..?> "upcomingMinutesScheduled")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetMinuteUsage where
+  hashWithSalt _salt GetMinuteUsage' {..} =
+    _salt
+      `Prelude.hashWithSalt` month
+      `Prelude.hashWithSalt` year
+
+instance Prelude.NFData GetMinuteUsage where
+  rnf GetMinuteUsage' {..} =
+    Prelude.rnf month `Prelude.seq` Prelude.rnf year
+
+instance Data.ToHeaders GetMinuteUsage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetMinuteUsage where
+  toJSON GetMinuteUsage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("month" Data..= month),
+            Prelude.Just ("year" Data..= year)
+          ]
+      )
+
+instance Data.ToPath GetMinuteUsage where
+  toPath = Prelude.const "/minute-usage"
+
+instance Data.ToQuery GetMinuteUsage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newGetMinuteUsageResponse' smart constructor.
+data GetMinuteUsageResponse = GetMinuteUsageResponse'
+  { -- | Estimated number of minutes remaining for an account, specific to the
+    -- month being requested.
+    estimatedMinutesRemaining :: Prelude.Maybe Prelude.Int,
+    -- | Returns whether or not an account has signed up for the reserved minutes
+    -- pricing plan, specific to the month being requested.
+    isReservedMinutesCustomer :: Prelude.Maybe Prelude.Bool,
+    -- | Total number of reserved minutes allocated, specific to the month being
+    -- requested.
+    totalReservedMinuteAllocation :: Prelude.Maybe Prelude.Int,
+    -- | Total scheduled minutes for an account, specific to the month being
+    -- requested.
+    totalScheduledMinutes :: Prelude.Maybe Prelude.Int,
+    -- | Upcoming minutes scheduled for an account, specific to the month being
+    -- requested.
+    upcomingMinutesScheduled :: Prelude.Maybe Prelude.Int,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMinuteUsageResponse' 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:
+--
+-- 'estimatedMinutesRemaining', 'getMinuteUsageResponse_estimatedMinutesRemaining' - Estimated number of minutes remaining for an account, specific to the
+-- month being requested.
+--
+-- 'isReservedMinutesCustomer', 'getMinuteUsageResponse_isReservedMinutesCustomer' - Returns whether or not an account has signed up for the reserved minutes
+-- pricing plan, specific to the month being requested.
+--
+-- 'totalReservedMinuteAllocation', 'getMinuteUsageResponse_totalReservedMinuteAllocation' - Total number of reserved minutes allocated, specific to the month being
+-- requested.
+--
+-- 'totalScheduledMinutes', 'getMinuteUsageResponse_totalScheduledMinutes' - Total scheduled minutes for an account, specific to the month being
+-- requested.
+--
+-- 'upcomingMinutesScheduled', 'getMinuteUsageResponse_upcomingMinutesScheduled' - Upcoming minutes scheduled for an account, specific to the month being
+-- requested.
+--
+-- 'httpStatus', 'getMinuteUsageResponse_httpStatus' - The response's http status code.
+newGetMinuteUsageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetMinuteUsageResponse
+newGetMinuteUsageResponse pHttpStatus_ =
+  GetMinuteUsageResponse'
+    { estimatedMinutesRemaining =
+        Prelude.Nothing,
+      isReservedMinutesCustomer = Prelude.Nothing,
+      totalReservedMinuteAllocation = Prelude.Nothing,
+      totalScheduledMinutes = Prelude.Nothing,
+      upcomingMinutesScheduled = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Estimated number of minutes remaining for an account, specific to the
+-- month being requested.
+getMinuteUsageResponse_estimatedMinutesRemaining :: Lens.Lens' GetMinuteUsageResponse (Prelude.Maybe Prelude.Int)
+getMinuteUsageResponse_estimatedMinutesRemaining = Lens.lens (\GetMinuteUsageResponse' {estimatedMinutesRemaining} -> estimatedMinutesRemaining) (\s@GetMinuteUsageResponse' {} a -> s {estimatedMinutesRemaining = a} :: GetMinuteUsageResponse)
+
+-- | Returns whether or not an account has signed up for the reserved minutes
+-- pricing plan, specific to the month being requested.
+getMinuteUsageResponse_isReservedMinutesCustomer :: Lens.Lens' GetMinuteUsageResponse (Prelude.Maybe Prelude.Bool)
+getMinuteUsageResponse_isReservedMinutesCustomer = Lens.lens (\GetMinuteUsageResponse' {isReservedMinutesCustomer} -> isReservedMinutesCustomer) (\s@GetMinuteUsageResponse' {} a -> s {isReservedMinutesCustomer = a} :: GetMinuteUsageResponse)
+
+-- | Total number of reserved minutes allocated, specific to the month being
+-- requested.
+getMinuteUsageResponse_totalReservedMinuteAllocation :: Lens.Lens' GetMinuteUsageResponse (Prelude.Maybe Prelude.Int)
+getMinuteUsageResponse_totalReservedMinuteAllocation = Lens.lens (\GetMinuteUsageResponse' {totalReservedMinuteAllocation} -> totalReservedMinuteAllocation) (\s@GetMinuteUsageResponse' {} a -> s {totalReservedMinuteAllocation = a} :: GetMinuteUsageResponse)
+
+-- | Total scheduled minutes for an account, specific to the month being
+-- requested.
+getMinuteUsageResponse_totalScheduledMinutes :: Lens.Lens' GetMinuteUsageResponse (Prelude.Maybe Prelude.Int)
+getMinuteUsageResponse_totalScheduledMinutes = Lens.lens (\GetMinuteUsageResponse' {totalScheduledMinutes} -> totalScheduledMinutes) (\s@GetMinuteUsageResponse' {} a -> s {totalScheduledMinutes = a} :: GetMinuteUsageResponse)
+
+-- | Upcoming minutes scheduled for an account, specific to the month being
+-- requested.
+getMinuteUsageResponse_upcomingMinutesScheduled :: Lens.Lens' GetMinuteUsageResponse (Prelude.Maybe Prelude.Int)
+getMinuteUsageResponse_upcomingMinutesScheduled = Lens.lens (\GetMinuteUsageResponse' {upcomingMinutesScheduled} -> upcomingMinutesScheduled) (\s@GetMinuteUsageResponse' {} a -> s {upcomingMinutesScheduled = a} :: GetMinuteUsageResponse)
+
+-- | The response's http status code.
+getMinuteUsageResponse_httpStatus :: Lens.Lens' GetMinuteUsageResponse Prelude.Int
+getMinuteUsageResponse_httpStatus = Lens.lens (\GetMinuteUsageResponse' {httpStatus} -> httpStatus) (\s@GetMinuteUsageResponse' {} a -> s {httpStatus = a} :: GetMinuteUsageResponse)
+
+instance Prelude.NFData GetMinuteUsageResponse where
+  rnf GetMinuteUsageResponse' {..} =
+    Prelude.rnf estimatedMinutesRemaining
+      `Prelude.seq` Prelude.rnf isReservedMinutesCustomer
+      `Prelude.seq` Prelude.rnf totalReservedMinuteAllocation
+      `Prelude.seq` Prelude.rnf totalScheduledMinutes
+      `Prelude.seq` Prelude.rnf upcomingMinutesScheduled
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/GetMissionProfile.hs b/gen/Amazonka/GroundStation/GetMissionProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/GetMissionProfile.hs
@@ -0,0 +1,291 @@
+{-# 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.GroundStation.GetMissionProfile
+-- 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 a mission profile.
+module Amazonka.GroundStation.GetMissionProfile
+  ( -- * Creating a Request
+    GetMissionProfile (..),
+    newGetMissionProfile,
+
+    -- * Request Lenses
+    getMissionProfile_missionProfileId,
+
+    -- * Destructuring the Response
+    GetMissionProfileResponse (..),
+    newGetMissionProfileResponse,
+
+    -- * Response Lenses
+    getMissionProfileResponse_contactPostPassDurationSeconds,
+    getMissionProfileResponse_contactPrePassDurationSeconds,
+    getMissionProfileResponse_dataflowEdges,
+    getMissionProfileResponse_minimumViableContactDurationSeconds,
+    getMissionProfileResponse_missionProfileArn,
+    getMissionProfileResponse_missionProfileId,
+    getMissionProfileResponse_name,
+    getMissionProfileResponse_region,
+    getMissionProfileResponse_tags,
+    getMissionProfileResponse_trackingConfigArn,
+    getMissionProfileResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newGetMissionProfile' smart constructor.
+data GetMissionProfile = GetMissionProfile'
+  { -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMissionProfile' 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:
+--
+-- 'missionProfileId', 'getMissionProfile_missionProfileId' - UUID of a mission profile.
+newGetMissionProfile ::
+  -- | 'missionProfileId'
+  Prelude.Text ->
+  GetMissionProfile
+newGetMissionProfile pMissionProfileId_ =
+  GetMissionProfile'
+    { missionProfileId =
+        pMissionProfileId_
+    }
+
+-- | UUID of a mission profile.
+getMissionProfile_missionProfileId :: Lens.Lens' GetMissionProfile Prelude.Text
+getMissionProfile_missionProfileId = Lens.lens (\GetMissionProfile' {missionProfileId} -> missionProfileId) (\s@GetMissionProfile' {} a -> s {missionProfileId = a} :: GetMissionProfile)
+
+instance Core.AWSRequest GetMissionProfile where
+  type
+    AWSResponse GetMissionProfile =
+      GetMissionProfileResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetMissionProfileResponse'
+            Prelude.<$> (x Data..?> "contactPostPassDurationSeconds")
+            Prelude.<*> (x Data..?> "contactPrePassDurationSeconds")
+            Prelude.<*> (x Data..?> "dataflowEdges" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "minimumViableContactDurationSeconds")
+            Prelude.<*> (x Data..?> "missionProfileArn")
+            Prelude.<*> (x Data..?> "missionProfileId")
+            Prelude.<*> (x Data..?> "name")
+            Prelude.<*> (x Data..?> "region")
+            Prelude.<*> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "trackingConfigArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetMissionProfile where
+  hashWithSalt _salt GetMissionProfile' {..} =
+    _salt `Prelude.hashWithSalt` missionProfileId
+
+instance Prelude.NFData GetMissionProfile where
+  rnf GetMissionProfile' {..} =
+    Prelude.rnf missionProfileId
+
+instance Data.ToHeaders GetMissionProfile where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetMissionProfile where
+  toPath GetMissionProfile' {..} =
+    Prelude.mconcat
+      ["/missionprofile/", Data.toBS missionProfileId]
+
+instance Data.ToQuery GetMissionProfile where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newGetMissionProfileResponse' smart constructor.
+data GetMissionProfileResponse = GetMissionProfileResponse'
+  { -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    contactPostPassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Amount of time prior to contact start you’d like to receive a CloudWatch
+    -- event indicating an upcoming pass.
+    contactPrePassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+    -- @Config@ and a /to/ @Config@.
+    dataflowEdges :: Prelude.Maybe [Prelude.NonEmpty Prelude.Text],
+    -- | Smallest amount of time in seconds that you’d like to see for an
+    -- available contact. AWS Ground Station will not present you with contacts
+    -- shorter than this duration.
+    minimumViableContactDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Maybe Prelude.Text,
+    -- | Name of a mission profile.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Region of a mission profile.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | Tags assigned to a mission profile.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | ARN of a tracking @Config@.
+    trackingConfigArn :: 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 'GetMissionProfileResponse' 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:
+--
+-- 'contactPostPassDurationSeconds', 'getMissionProfileResponse_contactPostPassDurationSeconds' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'contactPrePassDurationSeconds', 'getMissionProfileResponse_contactPrePassDurationSeconds' - Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+--
+-- 'dataflowEdges', 'getMissionProfileResponse_dataflowEdges' - A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+--
+-- 'minimumViableContactDurationSeconds', 'getMissionProfileResponse_minimumViableContactDurationSeconds' - Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+--
+-- 'missionProfileArn', 'getMissionProfileResponse_missionProfileArn' - ARN of a mission profile.
+--
+-- 'missionProfileId', 'getMissionProfileResponse_missionProfileId' - UUID of a mission profile.
+--
+-- 'name', 'getMissionProfileResponse_name' - Name of a mission profile.
+--
+-- 'region', 'getMissionProfileResponse_region' - Region of a mission profile.
+--
+-- 'tags', 'getMissionProfileResponse_tags' - Tags assigned to a mission profile.
+--
+-- 'trackingConfigArn', 'getMissionProfileResponse_trackingConfigArn' - ARN of a tracking @Config@.
+--
+-- 'httpStatus', 'getMissionProfileResponse_httpStatus' - The response's http status code.
+newGetMissionProfileResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetMissionProfileResponse
+newGetMissionProfileResponse pHttpStatus_ =
+  GetMissionProfileResponse'
+    { contactPostPassDurationSeconds =
+        Prelude.Nothing,
+      contactPrePassDurationSeconds = Prelude.Nothing,
+      dataflowEdges = Prelude.Nothing,
+      minimumViableContactDurationSeconds =
+        Prelude.Nothing,
+      missionProfileArn = Prelude.Nothing,
+      missionProfileId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      region = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      trackingConfigArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+getMissionProfileResponse_contactPostPassDurationSeconds :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Natural)
+getMissionProfileResponse_contactPostPassDurationSeconds = Lens.lens (\GetMissionProfileResponse' {contactPostPassDurationSeconds} -> contactPostPassDurationSeconds) (\s@GetMissionProfileResponse' {} a -> s {contactPostPassDurationSeconds = a} :: GetMissionProfileResponse)
+
+-- | Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+getMissionProfileResponse_contactPrePassDurationSeconds :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Natural)
+getMissionProfileResponse_contactPrePassDurationSeconds = Lens.lens (\GetMissionProfileResponse' {contactPrePassDurationSeconds} -> contactPrePassDurationSeconds) (\s@GetMissionProfileResponse' {} a -> s {contactPrePassDurationSeconds = a} :: GetMissionProfileResponse)
+
+-- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+getMissionProfileResponse_dataflowEdges :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe [Prelude.NonEmpty Prelude.Text])
+getMissionProfileResponse_dataflowEdges = Lens.lens (\GetMissionProfileResponse' {dataflowEdges} -> dataflowEdges) (\s@GetMissionProfileResponse' {} a -> s {dataflowEdges = a} :: GetMissionProfileResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+getMissionProfileResponse_minimumViableContactDurationSeconds :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Natural)
+getMissionProfileResponse_minimumViableContactDurationSeconds = Lens.lens (\GetMissionProfileResponse' {minimumViableContactDurationSeconds} -> minimumViableContactDurationSeconds) (\s@GetMissionProfileResponse' {} a -> s {minimumViableContactDurationSeconds = a} :: GetMissionProfileResponse)
+
+-- | ARN of a mission profile.
+getMissionProfileResponse_missionProfileArn :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Text)
+getMissionProfileResponse_missionProfileArn = Lens.lens (\GetMissionProfileResponse' {missionProfileArn} -> missionProfileArn) (\s@GetMissionProfileResponse' {} a -> s {missionProfileArn = a} :: GetMissionProfileResponse)
+
+-- | UUID of a mission profile.
+getMissionProfileResponse_missionProfileId :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Text)
+getMissionProfileResponse_missionProfileId = Lens.lens (\GetMissionProfileResponse' {missionProfileId} -> missionProfileId) (\s@GetMissionProfileResponse' {} a -> s {missionProfileId = a} :: GetMissionProfileResponse)
+
+-- | Name of a mission profile.
+getMissionProfileResponse_name :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Text)
+getMissionProfileResponse_name = Lens.lens (\GetMissionProfileResponse' {name} -> name) (\s@GetMissionProfileResponse' {} a -> s {name = a} :: GetMissionProfileResponse)
+
+-- | Region of a mission profile.
+getMissionProfileResponse_region :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Text)
+getMissionProfileResponse_region = Lens.lens (\GetMissionProfileResponse' {region} -> region) (\s@GetMissionProfileResponse' {} a -> s {region = a} :: GetMissionProfileResponse)
+
+-- | Tags assigned to a mission profile.
+getMissionProfileResponse_tags :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+getMissionProfileResponse_tags = Lens.lens (\GetMissionProfileResponse' {tags} -> tags) (\s@GetMissionProfileResponse' {} a -> s {tags = a} :: GetMissionProfileResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | ARN of a tracking @Config@.
+getMissionProfileResponse_trackingConfigArn :: Lens.Lens' GetMissionProfileResponse (Prelude.Maybe Prelude.Text)
+getMissionProfileResponse_trackingConfigArn = Lens.lens (\GetMissionProfileResponse' {trackingConfigArn} -> trackingConfigArn) (\s@GetMissionProfileResponse' {} a -> s {trackingConfigArn = a} :: GetMissionProfileResponse)
+
+-- | The response's http status code.
+getMissionProfileResponse_httpStatus :: Lens.Lens' GetMissionProfileResponse Prelude.Int
+getMissionProfileResponse_httpStatus = Lens.lens (\GetMissionProfileResponse' {httpStatus} -> httpStatus) (\s@GetMissionProfileResponse' {} a -> s {httpStatus = a} :: GetMissionProfileResponse)
+
+instance Prelude.NFData GetMissionProfileResponse where
+  rnf GetMissionProfileResponse' {..} =
+    Prelude.rnf contactPostPassDurationSeconds
+      `Prelude.seq` Prelude.rnf contactPrePassDurationSeconds
+      `Prelude.seq` Prelude.rnf dataflowEdges
+      `Prelude.seq` Prelude.rnf minimumViableContactDurationSeconds
+      `Prelude.seq` Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf missionProfileId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf trackingConfigArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/GetSatellite.hs b/gen/Amazonka/GroundStation/GetSatellite.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/GetSatellite.hs
@@ -0,0 +1,212 @@
+{-# 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.GroundStation.GetSatellite
+-- 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 a satellite.
+module Amazonka.GroundStation.GetSatellite
+  ( -- * Creating a Request
+    GetSatellite (..),
+    newGetSatellite,
+
+    -- * Request Lenses
+    getSatellite_satelliteId,
+
+    -- * Destructuring the Response
+    GetSatelliteResponse (..),
+    newGetSatelliteResponse,
+
+    -- * Response Lenses
+    getSatelliteResponse_currentEphemeris,
+    getSatelliteResponse_groundStations,
+    getSatelliteResponse_noradSatelliteID,
+    getSatelliteResponse_satelliteArn,
+    getSatelliteResponse_satelliteId,
+    getSatelliteResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newGetSatellite' smart constructor.
+data GetSatellite = GetSatellite'
+  { -- | UUID of a satellite.
+    satelliteId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSatellite' 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:
+--
+-- 'satelliteId', 'getSatellite_satelliteId' - UUID of a satellite.
+newGetSatellite ::
+  -- | 'satelliteId'
+  Prelude.Text ->
+  GetSatellite
+newGetSatellite pSatelliteId_ =
+  GetSatellite' {satelliteId = pSatelliteId_}
+
+-- | UUID of a satellite.
+getSatellite_satelliteId :: Lens.Lens' GetSatellite Prelude.Text
+getSatellite_satelliteId = Lens.lens (\GetSatellite' {satelliteId} -> satelliteId) (\s@GetSatellite' {} a -> s {satelliteId = a} :: GetSatellite)
+
+instance Core.AWSRequest GetSatellite where
+  type AWSResponse GetSatellite = GetSatelliteResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetSatelliteResponse'
+            Prelude.<$> (x Data..?> "currentEphemeris")
+            Prelude.<*> (x Data..?> "groundStations" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "noradSatelliteID")
+            Prelude.<*> (x Data..?> "satelliteArn")
+            Prelude.<*> (x Data..?> "satelliteId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetSatellite where
+  hashWithSalt _salt GetSatellite' {..} =
+    _salt `Prelude.hashWithSalt` satelliteId
+
+instance Prelude.NFData GetSatellite where
+  rnf GetSatellite' {..} = Prelude.rnf satelliteId
+
+instance Data.ToHeaders GetSatellite where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetSatellite where
+  toPath GetSatellite' {..} =
+    Prelude.mconcat
+      ["/satellite/", Data.toBS satelliteId]
+
+instance Data.ToQuery GetSatellite where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newGetSatelliteResponse' smart constructor.
+data GetSatelliteResponse = GetSatelliteResponse'
+  { -- | The current ephemeris being used to compute the trajectory of the
+    -- satellite.
+    currentEphemeris :: Prelude.Maybe EphemerisMetaData,
+    -- | A list of ground stations to which the satellite is on-boarded.
+    groundStations :: Prelude.Maybe [Prelude.Text],
+    -- | NORAD satellite ID number.
+    noradSatelliteID :: Prelude.Maybe Prelude.Natural,
+    -- | ARN of a satellite.
+    satelliteArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a satellite.
+    satelliteId :: 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 'GetSatelliteResponse' 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:
+--
+-- 'currentEphemeris', 'getSatelliteResponse_currentEphemeris' - The current ephemeris being used to compute the trajectory of the
+-- satellite.
+--
+-- 'groundStations', 'getSatelliteResponse_groundStations' - A list of ground stations to which the satellite is on-boarded.
+--
+-- 'noradSatelliteID', 'getSatelliteResponse_noradSatelliteID' - NORAD satellite ID number.
+--
+-- 'satelliteArn', 'getSatelliteResponse_satelliteArn' - ARN of a satellite.
+--
+-- 'satelliteId', 'getSatelliteResponse_satelliteId' - UUID of a satellite.
+--
+-- 'httpStatus', 'getSatelliteResponse_httpStatus' - The response's http status code.
+newGetSatelliteResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetSatelliteResponse
+newGetSatelliteResponse pHttpStatus_ =
+  GetSatelliteResponse'
+    { currentEphemeris =
+        Prelude.Nothing,
+      groundStations = Prelude.Nothing,
+      noradSatelliteID = Prelude.Nothing,
+      satelliteArn = Prelude.Nothing,
+      satelliteId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current ephemeris being used to compute the trajectory of the
+-- satellite.
+getSatelliteResponse_currentEphemeris :: Lens.Lens' GetSatelliteResponse (Prelude.Maybe EphemerisMetaData)
+getSatelliteResponse_currentEphemeris = Lens.lens (\GetSatelliteResponse' {currentEphemeris} -> currentEphemeris) (\s@GetSatelliteResponse' {} a -> s {currentEphemeris = a} :: GetSatelliteResponse)
+
+-- | A list of ground stations to which the satellite is on-boarded.
+getSatelliteResponse_groundStations :: Lens.Lens' GetSatelliteResponse (Prelude.Maybe [Prelude.Text])
+getSatelliteResponse_groundStations = Lens.lens (\GetSatelliteResponse' {groundStations} -> groundStations) (\s@GetSatelliteResponse' {} a -> s {groundStations = a} :: GetSatelliteResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | NORAD satellite ID number.
+getSatelliteResponse_noradSatelliteID :: Lens.Lens' GetSatelliteResponse (Prelude.Maybe Prelude.Natural)
+getSatelliteResponse_noradSatelliteID = Lens.lens (\GetSatelliteResponse' {noradSatelliteID} -> noradSatelliteID) (\s@GetSatelliteResponse' {} a -> s {noradSatelliteID = a} :: GetSatelliteResponse)
+
+-- | ARN of a satellite.
+getSatelliteResponse_satelliteArn :: Lens.Lens' GetSatelliteResponse (Prelude.Maybe Prelude.Text)
+getSatelliteResponse_satelliteArn = Lens.lens (\GetSatelliteResponse' {satelliteArn} -> satelliteArn) (\s@GetSatelliteResponse' {} a -> s {satelliteArn = a} :: GetSatelliteResponse)
+
+-- | UUID of a satellite.
+getSatelliteResponse_satelliteId :: Lens.Lens' GetSatelliteResponse (Prelude.Maybe Prelude.Text)
+getSatelliteResponse_satelliteId = Lens.lens (\GetSatelliteResponse' {satelliteId} -> satelliteId) (\s@GetSatelliteResponse' {} a -> s {satelliteId = a} :: GetSatelliteResponse)
+
+-- | The response's http status code.
+getSatelliteResponse_httpStatus :: Lens.Lens' GetSatelliteResponse Prelude.Int
+getSatelliteResponse_httpStatus = Lens.lens (\GetSatelliteResponse' {httpStatus} -> httpStatus) (\s@GetSatelliteResponse' {} a -> s {httpStatus = a} :: GetSatelliteResponse)
+
+instance Prelude.NFData GetSatelliteResponse where
+  rnf GetSatelliteResponse' {..} =
+    Prelude.rnf currentEphemeris
+      `Prelude.seq` Prelude.rnf groundStations
+      `Prelude.seq` Prelude.rnf noradSatelliteID
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf satelliteId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/Lens.hs b/gen/Amazonka/GroundStation/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Lens.hs
@@ -0,0 +1,574 @@
+{-# 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.GroundStation.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.GroundStation.Lens
+  ( -- * Operations
+
+    -- ** CancelContact
+    cancelContact_contactId,
+    contactIdResponse_contactId,
+
+    -- ** CreateConfig
+    createConfig_tags,
+    createConfig_configData,
+    createConfig_name,
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+
+    -- ** CreateDataflowEndpointGroup
+    createDataflowEndpointGroup_tags,
+    createDataflowEndpointGroup_endpointDetails,
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+
+    -- ** CreateEphemeris
+    createEphemeris_enabled,
+    createEphemeris_ephemeris,
+    createEphemeris_expirationTime,
+    createEphemeris_kmsKeyArn,
+    createEphemeris_priority,
+    createEphemeris_tags,
+    createEphemeris_name,
+    createEphemeris_satelliteId,
+    ephemerisIdResponse_ephemerisId,
+
+    -- ** CreateMissionProfile
+    createMissionProfile_contactPostPassDurationSeconds,
+    createMissionProfile_contactPrePassDurationSeconds,
+    createMissionProfile_tags,
+    createMissionProfile_dataflowEdges,
+    createMissionProfile_minimumViableContactDurationSeconds,
+    createMissionProfile_name,
+    createMissionProfile_trackingConfigArn,
+    missionProfileIdResponse_missionProfileId,
+
+    -- ** DeleteConfig
+    deleteConfig_configId,
+    deleteConfig_configType,
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+
+    -- ** DeleteDataflowEndpointGroup
+    deleteDataflowEndpointGroup_dataflowEndpointGroupId,
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+
+    -- ** DeleteEphemeris
+    deleteEphemeris_ephemerisId,
+    ephemerisIdResponse_ephemerisId,
+
+    -- ** DeleteMissionProfile
+    deleteMissionProfile_missionProfileId,
+    missionProfileIdResponse_missionProfileId,
+
+    -- ** DescribeContact
+    describeContact_contactId,
+    describeContactResponse_contactId,
+    describeContactResponse_contactStatus,
+    describeContactResponse_dataflowList,
+    describeContactResponse_endTime,
+    describeContactResponse_errorMessage,
+    describeContactResponse_groundStation,
+    describeContactResponse_maximumElevation,
+    describeContactResponse_missionProfileArn,
+    describeContactResponse_postPassEndTime,
+    describeContactResponse_prePassStartTime,
+    describeContactResponse_region,
+    describeContactResponse_satelliteArn,
+    describeContactResponse_startTime,
+    describeContactResponse_tags,
+    describeContactResponse_httpStatus,
+
+    -- ** DescribeEphemeris
+    describeEphemeris_ephemerisId,
+    describeEphemerisResponse_creationTime,
+    describeEphemerisResponse_enabled,
+    describeEphemerisResponse_ephemerisId,
+    describeEphemerisResponse_invalidReason,
+    describeEphemerisResponse_name,
+    describeEphemerisResponse_priority,
+    describeEphemerisResponse_satelliteId,
+    describeEphemerisResponse_status,
+    describeEphemerisResponse_suppliedData,
+    describeEphemerisResponse_tags,
+    describeEphemerisResponse_httpStatus,
+
+    -- ** GetConfig
+    getConfig_configId,
+    getConfig_configType,
+    getConfigResponse_configType,
+    getConfigResponse_tags,
+    getConfigResponse_httpStatus,
+    getConfigResponse_configArn,
+    getConfigResponse_configData,
+    getConfigResponse_configId,
+    getConfigResponse_name,
+
+    -- ** GetDataflowEndpointGroup
+    getDataflowEndpointGroup_dataflowEndpointGroupId,
+    getDataflowEndpointGroupResponse_dataflowEndpointGroupArn,
+    getDataflowEndpointGroupResponse_dataflowEndpointGroupId,
+    getDataflowEndpointGroupResponse_endpointsDetails,
+    getDataflowEndpointGroupResponse_tags,
+    getDataflowEndpointGroupResponse_httpStatus,
+
+    -- ** GetMinuteUsage
+    getMinuteUsage_month,
+    getMinuteUsage_year,
+    getMinuteUsageResponse_estimatedMinutesRemaining,
+    getMinuteUsageResponse_isReservedMinutesCustomer,
+    getMinuteUsageResponse_totalReservedMinuteAllocation,
+    getMinuteUsageResponse_totalScheduledMinutes,
+    getMinuteUsageResponse_upcomingMinutesScheduled,
+    getMinuteUsageResponse_httpStatus,
+
+    -- ** GetMissionProfile
+    getMissionProfile_missionProfileId,
+    getMissionProfileResponse_contactPostPassDurationSeconds,
+    getMissionProfileResponse_contactPrePassDurationSeconds,
+    getMissionProfileResponse_dataflowEdges,
+    getMissionProfileResponse_minimumViableContactDurationSeconds,
+    getMissionProfileResponse_missionProfileArn,
+    getMissionProfileResponse_missionProfileId,
+    getMissionProfileResponse_name,
+    getMissionProfileResponse_region,
+    getMissionProfileResponse_tags,
+    getMissionProfileResponse_trackingConfigArn,
+    getMissionProfileResponse_httpStatus,
+
+    -- ** GetSatellite
+    getSatellite_satelliteId,
+    getSatelliteResponse_currentEphemeris,
+    getSatelliteResponse_groundStations,
+    getSatelliteResponse_noradSatelliteID,
+    getSatelliteResponse_satelliteArn,
+    getSatelliteResponse_satelliteId,
+    getSatelliteResponse_httpStatus,
+
+    -- ** ListConfigs
+    listConfigs_maxResults,
+    listConfigs_nextToken,
+    listConfigsResponse_configList,
+    listConfigsResponse_nextToken,
+    listConfigsResponse_httpStatus,
+
+    -- ** ListContacts
+    listContacts_groundStation,
+    listContacts_maxResults,
+    listContacts_missionProfileArn,
+    listContacts_nextToken,
+    listContacts_satelliteArn,
+    listContacts_endTime,
+    listContacts_startTime,
+    listContacts_statusList,
+    listContactsResponse_contactList,
+    listContactsResponse_nextToken,
+    listContactsResponse_httpStatus,
+
+    -- ** ListDataflowEndpointGroups
+    listDataflowEndpointGroups_maxResults,
+    listDataflowEndpointGroups_nextToken,
+    listDataflowEndpointGroupsResponse_dataflowEndpointGroupList,
+    listDataflowEndpointGroupsResponse_nextToken,
+    listDataflowEndpointGroupsResponse_httpStatus,
+
+    -- ** ListEphemerides
+    listEphemerides_maxResults,
+    listEphemerides_nextToken,
+    listEphemerides_statusList,
+    listEphemerides_endTime,
+    listEphemerides_satelliteId,
+    listEphemerides_startTime,
+    listEphemeridesResponse_ephemerides,
+    listEphemeridesResponse_nextToken,
+    listEphemeridesResponse_httpStatus,
+
+    -- ** ListGroundStations
+    listGroundStations_maxResults,
+    listGroundStations_nextToken,
+    listGroundStations_satelliteId,
+    listGroundStationsResponse_groundStationList,
+    listGroundStationsResponse_nextToken,
+    listGroundStationsResponse_httpStatus,
+
+    -- ** ListMissionProfiles
+    listMissionProfiles_maxResults,
+    listMissionProfiles_nextToken,
+    listMissionProfilesResponse_missionProfileList,
+    listMissionProfilesResponse_nextToken,
+    listMissionProfilesResponse_httpStatus,
+
+    -- ** ListSatellites
+    listSatellites_maxResults,
+    listSatellites_nextToken,
+    listSatellitesResponse_nextToken,
+    listSatellitesResponse_satellites,
+    listSatellitesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ReserveContact
+    reserveContact_tags,
+    reserveContact_endTime,
+    reserveContact_groundStation,
+    reserveContact_missionProfileArn,
+    reserveContact_satelliteArn,
+    reserveContact_startTime,
+    contactIdResponse_contactId,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateConfig
+    updateConfig_configData,
+    updateConfig_configId,
+    updateConfig_configType,
+    updateConfig_name,
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+
+    -- ** UpdateEphemeris
+    updateEphemeris_name,
+    updateEphemeris_priority,
+    updateEphemeris_enabled,
+    updateEphemeris_ephemerisId,
+    ephemerisIdResponse_ephemerisId,
+
+    -- ** UpdateMissionProfile
+    updateMissionProfile_contactPostPassDurationSeconds,
+    updateMissionProfile_contactPrePassDurationSeconds,
+    updateMissionProfile_dataflowEdges,
+    updateMissionProfile_minimumViableContactDurationSeconds,
+    updateMissionProfile_name,
+    updateMissionProfile_trackingConfigArn,
+    updateMissionProfile_missionProfileId,
+    missionProfileIdResponse_missionProfileId,
+
+    -- * Types
+
+    -- ** AntennaDemodDecodeDetails
+    antennaDemodDecodeDetails_outputNode,
+
+    -- ** AntennaDownlinkConfig
+    antennaDownlinkConfig_spectrumConfig,
+
+    -- ** AntennaDownlinkDemodDecodeConfig
+    antennaDownlinkDemodDecodeConfig_decodeConfig,
+    antennaDownlinkDemodDecodeConfig_demodulationConfig,
+    antennaDownlinkDemodDecodeConfig_spectrumConfig,
+
+    -- ** AntennaUplinkConfig
+    antennaUplinkConfig_transmitDisabled,
+    antennaUplinkConfig_spectrumConfig,
+    antennaUplinkConfig_targetEirp,
+
+    -- ** ConfigDetails
+    configDetails_antennaDemodDecodeDetails,
+    configDetails_endpointDetails,
+    configDetails_s3RecordingDetails,
+
+    -- ** ConfigIdResponse
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+
+    -- ** ConfigListItem
+    configListItem_configArn,
+    configListItem_configId,
+    configListItem_configType,
+    configListItem_name,
+
+    -- ** ConfigTypeData
+    configTypeData_antennaDownlinkConfig,
+    configTypeData_antennaDownlinkDemodDecodeConfig,
+    configTypeData_antennaUplinkConfig,
+    configTypeData_dataflowEndpointConfig,
+    configTypeData_s3RecordingConfig,
+    configTypeData_trackingConfig,
+    configTypeData_uplinkEchoConfig,
+
+    -- ** ContactData
+    contactData_contactId,
+    contactData_contactStatus,
+    contactData_endTime,
+    contactData_errorMessage,
+    contactData_groundStation,
+    contactData_maximumElevation,
+    contactData_missionProfileArn,
+    contactData_postPassEndTime,
+    contactData_prePassStartTime,
+    contactData_region,
+    contactData_satelliteArn,
+    contactData_startTime,
+    contactData_tags,
+
+    -- ** ContactIdResponse
+    contactIdResponse_contactId,
+
+    -- ** DataflowDetail
+    dataflowDetail_destination,
+    dataflowDetail_errorMessage,
+    dataflowDetail_source,
+
+    -- ** DataflowEndpoint
+    dataflowEndpoint_address,
+    dataflowEndpoint_mtu,
+    dataflowEndpoint_name,
+    dataflowEndpoint_status,
+
+    -- ** DataflowEndpointConfig
+    dataflowEndpointConfig_dataflowEndpointRegion,
+    dataflowEndpointConfig_dataflowEndpointName,
+
+    -- ** DataflowEndpointGroupIdResponse
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+
+    -- ** DataflowEndpointListItem
+    dataflowEndpointListItem_dataflowEndpointGroupArn,
+    dataflowEndpointListItem_dataflowEndpointGroupId,
+
+    -- ** DecodeConfig
+    decodeConfig_unvalidatedJSON,
+
+    -- ** DemodulationConfig
+    demodulationConfig_unvalidatedJSON,
+
+    -- ** Destination
+    destination_configDetails,
+    destination_configId,
+    destination_configType,
+    destination_dataflowDestinationRegion,
+
+    -- ** Eirp
+    eirp_units,
+    eirp_value,
+
+    -- ** Elevation
+    elevation_unit,
+    elevation_value,
+
+    -- ** EndpointDetails
+    endpointDetails_endpoint,
+    endpointDetails_securityDetails,
+
+    -- ** EphemerisData
+    ephemerisData_oem,
+    ephemerisData_tle,
+
+    -- ** EphemerisDescription
+    ephemerisDescription_ephemerisData,
+    ephemerisDescription_sourceS3Object,
+
+    -- ** EphemerisIdResponse
+    ephemerisIdResponse_ephemerisId,
+
+    -- ** EphemerisItem
+    ephemerisItem_creationTime,
+    ephemerisItem_enabled,
+    ephemerisItem_ephemerisId,
+    ephemerisItem_name,
+    ephemerisItem_priority,
+    ephemerisItem_sourceS3Object,
+    ephemerisItem_status,
+
+    -- ** EphemerisMetaData
+    ephemerisMetaData_ephemerisId,
+    ephemerisMetaData_epoch,
+    ephemerisMetaData_name,
+    ephemerisMetaData_source,
+
+    -- ** EphemerisTypeDescription
+    ephemerisTypeDescription_oem,
+    ephemerisTypeDescription_tle,
+
+    -- ** Frequency
+    frequency_units,
+    frequency_value,
+
+    -- ** FrequencyBandwidth
+    frequencyBandwidth_units,
+    frequencyBandwidth_value,
+
+    -- ** GroundStationData
+    groundStationData_groundStationId,
+    groundStationData_groundStationName,
+    groundStationData_region,
+
+    -- ** MissionProfileIdResponse
+    missionProfileIdResponse_missionProfileId,
+
+    -- ** MissionProfileListItem
+    missionProfileListItem_missionProfileArn,
+    missionProfileListItem_missionProfileId,
+    missionProfileListItem_name,
+    missionProfileListItem_region,
+
+    -- ** OEMEphemeris
+    oEMEphemeris_oemData,
+    oEMEphemeris_s3Object,
+
+    -- ** S3Object
+    s3Object_bucket,
+    s3Object_key,
+    s3Object_version,
+
+    -- ** S3RecordingConfig
+    s3RecordingConfig_prefix,
+    s3RecordingConfig_bucketArn,
+    s3RecordingConfig_roleArn,
+
+    -- ** S3RecordingDetails
+    s3RecordingDetails_bucketArn,
+    s3RecordingDetails_keyTemplate,
+
+    -- ** SatelliteListItem
+    satelliteListItem_currentEphemeris,
+    satelliteListItem_groundStations,
+    satelliteListItem_noradSatelliteID,
+    satelliteListItem_satelliteArn,
+    satelliteListItem_satelliteId,
+
+    -- ** SecurityDetails
+    securityDetails_roleArn,
+    securityDetails_securityGroupIds,
+    securityDetails_subnetIds,
+
+    -- ** SocketAddress
+    socketAddress_name,
+    socketAddress_port,
+
+    -- ** Source
+    source_configDetails,
+    source_configId,
+    source_configType,
+    source_dataflowSourceRegion,
+
+    -- ** SpectrumConfig
+    spectrumConfig_polarization,
+    spectrumConfig_bandwidth,
+    spectrumConfig_centerFrequency,
+
+    -- ** TLEData
+    tLEData_tleLine1,
+    tLEData_tleLine2,
+    tLEData_validTimeRange,
+
+    -- ** TLEEphemeris
+    tLEEphemeris_s3Object,
+    tLEEphemeris_tleData,
+
+    -- ** TimeRange
+    timeRange_endTime,
+    timeRange_startTime,
+
+    -- ** TrackingConfig
+    trackingConfig_autotrack,
+
+    -- ** UplinkEchoConfig
+    uplinkEchoConfig_antennaUplinkConfigArn,
+    uplinkEchoConfig_enabled,
+
+    -- ** UplinkSpectrumConfig
+    uplinkSpectrumConfig_polarization,
+    uplinkSpectrumConfig_centerFrequency,
+  )
+where
+
+import Amazonka.GroundStation.CancelContact
+import Amazonka.GroundStation.CreateConfig
+import Amazonka.GroundStation.CreateDataflowEndpointGroup
+import Amazonka.GroundStation.CreateEphemeris
+import Amazonka.GroundStation.CreateMissionProfile
+import Amazonka.GroundStation.DeleteConfig
+import Amazonka.GroundStation.DeleteDataflowEndpointGroup
+import Amazonka.GroundStation.DeleteEphemeris
+import Amazonka.GroundStation.DeleteMissionProfile
+import Amazonka.GroundStation.DescribeContact
+import Amazonka.GroundStation.DescribeEphemeris
+import Amazonka.GroundStation.GetConfig
+import Amazonka.GroundStation.GetDataflowEndpointGroup
+import Amazonka.GroundStation.GetMinuteUsage
+import Amazonka.GroundStation.GetMissionProfile
+import Amazonka.GroundStation.GetSatellite
+import Amazonka.GroundStation.ListConfigs
+import Amazonka.GroundStation.ListContacts
+import Amazonka.GroundStation.ListDataflowEndpointGroups
+import Amazonka.GroundStation.ListEphemerides
+import Amazonka.GroundStation.ListGroundStations
+import Amazonka.GroundStation.ListMissionProfiles
+import Amazonka.GroundStation.ListSatellites
+import Amazonka.GroundStation.ListTagsForResource
+import Amazonka.GroundStation.ReserveContact
+import Amazonka.GroundStation.TagResource
+import Amazonka.GroundStation.Types.AntennaDemodDecodeDetails
+import Amazonka.GroundStation.Types.AntennaDownlinkConfig
+import Amazonka.GroundStation.Types.AntennaDownlinkDemodDecodeConfig
+import Amazonka.GroundStation.Types.AntennaUplinkConfig
+import Amazonka.GroundStation.Types.ConfigDetails
+import Amazonka.GroundStation.Types.ConfigIdResponse
+import Amazonka.GroundStation.Types.ConfigListItem
+import Amazonka.GroundStation.Types.ConfigTypeData
+import Amazonka.GroundStation.Types.ContactData
+import Amazonka.GroundStation.Types.ContactIdResponse
+import Amazonka.GroundStation.Types.DataflowDetail
+import Amazonka.GroundStation.Types.DataflowEndpoint
+import Amazonka.GroundStation.Types.DataflowEndpointConfig
+import Amazonka.GroundStation.Types.DataflowEndpointGroupIdResponse
+import Amazonka.GroundStation.Types.DataflowEndpointListItem
+import Amazonka.GroundStation.Types.DecodeConfig
+import Amazonka.GroundStation.Types.DemodulationConfig
+import Amazonka.GroundStation.Types.Destination
+import Amazonka.GroundStation.Types.Eirp
+import Amazonka.GroundStation.Types.Elevation
+import Amazonka.GroundStation.Types.EndpointDetails
+import Amazonka.GroundStation.Types.EphemerisData
+import Amazonka.GroundStation.Types.EphemerisDescription
+import Amazonka.GroundStation.Types.EphemerisIdResponse
+import Amazonka.GroundStation.Types.EphemerisItem
+import Amazonka.GroundStation.Types.EphemerisMetaData
+import Amazonka.GroundStation.Types.EphemerisTypeDescription
+import Amazonka.GroundStation.Types.Frequency
+import Amazonka.GroundStation.Types.FrequencyBandwidth
+import Amazonka.GroundStation.Types.GroundStationData
+import Amazonka.GroundStation.Types.MissionProfileIdResponse
+import Amazonka.GroundStation.Types.MissionProfileListItem
+import Amazonka.GroundStation.Types.OEMEphemeris
+import Amazonka.GroundStation.Types.S3Object
+import Amazonka.GroundStation.Types.S3RecordingConfig
+import Amazonka.GroundStation.Types.S3RecordingDetails
+import Amazonka.GroundStation.Types.SatelliteListItem
+import Amazonka.GroundStation.Types.SecurityDetails
+import Amazonka.GroundStation.Types.SocketAddress
+import Amazonka.GroundStation.Types.Source
+import Amazonka.GroundStation.Types.SpectrumConfig
+import Amazonka.GroundStation.Types.TLEData
+import Amazonka.GroundStation.Types.TLEEphemeris
+import Amazonka.GroundStation.Types.TimeRange
+import Amazonka.GroundStation.Types.TrackingConfig
+import Amazonka.GroundStation.Types.UplinkEchoConfig
+import Amazonka.GroundStation.Types.UplinkSpectrumConfig
+import Amazonka.GroundStation.UntagResource
+import Amazonka.GroundStation.UpdateConfig
+import Amazonka.GroundStation.UpdateEphemeris
+import Amazonka.GroundStation.UpdateMissionProfile
diff --git a/gen/Amazonka/GroundStation/ListConfigs.hs b/gen/Amazonka/GroundStation/ListConfigs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListConfigs.hs
@@ -0,0 +1,218 @@
+{-# 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.GroundStation.ListConfigs
+-- 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 a list of @Config@ objects.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListConfigs
+  ( -- * Creating a Request
+    ListConfigs (..),
+    newListConfigs,
+
+    -- * Request Lenses
+    listConfigs_maxResults,
+    listConfigs_nextToken,
+
+    -- * Destructuring the Response
+    ListConfigsResponse (..),
+    newListConfigsResponse,
+
+    -- * Response Lenses
+    listConfigsResponse_configList,
+    listConfigsResponse_nextToken,
+    listConfigsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListConfigs' smart constructor.
+data ListConfigs = ListConfigs'
+  { -- | Maximum number of @Configs@ returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Next token returned in the request of a previous @ListConfigs@ call.
+    -- Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListConfigs' 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', 'listConfigs_maxResults' - Maximum number of @Configs@ returned.
+--
+-- 'nextToken', 'listConfigs_nextToken' - Next token returned in the request of a previous @ListConfigs@ call.
+-- Used to get the next page of results.
+newListConfigs ::
+  ListConfigs
+newListConfigs =
+  ListConfigs'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of @Configs@ returned.
+listConfigs_maxResults :: Lens.Lens' ListConfigs (Prelude.Maybe Prelude.Natural)
+listConfigs_maxResults = Lens.lens (\ListConfigs' {maxResults} -> maxResults) (\s@ListConfigs' {} a -> s {maxResults = a} :: ListConfigs)
+
+-- | Next token returned in the request of a previous @ListConfigs@ call.
+-- Used to get the next page of results.
+listConfigs_nextToken :: Lens.Lens' ListConfigs (Prelude.Maybe Prelude.Text)
+listConfigs_nextToken = Lens.lens (\ListConfigs' {nextToken} -> nextToken) (\s@ListConfigs' {} a -> s {nextToken = a} :: ListConfigs)
+
+instance Core.AWSPager ListConfigs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listConfigsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listConfigsResponse_configList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listConfigs_nextToken
+          Lens..~ rs
+          Lens.^? listConfigsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListConfigs where
+  type AWSResponse ListConfigs = ListConfigsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListConfigsResponse'
+            Prelude.<$> (x Data..?> "configList" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListConfigs where
+  hashWithSalt _salt ListConfigs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListConfigs where
+  rnf ListConfigs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListConfigs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListConfigs where
+  toPath = Prelude.const "/config"
+
+instance Data.ToQuery ListConfigs where
+  toQuery ListConfigs' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListConfigsResponse' smart constructor.
+data ListConfigsResponse = ListConfigsResponse'
+  { -- | List of @Config@ items.
+    configList :: Prelude.Maybe [ConfigListItem],
+    -- | Next token returned in the response of a previous @ListConfigs@ call.
+    -- Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListConfigsResponse' 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:
+--
+-- 'configList', 'listConfigsResponse_configList' - List of @Config@ items.
+--
+-- 'nextToken', 'listConfigsResponse_nextToken' - Next token returned in the response of a previous @ListConfigs@ call.
+-- Used to get the next page of results.
+--
+-- 'httpStatus', 'listConfigsResponse_httpStatus' - The response's http status code.
+newListConfigsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListConfigsResponse
+newListConfigsResponse pHttpStatus_ =
+  ListConfigsResponse'
+    { configList = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of @Config@ items.
+listConfigsResponse_configList :: Lens.Lens' ListConfigsResponse (Prelude.Maybe [ConfigListItem])
+listConfigsResponse_configList = Lens.lens (\ListConfigsResponse' {configList} -> configList) (\s@ListConfigsResponse' {} a -> s {configList = a} :: ListConfigsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token returned in the response of a previous @ListConfigs@ call.
+-- Used to get the next page of results.
+listConfigsResponse_nextToken :: Lens.Lens' ListConfigsResponse (Prelude.Maybe Prelude.Text)
+listConfigsResponse_nextToken = Lens.lens (\ListConfigsResponse' {nextToken} -> nextToken) (\s@ListConfigsResponse' {} a -> s {nextToken = a} :: ListConfigsResponse)
+
+-- | The response's http status code.
+listConfigsResponse_httpStatus :: Lens.Lens' ListConfigsResponse Prelude.Int
+listConfigsResponse_httpStatus = Lens.lens (\ListConfigsResponse' {httpStatus} -> httpStatus) (\s@ListConfigsResponse' {} a -> s {httpStatus = a} :: ListConfigsResponse)
+
+instance Prelude.NFData ListConfigsResponse where
+  rnf ListConfigsResponse' {..} =
+    Prelude.rnf configList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListContacts.hs b/gen/Amazonka/GroundStation/ListContacts.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListContacts.hs
@@ -0,0 +1,310 @@
+{-# 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.GroundStation.ListContacts
+-- 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 a list of contacts.
+--
+-- If @statusList@ contains AVAILABLE, the request must include
+-- @groundStation@, @missionprofileArn@, and @satelliteArn@.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListContacts
+  ( -- * Creating a Request
+    ListContacts (..),
+    newListContacts,
+
+    -- * Request Lenses
+    listContacts_groundStation,
+    listContacts_maxResults,
+    listContacts_missionProfileArn,
+    listContacts_nextToken,
+    listContacts_satelliteArn,
+    listContacts_endTime,
+    listContacts_startTime,
+    listContacts_statusList,
+
+    -- * Destructuring the Response
+    ListContactsResponse (..),
+    newListContactsResponse,
+
+    -- * Response Lenses
+    listContactsResponse_contactList,
+    listContactsResponse_nextToken,
+    listContactsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListContacts' smart constructor.
+data ListContacts = ListContacts'
+  { -- | Name of a ground station.
+    groundStation :: Prelude.Maybe Prelude.Text,
+    -- | Maximum number of contacts returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Maybe Prelude.Text,
+    -- | Next token returned in the request of a previous @ListContacts@ call.
+    -- Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | ARN of a satellite.
+    satelliteArn :: Prelude.Maybe Prelude.Text,
+    -- | End time of a contact in UTC.
+    endTime :: Data.POSIX,
+    -- | Start time of a contact in UTC.
+    startTime :: Data.POSIX,
+    -- | Status of a contact reservation.
+    statusList :: [ContactStatus]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContacts' 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:
+--
+-- 'groundStation', 'listContacts_groundStation' - Name of a ground station.
+--
+-- 'maxResults', 'listContacts_maxResults' - Maximum number of contacts returned.
+--
+-- 'missionProfileArn', 'listContacts_missionProfileArn' - ARN of a mission profile.
+--
+-- 'nextToken', 'listContacts_nextToken' - Next token returned in the request of a previous @ListContacts@ call.
+-- Used to get the next page of results.
+--
+-- 'satelliteArn', 'listContacts_satelliteArn' - ARN of a satellite.
+--
+-- 'endTime', 'listContacts_endTime' - End time of a contact in UTC.
+--
+-- 'startTime', 'listContacts_startTime' - Start time of a contact in UTC.
+--
+-- 'statusList', 'listContacts_statusList' - Status of a contact reservation.
+newListContacts ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  ListContacts
+newListContacts pEndTime_ pStartTime_ =
+  ListContacts'
+    { groundStation = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      missionProfileArn = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      satelliteArn = Prelude.Nothing,
+      endTime = Data._Time Lens.# pEndTime_,
+      startTime = Data._Time Lens.# pStartTime_,
+      statusList = Prelude.mempty
+    }
+
+-- | Name of a ground station.
+listContacts_groundStation :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_groundStation = Lens.lens (\ListContacts' {groundStation} -> groundStation) (\s@ListContacts' {} a -> s {groundStation = a} :: ListContacts)
+
+-- | Maximum number of contacts returned.
+listContacts_maxResults :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Natural)
+listContacts_maxResults = Lens.lens (\ListContacts' {maxResults} -> maxResults) (\s@ListContacts' {} a -> s {maxResults = a} :: ListContacts)
+
+-- | ARN of a mission profile.
+listContacts_missionProfileArn :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_missionProfileArn = Lens.lens (\ListContacts' {missionProfileArn} -> missionProfileArn) (\s@ListContacts' {} a -> s {missionProfileArn = a} :: ListContacts)
+
+-- | Next token returned in the request of a previous @ListContacts@ call.
+-- Used to get the next page of results.
+listContacts_nextToken :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_nextToken = Lens.lens (\ListContacts' {nextToken} -> nextToken) (\s@ListContacts' {} a -> s {nextToken = a} :: ListContacts)
+
+-- | ARN of a satellite.
+listContacts_satelliteArn :: Lens.Lens' ListContacts (Prelude.Maybe Prelude.Text)
+listContacts_satelliteArn = Lens.lens (\ListContacts' {satelliteArn} -> satelliteArn) (\s@ListContacts' {} a -> s {satelliteArn = a} :: ListContacts)
+
+-- | End time of a contact in UTC.
+listContacts_endTime :: Lens.Lens' ListContacts Prelude.UTCTime
+listContacts_endTime = Lens.lens (\ListContacts' {endTime} -> endTime) (\s@ListContacts' {} a -> s {endTime = a} :: ListContacts) Prelude.. Data._Time
+
+-- | Start time of a contact in UTC.
+listContacts_startTime :: Lens.Lens' ListContacts Prelude.UTCTime
+listContacts_startTime = Lens.lens (\ListContacts' {startTime} -> startTime) (\s@ListContacts' {} a -> s {startTime = a} :: ListContacts) Prelude.. Data._Time
+
+-- | Status of a contact reservation.
+listContacts_statusList :: Lens.Lens' ListContacts [ContactStatus]
+listContacts_statusList = Lens.lens (\ListContacts' {statusList} -> statusList) (\s@ListContacts' {} a -> s {statusList = a} :: ListContacts) Prelude.. Lens.coerced
+
+instance Core.AWSPager ListContacts where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listContactsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listContactsResponse_contactList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listContacts_nextToken
+          Lens..~ rs
+          Lens.^? listContactsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListContacts where
+  type AWSResponse ListContacts = ListContactsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListContactsResponse'
+            Prelude.<$> (x Data..?> "contactList" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListContacts where
+  hashWithSalt _salt ListContacts' {..} =
+    _salt
+      `Prelude.hashWithSalt` groundStation
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` missionProfileArn
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` satelliteArn
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` statusList
+
+instance Prelude.NFData ListContacts where
+  rnf ListContacts' {..} =
+    Prelude.rnf groundStation
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf statusList
+
+instance Data.ToHeaders ListContacts where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListContacts where
+  toJSON ListContacts' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("groundStation" Data..=) Prelude.<$> groundStation,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("missionProfileArn" Data..=)
+              Prelude.<$> missionProfileArn,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("satelliteArn" Data..=) Prelude.<$> satelliteArn,
+            Prelude.Just ("endTime" Data..= endTime),
+            Prelude.Just ("startTime" Data..= startTime),
+            Prelude.Just ("statusList" Data..= statusList)
+          ]
+      )
+
+instance Data.ToPath ListContacts where
+  toPath = Prelude.const "/contacts"
+
+instance Data.ToQuery ListContacts where
+  toQuery = Prelude.const Prelude.mempty
+
+-- |
+--
+-- /See:/ 'newListContactsResponse' smart constructor.
+data ListContactsResponse = ListContactsResponse'
+  { -- | List of contacts.
+    contactList :: Prelude.Maybe [ContactData],
+    -- | Next token returned in the response of a previous @ListContacts@ call.
+    -- Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListContactsResponse' 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:
+--
+-- 'contactList', 'listContactsResponse_contactList' - List of contacts.
+--
+-- 'nextToken', 'listContactsResponse_nextToken' - Next token returned in the response of a previous @ListContacts@ call.
+-- Used to get the next page of results.
+--
+-- 'httpStatus', 'listContactsResponse_httpStatus' - The response's http status code.
+newListContactsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListContactsResponse
+newListContactsResponse pHttpStatus_ =
+  ListContactsResponse'
+    { contactList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of contacts.
+listContactsResponse_contactList :: Lens.Lens' ListContactsResponse (Prelude.Maybe [ContactData])
+listContactsResponse_contactList = Lens.lens (\ListContactsResponse' {contactList} -> contactList) (\s@ListContactsResponse' {} a -> s {contactList = a} :: ListContactsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token returned in the response of a previous @ListContacts@ call.
+-- Used to get the next page of results.
+listContactsResponse_nextToken :: Lens.Lens' ListContactsResponse (Prelude.Maybe Prelude.Text)
+listContactsResponse_nextToken = Lens.lens (\ListContactsResponse' {nextToken} -> nextToken) (\s@ListContactsResponse' {} a -> s {nextToken = a} :: ListContactsResponse)
+
+-- | The response's http status code.
+listContactsResponse_httpStatus :: Lens.Lens' ListContactsResponse Prelude.Int
+listContactsResponse_httpStatus = Lens.lens (\ListContactsResponse' {httpStatus} -> httpStatus) (\s@ListContactsResponse' {} a -> s {httpStatus = a} :: ListContactsResponse)
+
+instance Prelude.NFData ListContactsResponse where
+  rnf ListContactsResponse' {..} =
+    Prelude.rnf contactList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListDataflowEndpointGroups.hs b/gen/Amazonka/GroundStation/ListDataflowEndpointGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListDataflowEndpointGroups.hs
@@ -0,0 +1,228 @@
+{-# 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.GroundStation.ListDataflowEndpointGroups
+-- 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 a list of @DataflowEndpoint@ groups.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListDataflowEndpointGroups
+  ( -- * Creating a Request
+    ListDataflowEndpointGroups (..),
+    newListDataflowEndpointGroups,
+
+    -- * Request Lenses
+    listDataflowEndpointGroups_maxResults,
+    listDataflowEndpointGroups_nextToken,
+
+    -- * Destructuring the Response
+    ListDataflowEndpointGroupsResponse (..),
+    newListDataflowEndpointGroupsResponse,
+
+    -- * Response Lenses
+    listDataflowEndpointGroupsResponse_dataflowEndpointGroupList,
+    listDataflowEndpointGroupsResponse_nextToken,
+    listDataflowEndpointGroupsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListDataflowEndpointGroups' smart constructor.
+data ListDataflowEndpointGroups = ListDataflowEndpointGroups'
+  { -- | Maximum number of dataflow endpoint groups returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Next token returned in the request of a previous
+    -- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDataflowEndpointGroups' 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', 'listDataflowEndpointGroups_maxResults' - Maximum number of dataflow endpoint groups returned.
+--
+-- 'nextToken', 'listDataflowEndpointGroups_nextToken' - Next token returned in the request of a previous
+-- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+newListDataflowEndpointGroups ::
+  ListDataflowEndpointGroups
+newListDataflowEndpointGroups =
+  ListDataflowEndpointGroups'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of dataflow endpoint groups returned.
+listDataflowEndpointGroups_maxResults :: Lens.Lens' ListDataflowEndpointGroups (Prelude.Maybe Prelude.Natural)
+listDataflowEndpointGroups_maxResults = Lens.lens (\ListDataflowEndpointGroups' {maxResults} -> maxResults) (\s@ListDataflowEndpointGroups' {} a -> s {maxResults = a} :: ListDataflowEndpointGroups)
+
+-- | Next token returned in the request of a previous
+-- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+listDataflowEndpointGroups_nextToken :: Lens.Lens' ListDataflowEndpointGroups (Prelude.Maybe Prelude.Text)
+listDataflowEndpointGroups_nextToken = Lens.lens (\ListDataflowEndpointGroups' {nextToken} -> nextToken) (\s@ListDataflowEndpointGroups' {} a -> s {nextToken = a} :: ListDataflowEndpointGroups)
+
+instance Core.AWSPager ListDataflowEndpointGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDataflowEndpointGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDataflowEndpointGroupsResponse_dataflowEndpointGroupList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDataflowEndpointGroups_nextToken
+          Lens..~ rs
+          Lens.^? listDataflowEndpointGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDataflowEndpointGroups where
+  type
+    AWSResponse ListDataflowEndpointGroups =
+      ListDataflowEndpointGroupsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDataflowEndpointGroupsResponse'
+            Prelude.<$> ( x
+                            Data..?> "dataflowEndpointGroupList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDataflowEndpointGroups where
+  hashWithSalt _salt ListDataflowEndpointGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDataflowEndpointGroups where
+  rnf ListDataflowEndpointGroups' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDataflowEndpointGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDataflowEndpointGroups where
+  toPath = Prelude.const "/dataflowEndpointGroup"
+
+instance Data.ToQuery ListDataflowEndpointGroups where
+  toQuery ListDataflowEndpointGroups' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListDataflowEndpointGroupsResponse' smart constructor.
+data ListDataflowEndpointGroupsResponse = ListDataflowEndpointGroupsResponse'
+  { -- | A list of dataflow endpoint groups.
+    dataflowEndpointGroupList :: Prelude.Maybe [DataflowEndpointListItem],
+    -- | Next token returned in the response of a previous
+    -- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDataflowEndpointGroupsResponse' 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:
+--
+-- 'dataflowEndpointGroupList', 'listDataflowEndpointGroupsResponse_dataflowEndpointGroupList' - A list of dataflow endpoint groups.
+--
+-- 'nextToken', 'listDataflowEndpointGroupsResponse_nextToken' - Next token returned in the response of a previous
+-- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+--
+-- 'httpStatus', 'listDataflowEndpointGroupsResponse_httpStatus' - The response's http status code.
+newListDataflowEndpointGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDataflowEndpointGroupsResponse
+newListDataflowEndpointGroupsResponse pHttpStatus_ =
+  ListDataflowEndpointGroupsResponse'
+    { dataflowEndpointGroupList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of dataflow endpoint groups.
+listDataflowEndpointGroupsResponse_dataflowEndpointGroupList :: Lens.Lens' ListDataflowEndpointGroupsResponse (Prelude.Maybe [DataflowEndpointListItem])
+listDataflowEndpointGroupsResponse_dataflowEndpointGroupList = Lens.lens (\ListDataflowEndpointGroupsResponse' {dataflowEndpointGroupList} -> dataflowEndpointGroupList) (\s@ListDataflowEndpointGroupsResponse' {} a -> s {dataflowEndpointGroupList = a} :: ListDataflowEndpointGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token returned in the response of a previous
+-- @ListDataflowEndpointGroups@ call. Used to get the next page of results.
+listDataflowEndpointGroupsResponse_nextToken :: Lens.Lens' ListDataflowEndpointGroupsResponse (Prelude.Maybe Prelude.Text)
+listDataflowEndpointGroupsResponse_nextToken = Lens.lens (\ListDataflowEndpointGroupsResponse' {nextToken} -> nextToken) (\s@ListDataflowEndpointGroupsResponse' {} a -> s {nextToken = a} :: ListDataflowEndpointGroupsResponse)
+
+-- | The response's http status code.
+listDataflowEndpointGroupsResponse_httpStatus :: Lens.Lens' ListDataflowEndpointGroupsResponse Prelude.Int
+listDataflowEndpointGroupsResponse_httpStatus = Lens.lens (\ListDataflowEndpointGroupsResponse' {httpStatus} -> httpStatus) (\s@ListDataflowEndpointGroupsResponse' {} a -> s {httpStatus = a} :: ListDataflowEndpointGroupsResponse)
+
+instance
+  Prelude.NFData
+    ListDataflowEndpointGroupsResponse
+  where
+  rnf ListDataflowEndpointGroupsResponse' {..} =
+    Prelude.rnf dataflowEndpointGroupList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListEphemerides.hs b/gen/Amazonka/GroundStation/ListEphemerides.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListEphemerides.hs
@@ -0,0 +1,292 @@
+{-# 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.GroundStation.ListEphemerides
+-- 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 existing ephemerides.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListEphemerides
+  ( -- * Creating a Request
+    ListEphemerides (..),
+    newListEphemerides,
+
+    -- * Request Lenses
+    listEphemerides_maxResults,
+    listEphemerides_nextToken,
+    listEphemerides_statusList,
+    listEphemerides_endTime,
+    listEphemerides_satelliteId,
+    listEphemerides_startTime,
+
+    -- * Destructuring the Response
+    ListEphemeridesResponse (..),
+    newListEphemeridesResponse,
+
+    -- * Response Lenses
+    listEphemeridesResponse_ephemerides,
+    listEphemeridesResponse_nextToken,
+    listEphemeridesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListEphemerides' smart constructor.
+data ListEphemerides = ListEphemerides'
+  { -- | Maximum number of ephemerides to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Pagination token.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of ephemeris status to return.
+    statusList :: Prelude.Maybe [EphemerisStatus],
+    -- | The end time to list in UTC. The operation will return an ephemeris if
+    -- its expiration time is within the time range defined by the @startTime@
+    -- and @endTime@.
+    endTime :: Data.POSIX,
+    -- | The AWS Ground Station satellite ID to list ephemeris for.
+    satelliteId :: Prelude.Text,
+    -- | The start time to list in UTC. The operation will return an ephemeris if
+    -- its expiration time is within the time range defined by the @startTime@
+    -- and @endTime@.
+    startTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEphemerides' 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', 'listEphemerides_maxResults' - Maximum number of ephemerides to return.
+--
+-- 'nextToken', 'listEphemerides_nextToken' - Pagination token.
+--
+-- 'statusList', 'listEphemerides_statusList' - The list of ephemeris status to return.
+--
+-- 'endTime', 'listEphemerides_endTime' - The end time to list in UTC. The operation will return an ephemeris if
+-- its expiration time is within the time range defined by the @startTime@
+-- and @endTime@.
+--
+-- 'satelliteId', 'listEphemerides_satelliteId' - The AWS Ground Station satellite ID to list ephemeris for.
+--
+-- 'startTime', 'listEphemerides_startTime' - The start time to list in UTC. The operation will return an ephemeris if
+-- its expiration time is within the time range defined by the @startTime@
+-- and @endTime@.
+newListEphemerides ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'satelliteId'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  ListEphemerides
+newListEphemerides
+  pEndTime_
+  pSatelliteId_
+  pStartTime_ =
+    ListEphemerides'
+      { maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        statusList = Prelude.Nothing,
+        endTime = Data._Time Lens.# pEndTime_,
+        satelliteId = pSatelliteId_,
+        startTime = Data._Time Lens.# pStartTime_
+      }
+
+-- | Maximum number of ephemerides to return.
+listEphemerides_maxResults :: Lens.Lens' ListEphemerides (Prelude.Maybe Prelude.Natural)
+listEphemerides_maxResults = Lens.lens (\ListEphemerides' {maxResults} -> maxResults) (\s@ListEphemerides' {} a -> s {maxResults = a} :: ListEphemerides)
+
+-- | Pagination token.
+listEphemerides_nextToken :: Lens.Lens' ListEphemerides (Prelude.Maybe Prelude.Text)
+listEphemerides_nextToken = Lens.lens (\ListEphemerides' {nextToken} -> nextToken) (\s@ListEphemerides' {} a -> s {nextToken = a} :: ListEphemerides)
+
+-- | The list of ephemeris status to return.
+listEphemerides_statusList :: Lens.Lens' ListEphemerides (Prelude.Maybe [EphemerisStatus])
+listEphemerides_statusList = Lens.lens (\ListEphemerides' {statusList} -> statusList) (\s@ListEphemerides' {} a -> s {statusList = a} :: ListEphemerides) Prelude.. Lens.mapping Lens.coerced
+
+-- | The end time to list in UTC. The operation will return an ephemeris if
+-- its expiration time is within the time range defined by the @startTime@
+-- and @endTime@.
+listEphemerides_endTime :: Lens.Lens' ListEphemerides Prelude.UTCTime
+listEphemerides_endTime = Lens.lens (\ListEphemerides' {endTime} -> endTime) (\s@ListEphemerides' {} a -> s {endTime = a} :: ListEphemerides) Prelude.. Data._Time
+
+-- | The AWS Ground Station satellite ID to list ephemeris for.
+listEphemerides_satelliteId :: Lens.Lens' ListEphemerides Prelude.Text
+listEphemerides_satelliteId = Lens.lens (\ListEphemerides' {satelliteId} -> satelliteId) (\s@ListEphemerides' {} a -> s {satelliteId = a} :: ListEphemerides)
+
+-- | The start time to list in UTC. The operation will return an ephemeris if
+-- its expiration time is within the time range defined by the @startTime@
+-- and @endTime@.
+listEphemerides_startTime :: Lens.Lens' ListEphemerides Prelude.UTCTime
+listEphemerides_startTime = Lens.lens (\ListEphemerides' {startTime} -> startTime) (\s@ListEphemerides' {} a -> s {startTime = a} :: ListEphemerides) Prelude.. Data._Time
+
+instance Core.AWSPager ListEphemerides where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listEphemeridesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listEphemeridesResponse_ephemerides
+            Prelude.. Lens._Just
+            Prelude.. Lens.to Prelude.toList
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listEphemerides_nextToken
+          Lens..~ rs
+          Lens.^? listEphemeridesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListEphemerides where
+  type
+    AWSResponse ListEphemerides =
+      ListEphemeridesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEphemeridesResponse'
+            Prelude.<$> (x Data..?> "ephemerides")
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListEphemerides where
+  hashWithSalt _salt ListEphemerides' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` statusList
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` satelliteId
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData ListEphemerides where
+  rnf ListEphemerides' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusList
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf satelliteId
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders ListEphemerides where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListEphemerides where
+  toJSON ListEphemerides' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("statusList" Data..=) Prelude.<$> statusList,
+            Prelude.Just ("endTime" Data..= endTime),
+            Prelude.Just ("satelliteId" Data..= satelliteId),
+            Prelude.Just ("startTime" Data..= startTime)
+          ]
+      )
+
+instance Data.ToPath ListEphemerides where
+  toPath = Prelude.const "/ephemerides"
+
+instance Data.ToQuery ListEphemerides where
+  toQuery ListEphemerides' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListEphemeridesResponse' smart constructor.
+data ListEphemeridesResponse = ListEphemeridesResponse'
+  { -- | List of ephemerides.
+    ephemerides :: Prelude.Maybe (Prelude.NonEmpty EphemerisItem),
+    -- | Pagination token.
+    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 'ListEphemeridesResponse' 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:
+--
+-- 'ephemerides', 'listEphemeridesResponse_ephemerides' - List of ephemerides.
+--
+-- 'nextToken', 'listEphemeridesResponse_nextToken' - Pagination token.
+--
+-- 'httpStatus', 'listEphemeridesResponse_httpStatus' - The response's http status code.
+newListEphemeridesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEphemeridesResponse
+newListEphemeridesResponse pHttpStatus_ =
+  ListEphemeridesResponse'
+    { ephemerides =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of ephemerides.
+listEphemeridesResponse_ephemerides :: Lens.Lens' ListEphemeridesResponse (Prelude.Maybe (Prelude.NonEmpty EphemerisItem))
+listEphemeridesResponse_ephemerides = Lens.lens (\ListEphemeridesResponse' {ephemerides} -> ephemerides) (\s@ListEphemeridesResponse' {} a -> s {ephemerides = a} :: ListEphemeridesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Pagination token.
+listEphemeridesResponse_nextToken :: Lens.Lens' ListEphemeridesResponse (Prelude.Maybe Prelude.Text)
+listEphemeridesResponse_nextToken = Lens.lens (\ListEphemeridesResponse' {nextToken} -> nextToken) (\s@ListEphemeridesResponse' {} a -> s {nextToken = a} :: ListEphemeridesResponse)
+
+-- | The response's http status code.
+listEphemeridesResponse_httpStatus :: Lens.Lens' ListEphemeridesResponse Prelude.Int
+listEphemeridesResponse_httpStatus = Lens.lens (\ListEphemeridesResponse' {httpStatus} -> httpStatus) (\s@ListEphemeridesResponse' {} a -> s {httpStatus = a} :: ListEphemeridesResponse)
+
+instance Prelude.NFData ListEphemeridesResponse where
+  rnf ListEphemeridesResponse' {..} =
+    Prelude.rnf ephemerides
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListGroundStations.hs b/gen/Amazonka/GroundStation/ListGroundStations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListGroundStations.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.GroundStation.ListGroundStations
+-- 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 a list of ground stations.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListGroundStations
+  ( -- * Creating a Request
+    ListGroundStations (..),
+    newListGroundStations,
+
+    -- * Request Lenses
+    listGroundStations_maxResults,
+    listGroundStations_nextToken,
+    listGroundStations_satelliteId,
+
+    -- * Destructuring the Response
+    ListGroundStationsResponse (..),
+    newListGroundStationsResponse,
+
+    -- * Response Lenses
+    listGroundStationsResponse_groundStationList,
+    listGroundStationsResponse_nextToken,
+    listGroundStationsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListGroundStations' smart constructor.
+data ListGroundStations = ListGroundStations'
+  { -- | Maximum number of ground stations returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Next token that can be supplied in the next call to get the next page of
+    -- ground stations.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Satellite ID to retrieve on-boarded ground stations.
+    satelliteId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGroundStations' 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', 'listGroundStations_maxResults' - Maximum number of ground stations returned.
+--
+-- 'nextToken', 'listGroundStations_nextToken' - Next token that can be supplied in the next call to get the next page of
+-- ground stations.
+--
+-- 'satelliteId', 'listGroundStations_satelliteId' - Satellite ID to retrieve on-boarded ground stations.
+newListGroundStations ::
+  ListGroundStations
+newListGroundStations =
+  ListGroundStations'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      satelliteId = Prelude.Nothing
+    }
+
+-- | Maximum number of ground stations returned.
+listGroundStations_maxResults :: Lens.Lens' ListGroundStations (Prelude.Maybe Prelude.Natural)
+listGroundStations_maxResults = Lens.lens (\ListGroundStations' {maxResults} -> maxResults) (\s@ListGroundStations' {} a -> s {maxResults = a} :: ListGroundStations)
+
+-- | Next token that can be supplied in the next call to get the next page of
+-- ground stations.
+listGroundStations_nextToken :: Lens.Lens' ListGroundStations (Prelude.Maybe Prelude.Text)
+listGroundStations_nextToken = Lens.lens (\ListGroundStations' {nextToken} -> nextToken) (\s@ListGroundStations' {} a -> s {nextToken = a} :: ListGroundStations)
+
+-- | Satellite ID to retrieve on-boarded ground stations.
+listGroundStations_satelliteId :: Lens.Lens' ListGroundStations (Prelude.Maybe Prelude.Text)
+listGroundStations_satelliteId = Lens.lens (\ListGroundStations' {satelliteId} -> satelliteId) (\s@ListGroundStations' {} a -> s {satelliteId = a} :: ListGroundStations)
+
+instance Core.AWSPager ListGroundStations where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGroundStationsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listGroundStationsResponse_groundStationList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGroundStations_nextToken
+          Lens..~ rs
+          Lens.^? listGroundStationsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListGroundStations where
+  type
+    AWSResponse ListGroundStations =
+      ListGroundStationsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGroundStationsResponse'
+            Prelude.<$> ( x
+                            Data..?> "groundStationList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListGroundStations where
+  hashWithSalt _salt ListGroundStations' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` satelliteId
+
+instance Prelude.NFData ListGroundStations where
+  rnf ListGroundStations' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf satelliteId
+
+instance Data.ToHeaders ListGroundStations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListGroundStations where
+  toPath = Prelude.const "/groundstation"
+
+instance Data.ToQuery ListGroundStations where
+  toQuery ListGroundStations' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "satelliteId" Data.=: satelliteId
+      ]
+
+-- |
+--
+-- /See:/ 'newListGroundStationsResponse' smart constructor.
+data ListGroundStationsResponse = ListGroundStationsResponse'
+  { -- | List of ground stations.
+    groundStationList :: Prelude.Maybe [GroundStationData],
+    -- | Next token that can be supplied in the next call to get the next page of
+    -- ground stations.
+    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 'ListGroundStationsResponse' 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:
+--
+-- 'groundStationList', 'listGroundStationsResponse_groundStationList' - List of ground stations.
+--
+-- 'nextToken', 'listGroundStationsResponse_nextToken' - Next token that can be supplied in the next call to get the next page of
+-- ground stations.
+--
+-- 'httpStatus', 'listGroundStationsResponse_httpStatus' - The response's http status code.
+newListGroundStationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGroundStationsResponse
+newListGroundStationsResponse pHttpStatus_ =
+  ListGroundStationsResponse'
+    { groundStationList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of ground stations.
+listGroundStationsResponse_groundStationList :: Lens.Lens' ListGroundStationsResponse (Prelude.Maybe [GroundStationData])
+listGroundStationsResponse_groundStationList = Lens.lens (\ListGroundStationsResponse' {groundStationList} -> groundStationList) (\s@ListGroundStationsResponse' {} a -> s {groundStationList = a} :: ListGroundStationsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token that can be supplied in the next call to get the next page of
+-- ground stations.
+listGroundStationsResponse_nextToken :: Lens.Lens' ListGroundStationsResponse (Prelude.Maybe Prelude.Text)
+listGroundStationsResponse_nextToken = Lens.lens (\ListGroundStationsResponse' {nextToken} -> nextToken) (\s@ListGroundStationsResponse' {} a -> s {nextToken = a} :: ListGroundStationsResponse)
+
+-- | The response's http status code.
+listGroundStationsResponse_httpStatus :: Lens.Lens' ListGroundStationsResponse Prelude.Int
+listGroundStationsResponse_httpStatus = Lens.lens (\ListGroundStationsResponse' {httpStatus} -> httpStatus) (\s@ListGroundStationsResponse' {} a -> s {httpStatus = a} :: ListGroundStationsResponse)
+
+instance Prelude.NFData ListGroundStationsResponse where
+  rnf ListGroundStationsResponse' {..} =
+    Prelude.rnf groundStationList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListMissionProfiles.hs b/gen/Amazonka/GroundStation/ListMissionProfiles.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListMissionProfiles.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.GroundStation.ListMissionProfiles
+-- 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 a list of mission profiles.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListMissionProfiles
+  ( -- * Creating a Request
+    ListMissionProfiles (..),
+    newListMissionProfiles,
+
+    -- * Request Lenses
+    listMissionProfiles_maxResults,
+    listMissionProfiles_nextToken,
+
+    -- * Destructuring the Response
+    ListMissionProfilesResponse (..),
+    newListMissionProfilesResponse,
+
+    -- * Response Lenses
+    listMissionProfilesResponse_missionProfileList,
+    listMissionProfilesResponse_nextToken,
+    listMissionProfilesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListMissionProfiles' smart constructor.
+data ListMissionProfiles = ListMissionProfiles'
+  { -- | Maximum number of mission profiles returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Next token returned in the request of a previous @ListMissionProfiles@
+    -- call. Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMissionProfiles' 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', 'listMissionProfiles_maxResults' - Maximum number of mission profiles returned.
+--
+-- 'nextToken', 'listMissionProfiles_nextToken' - Next token returned in the request of a previous @ListMissionProfiles@
+-- call. Used to get the next page of results.
+newListMissionProfiles ::
+  ListMissionProfiles
+newListMissionProfiles =
+  ListMissionProfiles'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of mission profiles returned.
+listMissionProfiles_maxResults :: Lens.Lens' ListMissionProfiles (Prelude.Maybe Prelude.Natural)
+listMissionProfiles_maxResults = Lens.lens (\ListMissionProfiles' {maxResults} -> maxResults) (\s@ListMissionProfiles' {} a -> s {maxResults = a} :: ListMissionProfiles)
+
+-- | Next token returned in the request of a previous @ListMissionProfiles@
+-- call. Used to get the next page of results.
+listMissionProfiles_nextToken :: Lens.Lens' ListMissionProfiles (Prelude.Maybe Prelude.Text)
+listMissionProfiles_nextToken = Lens.lens (\ListMissionProfiles' {nextToken} -> nextToken) (\s@ListMissionProfiles' {} a -> s {nextToken = a} :: ListMissionProfiles)
+
+instance Core.AWSPager ListMissionProfiles where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listMissionProfilesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listMissionProfilesResponse_missionProfileList
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listMissionProfiles_nextToken
+          Lens..~ rs
+          Lens.^? listMissionProfilesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListMissionProfiles where
+  type
+    AWSResponse ListMissionProfiles =
+      ListMissionProfilesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMissionProfilesResponse'
+            Prelude.<$> ( x
+                            Data..?> "missionProfileList"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListMissionProfiles where
+  hashWithSalt _salt ListMissionProfiles' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListMissionProfiles where
+  rnf ListMissionProfiles' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListMissionProfiles where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListMissionProfiles where
+  toPath = Prelude.const "/missionprofile"
+
+instance Data.ToQuery ListMissionProfiles where
+  toQuery ListMissionProfiles' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListMissionProfilesResponse' smart constructor.
+data ListMissionProfilesResponse = ListMissionProfilesResponse'
+  { -- | List of mission profiles.
+    missionProfileList :: Prelude.Maybe [MissionProfileListItem],
+    -- | Next token returned in the response of a previous @ListMissionProfiles@
+    -- call. Used to get the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMissionProfilesResponse' 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:
+--
+-- 'missionProfileList', 'listMissionProfilesResponse_missionProfileList' - List of mission profiles.
+--
+-- 'nextToken', 'listMissionProfilesResponse_nextToken' - Next token returned in the response of a previous @ListMissionProfiles@
+-- call. Used to get the next page of results.
+--
+-- 'httpStatus', 'listMissionProfilesResponse_httpStatus' - The response's http status code.
+newListMissionProfilesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMissionProfilesResponse
+newListMissionProfilesResponse pHttpStatus_ =
+  ListMissionProfilesResponse'
+    { missionProfileList =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | List of mission profiles.
+listMissionProfilesResponse_missionProfileList :: Lens.Lens' ListMissionProfilesResponse (Prelude.Maybe [MissionProfileListItem])
+listMissionProfilesResponse_missionProfileList = Lens.lens (\ListMissionProfilesResponse' {missionProfileList} -> missionProfileList) (\s@ListMissionProfilesResponse' {} a -> s {missionProfileList = a} :: ListMissionProfilesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Next token returned in the response of a previous @ListMissionProfiles@
+-- call. Used to get the next page of results.
+listMissionProfilesResponse_nextToken :: Lens.Lens' ListMissionProfilesResponse (Prelude.Maybe Prelude.Text)
+listMissionProfilesResponse_nextToken = Lens.lens (\ListMissionProfilesResponse' {nextToken} -> nextToken) (\s@ListMissionProfilesResponse' {} a -> s {nextToken = a} :: ListMissionProfilesResponse)
+
+-- | The response's http status code.
+listMissionProfilesResponse_httpStatus :: Lens.Lens' ListMissionProfilesResponse Prelude.Int
+listMissionProfilesResponse_httpStatus = Lens.lens (\ListMissionProfilesResponse' {httpStatus} -> httpStatus) (\s@ListMissionProfilesResponse' {} a -> s {httpStatus = a} :: ListMissionProfilesResponse)
+
+instance Prelude.NFData ListMissionProfilesResponse where
+  rnf ListMissionProfilesResponse' {..} =
+    Prelude.rnf missionProfileList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListSatellites.hs b/gen/Amazonka/GroundStation/ListSatellites.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListSatellites.hs
@@ -0,0 +1,221 @@
+{-# 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.GroundStation.ListSatellites
+-- 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 a list of satellites.
+--
+-- This operation returns paginated results.
+module Amazonka.GroundStation.ListSatellites
+  ( -- * Creating a Request
+    ListSatellites (..),
+    newListSatellites,
+
+    -- * Request Lenses
+    listSatellites_maxResults,
+    listSatellites_nextToken,
+
+    -- * Destructuring the Response
+    ListSatellitesResponse (..),
+    newListSatellitesResponse,
+
+    -- * Response Lenses
+    listSatellitesResponse_nextToken,
+    listSatellitesResponse_satellites,
+    listSatellitesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListSatellites' smart constructor.
+data ListSatellites = ListSatellites'
+  { -- | Maximum number of satellites returned.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Next token that can be supplied in the next call to get the next page of
+    -- satellites.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSatellites' 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', 'listSatellites_maxResults' - Maximum number of satellites returned.
+--
+-- 'nextToken', 'listSatellites_nextToken' - Next token that can be supplied in the next call to get the next page of
+-- satellites.
+newListSatellites ::
+  ListSatellites
+newListSatellites =
+  ListSatellites'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Maximum number of satellites returned.
+listSatellites_maxResults :: Lens.Lens' ListSatellites (Prelude.Maybe Prelude.Natural)
+listSatellites_maxResults = Lens.lens (\ListSatellites' {maxResults} -> maxResults) (\s@ListSatellites' {} a -> s {maxResults = a} :: ListSatellites)
+
+-- | Next token that can be supplied in the next call to get the next page of
+-- satellites.
+listSatellites_nextToken :: Lens.Lens' ListSatellites (Prelude.Maybe Prelude.Text)
+listSatellites_nextToken = Lens.lens (\ListSatellites' {nextToken} -> nextToken) (\s@ListSatellites' {} a -> s {nextToken = a} :: ListSatellites)
+
+instance Core.AWSPager ListSatellites where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSatellitesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSatellitesResponse_satellites
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSatellites_nextToken
+          Lens..~ rs
+          Lens.^? listSatellitesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSatellites where
+  type
+    AWSResponse ListSatellites =
+      ListSatellitesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSatellitesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "satellites" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSatellites where
+  hashWithSalt _salt ListSatellites' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListSatellites where
+  rnf ListSatellites' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListSatellites where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListSatellites where
+  toPath = Prelude.const "/satellite"
+
+instance Data.ToQuery ListSatellites where
+  toQuery ListSatellites' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- |
+--
+-- /See:/ 'newListSatellitesResponse' smart constructor.
+data ListSatellitesResponse = ListSatellitesResponse'
+  { -- | Next token that can be supplied in the next call to get the next page of
+    -- satellites.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | List of satellites.
+    satellites :: Prelude.Maybe [SatelliteListItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSatellitesResponse' 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', 'listSatellitesResponse_nextToken' - Next token that can be supplied in the next call to get the next page of
+-- satellites.
+--
+-- 'satellites', 'listSatellitesResponse_satellites' - List of satellites.
+--
+-- 'httpStatus', 'listSatellitesResponse_httpStatus' - The response's http status code.
+newListSatellitesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSatellitesResponse
+newListSatellitesResponse pHttpStatus_ =
+  ListSatellitesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      satellites = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Next token that can be supplied in the next call to get the next page of
+-- satellites.
+listSatellitesResponse_nextToken :: Lens.Lens' ListSatellitesResponse (Prelude.Maybe Prelude.Text)
+listSatellitesResponse_nextToken = Lens.lens (\ListSatellitesResponse' {nextToken} -> nextToken) (\s@ListSatellitesResponse' {} a -> s {nextToken = a} :: ListSatellitesResponse)
+
+-- | List of satellites.
+listSatellitesResponse_satellites :: Lens.Lens' ListSatellitesResponse (Prelude.Maybe [SatelliteListItem])
+listSatellitesResponse_satellites = Lens.lens (\ListSatellitesResponse' {satellites} -> satellites) (\s@ListSatellitesResponse' {} a -> s {satellites = a} :: ListSatellitesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSatellitesResponse_httpStatus :: Lens.Lens' ListSatellitesResponse Prelude.Int
+listSatellitesResponse_httpStatus = Lens.lens (\ListSatellitesResponse' {httpStatus} -> httpStatus) (\s@ListSatellitesResponse' {} a -> s {httpStatus = a} :: ListSatellitesResponse)
+
+instance Prelude.NFData ListSatellitesResponse where
+  rnf ListSatellitesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf satellites
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ListTagsForResource.hs b/gen/Amazonka/GroundStation/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ListTagsForResource.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.GroundStation.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)
+--
+-- Returns a list of tags for a specified resource.
+module Amazonka.GroundStation.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 Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | ARN of a resource.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - ARN of a resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | ARN of a resource.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.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'
+  { -- | Tags assigned to a resource.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - Tags assigned to a resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Tags assigned to a resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/GroundStation/ReserveContact.hs b/gen/Amazonka/GroundStation/ReserveContact.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/ReserveContact.hs
@@ -0,0 +1,199 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.ReserveContact
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Reserves a contact using specified parameters.
+module Amazonka.GroundStation.ReserveContact
+  ( -- * Creating a Request
+    ReserveContact (..),
+    newReserveContact,
+
+    -- * Request Lenses
+    reserveContact_tags,
+    reserveContact_endTime,
+    reserveContact_groundStation,
+    reserveContact_missionProfileArn,
+    reserveContact_satelliteArn,
+    reserveContact_startTime,
+
+    -- * Destructuring the Response
+    ContactIdResponse (..),
+    newContactIdResponse,
+
+    -- * Response Lenses
+    contactIdResponse_contactId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newReserveContact' smart constructor.
+data ReserveContact = ReserveContact'
+  { -- | Tags assigned to a contact.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | End time of a contact in UTC.
+    endTime :: Data.POSIX,
+    -- | Name of a ground station.
+    groundStation :: Prelude.Text,
+    -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Text,
+    -- | ARN of a satellite
+    satelliteArn :: Prelude.Text,
+    -- | Start time of a contact in UTC.
+    startTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReserveContact' 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', 'reserveContact_tags' - Tags assigned to a contact.
+--
+-- 'endTime', 'reserveContact_endTime' - End time of a contact in UTC.
+--
+-- 'groundStation', 'reserveContact_groundStation' - Name of a ground station.
+--
+-- 'missionProfileArn', 'reserveContact_missionProfileArn' - ARN of a mission profile.
+--
+-- 'satelliteArn', 'reserveContact_satelliteArn' - ARN of a satellite
+--
+-- 'startTime', 'reserveContact_startTime' - Start time of a contact in UTC.
+newReserveContact ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'groundStation'
+  Prelude.Text ->
+  -- | 'missionProfileArn'
+  Prelude.Text ->
+  -- | 'satelliteArn'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  ReserveContact
+newReserveContact
+  pEndTime_
+  pGroundStation_
+  pMissionProfileArn_
+  pSatelliteArn_
+  pStartTime_ =
+    ReserveContact'
+      { tags = Prelude.Nothing,
+        endTime = Data._Time Lens.# pEndTime_,
+        groundStation = pGroundStation_,
+        missionProfileArn = pMissionProfileArn_,
+        satelliteArn = pSatelliteArn_,
+        startTime = Data._Time Lens.# pStartTime_
+      }
+
+-- | Tags assigned to a contact.
+reserveContact_tags :: Lens.Lens' ReserveContact (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+reserveContact_tags = Lens.lens (\ReserveContact' {tags} -> tags) (\s@ReserveContact' {} a -> s {tags = a} :: ReserveContact) Prelude.. Lens.mapping Lens.coerced
+
+-- | End time of a contact in UTC.
+reserveContact_endTime :: Lens.Lens' ReserveContact Prelude.UTCTime
+reserveContact_endTime = Lens.lens (\ReserveContact' {endTime} -> endTime) (\s@ReserveContact' {} a -> s {endTime = a} :: ReserveContact) Prelude.. Data._Time
+
+-- | Name of a ground station.
+reserveContact_groundStation :: Lens.Lens' ReserveContact Prelude.Text
+reserveContact_groundStation = Lens.lens (\ReserveContact' {groundStation} -> groundStation) (\s@ReserveContact' {} a -> s {groundStation = a} :: ReserveContact)
+
+-- | ARN of a mission profile.
+reserveContact_missionProfileArn :: Lens.Lens' ReserveContact Prelude.Text
+reserveContact_missionProfileArn = Lens.lens (\ReserveContact' {missionProfileArn} -> missionProfileArn) (\s@ReserveContact' {} a -> s {missionProfileArn = a} :: ReserveContact)
+
+-- | ARN of a satellite
+reserveContact_satelliteArn :: Lens.Lens' ReserveContact Prelude.Text
+reserveContact_satelliteArn = Lens.lens (\ReserveContact' {satelliteArn} -> satelliteArn) (\s@ReserveContact' {} a -> s {satelliteArn = a} :: ReserveContact)
+
+-- | Start time of a contact in UTC.
+reserveContact_startTime :: Lens.Lens' ReserveContact Prelude.UTCTime
+reserveContact_startTime = Lens.lens (\ReserveContact' {startTime} -> startTime) (\s@ReserveContact' {} a -> s {startTime = a} :: ReserveContact) Prelude.. Data._Time
+
+instance Core.AWSRequest ReserveContact where
+  type AWSResponse ReserveContact = ContactIdResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable ReserveContact where
+  hashWithSalt _salt ReserveContact' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` groundStation
+      `Prelude.hashWithSalt` missionProfileArn
+      `Prelude.hashWithSalt` satelliteArn
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData ReserveContact where
+  rnf ReserveContact' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf groundStation
+      `Prelude.seq` Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders ReserveContact where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ReserveContact where
+  toJSON ReserveContact' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("endTime" Data..= endTime),
+            Prelude.Just ("groundStation" Data..= groundStation),
+            Prelude.Just
+              ("missionProfileArn" Data..= missionProfileArn),
+            Prelude.Just ("satelliteArn" Data..= satelliteArn),
+            Prelude.Just ("startTime" Data..= startTime)
+          ]
+      )
+
+instance Data.ToPath ReserveContact where
+  toPath = Prelude.const "/contact"
+
+instance Data.ToQuery ReserveContact where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/TagResource.hs b/gen/Amazonka/GroundStation/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/TagResource.hs
@@ -0,0 +1,167 @@
+{-# 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.GroundStation.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)
+--
+-- Assigns a tag to a resource.
+module Amazonka.GroundStation.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | ARN of a resource tag.
+    resourceArn :: Prelude.Text,
+    -- | Tags assigned to a 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' - ARN of a resource tag.
+--
+-- 'tags', 'tagResource_tags' - Tags assigned to a resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | ARN of a resource tag.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | Tags assigned to a 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/GroundStation/Types.hs b/gen/Amazonka/GroundStation/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types.hs
@@ -0,0 +1,548 @@
+{-# 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.GroundStation.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.GroundStation.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _DependencyException,
+    _InvalidParameterException,
+    _ResourceLimitExceededException,
+    _ResourceNotFoundException,
+
+    -- * AngleUnits
+    AngleUnits (..),
+
+    -- * BandwidthUnits
+    BandwidthUnits (..),
+
+    -- * ConfigCapabilityType
+    ConfigCapabilityType (..),
+
+    -- * ContactStatus
+    ContactStatus (..),
+
+    -- * Criticality
+    Criticality (..),
+
+    -- * EirpUnits
+    EirpUnits (..),
+
+    -- * EndpointStatus
+    EndpointStatus (..),
+
+    -- * EphemerisInvalidReason
+    EphemerisInvalidReason (..),
+
+    -- * EphemerisSource
+    EphemerisSource (..),
+
+    -- * EphemerisStatus
+    EphemerisStatus (..),
+
+    -- * FrequencyUnits
+    FrequencyUnits (..),
+
+    -- * Polarization
+    Polarization (..),
+
+    -- * AntennaDemodDecodeDetails
+    AntennaDemodDecodeDetails (..),
+    newAntennaDemodDecodeDetails,
+    antennaDemodDecodeDetails_outputNode,
+
+    -- * AntennaDownlinkConfig
+    AntennaDownlinkConfig (..),
+    newAntennaDownlinkConfig,
+    antennaDownlinkConfig_spectrumConfig,
+
+    -- * AntennaDownlinkDemodDecodeConfig
+    AntennaDownlinkDemodDecodeConfig (..),
+    newAntennaDownlinkDemodDecodeConfig,
+    antennaDownlinkDemodDecodeConfig_decodeConfig,
+    antennaDownlinkDemodDecodeConfig_demodulationConfig,
+    antennaDownlinkDemodDecodeConfig_spectrumConfig,
+
+    -- * AntennaUplinkConfig
+    AntennaUplinkConfig (..),
+    newAntennaUplinkConfig,
+    antennaUplinkConfig_transmitDisabled,
+    antennaUplinkConfig_spectrumConfig,
+    antennaUplinkConfig_targetEirp,
+
+    -- * ConfigDetails
+    ConfigDetails (..),
+    newConfigDetails,
+    configDetails_antennaDemodDecodeDetails,
+    configDetails_endpointDetails,
+    configDetails_s3RecordingDetails,
+
+    -- * ConfigIdResponse
+    ConfigIdResponse (..),
+    newConfigIdResponse,
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+
+    -- * ConfigListItem
+    ConfigListItem (..),
+    newConfigListItem,
+    configListItem_configArn,
+    configListItem_configId,
+    configListItem_configType,
+    configListItem_name,
+
+    -- * ConfigTypeData
+    ConfigTypeData (..),
+    newConfigTypeData,
+    configTypeData_antennaDownlinkConfig,
+    configTypeData_antennaDownlinkDemodDecodeConfig,
+    configTypeData_antennaUplinkConfig,
+    configTypeData_dataflowEndpointConfig,
+    configTypeData_s3RecordingConfig,
+    configTypeData_trackingConfig,
+    configTypeData_uplinkEchoConfig,
+
+    -- * ContactData
+    ContactData (..),
+    newContactData,
+    contactData_contactId,
+    contactData_contactStatus,
+    contactData_endTime,
+    contactData_errorMessage,
+    contactData_groundStation,
+    contactData_maximumElevation,
+    contactData_missionProfileArn,
+    contactData_postPassEndTime,
+    contactData_prePassStartTime,
+    contactData_region,
+    contactData_satelliteArn,
+    contactData_startTime,
+    contactData_tags,
+
+    -- * ContactIdResponse
+    ContactIdResponse (..),
+    newContactIdResponse,
+    contactIdResponse_contactId,
+
+    -- * DataflowDetail
+    DataflowDetail (..),
+    newDataflowDetail,
+    dataflowDetail_destination,
+    dataflowDetail_errorMessage,
+    dataflowDetail_source,
+
+    -- * DataflowEndpoint
+    DataflowEndpoint (..),
+    newDataflowEndpoint,
+    dataflowEndpoint_address,
+    dataflowEndpoint_mtu,
+    dataflowEndpoint_name,
+    dataflowEndpoint_status,
+
+    -- * DataflowEndpointConfig
+    DataflowEndpointConfig (..),
+    newDataflowEndpointConfig,
+    dataflowEndpointConfig_dataflowEndpointRegion,
+    dataflowEndpointConfig_dataflowEndpointName,
+
+    -- * DataflowEndpointGroupIdResponse
+    DataflowEndpointGroupIdResponse (..),
+    newDataflowEndpointGroupIdResponse,
+    dataflowEndpointGroupIdResponse_dataflowEndpointGroupId,
+
+    -- * DataflowEndpointListItem
+    DataflowEndpointListItem (..),
+    newDataflowEndpointListItem,
+    dataflowEndpointListItem_dataflowEndpointGroupArn,
+    dataflowEndpointListItem_dataflowEndpointGroupId,
+
+    -- * DecodeConfig
+    DecodeConfig (..),
+    newDecodeConfig,
+    decodeConfig_unvalidatedJSON,
+
+    -- * DemodulationConfig
+    DemodulationConfig (..),
+    newDemodulationConfig,
+    demodulationConfig_unvalidatedJSON,
+
+    -- * Destination
+    Destination (..),
+    newDestination,
+    destination_configDetails,
+    destination_configId,
+    destination_configType,
+    destination_dataflowDestinationRegion,
+
+    -- * Eirp
+    Eirp (..),
+    newEirp,
+    eirp_units,
+    eirp_value,
+
+    -- * Elevation
+    Elevation (..),
+    newElevation,
+    elevation_unit,
+    elevation_value,
+
+    -- * EndpointDetails
+    EndpointDetails (..),
+    newEndpointDetails,
+    endpointDetails_endpoint,
+    endpointDetails_securityDetails,
+
+    -- * EphemerisData
+    EphemerisData (..),
+    newEphemerisData,
+    ephemerisData_oem,
+    ephemerisData_tle,
+
+    -- * EphemerisDescription
+    EphemerisDescription (..),
+    newEphemerisDescription,
+    ephemerisDescription_ephemerisData,
+    ephemerisDescription_sourceS3Object,
+
+    -- * EphemerisIdResponse
+    EphemerisIdResponse (..),
+    newEphemerisIdResponse,
+    ephemerisIdResponse_ephemerisId,
+
+    -- * EphemerisItem
+    EphemerisItem (..),
+    newEphemerisItem,
+    ephemerisItem_creationTime,
+    ephemerisItem_enabled,
+    ephemerisItem_ephemerisId,
+    ephemerisItem_name,
+    ephemerisItem_priority,
+    ephemerisItem_sourceS3Object,
+    ephemerisItem_status,
+
+    -- * EphemerisMetaData
+    EphemerisMetaData (..),
+    newEphemerisMetaData,
+    ephemerisMetaData_ephemerisId,
+    ephemerisMetaData_epoch,
+    ephemerisMetaData_name,
+    ephemerisMetaData_source,
+
+    -- * EphemerisTypeDescription
+    EphemerisTypeDescription (..),
+    newEphemerisTypeDescription,
+    ephemerisTypeDescription_oem,
+    ephemerisTypeDescription_tle,
+
+    -- * Frequency
+    Frequency (..),
+    newFrequency,
+    frequency_units,
+    frequency_value,
+
+    -- * FrequencyBandwidth
+    FrequencyBandwidth (..),
+    newFrequencyBandwidth,
+    frequencyBandwidth_units,
+    frequencyBandwidth_value,
+
+    -- * GroundStationData
+    GroundStationData (..),
+    newGroundStationData,
+    groundStationData_groundStationId,
+    groundStationData_groundStationName,
+    groundStationData_region,
+
+    -- * MissionProfileIdResponse
+    MissionProfileIdResponse (..),
+    newMissionProfileIdResponse,
+    missionProfileIdResponse_missionProfileId,
+
+    -- * MissionProfileListItem
+    MissionProfileListItem (..),
+    newMissionProfileListItem,
+    missionProfileListItem_missionProfileArn,
+    missionProfileListItem_missionProfileId,
+    missionProfileListItem_name,
+    missionProfileListItem_region,
+
+    -- * OEMEphemeris
+    OEMEphemeris (..),
+    newOEMEphemeris,
+    oEMEphemeris_oemData,
+    oEMEphemeris_s3Object,
+
+    -- * S3Object
+    S3Object (..),
+    newS3Object,
+    s3Object_bucket,
+    s3Object_key,
+    s3Object_version,
+
+    -- * S3RecordingConfig
+    S3RecordingConfig (..),
+    newS3RecordingConfig,
+    s3RecordingConfig_prefix,
+    s3RecordingConfig_bucketArn,
+    s3RecordingConfig_roleArn,
+
+    -- * S3RecordingDetails
+    S3RecordingDetails (..),
+    newS3RecordingDetails,
+    s3RecordingDetails_bucketArn,
+    s3RecordingDetails_keyTemplate,
+
+    -- * SatelliteListItem
+    SatelliteListItem (..),
+    newSatelliteListItem,
+    satelliteListItem_currentEphemeris,
+    satelliteListItem_groundStations,
+    satelliteListItem_noradSatelliteID,
+    satelliteListItem_satelliteArn,
+    satelliteListItem_satelliteId,
+
+    -- * SecurityDetails
+    SecurityDetails (..),
+    newSecurityDetails,
+    securityDetails_roleArn,
+    securityDetails_securityGroupIds,
+    securityDetails_subnetIds,
+
+    -- * SocketAddress
+    SocketAddress (..),
+    newSocketAddress,
+    socketAddress_name,
+    socketAddress_port,
+
+    -- * Source
+    Source (..),
+    newSource,
+    source_configDetails,
+    source_configId,
+    source_configType,
+    source_dataflowSourceRegion,
+
+    -- * SpectrumConfig
+    SpectrumConfig (..),
+    newSpectrumConfig,
+    spectrumConfig_polarization,
+    spectrumConfig_bandwidth,
+    spectrumConfig_centerFrequency,
+
+    -- * TLEData
+    TLEData (..),
+    newTLEData,
+    tLEData_tleLine1,
+    tLEData_tleLine2,
+    tLEData_validTimeRange,
+
+    -- * TLEEphemeris
+    TLEEphemeris (..),
+    newTLEEphemeris,
+    tLEEphemeris_s3Object,
+    tLEEphemeris_tleData,
+
+    -- * TimeRange
+    TimeRange (..),
+    newTimeRange,
+    timeRange_endTime,
+    timeRange_startTime,
+
+    -- * TrackingConfig
+    TrackingConfig (..),
+    newTrackingConfig,
+    trackingConfig_autotrack,
+
+    -- * UplinkEchoConfig
+    UplinkEchoConfig (..),
+    newUplinkEchoConfig,
+    uplinkEchoConfig_antennaUplinkConfigArn,
+    uplinkEchoConfig_enabled,
+
+    -- * UplinkSpectrumConfig
+    UplinkSpectrumConfig (..),
+    newUplinkSpectrumConfig,
+    uplinkSpectrumConfig_polarization,
+    uplinkSpectrumConfig_centerFrequency,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.GroundStation.Types.AngleUnits
+import Amazonka.GroundStation.Types.AntennaDemodDecodeDetails
+import Amazonka.GroundStation.Types.AntennaDownlinkConfig
+import Amazonka.GroundStation.Types.AntennaDownlinkDemodDecodeConfig
+import Amazonka.GroundStation.Types.AntennaUplinkConfig
+import Amazonka.GroundStation.Types.BandwidthUnits
+import Amazonka.GroundStation.Types.ConfigCapabilityType
+import Amazonka.GroundStation.Types.ConfigDetails
+import Amazonka.GroundStation.Types.ConfigIdResponse
+import Amazonka.GroundStation.Types.ConfigListItem
+import Amazonka.GroundStation.Types.ConfigTypeData
+import Amazonka.GroundStation.Types.ContactData
+import Amazonka.GroundStation.Types.ContactIdResponse
+import Amazonka.GroundStation.Types.ContactStatus
+import Amazonka.GroundStation.Types.Criticality
+import Amazonka.GroundStation.Types.DataflowDetail
+import Amazonka.GroundStation.Types.DataflowEndpoint
+import Amazonka.GroundStation.Types.DataflowEndpointConfig
+import Amazonka.GroundStation.Types.DataflowEndpointGroupIdResponse
+import Amazonka.GroundStation.Types.DataflowEndpointListItem
+import Amazonka.GroundStation.Types.DecodeConfig
+import Amazonka.GroundStation.Types.DemodulationConfig
+import Amazonka.GroundStation.Types.Destination
+import Amazonka.GroundStation.Types.Eirp
+import Amazonka.GroundStation.Types.EirpUnits
+import Amazonka.GroundStation.Types.Elevation
+import Amazonka.GroundStation.Types.EndpointDetails
+import Amazonka.GroundStation.Types.EndpointStatus
+import Amazonka.GroundStation.Types.EphemerisData
+import Amazonka.GroundStation.Types.EphemerisDescription
+import Amazonka.GroundStation.Types.EphemerisIdResponse
+import Amazonka.GroundStation.Types.EphemerisInvalidReason
+import Amazonka.GroundStation.Types.EphemerisItem
+import Amazonka.GroundStation.Types.EphemerisMetaData
+import Amazonka.GroundStation.Types.EphemerisSource
+import Amazonka.GroundStation.Types.EphemerisStatus
+import Amazonka.GroundStation.Types.EphemerisTypeDescription
+import Amazonka.GroundStation.Types.Frequency
+import Amazonka.GroundStation.Types.FrequencyBandwidth
+import Amazonka.GroundStation.Types.FrequencyUnits
+import Amazonka.GroundStation.Types.GroundStationData
+import Amazonka.GroundStation.Types.MissionProfileIdResponse
+import Amazonka.GroundStation.Types.MissionProfileListItem
+import Amazonka.GroundStation.Types.OEMEphemeris
+import Amazonka.GroundStation.Types.Polarization
+import Amazonka.GroundStation.Types.S3Object
+import Amazonka.GroundStation.Types.S3RecordingConfig
+import Amazonka.GroundStation.Types.S3RecordingDetails
+import Amazonka.GroundStation.Types.SatelliteListItem
+import Amazonka.GroundStation.Types.SecurityDetails
+import Amazonka.GroundStation.Types.SocketAddress
+import Amazonka.GroundStation.Types.Source
+import Amazonka.GroundStation.Types.SpectrumConfig
+import Amazonka.GroundStation.Types.TLEData
+import Amazonka.GroundStation.Types.TLEEphemeris
+import Amazonka.GroundStation.Types.TimeRange
+import Amazonka.GroundStation.Types.TrackingConfig
+import Amazonka.GroundStation.Types.UplinkEchoConfig
+import Amazonka.GroundStation.Types.UplinkSpectrumConfig
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2019-05-23@ of the Amazon Ground Station SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "GroundStation",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "groundstation",
+      Core.signingName = "groundstation",
+      Core.version = "2019-05-23",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "GroundStation",
+      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
+
+-- | Dependency encountered an error.
+_DependencyException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_DependencyException =
+  Core._MatchServiceError
+    defaultService
+    "DependencyException"
+    Prelude.. Core.hasStatus 531
+
+-- | One or more parameters are not valid.
+_InvalidParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterException"
+    Prelude.. Core.hasStatus 431
+
+-- | Account limits for this resource have been exceeded.
+_ResourceLimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceLimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceLimitExceededException"
+    Prelude.. Core.hasStatus 429
+
+-- | Resource was not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 434
diff --git a/gen/Amazonka/GroundStation/Types/AngleUnits.hs b/gen/Amazonka/GroundStation/Types/AngleUnits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/AngleUnits.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.AngleUnits
+-- 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.GroundStation.Types.AngleUnits
+  ( AngleUnits
+      ( ..,
+        AngleUnits_DEGREE_ANGLE,
+        AngleUnits_RADIAN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AngleUnits = AngleUnits'
+  { fromAngleUnits ::
+      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 AngleUnits_DEGREE_ANGLE :: AngleUnits
+pattern AngleUnits_DEGREE_ANGLE = AngleUnits' "DEGREE_ANGLE"
+
+pattern AngleUnits_RADIAN :: AngleUnits
+pattern AngleUnits_RADIAN = AngleUnits' "RADIAN"
+
+{-# COMPLETE
+  AngleUnits_DEGREE_ANGLE,
+  AngleUnits_RADIAN,
+  AngleUnits'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/AntennaDemodDecodeDetails.hs b/gen/Amazonka/GroundStation/Types/AntennaDemodDecodeDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/AntennaDemodDecodeDetails.hs
@@ -0,0 +1,72 @@
+{-# 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.GroundStation.Types.AntennaDemodDecodeDetails
+-- 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.GroundStation.Types.AntennaDemodDecodeDetails 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
+
+-- | Details about an antenna demod decode @Config@ used in a contact.
+--
+-- /See:/ 'newAntennaDemodDecodeDetails' smart constructor.
+data AntennaDemodDecodeDetails = AntennaDemodDecodeDetails'
+  { -- | Name of an antenna demod decode output node used in a contact.
+    outputNode :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AntennaDemodDecodeDetails' 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:
+--
+-- 'outputNode', 'antennaDemodDecodeDetails_outputNode' - Name of an antenna demod decode output node used in a contact.
+newAntennaDemodDecodeDetails ::
+  AntennaDemodDecodeDetails
+newAntennaDemodDecodeDetails =
+  AntennaDemodDecodeDetails'
+    { outputNode =
+        Prelude.Nothing
+    }
+
+-- | Name of an antenna demod decode output node used in a contact.
+antennaDemodDecodeDetails_outputNode :: Lens.Lens' AntennaDemodDecodeDetails (Prelude.Maybe Prelude.Text)
+antennaDemodDecodeDetails_outputNode = Lens.lens (\AntennaDemodDecodeDetails' {outputNode} -> outputNode) (\s@AntennaDemodDecodeDetails' {} a -> s {outputNode = a} :: AntennaDemodDecodeDetails)
+
+instance Data.FromJSON AntennaDemodDecodeDetails where
+  parseJSON =
+    Data.withObject
+      "AntennaDemodDecodeDetails"
+      ( \x ->
+          AntennaDemodDecodeDetails'
+            Prelude.<$> (x Data..:? "outputNode")
+      )
+
+instance Prelude.Hashable AntennaDemodDecodeDetails where
+  hashWithSalt _salt AntennaDemodDecodeDetails' {..} =
+    _salt `Prelude.hashWithSalt` outputNode
+
+instance Prelude.NFData AntennaDemodDecodeDetails where
+  rnf AntennaDemodDecodeDetails' {..} =
+    Prelude.rnf outputNode
diff --git a/gen/Amazonka/GroundStation/Types/AntennaDownlinkConfig.hs b/gen/Amazonka/GroundStation/Types/AntennaDownlinkConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/AntennaDownlinkConfig.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.AntennaDownlinkConfig
+-- 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.GroundStation.Types.AntennaDownlinkConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.SpectrumConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about how AWS Ground Station should configure an antenna for
+-- downlink during a contact.
+--
+-- /See:/ 'newAntennaDownlinkConfig' smart constructor.
+data AntennaDownlinkConfig = AntennaDownlinkConfig'
+  { -- | Object that describes a spectral @Config@.
+    spectrumConfig :: SpectrumConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AntennaDownlinkConfig' 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:
+--
+-- 'spectrumConfig', 'antennaDownlinkConfig_spectrumConfig' - Object that describes a spectral @Config@.
+newAntennaDownlinkConfig ::
+  -- | 'spectrumConfig'
+  SpectrumConfig ->
+  AntennaDownlinkConfig
+newAntennaDownlinkConfig pSpectrumConfig_ =
+  AntennaDownlinkConfig'
+    { spectrumConfig =
+        pSpectrumConfig_
+    }
+
+-- | Object that describes a spectral @Config@.
+antennaDownlinkConfig_spectrumConfig :: Lens.Lens' AntennaDownlinkConfig SpectrumConfig
+antennaDownlinkConfig_spectrumConfig = Lens.lens (\AntennaDownlinkConfig' {spectrumConfig} -> spectrumConfig) (\s@AntennaDownlinkConfig' {} a -> s {spectrumConfig = a} :: AntennaDownlinkConfig)
+
+instance Data.FromJSON AntennaDownlinkConfig where
+  parseJSON =
+    Data.withObject
+      "AntennaDownlinkConfig"
+      ( \x ->
+          AntennaDownlinkConfig'
+            Prelude.<$> (x Data..: "spectrumConfig")
+      )
+
+instance Prelude.Hashable AntennaDownlinkConfig where
+  hashWithSalt _salt AntennaDownlinkConfig' {..} =
+    _salt `Prelude.hashWithSalt` spectrumConfig
+
+instance Prelude.NFData AntennaDownlinkConfig where
+  rnf AntennaDownlinkConfig' {..} =
+    Prelude.rnf spectrumConfig
+
+instance Data.ToJSON AntennaDownlinkConfig where
+  toJSON AntennaDownlinkConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("spectrumConfig" Data..= spectrumConfig)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/AntennaDownlinkDemodDecodeConfig.hs b/gen/Amazonka/GroundStation/Types/AntennaDownlinkDemodDecodeConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/AntennaDownlinkDemodDecodeConfig.hs
@@ -0,0 +1,133 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.AntennaDownlinkDemodDecodeConfig
+-- 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.GroundStation.Types.AntennaDownlinkDemodDecodeConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.DecodeConfig
+import Amazonka.GroundStation.Types.DemodulationConfig
+import Amazonka.GroundStation.Types.SpectrumConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about how AWS Ground Station should conﬁgure an antenna for
+-- downlink demod decode during a contact.
+--
+-- /See:/ 'newAntennaDownlinkDemodDecodeConfig' smart constructor.
+data AntennaDownlinkDemodDecodeConfig = AntennaDownlinkDemodDecodeConfig'
+  { -- | Information about the decode @Config@.
+    decodeConfig :: DecodeConfig,
+    -- | Information about the demodulation @Config@.
+    demodulationConfig :: DemodulationConfig,
+    -- | Information about the spectral @Config@.
+    spectrumConfig :: SpectrumConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AntennaDownlinkDemodDecodeConfig' 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:
+--
+-- 'decodeConfig', 'antennaDownlinkDemodDecodeConfig_decodeConfig' - Information about the decode @Config@.
+--
+-- 'demodulationConfig', 'antennaDownlinkDemodDecodeConfig_demodulationConfig' - Information about the demodulation @Config@.
+--
+-- 'spectrumConfig', 'antennaDownlinkDemodDecodeConfig_spectrumConfig' - Information about the spectral @Config@.
+newAntennaDownlinkDemodDecodeConfig ::
+  -- | 'decodeConfig'
+  DecodeConfig ->
+  -- | 'demodulationConfig'
+  DemodulationConfig ->
+  -- | 'spectrumConfig'
+  SpectrumConfig ->
+  AntennaDownlinkDemodDecodeConfig
+newAntennaDownlinkDemodDecodeConfig
+  pDecodeConfig_
+  pDemodulationConfig_
+  pSpectrumConfig_ =
+    AntennaDownlinkDemodDecodeConfig'
+      { decodeConfig =
+          pDecodeConfig_,
+        demodulationConfig = pDemodulationConfig_,
+        spectrumConfig = pSpectrumConfig_
+      }
+
+-- | Information about the decode @Config@.
+antennaDownlinkDemodDecodeConfig_decodeConfig :: Lens.Lens' AntennaDownlinkDemodDecodeConfig DecodeConfig
+antennaDownlinkDemodDecodeConfig_decodeConfig = Lens.lens (\AntennaDownlinkDemodDecodeConfig' {decodeConfig} -> decodeConfig) (\s@AntennaDownlinkDemodDecodeConfig' {} a -> s {decodeConfig = a} :: AntennaDownlinkDemodDecodeConfig)
+
+-- | Information about the demodulation @Config@.
+antennaDownlinkDemodDecodeConfig_demodulationConfig :: Lens.Lens' AntennaDownlinkDemodDecodeConfig DemodulationConfig
+antennaDownlinkDemodDecodeConfig_demodulationConfig = Lens.lens (\AntennaDownlinkDemodDecodeConfig' {demodulationConfig} -> demodulationConfig) (\s@AntennaDownlinkDemodDecodeConfig' {} a -> s {demodulationConfig = a} :: AntennaDownlinkDemodDecodeConfig)
+
+-- | Information about the spectral @Config@.
+antennaDownlinkDemodDecodeConfig_spectrumConfig :: Lens.Lens' AntennaDownlinkDemodDecodeConfig SpectrumConfig
+antennaDownlinkDemodDecodeConfig_spectrumConfig = Lens.lens (\AntennaDownlinkDemodDecodeConfig' {spectrumConfig} -> spectrumConfig) (\s@AntennaDownlinkDemodDecodeConfig' {} a -> s {spectrumConfig = a} :: AntennaDownlinkDemodDecodeConfig)
+
+instance
+  Data.FromJSON
+    AntennaDownlinkDemodDecodeConfig
+  where
+  parseJSON =
+    Data.withObject
+      "AntennaDownlinkDemodDecodeConfig"
+      ( \x ->
+          AntennaDownlinkDemodDecodeConfig'
+            Prelude.<$> (x Data..: "decodeConfig")
+            Prelude.<*> (x Data..: "demodulationConfig")
+            Prelude.<*> (x Data..: "spectrumConfig")
+      )
+
+instance
+  Prelude.Hashable
+    AntennaDownlinkDemodDecodeConfig
+  where
+  hashWithSalt
+    _salt
+    AntennaDownlinkDemodDecodeConfig' {..} =
+      _salt
+        `Prelude.hashWithSalt` decodeConfig
+        `Prelude.hashWithSalt` demodulationConfig
+        `Prelude.hashWithSalt` spectrumConfig
+
+instance
+  Prelude.NFData
+    AntennaDownlinkDemodDecodeConfig
+  where
+  rnf AntennaDownlinkDemodDecodeConfig' {..} =
+    Prelude.rnf decodeConfig
+      `Prelude.seq` Prelude.rnf demodulationConfig
+      `Prelude.seq` Prelude.rnf spectrumConfig
+
+instance Data.ToJSON AntennaDownlinkDemodDecodeConfig where
+  toJSON AntennaDownlinkDemodDecodeConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("decodeConfig" Data..= decodeConfig),
+            Prelude.Just
+              ("demodulationConfig" Data..= demodulationConfig),
+            Prelude.Just
+              ("spectrumConfig" Data..= spectrumConfig)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/AntennaUplinkConfig.hs b/gen/Amazonka/GroundStation/Types/AntennaUplinkConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/AntennaUplinkConfig.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.AntennaUplinkConfig
+-- 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.GroundStation.Types.AntennaUplinkConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.Eirp
+import Amazonka.GroundStation.Types.UplinkSpectrumConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the uplink @Config@ of an antenna.
+--
+-- /See:/ 'newAntennaUplinkConfig' smart constructor.
+data AntennaUplinkConfig = AntennaUplinkConfig'
+  { -- | Whether or not uplink transmit is disabled.
+    transmitDisabled :: Prelude.Maybe Prelude.Bool,
+    -- | Information about the uplink spectral @Config@.
+    spectrumConfig :: UplinkSpectrumConfig,
+    -- | EIRP of the target.
+    targetEirp :: Eirp
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AntennaUplinkConfig' 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:
+--
+-- 'transmitDisabled', 'antennaUplinkConfig_transmitDisabled' - Whether or not uplink transmit is disabled.
+--
+-- 'spectrumConfig', 'antennaUplinkConfig_spectrumConfig' - Information about the uplink spectral @Config@.
+--
+-- 'targetEirp', 'antennaUplinkConfig_targetEirp' - EIRP of the target.
+newAntennaUplinkConfig ::
+  -- | 'spectrumConfig'
+  UplinkSpectrumConfig ->
+  -- | 'targetEirp'
+  Eirp ->
+  AntennaUplinkConfig
+newAntennaUplinkConfig pSpectrumConfig_ pTargetEirp_ =
+  AntennaUplinkConfig'
+    { transmitDisabled =
+        Prelude.Nothing,
+      spectrumConfig = pSpectrumConfig_,
+      targetEirp = pTargetEirp_
+    }
+
+-- | Whether or not uplink transmit is disabled.
+antennaUplinkConfig_transmitDisabled :: Lens.Lens' AntennaUplinkConfig (Prelude.Maybe Prelude.Bool)
+antennaUplinkConfig_transmitDisabled = Lens.lens (\AntennaUplinkConfig' {transmitDisabled} -> transmitDisabled) (\s@AntennaUplinkConfig' {} a -> s {transmitDisabled = a} :: AntennaUplinkConfig)
+
+-- | Information about the uplink spectral @Config@.
+antennaUplinkConfig_spectrumConfig :: Lens.Lens' AntennaUplinkConfig UplinkSpectrumConfig
+antennaUplinkConfig_spectrumConfig = Lens.lens (\AntennaUplinkConfig' {spectrumConfig} -> spectrumConfig) (\s@AntennaUplinkConfig' {} a -> s {spectrumConfig = a} :: AntennaUplinkConfig)
+
+-- | EIRP of the target.
+antennaUplinkConfig_targetEirp :: Lens.Lens' AntennaUplinkConfig Eirp
+antennaUplinkConfig_targetEirp = Lens.lens (\AntennaUplinkConfig' {targetEirp} -> targetEirp) (\s@AntennaUplinkConfig' {} a -> s {targetEirp = a} :: AntennaUplinkConfig)
+
+instance Data.FromJSON AntennaUplinkConfig where
+  parseJSON =
+    Data.withObject
+      "AntennaUplinkConfig"
+      ( \x ->
+          AntennaUplinkConfig'
+            Prelude.<$> (x Data..:? "transmitDisabled")
+            Prelude.<*> (x Data..: "spectrumConfig")
+            Prelude.<*> (x Data..: "targetEirp")
+      )
+
+instance Prelude.Hashable AntennaUplinkConfig where
+  hashWithSalt _salt AntennaUplinkConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` transmitDisabled
+      `Prelude.hashWithSalt` spectrumConfig
+      `Prelude.hashWithSalt` targetEirp
+
+instance Prelude.NFData AntennaUplinkConfig where
+  rnf AntennaUplinkConfig' {..} =
+    Prelude.rnf transmitDisabled
+      `Prelude.seq` Prelude.rnf spectrumConfig
+      `Prelude.seq` Prelude.rnf targetEirp
+
+instance Data.ToJSON AntennaUplinkConfig where
+  toJSON AntennaUplinkConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("transmitDisabled" Data..=)
+              Prelude.<$> transmitDisabled,
+            Prelude.Just
+              ("spectrumConfig" Data..= spectrumConfig),
+            Prelude.Just ("targetEirp" Data..= targetEirp)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/BandwidthUnits.hs b/gen/Amazonka/GroundStation/Types/BandwidthUnits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/BandwidthUnits.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.BandwidthUnits
+-- 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.GroundStation.Types.BandwidthUnits
+  ( BandwidthUnits
+      ( ..,
+        BandwidthUnits_GHz,
+        BandwidthUnits_KHz,
+        BandwidthUnits_MHz
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BandwidthUnits = BandwidthUnits'
+  { fromBandwidthUnits ::
+      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 BandwidthUnits_GHz :: BandwidthUnits
+pattern BandwidthUnits_GHz = BandwidthUnits' "GHz"
+
+pattern BandwidthUnits_KHz :: BandwidthUnits
+pattern BandwidthUnits_KHz = BandwidthUnits' "kHz"
+
+pattern BandwidthUnits_MHz :: BandwidthUnits
+pattern BandwidthUnits_MHz = BandwidthUnits' "MHz"
+
+{-# COMPLETE
+  BandwidthUnits_GHz,
+  BandwidthUnits_KHz,
+  BandwidthUnits_MHz,
+  BandwidthUnits'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/ConfigCapabilityType.hs b/gen/Amazonka/GroundStation/Types/ConfigCapabilityType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ConfigCapabilityType.hs
@@ -0,0 +1,96 @@
+{-# 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.GroundStation.Types.ConfigCapabilityType
+-- 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.GroundStation.Types.ConfigCapabilityType
+  ( ConfigCapabilityType
+      ( ..,
+        ConfigCapabilityType_Antenna_downlink,
+        ConfigCapabilityType_Antenna_downlink_demod_decode,
+        ConfigCapabilityType_Antenna_uplink,
+        ConfigCapabilityType_Dataflow_endpoint,
+        ConfigCapabilityType_S3_recording,
+        ConfigCapabilityType_Tracking,
+        ConfigCapabilityType_Uplink_echo
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ConfigCapabilityType = ConfigCapabilityType'
+  { fromConfigCapabilityType ::
+      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 ConfigCapabilityType_Antenna_downlink :: ConfigCapabilityType
+pattern ConfigCapabilityType_Antenna_downlink = ConfigCapabilityType' "antenna-downlink"
+
+pattern ConfigCapabilityType_Antenna_downlink_demod_decode :: ConfigCapabilityType
+pattern ConfigCapabilityType_Antenna_downlink_demod_decode = ConfigCapabilityType' "antenna-downlink-demod-decode"
+
+pattern ConfigCapabilityType_Antenna_uplink :: ConfigCapabilityType
+pattern ConfigCapabilityType_Antenna_uplink = ConfigCapabilityType' "antenna-uplink"
+
+pattern ConfigCapabilityType_Dataflow_endpoint :: ConfigCapabilityType
+pattern ConfigCapabilityType_Dataflow_endpoint = ConfigCapabilityType' "dataflow-endpoint"
+
+pattern ConfigCapabilityType_S3_recording :: ConfigCapabilityType
+pattern ConfigCapabilityType_S3_recording = ConfigCapabilityType' "s3-recording"
+
+pattern ConfigCapabilityType_Tracking :: ConfigCapabilityType
+pattern ConfigCapabilityType_Tracking = ConfigCapabilityType' "tracking"
+
+pattern ConfigCapabilityType_Uplink_echo :: ConfigCapabilityType
+pattern ConfigCapabilityType_Uplink_echo = ConfigCapabilityType' "uplink-echo"
+
+{-# COMPLETE
+  ConfigCapabilityType_Antenna_downlink,
+  ConfigCapabilityType_Antenna_downlink_demod_decode,
+  ConfigCapabilityType_Antenna_uplink,
+  ConfigCapabilityType_Dataflow_endpoint,
+  ConfigCapabilityType_S3_recording,
+  ConfigCapabilityType_Tracking,
+  ConfigCapabilityType_Uplink_echo,
+  ConfigCapabilityType'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/ConfigDetails.hs b/gen/Amazonka/GroundStation/Types/ConfigDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ConfigDetails.hs
@@ -0,0 +1,99 @@
+{-# 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.GroundStation.Types.ConfigDetails
+-- 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.GroundStation.Types.ConfigDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.AntennaDemodDecodeDetails
+import Amazonka.GroundStation.Types.EndpointDetails
+import Amazonka.GroundStation.Types.S3RecordingDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details for certain @Config@ object types in a contact.
+--
+-- /See:/ 'newConfigDetails' smart constructor.
+data ConfigDetails = ConfigDetails'
+  { -- | Details for antenna demod decode @Config@ in a contact.
+    antennaDemodDecodeDetails :: Prelude.Maybe AntennaDemodDecodeDetails,
+    endpointDetails :: Prelude.Maybe EndpointDetails,
+    -- | Details for an S3 recording @Config@ in a contact.
+    s3RecordingDetails :: Prelude.Maybe S3RecordingDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigDetails' 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:
+--
+-- 'antennaDemodDecodeDetails', 'configDetails_antennaDemodDecodeDetails' - Details for antenna demod decode @Config@ in a contact.
+--
+-- 'endpointDetails', 'configDetails_endpointDetails' - Undocumented member.
+--
+-- 's3RecordingDetails', 'configDetails_s3RecordingDetails' - Details for an S3 recording @Config@ in a contact.
+newConfigDetails ::
+  ConfigDetails
+newConfigDetails =
+  ConfigDetails'
+    { antennaDemodDecodeDetails =
+        Prelude.Nothing,
+      endpointDetails = Prelude.Nothing,
+      s3RecordingDetails = Prelude.Nothing
+    }
+
+-- | Details for antenna demod decode @Config@ in a contact.
+configDetails_antennaDemodDecodeDetails :: Lens.Lens' ConfigDetails (Prelude.Maybe AntennaDemodDecodeDetails)
+configDetails_antennaDemodDecodeDetails = Lens.lens (\ConfigDetails' {antennaDemodDecodeDetails} -> antennaDemodDecodeDetails) (\s@ConfigDetails' {} a -> s {antennaDemodDecodeDetails = a} :: ConfigDetails)
+
+-- | Undocumented member.
+configDetails_endpointDetails :: Lens.Lens' ConfigDetails (Prelude.Maybe EndpointDetails)
+configDetails_endpointDetails = Lens.lens (\ConfigDetails' {endpointDetails} -> endpointDetails) (\s@ConfigDetails' {} a -> s {endpointDetails = a} :: ConfigDetails)
+
+-- | Details for an S3 recording @Config@ in a contact.
+configDetails_s3RecordingDetails :: Lens.Lens' ConfigDetails (Prelude.Maybe S3RecordingDetails)
+configDetails_s3RecordingDetails = Lens.lens (\ConfigDetails' {s3RecordingDetails} -> s3RecordingDetails) (\s@ConfigDetails' {} a -> s {s3RecordingDetails = a} :: ConfigDetails)
+
+instance Data.FromJSON ConfigDetails where
+  parseJSON =
+    Data.withObject
+      "ConfigDetails"
+      ( \x ->
+          ConfigDetails'
+            Prelude.<$> (x Data..:? "antennaDemodDecodeDetails")
+            Prelude.<*> (x Data..:? "endpointDetails")
+            Prelude.<*> (x Data..:? "s3RecordingDetails")
+      )
+
+instance Prelude.Hashable ConfigDetails where
+  hashWithSalt _salt ConfigDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` antennaDemodDecodeDetails
+      `Prelude.hashWithSalt` endpointDetails
+      `Prelude.hashWithSalt` s3RecordingDetails
+
+instance Prelude.NFData ConfigDetails where
+  rnf ConfigDetails' {..} =
+    Prelude.rnf antennaDemodDecodeDetails
+      `Prelude.seq` Prelude.rnf endpointDetails
+      `Prelude.seq` Prelude.rnf s3RecordingDetails
diff --git a/gen/Amazonka/GroundStation/Types/ConfigIdResponse.hs b/gen/Amazonka/GroundStation/Types/ConfigIdResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ConfigIdResponse.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.GroundStation.Types.ConfigIdResponse
+-- 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.GroundStation.Types.ConfigIdResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.ConfigCapabilityType
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newConfigIdResponse' smart constructor.
+data ConfigIdResponse = ConfigIdResponse'
+  { -- | ARN of a @Config@.
+    configArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Maybe Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: Prelude.Maybe ConfigCapabilityType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigIdResponse' 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:
+--
+-- 'configArn', 'configIdResponse_configArn' - ARN of a @Config@.
+--
+-- 'configId', 'configIdResponse_configId' - UUID of a @Config@.
+--
+-- 'configType', 'configIdResponse_configType' - Type of a @Config@.
+newConfigIdResponse ::
+  ConfigIdResponse
+newConfigIdResponse =
+  ConfigIdResponse'
+    { configArn = Prelude.Nothing,
+      configId = Prelude.Nothing,
+      configType = Prelude.Nothing
+    }
+
+-- | ARN of a @Config@.
+configIdResponse_configArn :: Lens.Lens' ConfigIdResponse (Prelude.Maybe Prelude.Text)
+configIdResponse_configArn = Lens.lens (\ConfigIdResponse' {configArn} -> configArn) (\s@ConfigIdResponse' {} a -> s {configArn = a} :: ConfigIdResponse)
+
+-- | UUID of a @Config@.
+configIdResponse_configId :: Lens.Lens' ConfigIdResponse (Prelude.Maybe Prelude.Text)
+configIdResponse_configId = Lens.lens (\ConfigIdResponse' {configId} -> configId) (\s@ConfigIdResponse' {} a -> s {configId = a} :: ConfigIdResponse)
+
+-- | Type of a @Config@.
+configIdResponse_configType :: Lens.Lens' ConfigIdResponse (Prelude.Maybe ConfigCapabilityType)
+configIdResponse_configType = Lens.lens (\ConfigIdResponse' {configType} -> configType) (\s@ConfigIdResponse' {} a -> s {configType = a} :: ConfigIdResponse)
+
+instance Data.FromJSON ConfigIdResponse where
+  parseJSON =
+    Data.withObject
+      "ConfigIdResponse"
+      ( \x ->
+          ConfigIdResponse'
+            Prelude.<$> (x Data..:? "configArn")
+            Prelude.<*> (x Data..:? "configId")
+            Prelude.<*> (x Data..:? "configType")
+      )
+
+instance Prelude.Hashable ConfigIdResponse where
+  hashWithSalt _salt ConfigIdResponse' {..} =
+    _salt
+      `Prelude.hashWithSalt` configArn
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+
+instance Prelude.NFData ConfigIdResponse where
+  rnf ConfigIdResponse' {..} =
+    Prelude.rnf configArn
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
diff --git a/gen/Amazonka/GroundStation/Types/ConfigListItem.hs b/gen/Amazonka/GroundStation/Types/ConfigListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ConfigListItem.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.ConfigListItem
+-- 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.GroundStation.Types.ConfigListItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.ConfigCapabilityType
+import qualified Amazonka.Prelude as Prelude
+
+-- | An item in a list of @Config@ objects.
+--
+-- /See:/ 'newConfigListItem' smart constructor.
+data ConfigListItem = ConfigListItem'
+  { -- | ARN of a @Config@.
+    configArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Maybe Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: Prelude.Maybe ConfigCapabilityType,
+    -- | Name of a @Config@.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigListItem' 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:
+--
+-- 'configArn', 'configListItem_configArn' - ARN of a @Config@.
+--
+-- 'configId', 'configListItem_configId' - UUID of a @Config@.
+--
+-- 'configType', 'configListItem_configType' - Type of a @Config@.
+--
+-- 'name', 'configListItem_name' - Name of a @Config@.
+newConfigListItem ::
+  ConfigListItem
+newConfigListItem =
+  ConfigListItem'
+    { configArn = Prelude.Nothing,
+      configId = Prelude.Nothing,
+      configType = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | ARN of a @Config@.
+configListItem_configArn :: Lens.Lens' ConfigListItem (Prelude.Maybe Prelude.Text)
+configListItem_configArn = Lens.lens (\ConfigListItem' {configArn} -> configArn) (\s@ConfigListItem' {} a -> s {configArn = a} :: ConfigListItem)
+
+-- | UUID of a @Config@.
+configListItem_configId :: Lens.Lens' ConfigListItem (Prelude.Maybe Prelude.Text)
+configListItem_configId = Lens.lens (\ConfigListItem' {configId} -> configId) (\s@ConfigListItem' {} a -> s {configId = a} :: ConfigListItem)
+
+-- | Type of a @Config@.
+configListItem_configType :: Lens.Lens' ConfigListItem (Prelude.Maybe ConfigCapabilityType)
+configListItem_configType = Lens.lens (\ConfigListItem' {configType} -> configType) (\s@ConfigListItem' {} a -> s {configType = a} :: ConfigListItem)
+
+-- | Name of a @Config@.
+configListItem_name :: Lens.Lens' ConfigListItem (Prelude.Maybe Prelude.Text)
+configListItem_name = Lens.lens (\ConfigListItem' {name} -> name) (\s@ConfigListItem' {} a -> s {name = a} :: ConfigListItem)
+
+instance Data.FromJSON ConfigListItem where
+  parseJSON =
+    Data.withObject
+      "ConfigListItem"
+      ( \x ->
+          ConfigListItem'
+            Prelude.<$> (x Data..:? "configArn")
+            Prelude.<*> (x Data..:? "configId")
+            Prelude.<*> (x Data..:? "configType")
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance Prelude.Hashable ConfigListItem where
+  hashWithSalt _salt ConfigListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` configArn
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ConfigListItem where
+  rnf ConfigListItem' {..} =
+    Prelude.rnf configArn
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/GroundStation/Types/ConfigTypeData.hs b/gen/Amazonka/GroundStation/Types/ConfigTypeData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ConfigTypeData.hs
@@ -0,0 +1,199 @@
+{-# 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.GroundStation.Types.ConfigTypeData
+-- 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.GroundStation.Types.ConfigTypeData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.AntennaDownlinkConfig
+import Amazonka.GroundStation.Types.AntennaDownlinkDemodDecodeConfig
+import Amazonka.GroundStation.Types.AntennaUplinkConfig
+import Amazonka.GroundStation.Types.DataflowEndpointConfig
+import Amazonka.GroundStation.Types.S3RecordingConfig
+import Amazonka.GroundStation.Types.TrackingConfig
+import Amazonka.GroundStation.Types.UplinkEchoConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object containing the parameters of a @Config@.
+--
+-- See the subtype definitions for what each type of @Config@ contains.
+--
+-- /See:/ 'newConfigTypeData' smart constructor.
+data ConfigTypeData = ConfigTypeData'
+  { -- | Information about how AWS Ground Station should configure an antenna for
+    -- downlink during a contact.
+    antennaDownlinkConfig :: Prelude.Maybe AntennaDownlinkConfig,
+    -- | Information about how AWS Ground Station should conﬁgure an antenna for
+    -- downlink demod decode during a contact.
+    antennaDownlinkDemodDecodeConfig :: Prelude.Maybe AntennaDownlinkDemodDecodeConfig,
+    -- | Information about how AWS Ground Station should conﬁgure an antenna for
+    -- uplink during a contact.
+    antennaUplinkConfig :: Prelude.Maybe AntennaUplinkConfig,
+    -- | Information about the dataflow endpoint @Config@.
+    dataflowEndpointConfig :: Prelude.Maybe DataflowEndpointConfig,
+    -- | Information about an S3 recording @Config@.
+    s3RecordingConfig :: Prelude.Maybe S3RecordingConfig,
+    -- | Object that determines whether tracking should be used during a contact
+    -- executed with this @Config@ in the mission profile.
+    trackingConfig :: Prelude.Maybe TrackingConfig,
+    -- | Information about an uplink echo @Config@.
+    --
+    -- Parameters from the @AntennaUplinkConfig@, corresponding to the
+    -- specified @AntennaUplinkConfigArn@, are used when this
+    -- @UplinkEchoConfig@ is used in a contact.
+    uplinkEchoConfig :: Prelude.Maybe UplinkEchoConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigTypeData' 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:
+--
+-- 'antennaDownlinkConfig', 'configTypeData_antennaDownlinkConfig' - Information about how AWS Ground Station should configure an antenna for
+-- downlink during a contact.
+--
+-- 'antennaDownlinkDemodDecodeConfig', 'configTypeData_antennaDownlinkDemodDecodeConfig' - Information about how AWS Ground Station should conﬁgure an antenna for
+-- downlink demod decode during a contact.
+--
+-- 'antennaUplinkConfig', 'configTypeData_antennaUplinkConfig' - Information about how AWS Ground Station should conﬁgure an antenna for
+-- uplink during a contact.
+--
+-- 'dataflowEndpointConfig', 'configTypeData_dataflowEndpointConfig' - Information about the dataflow endpoint @Config@.
+--
+-- 's3RecordingConfig', 'configTypeData_s3RecordingConfig' - Information about an S3 recording @Config@.
+--
+-- 'trackingConfig', 'configTypeData_trackingConfig' - Object that determines whether tracking should be used during a contact
+-- executed with this @Config@ in the mission profile.
+--
+-- 'uplinkEchoConfig', 'configTypeData_uplinkEchoConfig' - Information about an uplink echo @Config@.
+--
+-- Parameters from the @AntennaUplinkConfig@, corresponding to the
+-- specified @AntennaUplinkConfigArn@, are used when this
+-- @UplinkEchoConfig@ is used in a contact.
+newConfigTypeData ::
+  ConfigTypeData
+newConfigTypeData =
+  ConfigTypeData'
+    { antennaDownlinkConfig =
+        Prelude.Nothing,
+      antennaDownlinkDemodDecodeConfig = Prelude.Nothing,
+      antennaUplinkConfig = Prelude.Nothing,
+      dataflowEndpointConfig = Prelude.Nothing,
+      s3RecordingConfig = Prelude.Nothing,
+      trackingConfig = Prelude.Nothing,
+      uplinkEchoConfig = Prelude.Nothing
+    }
+
+-- | Information about how AWS Ground Station should configure an antenna for
+-- downlink during a contact.
+configTypeData_antennaDownlinkConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe AntennaDownlinkConfig)
+configTypeData_antennaDownlinkConfig = Lens.lens (\ConfigTypeData' {antennaDownlinkConfig} -> antennaDownlinkConfig) (\s@ConfigTypeData' {} a -> s {antennaDownlinkConfig = a} :: ConfigTypeData)
+
+-- | Information about how AWS Ground Station should conﬁgure an antenna for
+-- downlink demod decode during a contact.
+configTypeData_antennaDownlinkDemodDecodeConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe AntennaDownlinkDemodDecodeConfig)
+configTypeData_antennaDownlinkDemodDecodeConfig = Lens.lens (\ConfigTypeData' {antennaDownlinkDemodDecodeConfig} -> antennaDownlinkDemodDecodeConfig) (\s@ConfigTypeData' {} a -> s {antennaDownlinkDemodDecodeConfig = a} :: ConfigTypeData)
+
+-- | Information about how AWS Ground Station should conﬁgure an antenna for
+-- uplink during a contact.
+configTypeData_antennaUplinkConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe AntennaUplinkConfig)
+configTypeData_antennaUplinkConfig = Lens.lens (\ConfigTypeData' {antennaUplinkConfig} -> antennaUplinkConfig) (\s@ConfigTypeData' {} a -> s {antennaUplinkConfig = a} :: ConfigTypeData)
+
+-- | Information about the dataflow endpoint @Config@.
+configTypeData_dataflowEndpointConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe DataflowEndpointConfig)
+configTypeData_dataflowEndpointConfig = Lens.lens (\ConfigTypeData' {dataflowEndpointConfig} -> dataflowEndpointConfig) (\s@ConfigTypeData' {} a -> s {dataflowEndpointConfig = a} :: ConfigTypeData)
+
+-- | Information about an S3 recording @Config@.
+configTypeData_s3RecordingConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe S3RecordingConfig)
+configTypeData_s3RecordingConfig = Lens.lens (\ConfigTypeData' {s3RecordingConfig} -> s3RecordingConfig) (\s@ConfigTypeData' {} a -> s {s3RecordingConfig = a} :: ConfigTypeData)
+
+-- | Object that determines whether tracking should be used during a contact
+-- executed with this @Config@ in the mission profile.
+configTypeData_trackingConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe TrackingConfig)
+configTypeData_trackingConfig = Lens.lens (\ConfigTypeData' {trackingConfig} -> trackingConfig) (\s@ConfigTypeData' {} a -> s {trackingConfig = a} :: ConfigTypeData)
+
+-- | Information about an uplink echo @Config@.
+--
+-- Parameters from the @AntennaUplinkConfig@, corresponding to the
+-- specified @AntennaUplinkConfigArn@, are used when this
+-- @UplinkEchoConfig@ is used in a contact.
+configTypeData_uplinkEchoConfig :: Lens.Lens' ConfigTypeData (Prelude.Maybe UplinkEchoConfig)
+configTypeData_uplinkEchoConfig = Lens.lens (\ConfigTypeData' {uplinkEchoConfig} -> uplinkEchoConfig) (\s@ConfigTypeData' {} a -> s {uplinkEchoConfig = a} :: ConfigTypeData)
+
+instance Data.FromJSON ConfigTypeData where
+  parseJSON =
+    Data.withObject
+      "ConfigTypeData"
+      ( \x ->
+          ConfigTypeData'
+            Prelude.<$> (x Data..:? "antennaDownlinkConfig")
+            Prelude.<*> (x Data..:? "antennaDownlinkDemodDecodeConfig")
+            Prelude.<*> (x Data..:? "antennaUplinkConfig")
+            Prelude.<*> (x Data..:? "dataflowEndpointConfig")
+            Prelude.<*> (x Data..:? "s3RecordingConfig")
+            Prelude.<*> (x Data..:? "trackingConfig")
+            Prelude.<*> (x Data..:? "uplinkEchoConfig")
+      )
+
+instance Prelude.Hashable ConfigTypeData where
+  hashWithSalt _salt ConfigTypeData' {..} =
+    _salt
+      `Prelude.hashWithSalt` antennaDownlinkConfig
+      `Prelude.hashWithSalt` antennaDownlinkDemodDecodeConfig
+      `Prelude.hashWithSalt` antennaUplinkConfig
+      `Prelude.hashWithSalt` dataflowEndpointConfig
+      `Prelude.hashWithSalt` s3RecordingConfig
+      `Prelude.hashWithSalt` trackingConfig
+      `Prelude.hashWithSalt` uplinkEchoConfig
+
+instance Prelude.NFData ConfigTypeData where
+  rnf ConfigTypeData' {..} =
+    Prelude.rnf antennaDownlinkConfig
+      `Prelude.seq` Prelude.rnf antennaDownlinkDemodDecodeConfig
+      `Prelude.seq` Prelude.rnf antennaUplinkConfig
+      `Prelude.seq` Prelude.rnf dataflowEndpointConfig
+      `Prelude.seq` Prelude.rnf s3RecordingConfig
+      `Prelude.seq` Prelude.rnf trackingConfig
+      `Prelude.seq` Prelude.rnf uplinkEchoConfig
+
+instance Data.ToJSON ConfigTypeData where
+  toJSON ConfigTypeData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("antennaDownlinkConfig" Data..=)
+              Prelude.<$> antennaDownlinkConfig,
+            ("antennaDownlinkDemodDecodeConfig" Data..=)
+              Prelude.<$> antennaDownlinkDemodDecodeConfig,
+            ("antennaUplinkConfig" Data..=)
+              Prelude.<$> antennaUplinkConfig,
+            ("dataflowEndpointConfig" Data..=)
+              Prelude.<$> dataflowEndpointConfig,
+            ("s3RecordingConfig" Data..=)
+              Prelude.<$> s3RecordingConfig,
+            ("trackingConfig" Data..=)
+              Prelude.<$> trackingConfig,
+            ("uplinkEchoConfig" Data..=)
+              Prelude.<$> uplinkEchoConfig
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/ContactData.hs b/gen/Amazonka/GroundStation/Types/ContactData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ContactData.hs
@@ -0,0 +1,224 @@
+{-# 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.GroundStation.Types.ContactData
+-- 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.GroundStation.Types.ContactData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.ContactStatus
+import Amazonka.GroundStation.Types.Elevation
+import qualified Amazonka.Prelude as Prelude
+
+-- | Data describing a contact.
+--
+-- /See:/ 'newContactData' smart constructor.
+data ContactData = ContactData'
+  { -- | UUID of a contact.
+    contactId :: Prelude.Maybe Prelude.Text,
+    -- | Status of a contact.
+    contactStatus :: Prelude.Maybe ContactStatus,
+    -- | End time of a contact in UTC.
+    endTime :: Prelude.Maybe Data.POSIX,
+    -- | Error message of a contact.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    -- | Name of a ground station.
+    groundStation :: Prelude.Maybe Prelude.Text,
+    -- | Maximum elevation angle of a contact.
+    maximumElevation :: Prelude.Maybe Elevation,
+    -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Maybe Prelude.Text,
+    -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    postPassEndTime :: Prelude.Maybe Data.POSIX,
+    -- | Amount of time prior to contact start you’d like to receive a CloudWatch
+    -- event indicating an upcoming pass.
+    prePassStartTime :: Prelude.Maybe Data.POSIX,
+    -- | Region of a contact.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | ARN of a satellite.
+    satelliteArn :: Prelude.Maybe Prelude.Text,
+    -- | Start time of a contact in UTC.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | Tags assigned to a contact.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContactData' 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:
+--
+-- 'contactId', 'contactData_contactId' - UUID of a contact.
+--
+-- 'contactStatus', 'contactData_contactStatus' - Status of a contact.
+--
+-- 'endTime', 'contactData_endTime' - End time of a contact in UTC.
+--
+-- 'errorMessage', 'contactData_errorMessage' - Error message of a contact.
+--
+-- 'groundStation', 'contactData_groundStation' - Name of a ground station.
+--
+-- 'maximumElevation', 'contactData_maximumElevation' - Maximum elevation angle of a contact.
+--
+-- 'missionProfileArn', 'contactData_missionProfileArn' - ARN of a mission profile.
+--
+-- 'postPassEndTime', 'contactData_postPassEndTime' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'prePassStartTime', 'contactData_prePassStartTime' - Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+--
+-- 'region', 'contactData_region' - Region of a contact.
+--
+-- 'satelliteArn', 'contactData_satelliteArn' - ARN of a satellite.
+--
+-- 'startTime', 'contactData_startTime' - Start time of a contact in UTC.
+--
+-- 'tags', 'contactData_tags' - Tags assigned to a contact.
+newContactData ::
+  ContactData
+newContactData =
+  ContactData'
+    { contactId = Prelude.Nothing,
+      contactStatus = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      groundStation = Prelude.Nothing,
+      maximumElevation = Prelude.Nothing,
+      missionProfileArn = Prelude.Nothing,
+      postPassEndTime = Prelude.Nothing,
+      prePassStartTime = Prelude.Nothing,
+      region = Prelude.Nothing,
+      satelliteArn = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | UUID of a contact.
+contactData_contactId :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_contactId = Lens.lens (\ContactData' {contactId} -> contactId) (\s@ContactData' {} a -> s {contactId = a} :: ContactData)
+
+-- | Status of a contact.
+contactData_contactStatus :: Lens.Lens' ContactData (Prelude.Maybe ContactStatus)
+contactData_contactStatus = Lens.lens (\ContactData' {contactStatus} -> contactStatus) (\s@ContactData' {} a -> s {contactStatus = a} :: ContactData)
+
+-- | End time of a contact in UTC.
+contactData_endTime :: Lens.Lens' ContactData (Prelude.Maybe Prelude.UTCTime)
+contactData_endTime = Lens.lens (\ContactData' {endTime} -> endTime) (\s@ContactData' {} a -> s {endTime = a} :: ContactData) Prelude.. Lens.mapping Data._Time
+
+-- | Error message of a contact.
+contactData_errorMessage :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_errorMessage = Lens.lens (\ContactData' {errorMessage} -> errorMessage) (\s@ContactData' {} a -> s {errorMessage = a} :: ContactData)
+
+-- | Name of a ground station.
+contactData_groundStation :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_groundStation = Lens.lens (\ContactData' {groundStation} -> groundStation) (\s@ContactData' {} a -> s {groundStation = a} :: ContactData)
+
+-- | Maximum elevation angle of a contact.
+contactData_maximumElevation :: Lens.Lens' ContactData (Prelude.Maybe Elevation)
+contactData_maximumElevation = Lens.lens (\ContactData' {maximumElevation} -> maximumElevation) (\s@ContactData' {} a -> s {maximumElevation = a} :: ContactData)
+
+-- | ARN of a mission profile.
+contactData_missionProfileArn :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_missionProfileArn = Lens.lens (\ContactData' {missionProfileArn} -> missionProfileArn) (\s@ContactData' {} a -> s {missionProfileArn = a} :: ContactData)
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+contactData_postPassEndTime :: Lens.Lens' ContactData (Prelude.Maybe Prelude.UTCTime)
+contactData_postPassEndTime = Lens.lens (\ContactData' {postPassEndTime} -> postPassEndTime) (\s@ContactData' {} a -> s {postPassEndTime = a} :: ContactData) Prelude.. Lens.mapping Data._Time
+
+-- | Amount of time prior to contact start you’d like to receive a CloudWatch
+-- event indicating an upcoming pass.
+contactData_prePassStartTime :: Lens.Lens' ContactData (Prelude.Maybe Prelude.UTCTime)
+contactData_prePassStartTime = Lens.lens (\ContactData' {prePassStartTime} -> prePassStartTime) (\s@ContactData' {} a -> s {prePassStartTime = a} :: ContactData) Prelude.. Lens.mapping Data._Time
+
+-- | Region of a contact.
+contactData_region :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_region = Lens.lens (\ContactData' {region} -> region) (\s@ContactData' {} a -> s {region = a} :: ContactData)
+
+-- | ARN of a satellite.
+contactData_satelliteArn :: Lens.Lens' ContactData (Prelude.Maybe Prelude.Text)
+contactData_satelliteArn = Lens.lens (\ContactData' {satelliteArn} -> satelliteArn) (\s@ContactData' {} a -> s {satelliteArn = a} :: ContactData)
+
+-- | Start time of a contact in UTC.
+contactData_startTime :: Lens.Lens' ContactData (Prelude.Maybe Prelude.UTCTime)
+contactData_startTime = Lens.lens (\ContactData' {startTime} -> startTime) (\s@ContactData' {} a -> s {startTime = a} :: ContactData) Prelude.. Lens.mapping Data._Time
+
+-- | Tags assigned to a contact.
+contactData_tags :: Lens.Lens' ContactData (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+contactData_tags = Lens.lens (\ContactData' {tags} -> tags) (\s@ContactData' {} a -> s {tags = a} :: ContactData) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ContactData where
+  parseJSON =
+    Data.withObject
+      "ContactData"
+      ( \x ->
+          ContactData'
+            Prelude.<$> (x Data..:? "contactId")
+            Prelude.<*> (x Data..:? "contactStatus")
+            Prelude.<*> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "errorMessage")
+            Prelude.<*> (x Data..:? "groundStation")
+            Prelude.<*> (x Data..:? "maximumElevation")
+            Prelude.<*> (x Data..:? "missionProfileArn")
+            Prelude.<*> (x Data..:? "postPassEndTime")
+            Prelude.<*> (x Data..:? "prePassStartTime")
+            Prelude.<*> (x Data..:? "region")
+            Prelude.<*> (x Data..:? "satelliteArn")
+            Prelude.<*> (x Data..:? "startTime")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ContactData where
+  hashWithSalt _salt ContactData' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactId
+      `Prelude.hashWithSalt` contactStatus
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` groundStation
+      `Prelude.hashWithSalt` maximumElevation
+      `Prelude.hashWithSalt` missionProfileArn
+      `Prelude.hashWithSalt` postPassEndTime
+      `Prelude.hashWithSalt` prePassStartTime
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` satelliteArn
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData ContactData where
+  rnf ContactData' {..} =
+    Prelude.rnf contactId
+      `Prelude.seq` Prelude.rnf contactStatus
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf groundStation
+      `Prelude.seq` Prelude.rnf maximumElevation
+      `Prelude.seq` Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf postPassEndTime
+      `Prelude.seq` Prelude.rnf prePassStartTime
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/GroundStation/Types/ContactIdResponse.hs b/gen/Amazonka/GroundStation/Types/ContactIdResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ContactIdResponse.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.ContactIdResponse
+-- 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.GroundStation.Types.ContactIdResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newContactIdResponse' smart constructor.
+data ContactIdResponse = ContactIdResponse'
+  { -- | UUID of a contact.
+    contactId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContactIdResponse' 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:
+--
+-- 'contactId', 'contactIdResponse_contactId' - UUID of a contact.
+newContactIdResponse ::
+  ContactIdResponse
+newContactIdResponse =
+  ContactIdResponse' {contactId = Prelude.Nothing}
+
+-- | UUID of a contact.
+contactIdResponse_contactId :: Lens.Lens' ContactIdResponse (Prelude.Maybe Prelude.Text)
+contactIdResponse_contactId = Lens.lens (\ContactIdResponse' {contactId} -> contactId) (\s@ContactIdResponse' {} a -> s {contactId = a} :: ContactIdResponse)
+
+instance Data.FromJSON ContactIdResponse where
+  parseJSON =
+    Data.withObject
+      "ContactIdResponse"
+      ( \x ->
+          ContactIdResponse'
+            Prelude.<$> (x Data..:? "contactId")
+      )
+
+instance Prelude.Hashable ContactIdResponse where
+  hashWithSalt _salt ContactIdResponse' {..} =
+    _salt `Prelude.hashWithSalt` contactId
+
+instance Prelude.NFData ContactIdResponse where
+  rnf ContactIdResponse' {..} = Prelude.rnf contactId
diff --git a/gen/Amazonka/GroundStation/Types/ContactStatus.hs b/gen/Amazonka/GroundStation/Types/ContactStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/ContactStatus.hs
@@ -0,0 +1,126 @@
+{-# 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.GroundStation.Types.ContactStatus
+-- 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.GroundStation.Types.ContactStatus
+  ( ContactStatus
+      ( ..,
+        ContactStatus_AVAILABLE,
+        ContactStatus_AWS_CANCELLED,
+        ContactStatus_AWS_FAILED,
+        ContactStatus_CANCELLED,
+        ContactStatus_CANCELLING,
+        ContactStatus_COMPLETED,
+        ContactStatus_FAILED,
+        ContactStatus_FAILED_TO_SCHEDULE,
+        ContactStatus_PASS,
+        ContactStatus_POSTPASS,
+        ContactStatus_PREPASS,
+        ContactStatus_SCHEDULED,
+        ContactStatus_SCHEDULING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ContactStatus = ContactStatus'
+  { fromContactStatus ::
+      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 ContactStatus_AVAILABLE :: ContactStatus
+pattern ContactStatus_AVAILABLE = ContactStatus' "AVAILABLE"
+
+pattern ContactStatus_AWS_CANCELLED :: ContactStatus
+pattern ContactStatus_AWS_CANCELLED = ContactStatus' "AWS_CANCELLED"
+
+pattern ContactStatus_AWS_FAILED :: ContactStatus
+pattern ContactStatus_AWS_FAILED = ContactStatus' "AWS_FAILED"
+
+pattern ContactStatus_CANCELLED :: ContactStatus
+pattern ContactStatus_CANCELLED = ContactStatus' "CANCELLED"
+
+pattern ContactStatus_CANCELLING :: ContactStatus
+pattern ContactStatus_CANCELLING = ContactStatus' "CANCELLING"
+
+pattern ContactStatus_COMPLETED :: ContactStatus
+pattern ContactStatus_COMPLETED = ContactStatus' "COMPLETED"
+
+pattern ContactStatus_FAILED :: ContactStatus
+pattern ContactStatus_FAILED = ContactStatus' "FAILED"
+
+pattern ContactStatus_FAILED_TO_SCHEDULE :: ContactStatus
+pattern ContactStatus_FAILED_TO_SCHEDULE = ContactStatus' "FAILED_TO_SCHEDULE"
+
+pattern ContactStatus_PASS :: ContactStatus
+pattern ContactStatus_PASS = ContactStatus' "PASS"
+
+pattern ContactStatus_POSTPASS :: ContactStatus
+pattern ContactStatus_POSTPASS = ContactStatus' "POSTPASS"
+
+pattern ContactStatus_PREPASS :: ContactStatus
+pattern ContactStatus_PREPASS = ContactStatus' "PREPASS"
+
+pattern ContactStatus_SCHEDULED :: ContactStatus
+pattern ContactStatus_SCHEDULED = ContactStatus' "SCHEDULED"
+
+pattern ContactStatus_SCHEDULING :: ContactStatus
+pattern ContactStatus_SCHEDULING = ContactStatus' "SCHEDULING"
+
+{-# COMPLETE
+  ContactStatus_AVAILABLE,
+  ContactStatus_AWS_CANCELLED,
+  ContactStatus_AWS_FAILED,
+  ContactStatus_CANCELLED,
+  ContactStatus_CANCELLING,
+  ContactStatus_COMPLETED,
+  ContactStatus_FAILED,
+  ContactStatus_FAILED_TO_SCHEDULE,
+  ContactStatus_PASS,
+  ContactStatus_POSTPASS,
+  ContactStatus_PREPASS,
+  ContactStatus_SCHEDULED,
+  ContactStatus_SCHEDULING,
+  ContactStatus'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/Criticality.hs b/gen/Amazonka/GroundStation/Types/Criticality.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Criticality.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.Criticality
+-- 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.GroundStation.Types.Criticality
+  ( Criticality
+      ( ..,
+        Criticality_PREFERRED,
+        Criticality_REMOVED,
+        Criticality_REQUIRED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Criticality = Criticality'
+  { fromCriticality ::
+      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 Criticality_PREFERRED :: Criticality
+pattern Criticality_PREFERRED = Criticality' "PREFERRED"
+
+pattern Criticality_REMOVED :: Criticality
+pattern Criticality_REMOVED = Criticality' "REMOVED"
+
+pattern Criticality_REQUIRED :: Criticality
+pattern Criticality_REQUIRED = Criticality' "REQUIRED"
+
+{-# COMPLETE
+  Criticality_PREFERRED,
+  Criticality_REMOVED,
+  Criticality_REQUIRED,
+  Criticality'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/DataflowDetail.hs b/gen/Amazonka/GroundStation/Types/DataflowDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DataflowDetail.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.DataflowDetail
+-- 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.GroundStation.Types.DataflowDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.Destination
+import Amazonka.GroundStation.Types.Source
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a dataflow edge used in a contact.
+--
+-- /See:/ 'newDataflowDetail' smart constructor.
+data DataflowDetail = DataflowDetail'
+  { destination :: Prelude.Maybe Destination,
+    -- | Error message for a dataflow.
+    errorMessage :: Prelude.Maybe Prelude.Text,
+    source :: Prelude.Maybe Source
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataflowDetail' 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:
+--
+-- 'destination', 'dataflowDetail_destination' - Undocumented member.
+--
+-- 'errorMessage', 'dataflowDetail_errorMessage' - Error message for a dataflow.
+--
+-- 'source', 'dataflowDetail_source' - Undocumented member.
+newDataflowDetail ::
+  DataflowDetail
+newDataflowDetail =
+  DataflowDetail'
+    { destination = Prelude.Nothing,
+      errorMessage = Prelude.Nothing,
+      source = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+dataflowDetail_destination :: Lens.Lens' DataflowDetail (Prelude.Maybe Destination)
+dataflowDetail_destination = Lens.lens (\DataflowDetail' {destination} -> destination) (\s@DataflowDetail' {} a -> s {destination = a} :: DataflowDetail)
+
+-- | Error message for a dataflow.
+dataflowDetail_errorMessage :: Lens.Lens' DataflowDetail (Prelude.Maybe Prelude.Text)
+dataflowDetail_errorMessage = Lens.lens (\DataflowDetail' {errorMessage} -> errorMessage) (\s@DataflowDetail' {} a -> s {errorMessage = a} :: DataflowDetail)
+
+-- | Undocumented member.
+dataflowDetail_source :: Lens.Lens' DataflowDetail (Prelude.Maybe Source)
+dataflowDetail_source = Lens.lens (\DataflowDetail' {source} -> source) (\s@DataflowDetail' {} a -> s {source = a} :: DataflowDetail)
+
+instance Data.FromJSON DataflowDetail where
+  parseJSON =
+    Data.withObject
+      "DataflowDetail"
+      ( \x ->
+          DataflowDetail'
+            Prelude.<$> (x Data..:? "destination")
+            Prelude.<*> (x Data..:? "errorMessage")
+            Prelude.<*> (x Data..:? "source")
+      )
+
+instance Prelude.Hashable DataflowDetail where
+  hashWithSalt _salt DataflowDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` destination
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` source
+
+instance Prelude.NFData DataflowDetail where
+  rnf DataflowDetail' {..} =
+    Prelude.rnf destination
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf source
diff --git a/gen/Amazonka/GroundStation/Types/DataflowEndpoint.hs b/gen/Amazonka/GroundStation/Types/DataflowEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DataflowEndpoint.hs
@@ -0,0 +1,121 @@
+{-# 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.GroundStation.Types.DataflowEndpoint
+-- 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.GroundStation.Types.DataflowEndpoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EndpointStatus
+import Amazonka.GroundStation.Types.SocketAddress
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a dataflow endpoint.
+--
+-- /See:/ 'newDataflowEndpoint' smart constructor.
+data DataflowEndpoint = DataflowEndpoint'
+  { -- | Socket address of a dataflow endpoint.
+    address :: Prelude.Maybe SocketAddress,
+    -- | Maximum transmission unit (MTU) size in bytes of a dataflow endpoint.
+    mtu :: Prelude.Maybe Prelude.Natural,
+    -- | Name of a dataflow endpoint.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Status of a dataflow endpoint.
+    status :: Prelude.Maybe EndpointStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataflowEndpoint' 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:
+--
+-- 'address', 'dataflowEndpoint_address' - Socket address of a dataflow endpoint.
+--
+-- 'mtu', 'dataflowEndpoint_mtu' - Maximum transmission unit (MTU) size in bytes of a dataflow endpoint.
+--
+-- 'name', 'dataflowEndpoint_name' - Name of a dataflow endpoint.
+--
+-- 'status', 'dataflowEndpoint_status' - Status of a dataflow endpoint.
+newDataflowEndpoint ::
+  DataflowEndpoint
+newDataflowEndpoint =
+  DataflowEndpoint'
+    { address = Prelude.Nothing,
+      mtu = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Socket address of a dataflow endpoint.
+dataflowEndpoint_address :: Lens.Lens' DataflowEndpoint (Prelude.Maybe SocketAddress)
+dataflowEndpoint_address = Lens.lens (\DataflowEndpoint' {address} -> address) (\s@DataflowEndpoint' {} a -> s {address = a} :: DataflowEndpoint)
+
+-- | Maximum transmission unit (MTU) size in bytes of a dataflow endpoint.
+dataflowEndpoint_mtu :: Lens.Lens' DataflowEndpoint (Prelude.Maybe Prelude.Natural)
+dataflowEndpoint_mtu = Lens.lens (\DataflowEndpoint' {mtu} -> mtu) (\s@DataflowEndpoint' {} a -> s {mtu = a} :: DataflowEndpoint)
+
+-- | Name of a dataflow endpoint.
+dataflowEndpoint_name :: Lens.Lens' DataflowEndpoint (Prelude.Maybe Prelude.Text)
+dataflowEndpoint_name = Lens.lens (\DataflowEndpoint' {name} -> name) (\s@DataflowEndpoint' {} a -> s {name = a} :: DataflowEndpoint)
+
+-- | Status of a dataflow endpoint.
+dataflowEndpoint_status :: Lens.Lens' DataflowEndpoint (Prelude.Maybe EndpointStatus)
+dataflowEndpoint_status = Lens.lens (\DataflowEndpoint' {status} -> status) (\s@DataflowEndpoint' {} a -> s {status = a} :: DataflowEndpoint)
+
+instance Data.FromJSON DataflowEndpoint where
+  parseJSON =
+    Data.withObject
+      "DataflowEndpoint"
+      ( \x ->
+          DataflowEndpoint'
+            Prelude.<$> (x Data..:? "address")
+            Prelude.<*> (x Data..:? "mtu")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DataflowEndpoint where
+  hashWithSalt _salt DataflowEndpoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` address
+      `Prelude.hashWithSalt` mtu
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DataflowEndpoint where
+  rnf DataflowEndpoint' {..} =
+    Prelude.rnf address
+      `Prelude.seq` Prelude.rnf mtu
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
+
+instance Data.ToJSON DataflowEndpoint where
+  toJSON DataflowEndpoint' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("address" Data..=) Prelude.<$> address,
+            ("mtu" Data..=) Prelude.<$> mtu,
+            ("name" Data..=) Prelude.<$> name,
+            ("status" Data..=) Prelude.<$> status
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/DataflowEndpointConfig.hs b/gen/Amazonka/GroundStation/Types/DataflowEndpointConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DataflowEndpointConfig.hs
@@ -0,0 +1,100 @@
+{-# 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.GroundStation.Types.DataflowEndpointConfig
+-- 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.GroundStation.Types.DataflowEndpointConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the dataflow endpoint @Config@.
+--
+-- /See:/ 'newDataflowEndpointConfig' smart constructor.
+data DataflowEndpointConfig = DataflowEndpointConfig'
+  { -- | Region of a dataflow endpoint.
+    dataflowEndpointRegion :: Prelude.Maybe Prelude.Text,
+    -- | Name of a dataflow endpoint.
+    dataflowEndpointName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataflowEndpointConfig' 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:
+--
+-- 'dataflowEndpointRegion', 'dataflowEndpointConfig_dataflowEndpointRegion' - Region of a dataflow endpoint.
+--
+-- 'dataflowEndpointName', 'dataflowEndpointConfig_dataflowEndpointName' - Name of a dataflow endpoint.
+newDataflowEndpointConfig ::
+  -- | 'dataflowEndpointName'
+  Prelude.Text ->
+  DataflowEndpointConfig
+newDataflowEndpointConfig pDataflowEndpointName_ =
+  DataflowEndpointConfig'
+    { dataflowEndpointRegion =
+        Prelude.Nothing,
+      dataflowEndpointName = pDataflowEndpointName_
+    }
+
+-- | Region of a dataflow endpoint.
+dataflowEndpointConfig_dataflowEndpointRegion :: Lens.Lens' DataflowEndpointConfig (Prelude.Maybe Prelude.Text)
+dataflowEndpointConfig_dataflowEndpointRegion = Lens.lens (\DataflowEndpointConfig' {dataflowEndpointRegion} -> dataflowEndpointRegion) (\s@DataflowEndpointConfig' {} a -> s {dataflowEndpointRegion = a} :: DataflowEndpointConfig)
+
+-- | Name of a dataflow endpoint.
+dataflowEndpointConfig_dataflowEndpointName :: Lens.Lens' DataflowEndpointConfig Prelude.Text
+dataflowEndpointConfig_dataflowEndpointName = Lens.lens (\DataflowEndpointConfig' {dataflowEndpointName} -> dataflowEndpointName) (\s@DataflowEndpointConfig' {} a -> s {dataflowEndpointName = a} :: DataflowEndpointConfig)
+
+instance Data.FromJSON DataflowEndpointConfig where
+  parseJSON =
+    Data.withObject
+      "DataflowEndpointConfig"
+      ( \x ->
+          DataflowEndpointConfig'
+            Prelude.<$> (x Data..:? "dataflowEndpointRegion")
+            Prelude.<*> (x Data..: "dataflowEndpointName")
+      )
+
+instance Prelude.Hashable DataflowEndpointConfig where
+  hashWithSalt _salt DataflowEndpointConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataflowEndpointRegion
+      `Prelude.hashWithSalt` dataflowEndpointName
+
+instance Prelude.NFData DataflowEndpointConfig where
+  rnf DataflowEndpointConfig' {..} =
+    Prelude.rnf dataflowEndpointRegion
+      `Prelude.seq` Prelude.rnf dataflowEndpointName
+
+instance Data.ToJSON DataflowEndpointConfig where
+  toJSON DataflowEndpointConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataflowEndpointRegion" Data..=)
+              Prelude.<$> dataflowEndpointRegion,
+            Prelude.Just
+              ( "dataflowEndpointName"
+                  Data..= dataflowEndpointName
+              )
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/DataflowEndpointGroupIdResponse.hs b/gen/Amazonka/GroundStation/Types/DataflowEndpointGroupIdResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DataflowEndpointGroupIdResponse.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.DataflowEndpointGroupIdResponse
+-- 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.GroundStation.Types.DataflowEndpointGroupIdResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newDataflowEndpointGroupIdResponse' smart constructor.
+data DataflowEndpointGroupIdResponse = DataflowEndpointGroupIdResponse'
+  { -- | UUID of a dataflow endpoint group.
+    dataflowEndpointGroupId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataflowEndpointGroupIdResponse' 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:
+--
+-- 'dataflowEndpointGroupId', 'dataflowEndpointGroupIdResponse_dataflowEndpointGroupId' - UUID of a dataflow endpoint group.
+newDataflowEndpointGroupIdResponse ::
+  DataflowEndpointGroupIdResponse
+newDataflowEndpointGroupIdResponse =
+  DataflowEndpointGroupIdResponse'
+    { dataflowEndpointGroupId =
+        Prelude.Nothing
+    }
+
+-- | UUID of a dataflow endpoint group.
+dataflowEndpointGroupIdResponse_dataflowEndpointGroupId :: Lens.Lens' DataflowEndpointGroupIdResponse (Prelude.Maybe Prelude.Text)
+dataflowEndpointGroupIdResponse_dataflowEndpointGroupId = Lens.lens (\DataflowEndpointGroupIdResponse' {dataflowEndpointGroupId} -> dataflowEndpointGroupId) (\s@DataflowEndpointGroupIdResponse' {} a -> s {dataflowEndpointGroupId = a} :: DataflowEndpointGroupIdResponse)
+
+instance
+  Data.FromJSON
+    DataflowEndpointGroupIdResponse
+  where
+  parseJSON =
+    Data.withObject
+      "DataflowEndpointGroupIdResponse"
+      ( \x ->
+          DataflowEndpointGroupIdResponse'
+            Prelude.<$> (x Data..:? "dataflowEndpointGroupId")
+      )
+
+instance
+  Prelude.Hashable
+    DataflowEndpointGroupIdResponse
+  where
+  hashWithSalt
+    _salt
+    DataflowEndpointGroupIdResponse' {..} =
+      _salt
+        `Prelude.hashWithSalt` dataflowEndpointGroupId
+
+instance
+  Prelude.NFData
+    DataflowEndpointGroupIdResponse
+  where
+  rnf DataflowEndpointGroupIdResponse' {..} =
+    Prelude.rnf dataflowEndpointGroupId
diff --git a/gen/Amazonka/GroundStation/Types/DataflowEndpointListItem.hs b/gen/Amazonka/GroundStation/Types/DataflowEndpointListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DataflowEndpointListItem.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.DataflowEndpointListItem
+-- 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.GroundStation.Types.DataflowEndpointListItem 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
+
+-- | Item in a list of @DataflowEndpoint@ groups.
+--
+-- /See:/ 'newDataflowEndpointListItem' smart constructor.
+data DataflowEndpointListItem = DataflowEndpointListItem'
+  { -- | ARN of a dataflow endpoint group.
+    dataflowEndpointGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a dataflow endpoint group.
+    dataflowEndpointGroupId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataflowEndpointListItem' 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:
+--
+-- 'dataflowEndpointGroupArn', 'dataflowEndpointListItem_dataflowEndpointGroupArn' - ARN of a dataflow endpoint group.
+--
+-- 'dataflowEndpointGroupId', 'dataflowEndpointListItem_dataflowEndpointGroupId' - UUID of a dataflow endpoint group.
+newDataflowEndpointListItem ::
+  DataflowEndpointListItem
+newDataflowEndpointListItem =
+  DataflowEndpointListItem'
+    { dataflowEndpointGroupArn =
+        Prelude.Nothing,
+      dataflowEndpointGroupId = Prelude.Nothing
+    }
+
+-- | ARN of a dataflow endpoint group.
+dataflowEndpointListItem_dataflowEndpointGroupArn :: Lens.Lens' DataflowEndpointListItem (Prelude.Maybe Prelude.Text)
+dataflowEndpointListItem_dataflowEndpointGroupArn = Lens.lens (\DataflowEndpointListItem' {dataflowEndpointGroupArn} -> dataflowEndpointGroupArn) (\s@DataflowEndpointListItem' {} a -> s {dataflowEndpointGroupArn = a} :: DataflowEndpointListItem)
+
+-- | UUID of a dataflow endpoint group.
+dataflowEndpointListItem_dataflowEndpointGroupId :: Lens.Lens' DataflowEndpointListItem (Prelude.Maybe Prelude.Text)
+dataflowEndpointListItem_dataflowEndpointGroupId = Lens.lens (\DataflowEndpointListItem' {dataflowEndpointGroupId} -> dataflowEndpointGroupId) (\s@DataflowEndpointListItem' {} a -> s {dataflowEndpointGroupId = a} :: DataflowEndpointListItem)
+
+instance Data.FromJSON DataflowEndpointListItem where
+  parseJSON =
+    Data.withObject
+      "DataflowEndpointListItem"
+      ( \x ->
+          DataflowEndpointListItem'
+            Prelude.<$> (x Data..:? "dataflowEndpointGroupArn")
+            Prelude.<*> (x Data..:? "dataflowEndpointGroupId")
+      )
+
+instance Prelude.Hashable DataflowEndpointListItem where
+  hashWithSalt _salt DataflowEndpointListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataflowEndpointGroupArn
+      `Prelude.hashWithSalt` dataflowEndpointGroupId
+
+instance Prelude.NFData DataflowEndpointListItem where
+  rnf DataflowEndpointListItem' {..} =
+    Prelude.rnf dataflowEndpointGroupArn
+      `Prelude.seq` Prelude.rnf dataflowEndpointGroupId
diff --git a/gen/Amazonka/GroundStation/Types/DecodeConfig.hs b/gen/Amazonka/GroundStation/Types/DecodeConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DecodeConfig.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.DecodeConfig
+-- 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.GroundStation.Types.DecodeConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the decode @Config@.
+--
+-- /See:/ 'newDecodeConfig' smart constructor.
+data DecodeConfig = DecodeConfig'
+  { -- | Unvalidated JSON of a decode @Config@.
+    unvalidatedJSON :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DecodeConfig' 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:
+--
+-- 'unvalidatedJSON', 'decodeConfig_unvalidatedJSON' - Unvalidated JSON of a decode @Config@.
+newDecodeConfig ::
+  -- | 'unvalidatedJSON'
+  Prelude.Text ->
+  DecodeConfig
+newDecodeConfig pUnvalidatedJSON_ =
+  DecodeConfig' {unvalidatedJSON = pUnvalidatedJSON_}
+
+-- | Unvalidated JSON of a decode @Config@.
+decodeConfig_unvalidatedJSON :: Lens.Lens' DecodeConfig Prelude.Text
+decodeConfig_unvalidatedJSON = Lens.lens (\DecodeConfig' {unvalidatedJSON} -> unvalidatedJSON) (\s@DecodeConfig' {} a -> s {unvalidatedJSON = a} :: DecodeConfig)
+
+instance Data.FromJSON DecodeConfig where
+  parseJSON =
+    Data.withObject
+      "DecodeConfig"
+      ( \x ->
+          DecodeConfig'
+            Prelude.<$> (x Data..: "unvalidatedJSON")
+      )
+
+instance Prelude.Hashable DecodeConfig where
+  hashWithSalt _salt DecodeConfig' {..} =
+    _salt `Prelude.hashWithSalt` unvalidatedJSON
+
+instance Prelude.NFData DecodeConfig where
+  rnf DecodeConfig' {..} = Prelude.rnf unvalidatedJSON
+
+instance Data.ToJSON DecodeConfig where
+  toJSON DecodeConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("unvalidatedJSON" Data..= unvalidatedJSON)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/DemodulationConfig.hs b/gen/Amazonka/GroundStation/Types/DemodulationConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/DemodulationConfig.hs
@@ -0,0 +1,83 @@
+{-# 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.GroundStation.Types.DemodulationConfig
+-- 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.GroundStation.Types.DemodulationConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the demodulation @Config@.
+--
+-- /See:/ 'newDemodulationConfig' smart constructor.
+data DemodulationConfig = DemodulationConfig'
+  { -- | Unvalidated JSON of a demodulation @Config@.
+    unvalidatedJSON :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DemodulationConfig' 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:
+--
+-- 'unvalidatedJSON', 'demodulationConfig_unvalidatedJSON' - Unvalidated JSON of a demodulation @Config@.
+newDemodulationConfig ::
+  -- | 'unvalidatedJSON'
+  Prelude.Text ->
+  DemodulationConfig
+newDemodulationConfig pUnvalidatedJSON_ =
+  DemodulationConfig'
+    { unvalidatedJSON =
+        pUnvalidatedJSON_
+    }
+
+-- | Unvalidated JSON of a demodulation @Config@.
+demodulationConfig_unvalidatedJSON :: Lens.Lens' DemodulationConfig Prelude.Text
+demodulationConfig_unvalidatedJSON = Lens.lens (\DemodulationConfig' {unvalidatedJSON} -> unvalidatedJSON) (\s@DemodulationConfig' {} a -> s {unvalidatedJSON = a} :: DemodulationConfig)
+
+instance Data.FromJSON DemodulationConfig where
+  parseJSON =
+    Data.withObject
+      "DemodulationConfig"
+      ( \x ->
+          DemodulationConfig'
+            Prelude.<$> (x Data..: "unvalidatedJSON")
+      )
+
+instance Prelude.Hashable DemodulationConfig where
+  hashWithSalt _salt DemodulationConfig' {..} =
+    _salt `Prelude.hashWithSalt` unvalidatedJSON
+
+instance Prelude.NFData DemodulationConfig where
+  rnf DemodulationConfig' {..} =
+    Prelude.rnf unvalidatedJSON
+
+instance Data.ToJSON DemodulationConfig where
+  toJSON DemodulationConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("unvalidatedJSON" Data..= unvalidatedJSON)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/Destination.hs b/gen/Amazonka/GroundStation/Types/Destination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Destination.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.Destination
+-- 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.GroundStation.Types.Destination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.ConfigCapabilityType
+import Amazonka.GroundStation.Types.ConfigDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Dataflow details for the destination side.
+--
+-- /See:/ 'newDestination' smart constructor.
+data Destination = Destination'
+  { -- | Additional details for a @Config@, if type is dataflow endpoint or
+    -- antenna demod decode.
+    configDetails :: Prelude.Maybe ConfigDetails,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Maybe Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: Prelude.Maybe ConfigCapabilityType,
+    -- | Region of a dataflow destination.
+    dataflowDestinationRegion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Destination' 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:
+--
+-- 'configDetails', 'destination_configDetails' - Additional details for a @Config@, if type is dataflow endpoint or
+-- antenna demod decode.
+--
+-- 'configId', 'destination_configId' - UUID of a @Config@.
+--
+-- 'configType', 'destination_configType' - Type of a @Config@.
+--
+-- 'dataflowDestinationRegion', 'destination_dataflowDestinationRegion' - Region of a dataflow destination.
+newDestination ::
+  Destination
+newDestination =
+  Destination'
+    { configDetails = Prelude.Nothing,
+      configId = Prelude.Nothing,
+      configType = Prelude.Nothing,
+      dataflowDestinationRegion = Prelude.Nothing
+    }
+
+-- | Additional details for a @Config@, if type is dataflow endpoint or
+-- antenna demod decode.
+destination_configDetails :: Lens.Lens' Destination (Prelude.Maybe ConfigDetails)
+destination_configDetails = Lens.lens (\Destination' {configDetails} -> configDetails) (\s@Destination' {} a -> s {configDetails = a} :: Destination)
+
+-- | UUID of a @Config@.
+destination_configId :: Lens.Lens' Destination (Prelude.Maybe Prelude.Text)
+destination_configId = Lens.lens (\Destination' {configId} -> configId) (\s@Destination' {} a -> s {configId = a} :: Destination)
+
+-- | Type of a @Config@.
+destination_configType :: Lens.Lens' Destination (Prelude.Maybe ConfigCapabilityType)
+destination_configType = Lens.lens (\Destination' {configType} -> configType) (\s@Destination' {} a -> s {configType = a} :: Destination)
+
+-- | Region of a dataflow destination.
+destination_dataflowDestinationRegion :: Lens.Lens' Destination (Prelude.Maybe Prelude.Text)
+destination_dataflowDestinationRegion = Lens.lens (\Destination' {dataflowDestinationRegion} -> dataflowDestinationRegion) (\s@Destination' {} a -> s {dataflowDestinationRegion = a} :: Destination)
+
+instance Data.FromJSON Destination where
+  parseJSON =
+    Data.withObject
+      "Destination"
+      ( \x ->
+          Destination'
+            Prelude.<$> (x Data..:? "configDetails")
+            Prelude.<*> (x Data..:? "configId")
+            Prelude.<*> (x Data..:? "configType")
+            Prelude.<*> (x Data..:? "dataflowDestinationRegion")
+      )
+
+instance Prelude.Hashable Destination where
+  hashWithSalt _salt Destination' {..} =
+    _salt
+      `Prelude.hashWithSalt` configDetails
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+      `Prelude.hashWithSalt` dataflowDestinationRegion
+
+instance Prelude.NFData Destination where
+  rnf Destination' {..} =
+    Prelude.rnf configDetails
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+      `Prelude.seq` Prelude.rnf dataflowDestinationRegion
diff --git a/gen/Amazonka/GroundStation/Types/Eirp.hs b/gen/Amazonka/GroundStation/Types/Eirp.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Eirp.hs
@@ -0,0 +1,94 @@
+{-# 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.GroundStation.Types.Eirp
+-- 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.GroundStation.Types.Eirp where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EirpUnits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that represents EIRP.
+--
+-- /See:/ 'newEirp' smart constructor.
+data Eirp = Eirp'
+  { -- | Units of an EIRP.
+    units :: EirpUnits,
+    -- | Value of an EIRP. Valid values are between 20.0 to 50.0 dBW.
+    value :: Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Eirp' 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:
+--
+-- 'units', 'eirp_units' - Units of an EIRP.
+--
+-- 'value', 'eirp_value' - Value of an EIRP. Valid values are between 20.0 to 50.0 dBW.
+newEirp ::
+  -- | 'units'
+  EirpUnits ->
+  -- | 'value'
+  Prelude.Double ->
+  Eirp
+newEirp pUnits_ pValue_ =
+  Eirp' {units = pUnits_, value = pValue_}
+
+-- | Units of an EIRP.
+eirp_units :: Lens.Lens' Eirp EirpUnits
+eirp_units = Lens.lens (\Eirp' {units} -> units) (\s@Eirp' {} a -> s {units = a} :: Eirp)
+
+-- | Value of an EIRP. Valid values are between 20.0 to 50.0 dBW.
+eirp_value :: Lens.Lens' Eirp Prelude.Double
+eirp_value = Lens.lens (\Eirp' {value} -> value) (\s@Eirp' {} a -> s {value = a} :: Eirp)
+
+instance Data.FromJSON Eirp where
+  parseJSON =
+    Data.withObject
+      "Eirp"
+      ( \x ->
+          Eirp'
+            Prelude.<$> (x Data..: "units")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable Eirp where
+  hashWithSalt _salt Eirp' {..} =
+    _salt
+      `Prelude.hashWithSalt` units
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Eirp where
+  rnf Eirp' {..} =
+    Prelude.rnf units `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Eirp where
+  toJSON Eirp' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("units" Data..= units),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/EirpUnits.hs b/gen/Amazonka/GroundStation/Types/EirpUnits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EirpUnits.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.EirpUnits
+-- 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.GroundStation.Types.EirpUnits
+  ( EirpUnits
+      ( ..,
+        EirpUnits_DBW
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EirpUnits = EirpUnits'
+  { fromEirpUnits ::
+      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 EirpUnits_DBW :: EirpUnits
+pattern EirpUnits_DBW = EirpUnits' "dBW"
+
+{-# COMPLETE
+  EirpUnits_DBW,
+  EirpUnits'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/Elevation.hs b/gen/Amazonka/GroundStation/Types/Elevation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Elevation.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.Elevation
+-- 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.GroundStation.Types.Elevation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.AngleUnits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Elevation angle of the satellite in the sky during a contact.
+--
+-- /See:/ 'newElevation' smart constructor.
+data Elevation = Elevation'
+  { -- | Elevation angle units.
+    unit :: AngleUnits,
+    -- | Elevation angle value.
+    value :: Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Elevation' 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:
+--
+-- 'unit', 'elevation_unit' - Elevation angle units.
+--
+-- 'value', 'elevation_value' - Elevation angle value.
+newElevation ::
+  -- | 'unit'
+  AngleUnits ->
+  -- | 'value'
+  Prelude.Double ->
+  Elevation
+newElevation pUnit_ pValue_ =
+  Elevation' {unit = pUnit_, value = pValue_}
+
+-- | Elevation angle units.
+elevation_unit :: Lens.Lens' Elevation AngleUnits
+elevation_unit = Lens.lens (\Elevation' {unit} -> unit) (\s@Elevation' {} a -> s {unit = a} :: Elevation)
+
+-- | Elevation angle value.
+elevation_value :: Lens.Lens' Elevation Prelude.Double
+elevation_value = Lens.lens (\Elevation' {value} -> value) (\s@Elevation' {} a -> s {value = a} :: Elevation)
+
+instance Data.FromJSON Elevation where
+  parseJSON =
+    Data.withObject
+      "Elevation"
+      ( \x ->
+          Elevation'
+            Prelude.<$> (x Data..: "unit")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable Elevation where
+  hashWithSalt _salt Elevation' {..} =
+    _salt
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Elevation where
+  rnf Elevation' {..} =
+    Prelude.rnf unit `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/GroundStation/Types/EndpointDetails.hs b/gen/Amazonka/GroundStation/Types/EndpointDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EndpointDetails.hs
@@ -0,0 +1,99 @@
+{-# 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.GroundStation.Types.EndpointDetails
+-- 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.GroundStation.Types.EndpointDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.DataflowEndpoint
+import Amazonka.GroundStation.Types.SecurityDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the endpoint details.
+--
+-- /See:/ 'newEndpointDetails' smart constructor.
+data EndpointDetails = EndpointDetails'
+  { -- | A dataflow endpoint.
+    endpoint :: Prelude.Maybe DataflowEndpoint,
+    -- | Endpoint security details including a list of subnets, a list of
+    -- security groups and a role to connect streams to instances.
+    securityDetails :: Prelude.Maybe SecurityDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EndpointDetails' 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', 'endpointDetails_endpoint' - A dataflow endpoint.
+--
+-- 'securityDetails', 'endpointDetails_securityDetails' - Endpoint security details including a list of subnets, a list of
+-- security groups and a role to connect streams to instances.
+newEndpointDetails ::
+  EndpointDetails
+newEndpointDetails =
+  EndpointDetails'
+    { endpoint = Prelude.Nothing,
+      securityDetails = Prelude.Nothing
+    }
+
+-- | A dataflow endpoint.
+endpointDetails_endpoint :: Lens.Lens' EndpointDetails (Prelude.Maybe DataflowEndpoint)
+endpointDetails_endpoint = Lens.lens (\EndpointDetails' {endpoint} -> endpoint) (\s@EndpointDetails' {} a -> s {endpoint = a} :: EndpointDetails)
+
+-- | Endpoint security details including a list of subnets, a list of
+-- security groups and a role to connect streams to instances.
+endpointDetails_securityDetails :: Lens.Lens' EndpointDetails (Prelude.Maybe SecurityDetails)
+endpointDetails_securityDetails = Lens.lens (\EndpointDetails' {securityDetails} -> securityDetails) (\s@EndpointDetails' {} a -> s {securityDetails = a} :: EndpointDetails)
+
+instance Data.FromJSON EndpointDetails where
+  parseJSON =
+    Data.withObject
+      "EndpointDetails"
+      ( \x ->
+          EndpointDetails'
+            Prelude.<$> (x Data..:? "endpoint")
+            Prelude.<*> (x Data..:? "securityDetails")
+      )
+
+instance Prelude.Hashable EndpointDetails where
+  hashWithSalt _salt EndpointDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` endpoint
+      `Prelude.hashWithSalt` securityDetails
+
+instance Prelude.NFData EndpointDetails where
+  rnf EndpointDetails' {..} =
+    Prelude.rnf endpoint
+      `Prelude.seq` Prelude.rnf securityDetails
+
+instance Data.ToJSON EndpointDetails where
+  toJSON EndpointDetails' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("endpoint" Data..=) Prelude.<$> endpoint,
+            ("securityDetails" Data..=)
+              Prelude.<$> securityDetails
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/EndpointStatus.hs b/gen/Amazonka/GroundStation/Types/EndpointStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EndpointStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.EndpointStatus
+-- 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.GroundStation.Types.EndpointStatus
+  ( EndpointStatus
+      ( ..,
+        EndpointStatus_Created,
+        EndpointStatus_Creating,
+        EndpointStatus_Deleted,
+        EndpointStatus_Deleting,
+        EndpointStatus_Failed
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EndpointStatus = EndpointStatus'
+  { fromEndpointStatus ::
+      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 EndpointStatus_Created :: EndpointStatus
+pattern EndpointStatus_Created = EndpointStatus' "created"
+
+pattern EndpointStatus_Creating :: EndpointStatus
+pattern EndpointStatus_Creating = EndpointStatus' "creating"
+
+pattern EndpointStatus_Deleted :: EndpointStatus
+pattern EndpointStatus_Deleted = EndpointStatus' "deleted"
+
+pattern EndpointStatus_Deleting :: EndpointStatus
+pattern EndpointStatus_Deleting = EndpointStatus' "deleting"
+
+pattern EndpointStatus_Failed :: EndpointStatus
+pattern EndpointStatus_Failed = EndpointStatus' "failed"
+
+{-# COMPLETE
+  EndpointStatus_Created,
+  EndpointStatus_Creating,
+  EndpointStatus_Deleted,
+  EndpointStatus_Deleting,
+  EndpointStatus_Failed,
+  EndpointStatus'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisData.hs b/gen/Amazonka/GroundStation/Types/EphemerisData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisData.hs
@@ -0,0 +1,82 @@
+{-# 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.GroundStation.Types.EphemerisData
+-- 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.GroundStation.Types.EphemerisData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.OEMEphemeris
+import Amazonka.GroundStation.Types.TLEEphemeris
+import qualified Amazonka.Prelude as Prelude
+
+-- | Ephemeris data.
+--
+-- /See:/ 'newEphemerisData' smart constructor.
+data EphemerisData = EphemerisData'
+  { oem :: Prelude.Maybe OEMEphemeris,
+    tle :: Prelude.Maybe TLEEphemeris
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisData' 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:
+--
+-- 'oem', 'ephemerisData_oem' - Undocumented member.
+--
+-- 'tle', 'ephemerisData_tle' - Undocumented member.
+newEphemerisData ::
+  EphemerisData
+newEphemerisData =
+  EphemerisData'
+    { oem = Prelude.Nothing,
+      tle = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+ephemerisData_oem :: Lens.Lens' EphemerisData (Prelude.Maybe OEMEphemeris)
+ephemerisData_oem = Lens.lens (\EphemerisData' {oem} -> oem) (\s@EphemerisData' {} a -> s {oem = a} :: EphemerisData)
+
+-- | Undocumented member.
+ephemerisData_tle :: Lens.Lens' EphemerisData (Prelude.Maybe TLEEphemeris)
+ephemerisData_tle = Lens.lens (\EphemerisData' {tle} -> tle) (\s@EphemerisData' {} a -> s {tle = a} :: EphemerisData)
+
+instance Prelude.Hashable EphemerisData where
+  hashWithSalt _salt EphemerisData' {..} =
+    _salt
+      `Prelude.hashWithSalt` oem
+      `Prelude.hashWithSalt` tle
+
+instance Prelude.NFData EphemerisData where
+  rnf EphemerisData' {..} =
+    Prelude.rnf oem `Prelude.seq` Prelude.rnf tle
+
+instance Data.ToJSON EphemerisData where
+  toJSON EphemerisData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("oem" Data..=) Prelude.<$> oem,
+            ("tle" Data..=) Prelude.<$> tle
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisDescription.hs b/gen/Amazonka/GroundStation/Types/EphemerisDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisDescription.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.EphemerisDescription
+-- 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.GroundStation.Types.EphemerisDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.S3Object
+import qualified Amazonka.Prelude as Prelude
+
+-- | Description of ephemeris.
+--
+-- /See:/ 'newEphemerisDescription' smart constructor.
+data EphemerisDescription = EphemerisDescription'
+  { -- | Supplied ephemeris data.
+    ephemerisData :: Prelude.Maybe Prelude.Text,
+    -- | Source S3 object used for the ephemeris.
+    sourceS3Object :: Prelude.Maybe S3Object
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisDescription' 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:
+--
+-- 'ephemerisData', 'ephemerisDescription_ephemerisData' - Supplied ephemeris data.
+--
+-- 'sourceS3Object', 'ephemerisDescription_sourceS3Object' - Source S3 object used for the ephemeris.
+newEphemerisDescription ::
+  EphemerisDescription
+newEphemerisDescription =
+  EphemerisDescription'
+    { ephemerisData =
+        Prelude.Nothing,
+      sourceS3Object = Prelude.Nothing
+    }
+
+-- | Supplied ephemeris data.
+ephemerisDescription_ephemerisData :: Lens.Lens' EphemerisDescription (Prelude.Maybe Prelude.Text)
+ephemerisDescription_ephemerisData = Lens.lens (\EphemerisDescription' {ephemerisData} -> ephemerisData) (\s@EphemerisDescription' {} a -> s {ephemerisData = a} :: EphemerisDescription)
+
+-- | Source S3 object used for the ephemeris.
+ephemerisDescription_sourceS3Object :: Lens.Lens' EphemerisDescription (Prelude.Maybe S3Object)
+ephemerisDescription_sourceS3Object = Lens.lens (\EphemerisDescription' {sourceS3Object} -> sourceS3Object) (\s@EphemerisDescription' {} a -> s {sourceS3Object = a} :: EphemerisDescription)
+
+instance Data.FromJSON EphemerisDescription where
+  parseJSON =
+    Data.withObject
+      "EphemerisDescription"
+      ( \x ->
+          EphemerisDescription'
+            Prelude.<$> (x Data..:? "ephemerisData")
+            Prelude.<*> (x Data..:? "sourceS3Object")
+      )
+
+instance Prelude.Hashable EphemerisDescription where
+  hashWithSalt _salt EphemerisDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` ephemerisData
+      `Prelude.hashWithSalt` sourceS3Object
+
+instance Prelude.NFData EphemerisDescription where
+  rnf EphemerisDescription' {..} =
+    Prelude.rnf ephemerisData
+      `Prelude.seq` Prelude.rnf sourceS3Object
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisIdResponse.hs b/gen/Amazonka/GroundStation/Types/EphemerisIdResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisIdResponse.hs
@@ -0,0 +1,67 @@
+{-# 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.GroundStation.Types.EphemerisIdResponse
+-- 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.GroundStation.Types.EphemerisIdResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | /See:/ 'newEphemerisIdResponse' smart constructor.
+data EphemerisIdResponse = EphemerisIdResponse'
+  { -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisIdResponse' 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:
+--
+-- 'ephemerisId', 'ephemerisIdResponse_ephemerisId' - The AWS Ground Station ephemeris ID.
+newEphemerisIdResponse ::
+  EphemerisIdResponse
+newEphemerisIdResponse =
+  EphemerisIdResponse' {ephemerisId = Prelude.Nothing}
+
+-- | The AWS Ground Station ephemeris ID.
+ephemerisIdResponse_ephemerisId :: Lens.Lens' EphemerisIdResponse (Prelude.Maybe Prelude.Text)
+ephemerisIdResponse_ephemerisId = Lens.lens (\EphemerisIdResponse' {ephemerisId} -> ephemerisId) (\s@EphemerisIdResponse' {} a -> s {ephemerisId = a} :: EphemerisIdResponse)
+
+instance Data.FromJSON EphemerisIdResponse where
+  parseJSON =
+    Data.withObject
+      "EphemerisIdResponse"
+      ( \x ->
+          EphemerisIdResponse'
+            Prelude.<$> (x Data..:? "ephemerisId")
+      )
+
+instance Prelude.Hashable EphemerisIdResponse where
+  hashWithSalt _salt EphemerisIdResponse' {..} =
+    _salt `Prelude.hashWithSalt` ephemerisId
+
+instance Prelude.NFData EphemerisIdResponse where
+  rnf EphemerisIdResponse' {..} =
+    Prelude.rnf ephemerisId
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisInvalidReason.hs b/gen/Amazonka/GroundStation/Types/EphemerisInvalidReason.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisInvalidReason.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.EphemerisInvalidReason
+-- 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.GroundStation.Types.EphemerisInvalidReason
+  ( EphemerisInvalidReason
+      ( ..,
+        EphemerisInvalidReason_KMS_KEY_INVALID,
+        EphemerisInvalidReason_METADATA_INVALID,
+        EphemerisInvalidReason_TIME_RANGE_INVALID,
+        EphemerisInvalidReason_TRAJECTORY_INVALID,
+        EphemerisInvalidReason_VALIDATION_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EphemerisInvalidReason = EphemerisInvalidReason'
+  { fromEphemerisInvalidReason ::
+      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 EphemerisInvalidReason_KMS_KEY_INVALID :: EphemerisInvalidReason
+pattern EphemerisInvalidReason_KMS_KEY_INVALID = EphemerisInvalidReason' "KMS_KEY_INVALID"
+
+pattern EphemerisInvalidReason_METADATA_INVALID :: EphemerisInvalidReason
+pattern EphemerisInvalidReason_METADATA_INVALID = EphemerisInvalidReason' "METADATA_INVALID"
+
+pattern EphemerisInvalidReason_TIME_RANGE_INVALID :: EphemerisInvalidReason
+pattern EphemerisInvalidReason_TIME_RANGE_INVALID = EphemerisInvalidReason' "TIME_RANGE_INVALID"
+
+pattern EphemerisInvalidReason_TRAJECTORY_INVALID :: EphemerisInvalidReason
+pattern EphemerisInvalidReason_TRAJECTORY_INVALID = EphemerisInvalidReason' "TRAJECTORY_INVALID"
+
+pattern EphemerisInvalidReason_VALIDATION_ERROR :: EphemerisInvalidReason
+pattern EphemerisInvalidReason_VALIDATION_ERROR = EphemerisInvalidReason' "VALIDATION_ERROR"
+
+{-# COMPLETE
+  EphemerisInvalidReason_KMS_KEY_INVALID,
+  EphemerisInvalidReason_METADATA_INVALID,
+  EphemerisInvalidReason_TIME_RANGE_INVALID,
+  EphemerisInvalidReason_TRAJECTORY_INVALID,
+  EphemerisInvalidReason_VALIDATION_ERROR,
+  EphemerisInvalidReason'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisItem.hs b/gen/Amazonka/GroundStation/Types/EphemerisItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisItem.hs
@@ -0,0 +1,167 @@
+{-# 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.GroundStation.Types.EphemerisItem
+-- 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.GroundStation.Types.EphemerisItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EphemerisStatus
+import Amazonka.GroundStation.Types.S3Object
+import qualified Amazonka.Prelude as Prelude
+
+-- | Ephemeris item.
+--
+-- /See:/ 'newEphemerisItem' smart constructor.
+data EphemerisItem = EphemerisItem'
+  { -- | The time the ephemeris was uploaded in UTC.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | Whether or not the ephemeris is enabled.
+    enabled :: Prelude.Maybe Prelude.Bool,
+    -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Maybe Prelude.Text,
+    -- | A name string associated with the ephemeris. Used as a human-readable
+    -- identifier for the ephemeris.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Customer-provided priority score to establish the order in which
+    -- overlapping ephemerides should be used.
+    --
+    -- The default for customer-provided ephemeris priority is 1, and higher
+    -- numbers take precedence.
+    --
+    -- Priority must be 1 or greater
+    priority :: Prelude.Maybe Prelude.Natural,
+    -- | Source S3 object used for the ephemeris.
+    sourceS3Object :: Prelude.Maybe S3Object,
+    -- | The status of the ephemeris.
+    status :: Prelude.Maybe EphemerisStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisItem' 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:
+--
+-- 'creationTime', 'ephemerisItem_creationTime' - The time the ephemeris was uploaded in UTC.
+--
+-- 'enabled', 'ephemerisItem_enabled' - Whether or not the ephemeris is enabled.
+--
+-- 'ephemerisId', 'ephemerisItem_ephemerisId' - The AWS Ground Station ephemeris ID.
+--
+-- 'name', 'ephemerisItem_name' - A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- 'priority', 'ephemerisItem_priority' - Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+--
+-- 'sourceS3Object', 'ephemerisItem_sourceS3Object' - Source S3 object used for the ephemeris.
+--
+-- 'status', 'ephemerisItem_status' - The status of the ephemeris.
+newEphemerisItem ::
+  EphemerisItem
+newEphemerisItem =
+  EphemerisItem'
+    { creationTime = Prelude.Nothing,
+      enabled = Prelude.Nothing,
+      ephemerisId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      priority = Prelude.Nothing,
+      sourceS3Object = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The time the ephemeris was uploaded in UTC.
+ephemerisItem_creationTime :: Lens.Lens' EphemerisItem (Prelude.Maybe Prelude.UTCTime)
+ephemerisItem_creationTime = Lens.lens (\EphemerisItem' {creationTime} -> creationTime) (\s@EphemerisItem' {} a -> s {creationTime = a} :: EphemerisItem) Prelude.. Lens.mapping Data._Time
+
+-- | Whether or not the ephemeris is enabled.
+ephemerisItem_enabled :: Lens.Lens' EphemerisItem (Prelude.Maybe Prelude.Bool)
+ephemerisItem_enabled = Lens.lens (\EphemerisItem' {enabled} -> enabled) (\s@EphemerisItem' {} a -> s {enabled = a} :: EphemerisItem)
+
+-- | The AWS Ground Station ephemeris ID.
+ephemerisItem_ephemerisId :: Lens.Lens' EphemerisItem (Prelude.Maybe Prelude.Text)
+ephemerisItem_ephemerisId = Lens.lens (\EphemerisItem' {ephemerisId} -> ephemerisId) (\s@EphemerisItem' {} a -> s {ephemerisId = a} :: EphemerisItem)
+
+-- | A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+ephemerisItem_name :: Lens.Lens' EphemerisItem (Prelude.Maybe Prelude.Text)
+ephemerisItem_name = Lens.lens (\EphemerisItem' {name} -> name) (\s@EphemerisItem' {} a -> s {name = a} :: EphemerisItem)
+
+-- | Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+ephemerisItem_priority :: Lens.Lens' EphemerisItem (Prelude.Maybe Prelude.Natural)
+ephemerisItem_priority = Lens.lens (\EphemerisItem' {priority} -> priority) (\s@EphemerisItem' {} a -> s {priority = a} :: EphemerisItem)
+
+-- | Source S3 object used for the ephemeris.
+ephemerisItem_sourceS3Object :: Lens.Lens' EphemerisItem (Prelude.Maybe S3Object)
+ephemerisItem_sourceS3Object = Lens.lens (\EphemerisItem' {sourceS3Object} -> sourceS3Object) (\s@EphemerisItem' {} a -> s {sourceS3Object = a} :: EphemerisItem)
+
+-- | The status of the ephemeris.
+ephemerisItem_status :: Lens.Lens' EphemerisItem (Prelude.Maybe EphemerisStatus)
+ephemerisItem_status = Lens.lens (\EphemerisItem' {status} -> status) (\s@EphemerisItem' {} a -> s {status = a} :: EphemerisItem)
+
+instance Data.FromJSON EphemerisItem where
+  parseJSON =
+    Data.withObject
+      "EphemerisItem"
+      ( \x ->
+          EphemerisItem'
+            Prelude.<$> (x Data..:? "creationTime")
+            Prelude.<*> (x Data..:? "enabled")
+            Prelude.<*> (x Data..:? "ephemerisId")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "priority")
+            Prelude.<*> (x Data..:? "sourceS3Object")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable EphemerisItem where
+  hashWithSalt _salt EphemerisItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` ephemerisId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` priority
+      `Prelude.hashWithSalt` sourceS3Object
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData EphemerisItem where
+  rnf EphemerisItem' {..} =
+    Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf ephemerisId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf priority
+      `Prelude.seq` Prelude.rnf sourceS3Object
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisMetaData.hs b/gen/Amazonka/GroundStation/Types/EphemerisMetaData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisMetaData.hs
@@ -0,0 +1,135 @@
+{-# 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.GroundStation.Types.EphemerisMetaData
+-- 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.GroundStation.Types.EphemerisMetaData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EphemerisSource
+import qualified Amazonka.Prelude as Prelude
+
+-- | Metadata describing a particular ephemeris.
+--
+-- /See:/ 'newEphemerisMetaData' smart constructor.
+data EphemerisMetaData = EphemerisMetaData'
+  { -- | UUID of a customer-provided ephemeris.
+    --
+    -- This field is not populated for default ephemerides from Space Track.
+    ephemerisId :: Prelude.Maybe Prelude.Text,
+    -- | The epoch of a default, ephemeris from Space Track in UTC.
+    --
+    -- This field is not populated for customer-provided ephemerides.
+    epoch :: Prelude.Maybe Data.POSIX,
+    -- | A name string associated with the ephemeris. Used as a human-readable
+    -- identifier for the ephemeris.
+    --
+    -- A name is only returned for customer-provider ephemerides that have a
+    -- name associated.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The @EphemerisSource@ that generated a given ephemeris.
+    source :: EphemerisSource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisMetaData' 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:
+--
+-- 'ephemerisId', 'ephemerisMetaData_ephemerisId' - UUID of a customer-provided ephemeris.
+--
+-- This field is not populated for default ephemerides from Space Track.
+--
+-- 'epoch', 'ephemerisMetaData_epoch' - The epoch of a default, ephemeris from Space Track in UTC.
+--
+-- This field is not populated for customer-provided ephemerides.
+--
+-- 'name', 'ephemerisMetaData_name' - A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- A name is only returned for customer-provider ephemerides that have a
+-- name associated.
+--
+-- 'source', 'ephemerisMetaData_source' - The @EphemerisSource@ that generated a given ephemeris.
+newEphemerisMetaData ::
+  -- | 'source'
+  EphemerisSource ->
+  EphemerisMetaData
+newEphemerisMetaData pSource_ =
+  EphemerisMetaData'
+    { ephemerisId = Prelude.Nothing,
+      epoch = Prelude.Nothing,
+      name = Prelude.Nothing,
+      source = pSource_
+    }
+
+-- | UUID of a customer-provided ephemeris.
+--
+-- This field is not populated for default ephemerides from Space Track.
+ephemerisMetaData_ephemerisId :: Lens.Lens' EphemerisMetaData (Prelude.Maybe Prelude.Text)
+ephemerisMetaData_ephemerisId = Lens.lens (\EphemerisMetaData' {ephemerisId} -> ephemerisId) (\s@EphemerisMetaData' {} a -> s {ephemerisId = a} :: EphemerisMetaData)
+
+-- | The epoch of a default, ephemeris from Space Track in UTC.
+--
+-- This field is not populated for customer-provided ephemerides.
+ephemerisMetaData_epoch :: Lens.Lens' EphemerisMetaData (Prelude.Maybe Prelude.UTCTime)
+ephemerisMetaData_epoch = Lens.lens (\EphemerisMetaData' {epoch} -> epoch) (\s@EphemerisMetaData' {} a -> s {epoch = a} :: EphemerisMetaData) Prelude.. Lens.mapping Data._Time
+
+-- | A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- A name is only returned for customer-provider ephemerides that have a
+-- name associated.
+ephemerisMetaData_name :: Lens.Lens' EphemerisMetaData (Prelude.Maybe Prelude.Text)
+ephemerisMetaData_name = Lens.lens (\EphemerisMetaData' {name} -> name) (\s@EphemerisMetaData' {} a -> s {name = a} :: EphemerisMetaData)
+
+-- | The @EphemerisSource@ that generated a given ephemeris.
+ephemerisMetaData_source :: Lens.Lens' EphemerisMetaData EphemerisSource
+ephemerisMetaData_source = Lens.lens (\EphemerisMetaData' {source} -> source) (\s@EphemerisMetaData' {} a -> s {source = a} :: EphemerisMetaData)
+
+instance Data.FromJSON EphemerisMetaData where
+  parseJSON =
+    Data.withObject
+      "EphemerisMetaData"
+      ( \x ->
+          EphemerisMetaData'
+            Prelude.<$> (x Data..:? "ephemerisId")
+            Prelude.<*> (x Data..:? "epoch")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..: "source")
+      )
+
+instance Prelude.Hashable EphemerisMetaData where
+  hashWithSalt _salt EphemerisMetaData' {..} =
+    _salt
+      `Prelude.hashWithSalt` ephemerisId
+      `Prelude.hashWithSalt` epoch
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` source
+
+instance Prelude.NFData EphemerisMetaData where
+  rnf EphemerisMetaData' {..} =
+    Prelude.rnf ephemerisId
+      `Prelude.seq` Prelude.rnf epoch
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf source
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisSource.hs b/gen/Amazonka/GroundStation/Types/EphemerisSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisSource.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.EphemerisSource
+-- 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.GroundStation.Types.EphemerisSource
+  ( EphemerisSource
+      ( ..,
+        EphemerisSource_CUSTOMER_PROVIDED,
+        EphemerisSource_SPACE_TRACK
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EphemerisSource = EphemerisSource'
+  { fromEphemerisSource ::
+      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 EphemerisSource_CUSTOMER_PROVIDED :: EphemerisSource
+pattern EphemerisSource_CUSTOMER_PROVIDED = EphemerisSource' "CUSTOMER_PROVIDED"
+
+pattern EphemerisSource_SPACE_TRACK :: EphemerisSource
+pattern EphemerisSource_SPACE_TRACK = EphemerisSource' "SPACE_TRACK"
+
+{-# COMPLETE
+  EphemerisSource_CUSTOMER_PROVIDED,
+  EphemerisSource_SPACE_TRACK,
+  EphemerisSource'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisStatus.hs b/gen/Amazonka/GroundStation/Types/EphemerisStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisStatus.hs
@@ -0,0 +1,91 @@
+{-# 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.GroundStation.Types.EphemerisStatus
+-- 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.GroundStation.Types.EphemerisStatus
+  ( EphemerisStatus
+      ( ..,
+        EphemerisStatus_DISABLED,
+        EphemerisStatus_ENABLED,
+        EphemerisStatus_ERROR,
+        EphemerisStatus_EXPIRED,
+        EphemerisStatus_INVALID,
+        EphemerisStatus_VALIDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EphemerisStatus = EphemerisStatus'
+  { fromEphemerisStatus ::
+      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 EphemerisStatus_DISABLED :: EphemerisStatus
+pattern EphemerisStatus_DISABLED = EphemerisStatus' "DISABLED"
+
+pattern EphemerisStatus_ENABLED :: EphemerisStatus
+pattern EphemerisStatus_ENABLED = EphemerisStatus' "ENABLED"
+
+pattern EphemerisStatus_ERROR :: EphemerisStatus
+pattern EphemerisStatus_ERROR = EphemerisStatus' "ERROR"
+
+pattern EphemerisStatus_EXPIRED :: EphemerisStatus
+pattern EphemerisStatus_EXPIRED = EphemerisStatus' "EXPIRED"
+
+pattern EphemerisStatus_INVALID :: EphemerisStatus
+pattern EphemerisStatus_INVALID = EphemerisStatus' "INVALID"
+
+pattern EphemerisStatus_VALIDATING :: EphemerisStatus
+pattern EphemerisStatus_VALIDATING = EphemerisStatus' "VALIDATING"
+
+{-# COMPLETE
+  EphemerisStatus_DISABLED,
+  EphemerisStatus_ENABLED,
+  EphemerisStatus_ERROR,
+  EphemerisStatus_EXPIRED,
+  EphemerisStatus_INVALID,
+  EphemerisStatus_VALIDATING,
+  EphemerisStatus'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/EphemerisTypeDescription.hs b/gen/Amazonka/GroundStation/Types/EphemerisTypeDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/EphemerisTypeDescription.hs
@@ -0,0 +1,82 @@
+{-# 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.GroundStation.Types.EphemerisTypeDescription
+-- 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.GroundStation.Types.EphemerisTypeDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EphemerisDescription
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newEphemerisTypeDescription' smart constructor.
+data EphemerisTypeDescription = EphemerisTypeDescription'
+  { oem :: Prelude.Maybe EphemerisDescription,
+    tle :: Prelude.Maybe EphemerisDescription
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EphemerisTypeDescription' 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:
+--
+-- 'oem', 'ephemerisTypeDescription_oem' - Undocumented member.
+--
+-- 'tle', 'ephemerisTypeDescription_tle' - Undocumented member.
+newEphemerisTypeDescription ::
+  EphemerisTypeDescription
+newEphemerisTypeDescription =
+  EphemerisTypeDescription'
+    { oem = Prelude.Nothing,
+      tle = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+ephemerisTypeDescription_oem :: Lens.Lens' EphemerisTypeDescription (Prelude.Maybe EphemerisDescription)
+ephemerisTypeDescription_oem = Lens.lens (\EphemerisTypeDescription' {oem} -> oem) (\s@EphemerisTypeDescription' {} a -> s {oem = a} :: EphemerisTypeDescription)
+
+-- | Undocumented member.
+ephemerisTypeDescription_tle :: Lens.Lens' EphemerisTypeDescription (Prelude.Maybe EphemerisDescription)
+ephemerisTypeDescription_tle = Lens.lens (\EphemerisTypeDescription' {tle} -> tle) (\s@EphemerisTypeDescription' {} a -> s {tle = a} :: EphemerisTypeDescription)
+
+instance Data.FromJSON EphemerisTypeDescription where
+  parseJSON =
+    Data.withObject
+      "EphemerisTypeDescription"
+      ( \x ->
+          EphemerisTypeDescription'
+            Prelude.<$> (x Data..:? "oem")
+            Prelude.<*> (x Data..:? "tle")
+      )
+
+instance Prelude.Hashable EphemerisTypeDescription where
+  hashWithSalt _salt EphemerisTypeDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` oem
+      `Prelude.hashWithSalt` tle
+
+instance Prelude.NFData EphemerisTypeDescription where
+  rnf EphemerisTypeDescription' {..} =
+    Prelude.rnf oem `Prelude.seq` Prelude.rnf tle
diff --git a/gen/Amazonka/GroundStation/Types/Frequency.hs b/gen/Amazonka/GroundStation/Types/Frequency.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Frequency.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.GroundStation.Types.Frequency
+-- 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.GroundStation.Types.Frequency where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.FrequencyUnits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that describes the frequency.
+--
+-- /See:/ 'newFrequency' smart constructor.
+data Frequency = Frequency'
+  { -- | Frequency units.
+    units :: FrequencyUnits,
+    -- | Frequency value. Valid values are between 2200 to 2300 MHz and 7750 to
+    -- 8400 MHz for downlink and 2025 to 2120 MHz for uplink.
+    value :: Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Frequency' 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:
+--
+-- 'units', 'frequency_units' - Frequency units.
+--
+-- 'value', 'frequency_value' - Frequency value. Valid values are between 2200 to 2300 MHz and 7750 to
+-- 8400 MHz for downlink and 2025 to 2120 MHz for uplink.
+newFrequency ::
+  -- | 'units'
+  FrequencyUnits ->
+  -- | 'value'
+  Prelude.Double ->
+  Frequency
+newFrequency pUnits_ pValue_ =
+  Frequency' {units = pUnits_, value = pValue_}
+
+-- | Frequency units.
+frequency_units :: Lens.Lens' Frequency FrequencyUnits
+frequency_units = Lens.lens (\Frequency' {units} -> units) (\s@Frequency' {} a -> s {units = a} :: Frequency)
+
+-- | Frequency value. Valid values are between 2200 to 2300 MHz and 7750 to
+-- 8400 MHz for downlink and 2025 to 2120 MHz for uplink.
+frequency_value :: Lens.Lens' Frequency Prelude.Double
+frequency_value = Lens.lens (\Frequency' {value} -> value) (\s@Frequency' {} a -> s {value = a} :: Frequency)
+
+instance Data.FromJSON Frequency where
+  parseJSON =
+    Data.withObject
+      "Frequency"
+      ( \x ->
+          Frequency'
+            Prelude.<$> (x Data..: "units")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable Frequency where
+  hashWithSalt _salt Frequency' {..} =
+    _salt
+      `Prelude.hashWithSalt` units
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Frequency where
+  rnf Frequency' {..} =
+    Prelude.rnf units `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Frequency where
+  toJSON Frequency' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("units" Data..= units),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/FrequencyBandwidth.hs b/gen/Amazonka/GroundStation/Types/FrequencyBandwidth.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/FrequencyBandwidth.hs
@@ -0,0 +1,127 @@
+{-# 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.GroundStation.Types.FrequencyBandwidth
+-- 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.GroundStation.Types.FrequencyBandwidth where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.BandwidthUnits
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that describes the frequency bandwidth.
+--
+-- /See:/ 'newFrequencyBandwidth' smart constructor.
+data FrequencyBandwidth = FrequencyBandwidth'
+  { -- | Frequency bandwidth units.
+    units :: BandwidthUnits,
+    -- | Frequency bandwidth value. AWS Ground Station currently has the
+    -- following bandwidth limitations:
+    --
+    -- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+    --     kHz to 650 MHz.
+    --
+    -- -   For @AntennaDownlinkconfig@, valid values are between 10 kHz to 54
+    --     MHz.
+    --
+    -- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+    --     MHz.
+    value :: Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FrequencyBandwidth' 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:
+--
+-- 'units', 'frequencyBandwidth_units' - Frequency bandwidth units.
+--
+-- 'value', 'frequencyBandwidth_value' - Frequency bandwidth value. AWS Ground Station currently has the
+-- following bandwidth limitations:
+--
+-- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+--     kHz to 650 MHz.
+--
+-- -   For @AntennaDownlinkconfig@, valid values are between 10 kHz to 54
+--     MHz.
+--
+-- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+--     MHz.
+newFrequencyBandwidth ::
+  -- | 'units'
+  BandwidthUnits ->
+  -- | 'value'
+  Prelude.Double ->
+  FrequencyBandwidth
+newFrequencyBandwidth pUnits_ pValue_ =
+  FrequencyBandwidth'
+    { units = pUnits_,
+      value = pValue_
+    }
+
+-- | Frequency bandwidth units.
+frequencyBandwidth_units :: Lens.Lens' FrequencyBandwidth BandwidthUnits
+frequencyBandwidth_units = Lens.lens (\FrequencyBandwidth' {units} -> units) (\s@FrequencyBandwidth' {} a -> s {units = a} :: FrequencyBandwidth)
+
+-- | Frequency bandwidth value. AWS Ground Station currently has the
+-- following bandwidth limitations:
+--
+-- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+--     kHz to 650 MHz.
+--
+-- -   For @AntennaDownlinkconfig@, valid values are between 10 kHz to 54
+--     MHz.
+--
+-- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+--     MHz.
+frequencyBandwidth_value :: Lens.Lens' FrequencyBandwidth Prelude.Double
+frequencyBandwidth_value = Lens.lens (\FrequencyBandwidth' {value} -> value) (\s@FrequencyBandwidth' {} a -> s {value = a} :: FrequencyBandwidth)
+
+instance Data.FromJSON FrequencyBandwidth where
+  parseJSON =
+    Data.withObject
+      "FrequencyBandwidth"
+      ( \x ->
+          FrequencyBandwidth'
+            Prelude.<$> (x Data..: "units")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable FrequencyBandwidth where
+  hashWithSalt _salt FrequencyBandwidth' {..} =
+    _salt
+      `Prelude.hashWithSalt` units
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData FrequencyBandwidth where
+  rnf FrequencyBandwidth' {..} =
+    Prelude.rnf units `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON FrequencyBandwidth where
+  toJSON FrequencyBandwidth' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("units" Data..= units),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/FrequencyUnits.hs b/gen/Amazonka/GroundStation/Types/FrequencyUnits.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/FrequencyUnits.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.FrequencyUnits
+-- 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.GroundStation.Types.FrequencyUnits
+  ( FrequencyUnits
+      ( ..,
+        FrequencyUnits_GHz,
+        FrequencyUnits_KHz,
+        FrequencyUnits_MHz
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FrequencyUnits = FrequencyUnits'
+  { fromFrequencyUnits ::
+      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 FrequencyUnits_GHz :: FrequencyUnits
+pattern FrequencyUnits_GHz = FrequencyUnits' "GHz"
+
+pattern FrequencyUnits_KHz :: FrequencyUnits
+pattern FrequencyUnits_KHz = FrequencyUnits' "kHz"
+
+pattern FrequencyUnits_MHz :: FrequencyUnits
+pattern FrequencyUnits_MHz = FrequencyUnits' "MHz"
+
+{-# COMPLETE
+  FrequencyUnits_GHz,
+  FrequencyUnits_KHz,
+  FrequencyUnits_MHz,
+  FrequencyUnits'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/GroundStationData.hs b/gen/Amazonka/GroundStation/Types/GroundStationData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/GroundStationData.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.GroundStation.Types.GroundStationData
+-- 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.GroundStation.Types.GroundStationData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the ground station data.
+--
+-- /See:/ 'newGroundStationData' smart constructor.
+data GroundStationData = GroundStationData'
+  { -- | UUID of a ground station.
+    groundStationId :: Prelude.Maybe Prelude.Text,
+    -- | Name of a ground station.
+    groundStationName :: Prelude.Maybe Prelude.Text,
+    -- | Ground station Region.
+    region :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GroundStationData' 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:
+--
+-- 'groundStationId', 'groundStationData_groundStationId' - UUID of a ground station.
+--
+-- 'groundStationName', 'groundStationData_groundStationName' - Name of a ground station.
+--
+-- 'region', 'groundStationData_region' - Ground station Region.
+newGroundStationData ::
+  GroundStationData
+newGroundStationData =
+  GroundStationData'
+    { groundStationId =
+        Prelude.Nothing,
+      groundStationName = Prelude.Nothing,
+      region = Prelude.Nothing
+    }
+
+-- | UUID of a ground station.
+groundStationData_groundStationId :: Lens.Lens' GroundStationData (Prelude.Maybe Prelude.Text)
+groundStationData_groundStationId = Lens.lens (\GroundStationData' {groundStationId} -> groundStationId) (\s@GroundStationData' {} a -> s {groundStationId = a} :: GroundStationData)
+
+-- | Name of a ground station.
+groundStationData_groundStationName :: Lens.Lens' GroundStationData (Prelude.Maybe Prelude.Text)
+groundStationData_groundStationName = Lens.lens (\GroundStationData' {groundStationName} -> groundStationName) (\s@GroundStationData' {} a -> s {groundStationName = a} :: GroundStationData)
+
+-- | Ground station Region.
+groundStationData_region :: Lens.Lens' GroundStationData (Prelude.Maybe Prelude.Text)
+groundStationData_region = Lens.lens (\GroundStationData' {region} -> region) (\s@GroundStationData' {} a -> s {region = a} :: GroundStationData)
+
+instance Data.FromJSON GroundStationData where
+  parseJSON =
+    Data.withObject
+      "GroundStationData"
+      ( \x ->
+          GroundStationData'
+            Prelude.<$> (x Data..:? "groundStationId")
+            Prelude.<*> (x Data..:? "groundStationName")
+            Prelude.<*> (x Data..:? "region")
+      )
+
+instance Prelude.Hashable GroundStationData where
+  hashWithSalt _salt GroundStationData' {..} =
+    _salt
+      `Prelude.hashWithSalt` groundStationId
+      `Prelude.hashWithSalt` groundStationName
+      `Prelude.hashWithSalt` region
+
+instance Prelude.NFData GroundStationData where
+  rnf GroundStationData' {..} =
+    Prelude.rnf groundStationId
+      `Prelude.seq` Prelude.rnf groundStationName
+      `Prelude.seq` Prelude.rnf region
diff --git a/gen/Amazonka/GroundStation/Types/MissionProfileIdResponse.hs b/gen/Amazonka/GroundStation/Types/MissionProfileIdResponse.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/MissionProfileIdResponse.hs
@@ -0,0 +1,72 @@
+{-# 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.GroundStation.Types.MissionProfileIdResponse
+-- 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.GroundStation.Types.MissionProfileIdResponse where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- |
+--
+-- /See:/ 'newMissionProfileIdResponse' smart constructor.
+data MissionProfileIdResponse = MissionProfileIdResponse'
+  { -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MissionProfileIdResponse' 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:
+--
+-- 'missionProfileId', 'missionProfileIdResponse_missionProfileId' - UUID of a mission profile.
+newMissionProfileIdResponse ::
+  MissionProfileIdResponse
+newMissionProfileIdResponse =
+  MissionProfileIdResponse'
+    { missionProfileId =
+        Prelude.Nothing
+    }
+
+-- | UUID of a mission profile.
+missionProfileIdResponse_missionProfileId :: Lens.Lens' MissionProfileIdResponse (Prelude.Maybe Prelude.Text)
+missionProfileIdResponse_missionProfileId = Lens.lens (\MissionProfileIdResponse' {missionProfileId} -> missionProfileId) (\s@MissionProfileIdResponse' {} a -> s {missionProfileId = a} :: MissionProfileIdResponse)
+
+instance Data.FromJSON MissionProfileIdResponse where
+  parseJSON =
+    Data.withObject
+      "MissionProfileIdResponse"
+      ( \x ->
+          MissionProfileIdResponse'
+            Prelude.<$> (x Data..:? "missionProfileId")
+      )
+
+instance Prelude.Hashable MissionProfileIdResponse where
+  hashWithSalt _salt MissionProfileIdResponse' {..} =
+    _salt `Prelude.hashWithSalt` missionProfileId
+
+instance Prelude.NFData MissionProfileIdResponse where
+  rnf MissionProfileIdResponse' {..} =
+    Prelude.rnf missionProfileId
diff --git a/gen/Amazonka/GroundStation/Types/MissionProfileListItem.hs b/gen/Amazonka/GroundStation/Types/MissionProfileListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/MissionProfileListItem.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.MissionProfileListItem
+-- 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.GroundStation.Types.MissionProfileListItem 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
+
+-- | Item in a list of mission profiles.
+--
+-- /See:/ 'newMissionProfileListItem' smart constructor.
+data MissionProfileListItem = MissionProfileListItem'
+  { -- | ARN of a mission profile.
+    missionProfileArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Maybe Prelude.Text,
+    -- | Name of a mission profile.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Region of a mission profile.
+    region :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MissionProfileListItem' 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:
+--
+-- 'missionProfileArn', 'missionProfileListItem_missionProfileArn' - ARN of a mission profile.
+--
+-- 'missionProfileId', 'missionProfileListItem_missionProfileId' - UUID of a mission profile.
+--
+-- 'name', 'missionProfileListItem_name' - Name of a mission profile.
+--
+-- 'region', 'missionProfileListItem_region' - Region of a mission profile.
+newMissionProfileListItem ::
+  MissionProfileListItem
+newMissionProfileListItem =
+  MissionProfileListItem'
+    { missionProfileArn =
+        Prelude.Nothing,
+      missionProfileId = Prelude.Nothing,
+      name = Prelude.Nothing,
+      region = Prelude.Nothing
+    }
+
+-- | ARN of a mission profile.
+missionProfileListItem_missionProfileArn :: Lens.Lens' MissionProfileListItem (Prelude.Maybe Prelude.Text)
+missionProfileListItem_missionProfileArn = Lens.lens (\MissionProfileListItem' {missionProfileArn} -> missionProfileArn) (\s@MissionProfileListItem' {} a -> s {missionProfileArn = a} :: MissionProfileListItem)
+
+-- | UUID of a mission profile.
+missionProfileListItem_missionProfileId :: Lens.Lens' MissionProfileListItem (Prelude.Maybe Prelude.Text)
+missionProfileListItem_missionProfileId = Lens.lens (\MissionProfileListItem' {missionProfileId} -> missionProfileId) (\s@MissionProfileListItem' {} a -> s {missionProfileId = a} :: MissionProfileListItem)
+
+-- | Name of a mission profile.
+missionProfileListItem_name :: Lens.Lens' MissionProfileListItem (Prelude.Maybe Prelude.Text)
+missionProfileListItem_name = Lens.lens (\MissionProfileListItem' {name} -> name) (\s@MissionProfileListItem' {} a -> s {name = a} :: MissionProfileListItem)
+
+-- | Region of a mission profile.
+missionProfileListItem_region :: Lens.Lens' MissionProfileListItem (Prelude.Maybe Prelude.Text)
+missionProfileListItem_region = Lens.lens (\MissionProfileListItem' {region} -> region) (\s@MissionProfileListItem' {} a -> s {region = a} :: MissionProfileListItem)
+
+instance Data.FromJSON MissionProfileListItem where
+  parseJSON =
+    Data.withObject
+      "MissionProfileListItem"
+      ( \x ->
+          MissionProfileListItem'
+            Prelude.<$> (x Data..:? "missionProfileArn")
+            Prelude.<*> (x Data..:? "missionProfileId")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "region")
+      )
+
+instance Prelude.Hashable MissionProfileListItem where
+  hashWithSalt _salt MissionProfileListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` missionProfileArn
+      `Prelude.hashWithSalt` missionProfileId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` region
+
+instance Prelude.NFData MissionProfileListItem where
+  rnf MissionProfileListItem' {..} =
+    Prelude.rnf missionProfileArn
+      `Prelude.seq` Prelude.rnf missionProfileId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf region
diff --git a/gen/Amazonka/GroundStation/Types/OEMEphemeris.hs b/gen/Amazonka/GroundStation/Types/OEMEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/OEMEphemeris.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.OEMEphemeris
+-- 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.GroundStation.Types.OEMEphemeris where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.S3Object
+import qualified Amazonka.Prelude as Prelude
+
+-- | Ephemeris data in Orbit Ephemeris Message (OEM) format.
+--
+-- /See:/ 'newOEMEphemeris' smart constructor.
+data OEMEphemeris = OEMEphemeris'
+  { -- | The data for an OEM ephemeris, supplied directly in the request rather
+    -- than through an S3 object.
+    oemData :: Prelude.Maybe Prelude.Text,
+    -- | Identifies the S3 object to be used as the ephemeris.
+    s3Object :: Prelude.Maybe S3Object
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OEMEphemeris' 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:
+--
+-- 'oemData', 'oEMEphemeris_oemData' - The data for an OEM ephemeris, supplied directly in the request rather
+-- than through an S3 object.
+--
+-- 's3Object', 'oEMEphemeris_s3Object' - Identifies the S3 object to be used as the ephemeris.
+newOEMEphemeris ::
+  OEMEphemeris
+newOEMEphemeris =
+  OEMEphemeris'
+    { oemData = Prelude.Nothing,
+      s3Object = Prelude.Nothing
+    }
+
+-- | The data for an OEM ephemeris, supplied directly in the request rather
+-- than through an S3 object.
+oEMEphemeris_oemData :: Lens.Lens' OEMEphemeris (Prelude.Maybe Prelude.Text)
+oEMEphemeris_oemData = Lens.lens (\OEMEphemeris' {oemData} -> oemData) (\s@OEMEphemeris' {} a -> s {oemData = a} :: OEMEphemeris)
+
+-- | Identifies the S3 object to be used as the ephemeris.
+oEMEphemeris_s3Object :: Lens.Lens' OEMEphemeris (Prelude.Maybe S3Object)
+oEMEphemeris_s3Object = Lens.lens (\OEMEphemeris' {s3Object} -> s3Object) (\s@OEMEphemeris' {} a -> s {s3Object = a} :: OEMEphemeris)
+
+instance Prelude.Hashable OEMEphemeris where
+  hashWithSalt _salt OEMEphemeris' {..} =
+    _salt
+      `Prelude.hashWithSalt` oemData
+      `Prelude.hashWithSalt` s3Object
+
+instance Prelude.NFData OEMEphemeris where
+  rnf OEMEphemeris' {..} =
+    Prelude.rnf oemData
+      `Prelude.seq` Prelude.rnf s3Object
+
+instance Data.ToJSON OEMEphemeris where
+  toJSON OEMEphemeris' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("oemData" Data..=) Prelude.<$> oemData,
+            ("s3Object" Data..=) Prelude.<$> s3Object
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/Polarization.hs b/gen/Amazonka/GroundStation/Types/Polarization.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Polarization.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.Polarization
+-- 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.GroundStation.Types.Polarization
+  ( Polarization
+      ( ..,
+        Polarization_LEFT_HAND,
+        Polarization_NONE,
+        Polarization_RIGHT_HAND
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Polarization = Polarization'
+  { fromPolarization ::
+      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 Polarization_LEFT_HAND :: Polarization
+pattern Polarization_LEFT_HAND = Polarization' "LEFT_HAND"
+
+pattern Polarization_NONE :: Polarization
+pattern Polarization_NONE = Polarization' "NONE"
+
+pattern Polarization_RIGHT_HAND :: Polarization
+pattern Polarization_RIGHT_HAND = Polarization' "RIGHT_HAND"
+
+{-# COMPLETE
+  Polarization_LEFT_HAND,
+  Polarization_NONE,
+  Polarization_RIGHT_HAND,
+  Polarization'
+  #-}
diff --git a/gen/Amazonka/GroundStation/Types/S3Object.hs b/gen/Amazonka/GroundStation/Types/S3Object.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/S3Object.hs
@@ -0,0 +1,106 @@
+{-# 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.GroundStation.Types.S3Object
+-- 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.GroundStation.Types.S3Object 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
+
+-- | Object stored in S3 containing ephemeris data.
+--
+-- /See:/ 'newS3Object' smart constructor.
+data S3Object = S3Object'
+  { -- | An Amazon S3 Bucket name.
+    bucket :: Prelude.Maybe Prelude.Text,
+    -- | An Amazon S3 key for the ephemeris.
+    key :: Prelude.Maybe Prelude.Text,
+    -- | For versioned S3 objects, the version to use for the ephemeris.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Object' 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:
+--
+-- 'bucket', 's3Object_bucket' - An Amazon S3 Bucket name.
+--
+-- 'key', 's3Object_key' - An Amazon S3 key for the ephemeris.
+--
+-- 'version', 's3Object_version' - For versioned S3 objects, the version to use for the ephemeris.
+newS3Object ::
+  S3Object
+newS3Object =
+  S3Object'
+    { bucket = Prelude.Nothing,
+      key = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | An Amazon S3 Bucket name.
+s3Object_bucket :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_bucket = Lens.lens (\S3Object' {bucket} -> bucket) (\s@S3Object' {} a -> s {bucket = a} :: S3Object)
+
+-- | An Amazon S3 key for the ephemeris.
+s3Object_key :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_key = Lens.lens (\S3Object' {key} -> key) (\s@S3Object' {} a -> s {key = a} :: S3Object)
+
+-- | For versioned S3 objects, the version to use for the ephemeris.
+s3Object_version :: Lens.Lens' S3Object (Prelude.Maybe Prelude.Text)
+s3Object_version = Lens.lens (\S3Object' {version} -> version) (\s@S3Object' {} a -> s {version = a} :: S3Object)
+
+instance Data.FromJSON S3Object where
+  parseJSON =
+    Data.withObject
+      "S3Object"
+      ( \x ->
+          S3Object'
+            Prelude.<$> (x Data..:? "bucket")
+            Prelude.<*> (x Data..:? "key")
+            Prelude.<*> (x Data..:? "version")
+      )
+
+instance Prelude.Hashable S3Object where
+  hashWithSalt _salt S3Object' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData S3Object where
+  rnf S3Object' {..} =
+    Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf key
+      `Prelude.seq` Prelude.rnf version
+
+instance Data.ToJSON S3Object where
+  toJSON S3Object' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("bucket" Data..=) Prelude.<$> bucket,
+            ("key" Data..=) Prelude.<$> key,
+            ("version" Data..=) Prelude.<$> version
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/S3RecordingConfig.hs b/gen/Amazonka/GroundStation/Types/S3RecordingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/S3RecordingConfig.hs
@@ -0,0 +1,110 @@
+{-# 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.GroundStation.Types.S3RecordingConfig
+-- 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.GroundStation.Types.S3RecordingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an S3 recording @Config@.
+--
+-- /See:/ 'newS3RecordingConfig' smart constructor.
+data S3RecordingConfig = S3RecordingConfig'
+  { -- | S3 Key prefix to prefice data files.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | ARN of the bucket to record to.
+    bucketArn :: Prelude.Text,
+    -- | ARN of the role Ground Station assumes to write data to the bucket.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3RecordingConfig' 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:
+--
+-- 'prefix', 's3RecordingConfig_prefix' - S3 Key prefix to prefice data files.
+--
+-- 'bucketArn', 's3RecordingConfig_bucketArn' - ARN of the bucket to record to.
+--
+-- 'roleArn', 's3RecordingConfig_roleArn' - ARN of the role Ground Station assumes to write data to the bucket.
+newS3RecordingConfig ::
+  -- | 'bucketArn'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  S3RecordingConfig
+newS3RecordingConfig pBucketArn_ pRoleArn_ =
+  S3RecordingConfig'
+    { prefix = Prelude.Nothing,
+      bucketArn = pBucketArn_,
+      roleArn = pRoleArn_
+    }
+
+-- | S3 Key prefix to prefice data files.
+s3RecordingConfig_prefix :: Lens.Lens' S3RecordingConfig (Prelude.Maybe Prelude.Text)
+s3RecordingConfig_prefix = Lens.lens (\S3RecordingConfig' {prefix} -> prefix) (\s@S3RecordingConfig' {} a -> s {prefix = a} :: S3RecordingConfig)
+
+-- | ARN of the bucket to record to.
+s3RecordingConfig_bucketArn :: Lens.Lens' S3RecordingConfig Prelude.Text
+s3RecordingConfig_bucketArn = Lens.lens (\S3RecordingConfig' {bucketArn} -> bucketArn) (\s@S3RecordingConfig' {} a -> s {bucketArn = a} :: S3RecordingConfig)
+
+-- | ARN of the role Ground Station assumes to write data to the bucket.
+s3RecordingConfig_roleArn :: Lens.Lens' S3RecordingConfig Prelude.Text
+s3RecordingConfig_roleArn = Lens.lens (\S3RecordingConfig' {roleArn} -> roleArn) (\s@S3RecordingConfig' {} a -> s {roleArn = a} :: S3RecordingConfig)
+
+instance Data.FromJSON S3RecordingConfig where
+  parseJSON =
+    Data.withObject
+      "S3RecordingConfig"
+      ( \x ->
+          S3RecordingConfig'
+            Prelude.<$> (x Data..:? "prefix")
+            Prelude.<*> (x Data..: "bucketArn")
+            Prelude.<*> (x Data..: "roleArn")
+      )
+
+instance Prelude.Hashable S3RecordingConfig where
+  hashWithSalt _salt S3RecordingConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` bucketArn
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData S3RecordingConfig where
+  rnf S3RecordingConfig' {..} =
+    Prelude.rnf prefix
+      `Prelude.seq` Prelude.rnf bucketArn
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToJSON S3RecordingConfig where
+  toJSON S3RecordingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("prefix" Data..=) Prelude.<$> prefix,
+            Prelude.Just ("bucketArn" Data..= bucketArn),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/S3RecordingDetails.hs b/gen/Amazonka/GroundStation/Types/S3RecordingDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/S3RecordingDetails.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.S3RecordingDetails
+-- 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.GroundStation.Types.S3RecordingDetails 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
+
+-- | Details about an S3 recording @Config@ used in a contact.
+--
+-- /See:/ 'newS3RecordingDetails' smart constructor.
+data S3RecordingDetails = S3RecordingDetails'
+  { -- | ARN of the bucket used.
+    bucketArn :: Prelude.Maybe Prelude.Text,
+    -- | Key template used for the S3 Recording Configuration
+    keyTemplate :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3RecordingDetails' 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:
+--
+-- 'bucketArn', 's3RecordingDetails_bucketArn' - ARN of the bucket used.
+--
+-- 'keyTemplate', 's3RecordingDetails_keyTemplate' - Key template used for the S3 Recording Configuration
+newS3RecordingDetails ::
+  S3RecordingDetails
+newS3RecordingDetails =
+  S3RecordingDetails'
+    { bucketArn = Prelude.Nothing,
+      keyTemplate = Prelude.Nothing
+    }
+
+-- | ARN of the bucket used.
+s3RecordingDetails_bucketArn :: Lens.Lens' S3RecordingDetails (Prelude.Maybe Prelude.Text)
+s3RecordingDetails_bucketArn = Lens.lens (\S3RecordingDetails' {bucketArn} -> bucketArn) (\s@S3RecordingDetails' {} a -> s {bucketArn = a} :: S3RecordingDetails)
+
+-- | Key template used for the S3 Recording Configuration
+s3RecordingDetails_keyTemplate :: Lens.Lens' S3RecordingDetails (Prelude.Maybe Prelude.Text)
+s3RecordingDetails_keyTemplate = Lens.lens (\S3RecordingDetails' {keyTemplate} -> keyTemplate) (\s@S3RecordingDetails' {} a -> s {keyTemplate = a} :: S3RecordingDetails)
+
+instance Data.FromJSON S3RecordingDetails where
+  parseJSON =
+    Data.withObject
+      "S3RecordingDetails"
+      ( \x ->
+          S3RecordingDetails'
+            Prelude.<$> (x Data..:? "bucketArn")
+            Prelude.<*> (x Data..:? "keyTemplate")
+      )
+
+instance Prelude.Hashable S3RecordingDetails where
+  hashWithSalt _salt S3RecordingDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucketArn
+      `Prelude.hashWithSalt` keyTemplate
+
+instance Prelude.NFData S3RecordingDetails where
+  rnf S3RecordingDetails' {..} =
+    Prelude.rnf bucketArn
+      `Prelude.seq` Prelude.rnf keyTemplate
diff --git a/gen/Amazonka/GroundStation/Types/SatelliteListItem.hs b/gen/Amazonka/GroundStation/Types/SatelliteListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/SatelliteListItem.hs
@@ -0,0 +1,125 @@
+{-# 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.GroundStation.Types.SatelliteListItem
+-- 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.GroundStation.Types.SatelliteListItem where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.EphemerisMetaData
+import qualified Amazonka.Prelude as Prelude
+
+-- | Item in a list of satellites.
+--
+-- /See:/ 'newSatelliteListItem' smart constructor.
+data SatelliteListItem = SatelliteListItem'
+  { -- | The current ephemeris being used to compute the trajectory of the
+    -- satellite.
+    currentEphemeris :: Prelude.Maybe EphemerisMetaData,
+    -- | A list of ground stations to which the satellite is on-boarded.
+    groundStations :: Prelude.Maybe [Prelude.Text],
+    -- | NORAD satellite ID number.
+    noradSatelliteID :: Prelude.Maybe Prelude.Natural,
+    -- | ARN of a satellite.
+    satelliteArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a satellite.
+    satelliteId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SatelliteListItem' 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:
+--
+-- 'currentEphemeris', 'satelliteListItem_currentEphemeris' - The current ephemeris being used to compute the trajectory of the
+-- satellite.
+--
+-- 'groundStations', 'satelliteListItem_groundStations' - A list of ground stations to which the satellite is on-boarded.
+--
+-- 'noradSatelliteID', 'satelliteListItem_noradSatelliteID' - NORAD satellite ID number.
+--
+-- 'satelliteArn', 'satelliteListItem_satelliteArn' - ARN of a satellite.
+--
+-- 'satelliteId', 'satelliteListItem_satelliteId' - UUID of a satellite.
+newSatelliteListItem ::
+  SatelliteListItem
+newSatelliteListItem =
+  SatelliteListItem'
+    { currentEphemeris =
+        Prelude.Nothing,
+      groundStations = Prelude.Nothing,
+      noradSatelliteID = Prelude.Nothing,
+      satelliteArn = Prelude.Nothing,
+      satelliteId = Prelude.Nothing
+    }
+
+-- | The current ephemeris being used to compute the trajectory of the
+-- satellite.
+satelliteListItem_currentEphemeris :: Lens.Lens' SatelliteListItem (Prelude.Maybe EphemerisMetaData)
+satelliteListItem_currentEphemeris = Lens.lens (\SatelliteListItem' {currentEphemeris} -> currentEphemeris) (\s@SatelliteListItem' {} a -> s {currentEphemeris = a} :: SatelliteListItem)
+
+-- | A list of ground stations to which the satellite is on-boarded.
+satelliteListItem_groundStations :: Lens.Lens' SatelliteListItem (Prelude.Maybe [Prelude.Text])
+satelliteListItem_groundStations = Lens.lens (\SatelliteListItem' {groundStations} -> groundStations) (\s@SatelliteListItem' {} a -> s {groundStations = a} :: SatelliteListItem) Prelude.. Lens.mapping Lens.coerced
+
+-- | NORAD satellite ID number.
+satelliteListItem_noradSatelliteID :: Lens.Lens' SatelliteListItem (Prelude.Maybe Prelude.Natural)
+satelliteListItem_noradSatelliteID = Lens.lens (\SatelliteListItem' {noradSatelliteID} -> noradSatelliteID) (\s@SatelliteListItem' {} a -> s {noradSatelliteID = a} :: SatelliteListItem)
+
+-- | ARN of a satellite.
+satelliteListItem_satelliteArn :: Lens.Lens' SatelliteListItem (Prelude.Maybe Prelude.Text)
+satelliteListItem_satelliteArn = Lens.lens (\SatelliteListItem' {satelliteArn} -> satelliteArn) (\s@SatelliteListItem' {} a -> s {satelliteArn = a} :: SatelliteListItem)
+
+-- | UUID of a satellite.
+satelliteListItem_satelliteId :: Lens.Lens' SatelliteListItem (Prelude.Maybe Prelude.Text)
+satelliteListItem_satelliteId = Lens.lens (\SatelliteListItem' {satelliteId} -> satelliteId) (\s@SatelliteListItem' {} a -> s {satelliteId = a} :: SatelliteListItem)
+
+instance Data.FromJSON SatelliteListItem where
+  parseJSON =
+    Data.withObject
+      "SatelliteListItem"
+      ( \x ->
+          SatelliteListItem'
+            Prelude.<$> (x Data..:? "currentEphemeris")
+            Prelude.<*> (x Data..:? "groundStations" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "noradSatelliteID")
+            Prelude.<*> (x Data..:? "satelliteArn")
+            Prelude.<*> (x Data..:? "satelliteId")
+      )
+
+instance Prelude.Hashable SatelliteListItem where
+  hashWithSalt _salt SatelliteListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` currentEphemeris
+      `Prelude.hashWithSalt` groundStations
+      `Prelude.hashWithSalt` noradSatelliteID
+      `Prelude.hashWithSalt` satelliteArn
+      `Prelude.hashWithSalt` satelliteId
+
+instance Prelude.NFData SatelliteListItem where
+  rnf SatelliteListItem' {..} =
+    Prelude.rnf currentEphemeris
+      `Prelude.seq` Prelude.rnf groundStations
+      `Prelude.seq` Prelude.rnf noradSatelliteID
+      `Prelude.seq` Prelude.rnf satelliteArn
+      `Prelude.seq` Prelude.rnf satelliteId
diff --git a/gen/Amazonka/GroundStation/Types/SecurityDetails.hs b/gen/Amazonka/GroundStation/Types/SecurityDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/SecurityDetails.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.SecurityDetails
+-- 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.GroundStation.Types.SecurityDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about endpoints.
+--
+-- /See:/ 'newSecurityDetails' smart constructor.
+data SecurityDetails = SecurityDetails'
+  { -- | ARN to a role needed for connecting streams to your instances.
+    roleArn :: Prelude.Text,
+    -- | The security groups to attach to the elastic network interfaces.
+    securityGroupIds :: [Prelude.Text],
+    -- | A list of subnets where AWS Ground Station places elastic network
+    -- interfaces to send streams to your instances.
+    subnetIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SecurityDetails' 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:
+--
+-- 'roleArn', 'securityDetails_roleArn' - ARN to a role needed for connecting streams to your instances.
+--
+-- 'securityGroupIds', 'securityDetails_securityGroupIds' - The security groups to attach to the elastic network interfaces.
+--
+-- 'subnetIds', 'securityDetails_subnetIds' - A list of subnets where AWS Ground Station places elastic network
+-- interfaces to send streams to your instances.
+newSecurityDetails ::
+  -- | 'roleArn'
+  Prelude.Text ->
+  SecurityDetails
+newSecurityDetails pRoleArn_ =
+  SecurityDetails'
+    { roleArn = pRoleArn_,
+      securityGroupIds = Prelude.mempty,
+      subnetIds = Prelude.mempty
+    }
+
+-- | ARN to a role needed for connecting streams to your instances.
+securityDetails_roleArn :: Lens.Lens' SecurityDetails Prelude.Text
+securityDetails_roleArn = Lens.lens (\SecurityDetails' {roleArn} -> roleArn) (\s@SecurityDetails' {} a -> s {roleArn = a} :: SecurityDetails)
+
+-- | The security groups to attach to the elastic network interfaces.
+securityDetails_securityGroupIds :: Lens.Lens' SecurityDetails [Prelude.Text]
+securityDetails_securityGroupIds = Lens.lens (\SecurityDetails' {securityGroupIds} -> securityGroupIds) (\s@SecurityDetails' {} a -> s {securityGroupIds = a} :: SecurityDetails) Prelude.. Lens.coerced
+
+-- | A list of subnets where AWS Ground Station places elastic network
+-- interfaces to send streams to your instances.
+securityDetails_subnetIds :: Lens.Lens' SecurityDetails [Prelude.Text]
+securityDetails_subnetIds = Lens.lens (\SecurityDetails' {subnetIds} -> subnetIds) (\s@SecurityDetails' {} a -> s {subnetIds = a} :: SecurityDetails) Prelude.. Lens.coerced
+
+instance Data.FromJSON SecurityDetails where
+  parseJSON =
+    Data.withObject
+      "SecurityDetails"
+      ( \x ->
+          SecurityDetails'
+            Prelude.<$> (x Data..: "roleArn")
+            Prelude.<*> ( x
+                            Data..:? "securityGroupIds"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "subnetIds" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable SecurityDetails where
+  hashWithSalt _salt SecurityDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` securityGroupIds
+      `Prelude.hashWithSalt` subnetIds
+
+instance Prelude.NFData SecurityDetails where
+  rnf SecurityDetails' {..} =
+    Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf securityGroupIds
+      `Prelude.seq` Prelude.rnf subnetIds
+
+instance Data.ToJSON SecurityDetails where
+  toJSON SecurityDetails' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("roleArn" Data..= roleArn),
+            Prelude.Just
+              ("securityGroupIds" Data..= securityGroupIds),
+            Prelude.Just ("subnetIds" Data..= subnetIds)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/SocketAddress.hs b/gen/Amazonka/GroundStation/Types/SocketAddress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/SocketAddress.hs
@@ -0,0 +1,93 @@
+{-# 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.GroundStation.Types.SocketAddress
+-- 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.GroundStation.Types.SocketAddress where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the socket address.
+--
+-- /See:/ 'newSocketAddress' smart constructor.
+data SocketAddress = SocketAddress'
+  { -- | Name of a socket address.
+    name :: Prelude.Text,
+    -- | Port of a socket address.
+    port :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SocketAddress' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'socketAddress_name' - Name of a socket address.
+--
+-- 'port', 'socketAddress_port' - Port of a socket address.
+newSocketAddress ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'port'
+  Prelude.Int ->
+  SocketAddress
+newSocketAddress pName_ pPort_ =
+  SocketAddress' {name = pName_, port = pPort_}
+
+-- | Name of a socket address.
+socketAddress_name :: Lens.Lens' SocketAddress Prelude.Text
+socketAddress_name = Lens.lens (\SocketAddress' {name} -> name) (\s@SocketAddress' {} a -> s {name = a} :: SocketAddress)
+
+-- | Port of a socket address.
+socketAddress_port :: Lens.Lens' SocketAddress Prelude.Int
+socketAddress_port = Lens.lens (\SocketAddress' {port} -> port) (\s@SocketAddress' {} a -> s {port = a} :: SocketAddress)
+
+instance Data.FromJSON SocketAddress where
+  parseJSON =
+    Data.withObject
+      "SocketAddress"
+      ( \x ->
+          SocketAddress'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "port")
+      )
+
+instance Prelude.Hashable SocketAddress where
+  hashWithSalt _salt SocketAddress' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` port
+
+instance Prelude.NFData SocketAddress where
+  rnf SocketAddress' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf port
+
+instance Data.ToJSON SocketAddress where
+  toJSON SocketAddress' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just ("port" Data..= port)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/Source.hs b/gen/Amazonka/GroundStation/Types/Source.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/Source.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.Source
+-- 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.GroundStation.Types.Source where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.ConfigCapabilityType
+import Amazonka.GroundStation.Types.ConfigDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Dataflow details for the source side.
+--
+-- /See:/ 'newSource' smart constructor.
+data Source = Source'
+  { -- | Additional details for a @Config@, if type is @dataflow-endpoint@ or
+    -- @antenna-downlink-demod-decode@
+    configDetails :: Prelude.Maybe ConfigDetails,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Maybe Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: Prelude.Maybe ConfigCapabilityType,
+    -- | Region of a dataflow source.
+    dataflowSourceRegion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Source' 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:
+--
+-- 'configDetails', 'source_configDetails' - Additional details for a @Config@, if type is @dataflow-endpoint@ or
+-- @antenna-downlink-demod-decode@
+--
+-- 'configId', 'source_configId' - UUID of a @Config@.
+--
+-- 'configType', 'source_configType' - Type of a @Config@.
+--
+-- 'dataflowSourceRegion', 'source_dataflowSourceRegion' - Region of a dataflow source.
+newSource ::
+  Source
+newSource =
+  Source'
+    { configDetails = Prelude.Nothing,
+      configId = Prelude.Nothing,
+      configType = Prelude.Nothing,
+      dataflowSourceRegion = Prelude.Nothing
+    }
+
+-- | Additional details for a @Config@, if type is @dataflow-endpoint@ or
+-- @antenna-downlink-demod-decode@
+source_configDetails :: Lens.Lens' Source (Prelude.Maybe ConfigDetails)
+source_configDetails = Lens.lens (\Source' {configDetails} -> configDetails) (\s@Source' {} a -> s {configDetails = a} :: Source)
+
+-- | UUID of a @Config@.
+source_configId :: Lens.Lens' Source (Prelude.Maybe Prelude.Text)
+source_configId = Lens.lens (\Source' {configId} -> configId) (\s@Source' {} a -> s {configId = a} :: Source)
+
+-- | Type of a @Config@.
+source_configType :: Lens.Lens' Source (Prelude.Maybe ConfigCapabilityType)
+source_configType = Lens.lens (\Source' {configType} -> configType) (\s@Source' {} a -> s {configType = a} :: Source)
+
+-- | Region of a dataflow source.
+source_dataflowSourceRegion :: Lens.Lens' Source (Prelude.Maybe Prelude.Text)
+source_dataflowSourceRegion = Lens.lens (\Source' {dataflowSourceRegion} -> dataflowSourceRegion) (\s@Source' {} a -> s {dataflowSourceRegion = a} :: Source)
+
+instance Data.FromJSON Source where
+  parseJSON =
+    Data.withObject
+      "Source"
+      ( \x ->
+          Source'
+            Prelude.<$> (x Data..:? "configDetails")
+            Prelude.<*> (x Data..:? "configId")
+            Prelude.<*> (x Data..:? "configType")
+            Prelude.<*> (x Data..:? "dataflowSourceRegion")
+      )
+
+instance Prelude.Hashable Source where
+  hashWithSalt _salt Source' {..} =
+    _salt
+      `Prelude.hashWithSalt` configDetails
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+      `Prelude.hashWithSalt` dataflowSourceRegion
+
+instance Prelude.NFData Source where
+  rnf Source' {..} =
+    Prelude.rnf configDetails
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+      `Prelude.seq` Prelude.rnf dataflowSourceRegion
diff --git a/gen/Amazonka/GroundStation/Types/SpectrumConfig.hs b/gen/Amazonka/GroundStation/Types/SpectrumConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/SpectrumConfig.hs
@@ -0,0 +1,153 @@
+{-# 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.GroundStation.Types.SpectrumConfig
+-- 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.GroundStation.Types.SpectrumConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.Frequency
+import Amazonka.GroundStation.Types.FrequencyBandwidth
+import Amazonka.GroundStation.Types.Polarization
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that describes a spectral @Config@.
+--
+-- /See:/ 'newSpectrumConfig' smart constructor.
+data SpectrumConfig = SpectrumConfig'
+  { -- | Polarization of a spectral @Config@. Capturing both @\"RIGHT_HAND\"@ and
+    -- @\"LEFT_HAND\"@ polarization requires two separate configs.
+    polarization :: Prelude.Maybe Polarization,
+    -- | Bandwidth of a spectral @Config@. AWS Ground Station currently has the
+    -- following bandwidth limitations:
+    --
+    -- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+    --     kHz to 650 MHz.
+    --
+    -- -   For @AntennaDownlinkconfig@ valid values are between 10 kHz to 54
+    --     MHz.
+    --
+    -- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+    --     MHz.
+    bandwidth :: FrequencyBandwidth,
+    -- | Center frequency of a spectral @Config@. Valid values are between 2200
+    -- to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for
+    -- uplink.
+    centerFrequency :: Frequency
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SpectrumConfig' 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:
+--
+-- 'polarization', 'spectrumConfig_polarization' - Polarization of a spectral @Config@. Capturing both @\"RIGHT_HAND\"@ and
+-- @\"LEFT_HAND\"@ polarization requires two separate configs.
+--
+-- 'bandwidth', 'spectrumConfig_bandwidth' - Bandwidth of a spectral @Config@. AWS Ground Station currently has the
+-- following bandwidth limitations:
+--
+-- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+--     kHz to 650 MHz.
+--
+-- -   For @AntennaDownlinkconfig@ valid values are between 10 kHz to 54
+--     MHz.
+--
+-- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+--     MHz.
+--
+-- 'centerFrequency', 'spectrumConfig_centerFrequency' - Center frequency of a spectral @Config@. Valid values are between 2200
+-- to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for
+-- uplink.
+newSpectrumConfig ::
+  -- | 'bandwidth'
+  FrequencyBandwidth ->
+  -- | 'centerFrequency'
+  Frequency ->
+  SpectrumConfig
+newSpectrumConfig pBandwidth_ pCenterFrequency_ =
+  SpectrumConfig'
+    { polarization = Prelude.Nothing,
+      bandwidth = pBandwidth_,
+      centerFrequency = pCenterFrequency_
+    }
+
+-- | Polarization of a spectral @Config@. Capturing both @\"RIGHT_HAND\"@ and
+-- @\"LEFT_HAND\"@ polarization requires two separate configs.
+spectrumConfig_polarization :: Lens.Lens' SpectrumConfig (Prelude.Maybe Polarization)
+spectrumConfig_polarization = Lens.lens (\SpectrumConfig' {polarization} -> polarization) (\s@SpectrumConfig' {} a -> s {polarization = a} :: SpectrumConfig)
+
+-- | Bandwidth of a spectral @Config@. AWS Ground Station currently has the
+-- following bandwidth limitations:
+--
+-- -   For @AntennaDownlinkDemodDecodeconfig@, valid values are between 125
+--     kHz to 650 MHz.
+--
+-- -   For @AntennaDownlinkconfig@ valid values are between 10 kHz to 54
+--     MHz.
+--
+-- -   For @AntennaUplinkConfig@, valid values are between 10 kHz to 54
+--     MHz.
+spectrumConfig_bandwidth :: Lens.Lens' SpectrumConfig FrequencyBandwidth
+spectrumConfig_bandwidth = Lens.lens (\SpectrumConfig' {bandwidth} -> bandwidth) (\s@SpectrumConfig' {} a -> s {bandwidth = a} :: SpectrumConfig)
+
+-- | Center frequency of a spectral @Config@. Valid values are between 2200
+-- to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for
+-- uplink.
+spectrumConfig_centerFrequency :: Lens.Lens' SpectrumConfig Frequency
+spectrumConfig_centerFrequency = Lens.lens (\SpectrumConfig' {centerFrequency} -> centerFrequency) (\s@SpectrumConfig' {} a -> s {centerFrequency = a} :: SpectrumConfig)
+
+instance Data.FromJSON SpectrumConfig where
+  parseJSON =
+    Data.withObject
+      "SpectrumConfig"
+      ( \x ->
+          SpectrumConfig'
+            Prelude.<$> (x Data..:? "polarization")
+            Prelude.<*> (x Data..: "bandwidth")
+            Prelude.<*> (x Data..: "centerFrequency")
+      )
+
+instance Prelude.Hashable SpectrumConfig where
+  hashWithSalt _salt SpectrumConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` polarization
+      `Prelude.hashWithSalt` bandwidth
+      `Prelude.hashWithSalt` centerFrequency
+
+instance Prelude.NFData SpectrumConfig where
+  rnf SpectrumConfig' {..} =
+    Prelude.rnf polarization
+      `Prelude.seq` Prelude.rnf bandwidth
+      `Prelude.seq` Prelude.rnf centerFrequency
+
+instance Data.ToJSON SpectrumConfig where
+  toJSON SpectrumConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("polarization" Data..=) Prelude.<$> polarization,
+            Prelude.Just ("bandwidth" Data..= bandwidth),
+            Prelude.Just
+              ("centerFrequency" Data..= centerFrequency)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/TLEData.hs b/gen/Amazonka/GroundStation/Types/TLEData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/TLEData.hs
@@ -0,0 +1,103 @@
+{-# 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.GroundStation.Types.TLEData
+-- 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.GroundStation.Types.TLEData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.TimeRange
+import qualified Amazonka.Prelude as Prelude
+
+-- | Two-line element set (TLE) data.
+--
+-- /See:/ 'newTLEData' smart constructor.
+data TLEData = TLEData'
+  { -- | First line of two-line element set (TLE) data.
+    tleLine1 :: Prelude.Text,
+    -- | Second line of two-line element set (TLE) data.
+    tleLine2 :: Prelude.Text,
+    -- | The valid time range for the TLE. Gaps or overlap are not permitted.
+    validTimeRange :: TimeRange
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TLEData' 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:
+--
+-- 'tleLine1', 'tLEData_tleLine1' - First line of two-line element set (TLE) data.
+--
+-- 'tleLine2', 'tLEData_tleLine2' - Second line of two-line element set (TLE) data.
+--
+-- 'validTimeRange', 'tLEData_validTimeRange' - The valid time range for the TLE. Gaps or overlap are not permitted.
+newTLEData ::
+  -- | 'tleLine1'
+  Prelude.Text ->
+  -- | 'tleLine2'
+  Prelude.Text ->
+  -- | 'validTimeRange'
+  TimeRange ->
+  TLEData
+newTLEData pTleLine1_ pTleLine2_ pValidTimeRange_ =
+  TLEData'
+    { tleLine1 = pTleLine1_,
+      tleLine2 = pTleLine2_,
+      validTimeRange = pValidTimeRange_
+    }
+
+-- | First line of two-line element set (TLE) data.
+tLEData_tleLine1 :: Lens.Lens' TLEData Prelude.Text
+tLEData_tleLine1 = Lens.lens (\TLEData' {tleLine1} -> tleLine1) (\s@TLEData' {} a -> s {tleLine1 = a} :: TLEData)
+
+-- | Second line of two-line element set (TLE) data.
+tLEData_tleLine2 :: Lens.Lens' TLEData Prelude.Text
+tLEData_tleLine2 = Lens.lens (\TLEData' {tleLine2} -> tleLine2) (\s@TLEData' {} a -> s {tleLine2 = a} :: TLEData)
+
+-- | The valid time range for the TLE. Gaps or overlap are not permitted.
+tLEData_validTimeRange :: Lens.Lens' TLEData TimeRange
+tLEData_validTimeRange = Lens.lens (\TLEData' {validTimeRange} -> validTimeRange) (\s@TLEData' {} a -> s {validTimeRange = a} :: TLEData)
+
+instance Prelude.Hashable TLEData where
+  hashWithSalt _salt TLEData' {..} =
+    _salt
+      `Prelude.hashWithSalt` tleLine1
+      `Prelude.hashWithSalt` tleLine2
+      `Prelude.hashWithSalt` validTimeRange
+
+instance Prelude.NFData TLEData where
+  rnf TLEData' {..} =
+    Prelude.rnf tleLine1
+      `Prelude.seq` Prelude.rnf tleLine2
+      `Prelude.seq` Prelude.rnf validTimeRange
+
+instance Data.ToJSON TLEData where
+  toJSON TLEData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("tleLine1" Data..= tleLine1),
+            Prelude.Just ("tleLine2" Data..= tleLine2),
+            Prelude.Just
+              ("validTimeRange" Data..= validTimeRange)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/TLEEphemeris.hs b/gen/Amazonka/GroundStation/Types/TLEEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/TLEEphemeris.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.TLEEphemeris
+-- 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.GroundStation.Types.TLEEphemeris where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.S3Object
+import Amazonka.GroundStation.Types.TLEData
+import qualified Amazonka.Prelude as Prelude
+
+-- | Two-line element set (TLE) ephemeris.
+--
+-- /See:/ 'newTLEEphemeris' smart constructor.
+data TLEEphemeris = TLEEphemeris'
+  { -- | Identifies the S3 object to be used as the ephemeris.
+    s3Object :: Prelude.Maybe S3Object,
+    -- | The data for a TLE ephemeris, supplied directly in the request rather
+    -- than through an S3 object.
+    tleData :: Prelude.Maybe (Prelude.NonEmpty TLEData)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TLEEphemeris' 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:
+--
+-- 's3Object', 'tLEEphemeris_s3Object' - Identifies the S3 object to be used as the ephemeris.
+--
+-- 'tleData', 'tLEEphemeris_tleData' - The data for a TLE ephemeris, supplied directly in the request rather
+-- than through an S3 object.
+newTLEEphemeris ::
+  TLEEphemeris
+newTLEEphemeris =
+  TLEEphemeris'
+    { s3Object = Prelude.Nothing,
+      tleData = Prelude.Nothing
+    }
+
+-- | Identifies the S3 object to be used as the ephemeris.
+tLEEphemeris_s3Object :: Lens.Lens' TLEEphemeris (Prelude.Maybe S3Object)
+tLEEphemeris_s3Object = Lens.lens (\TLEEphemeris' {s3Object} -> s3Object) (\s@TLEEphemeris' {} a -> s {s3Object = a} :: TLEEphemeris)
+
+-- | The data for a TLE ephemeris, supplied directly in the request rather
+-- than through an S3 object.
+tLEEphemeris_tleData :: Lens.Lens' TLEEphemeris (Prelude.Maybe (Prelude.NonEmpty TLEData))
+tLEEphemeris_tleData = Lens.lens (\TLEEphemeris' {tleData} -> tleData) (\s@TLEEphemeris' {} a -> s {tleData = a} :: TLEEphemeris) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable TLEEphemeris where
+  hashWithSalt _salt TLEEphemeris' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3Object
+      `Prelude.hashWithSalt` tleData
+
+instance Prelude.NFData TLEEphemeris where
+  rnf TLEEphemeris' {..} =
+    Prelude.rnf s3Object
+      `Prelude.seq` Prelude.rnf tleData
+
+instance Data.ToJSON TLEEphemeris where
+  toJSON TLEEphemeris' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("s3Object" Data..=) Prelude.<$> s3Object,
+            ("tleData" Data..=) Prelude.<$> tleData
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/TimeRange.hs b/gen/Amazonka/GroundStation/Types/TimeRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/TimeRange.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.TimeRange
+-- 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.GroundStation.Types.TimeRange 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 time range with a start and end time.
+--
+-- /See:/ 'newTimeRange' smart constructor.
+data TimeRange = TimeRange'
+  { -- | Time in UTC at which the time range ends.
+    endTime :: Data.POSIX,
+    -- | Time in UTC at which the time range starts.
+    startTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeRange' 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:
+--
+-- 'endTime', 'timeRange_endTime' - Time in UTC at which the time range ends.
+--
+-- 'startTime', 'timeRange_startTime' - Time in UTC at which the time range starts.
+newTimeRange ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  TimeRange
+newTimeRange pEndTime_ pStartTime_ =
+  TimeRange'
+    { endTime = Data._Time Lens.# pEndTime_,
+      startTime = Data._Time Lens.# pStartTime_
+    }
+
+-- | Time in UTC at which the time range ends.
+timeRange_endTime :: Lens.Lens' TimeRange Prelude.UTCTime
+timeRange_endTime = Lens.lens (\TimeRange' {endTime} -> endTime) (\s@TimeRange' {} a -> s {endTime = a} :: TimeRange) Prelude.. Data._Time
+
+-- | Time in UTC at which the time range starts.
+timeRange_startTime :: Lens.Lens' TimeRange Prelude.UTCTime
+timeRange_startTime = Lens.lens (\TimeRange' {startTime} -> startTime) (\s@TimeRange' {} a -> s {startTime = a} :: TimeRange) Prelude.. Data._Time
+
+instance Prelude.Hashable TimeRange where
+  hashWithSalt _salt TimeRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData TimeRange where
+  rnf TimeRange' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToJSON TimeRange where
+  toJSON TimeRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("endTime" Data..= endTime),
+            Prelude.Just ("startTime" Data..= startTime)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/TrackingConfig.hs b/gen/Amazonka/GroundStation/Types/TrackingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/TrackingConfig.hs
@@ -0,0 +1,78 @@
+{-# 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.GroundStation.Types.TrackingConfig
+-- 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.GroundStation.Types.TrackingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.Criticality
+import qualified Amazonka.Prelude as Prelude
+
+-- | Object that determines whether tracking should be used during a contact
+-- executed with this @Config@ in the mission profile.
+--
+-- /See:/ 'newTrackingConfig' smart constructor.
+data TrackingConfig = TrackingConfig'
+  { -- | Current setting for autotrack.
+    autotrack :: Criticality
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TrackingConfig' 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:
+--
+-- 'autotrack', 'trackingConfig_autotrack' - Current setting for autotrack.
+newTrackingConfig ::
+  -- | 'autotrack'
+  Criticality ->
+  TrackingConfig
+newTrackingConfig pAutotrack_ =
+  TrackingConfig' {autotrack = pAutotrack_}
+
+-- | Current setting for autotrack.
+trackingConfig_autotrack :: Lens.Lens' TrackingConfig Criticality
+trackingConfig_autotrack = Lens.lens (\TrackingConfig' {autotrack} -> autotrack) (\s@TrackingConfig' {} a -> s {autotrack = a} :: TrackingConfig)
+
+instance Data.FromJSON TrackingConfig where
+  parseJSON =
+    Data.withObject
+      "TrackingConfig"
+      ( \x ->
+          TrackingConfig' Prelude.<$> (x Data..: "autotrack")
+      )
+
+instance Prelude.Hashable TrackingConfig where
+  hashWithSalt _salt TrackingConfig' {..} =
+    _salt `Prelude.hashWithSalt` autotrack
+
+instance Prelude.NFData TrackingConfig where
+  rnf TrackingConfig' {..} = Prelude.rnf autotrack
+
+instance Data.ToJSON TrackingConfig where
+  toJSON TrackingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("autotrack" Data..= autotrack)]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/UplinkEchoConfig.hs b/gen/Amazonka/GroundStation/Types/UplinkEchoConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/UplinkEchoConfig.hs
@@ -0,0 +1,107 @@
+{-# 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.GroundStation.Types.UplinkEchoConfig
+-- 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.GroundStation.Types.UplinkEchoConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an uplink echo @Config@.
+--
+-- Parameters from the @AntennaUplinkConfig@, corresponding to the
+-- specified @AntennaUplinkConfigArn@, are used when this
+-- @UplinkEchoConfig@ is used in a contact.
+--
+-- /See:/ 'newUplinkEchoConfig' smart constructor.
+data UplinkEchoConfig = UplinkEchoConfig'
+  { -- | ARN of an uplink @Config@.
+    antennaUplinkConfigArn :: Prelude.Text,
+    -- | Whether or not an uplink @Config@ is enabled.
+    enabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UplinkEchoConfig' 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:
+--
+-- 'antennaUplinkConfigArn', 'uplinkEchoConfig_antennaUplinkConfigArn' - ARN of an uplink @Config@.
+--
+-- 'enabled', 'uplinkEchoConfig_enabled' - Whether or not an uplink @Config@ is enabled.
+newUplinkEchoConfig ::
+  -- | 'antennaUplinkConfigArn'
+  Prelude.Text ->
+  -- | 'enabled'
+  Prelude.Bool ->
+  UplinkEchoConfig
+newUplinkEchoConfig
+  pAntennaUplinkConfigArn_
+  pEnabled_ =
+    UplinkEchoConfig'
+      { antennaUplinkConfigArn =
+          pAntennaUplinkConfigArn_,
+        enabled = pEnabled_
+      }
+
+-- | ARN of an uplink @Config@.
+uplinkEchoConfig_antennaUplinkConfigArn :: Lens.Lens' UplinkEchoConfig Prelude.Text
+uplinkEchoConfig_antennaUplinkConfigArn = Lens.lens (\UplinkEchoConfig' {antennaUplinkConfigArn} -> antennaUplinkConfigArn) (\s@UplinkEchoConfig' {} a -> s {antennaUplinkConfigArn = a} :: UplinkEchoConfig)
+
+-- | Whether or not an uplink @Config@ is enabled.
+uplinkEchoConfig_enabled :: Lens.Lens' UplinkEchoConfig Prelude.Bool
+uplinkEchoConfig_enabled = Lens.lens (\UplinkEchoConfig' {enabled} -> enabled) (\s@UplinkEchoConfig' {} a -> s {enabled = a} :: UplinkEchoConfig)
+
+instance Data.FromJSON UplinkEchoConfig where
+  parseJSON =
+    Data.withObject
+      "UplinkEchoConfig"
+      ( \x ->
+          UplinkEchoConfig'
+            Prelude.<$> (x Data..: "antennaUplinkConfigArn")
+            Prelude.<*> (x Data..: "enabled")
+      )
+
+instance Prelude.Hashable UplinkEchoConfig where
+  hashWithSalt _salt UplinkEchoConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` antennaUplinkConfigArn
+      `Prelude.hashWithSalt` enabled
+
+instance Prelude.NFData UplinkEchoConfig where
+  rnf UplinkEchoConfig' {..} =
+    Prelude.rnf antennaUplinkConfigArn
+      `Prelude.seq` Prelude.rnf enabled
+
+instance Data.ToJSON UplinkEchoConfig where
+  toJSON UplinkEchoConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "antennaUplinkConfigArn"
+                  Data..= antennaUplinkConfigArn
+              ),
+            Prelude.Just ("enabled" Data..= enabled)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/Types/UplinkSpectrumConfig.hs b/gen/Amazonka/GroundStation/Types/UplinkSpectrumConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Types/UplinkSpectrumConfig.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.Types.UplinkSpectrumConfig
+-- 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.GroundStation.Types.UplinkSpectrumConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types.Frequency
+import Amazonka.GroundStation.Types.Polarization
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the uplink spectral @Config@.
+--
+-- /See:/ 'newUplinkSpectrumConfig' smart constructor.
+data UplinkSpectrumConfig = UplinkSpectrumConfig'
+  { -- | Polarization of an uplink spectral @Config@. Capturing both
+    -- @\"RIGHT_HAND\"@ and @\"LEFT_HAND\"@ polarization requires two separate
+    -- configs.
+    polarization :: Prelude.Maybe Polarization,
+    -- | Center frequency of an uplink spectral @Config@. Valid values are
+    -- between 2025 to 2120 MHz.
+    centerFrequency :: Frequency
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UplinkSpectrumConfig' 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:
+--
+-- 'polarization', 'uplinkSpectrumConfig_polarization' - Polarization of an uplink spectral @Config@. Capturing both
+-- @\"RIGHT_HAND\"@ and @\"LEFT_HAND\"@ polarization requires two separate
+-- configs.
+--
+-- 'centerFrequency', 'uplinkSpectrumConfig_centerFrequency' - Center frequency of an uplink spectral @Config@. Valid values are
+-- between 2025 to 2120 MHz.
+newUplinkSpectrumConfig ::
+  -- | 'centerFrequency'
+  Frequency ->
+  UplinkSpectrumConfig
+newUplinkSpectrumConfig pCenterFrequency_ =
+  UplinkSpectrumConfig'
+    { polarization =
+        Prelude.Nothing,
+      centerFrequency = pCenterFrequency_
+    }
+
+-- | Polarization of an uplink spectral @Config@. Capturing both
+-- @\"RIGHT_HAND\"@ and @\"LEFT_HAND\"@ polarization requires two separate
+-- configs.
+uplinkSpectrumConfig_polarization :: Lens.Lens' UplinkSpectrumConfig (Prelude.Maybe Polarization)
+uplinkSpectrumConfig_polarization = Lens.lens (\UplinkSpectrumConfig' {polarization} -> polarization) (\s@UplinkSpectrumConfig' {} a -> s {polarization = a} :: UplinkSpectrumConfig)
+
+-- | Center frequency of an uplink spectral @Config@. Valid values are
+-- between 2025 to 2120 MHz.
+uplinkSpectrumConfig_centerFrequency :: Lens.Lens' UplinkSpectrumConfig Frequency
+uplinkSpectrumConfig_centerFrequency = Lens.lens (\UplinkSpectrumConfig' {centerFrequency} -> centerFrequency) (\s@UplinkSpectrumConfig' {} a -> s {centerFrequency = a} :: UplinkSpectrumConfig)
+
+instance Data.FromJSON UplinkSpectrumConfig where
+  parseJSON =
+    Data.withObject
+      "UplinkSpectrumConfig"
+      ( \x ->
+          UplinkSpectrumConfig'
+            Prelude.<$> (x Data..:? "polarization")
+            Prelude.<*> (x Data..: "centerFrequency")
+      )
+
+instance Prelude.Hashable UplinkSpectrumConfig where
+  hashWithSalt _salt UplinkSpectrumConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` polarization
+      `Prelude.hashWithSalt` centerFrequency
+
+instance Prelude.NFData UplinkSpectrumConfig where
+  rnf UplinkSpectrumConfig' {..} =
+    Prelude.rnf polarization
+      `Prelude.seq` Prelude.rnf centerFrequency
+
+instance Data.ToJSON UplinkSpectrumConfig where
+  toJSON UplinkSpectrumConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("polarization" Data..=) Prelude.<$> polarization,
+            Prelude.Just
+              ("centerFrequency" Data..= centerFrequency)
+          ]
+      )
diff --git a/gen/Amazonka/GroundStation/UntagResource.hs b/gen/Amazonka/GroundStation/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/UntagResource.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.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)
+--
+-- Deassigns a resource tag.
+module Amazonka.GroundStation.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | ARN of a resource.
+    resourceArn :: Prelude.Text,
+    -- | Keys of a resource tag.
+    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' - ARN of a resource.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Keys of a resource tag.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | ARN of a resource.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Keys of a resource tag.
+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/GroundStation/UpdateConfig.hs b/gen/Amazonka/GroundStation/UpdateConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/UpdateConfig.hs
@@ -0,0 +1,178 @@
+{-# 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.GroundStation.UpdateConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the @Config@ used when scheduling contacts.
+--
+-- Updating a @Config@ will not update the execution parameters for
+-- existing future contacts scheduled with this @Config@.
+module Amazonka.GroundStation.UpdateConfig
+  ( -- * Creating a Request
+    UpdateConfig (..),
+    newUpdateConfig,
+
+    -- * Request Lenses
+    updateConfig_configData,
+    updateConfig_configId,
+    updateConfig_configType,
+    updateConfig_name,
+
+    -- * Destructuring the Response
+    ConfigIdResponse (..),
+    newConfigIdResponse,
+
+    -- * Response Lenses
+    configIdResponse_configArn,
+    configIdResponse_configId,
+    configIdResponse_configType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateConfig' smart constructor.
+data UpdateConfig = UpdateConfig'
+  { -- | Parameters of a @Config@.
+    configData :: ConfigTypeData,
+    -- | UUID of a @Config@.
+    configId :: Prelude.Text,
+    -- | Type of a @Config@.
+    configType :: ConfigCapabilityType,
+    -- | Name of a @Config@.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateConfig' 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:
+--
+-- 'configData', 'updateConfig_configData' - Parameters of a @Config@.
+--
+-- 'configId', 'updateConfig_configId' - UUID of a @Config@.
+--
+-- 'configType', 'updateConfig_configType' - Type of a @Config@.
+--
+-- 'name', 'updateConfig_name' - Name of a @Config@.
+newUpdateConfig ::
+  -- | 'configData'
+  ConfigTypeData ->
+  -- | 'configId'
+  Prelude.Text ->
+  -- | 'configType'
+  ConfigCapabilityType ->
+  -- | 'name'
+  Prelude.Text ->
+  UpdateConfig
+newUpdateConfig
+  pConfigData_
+  pConfigId_
+  pConfigType_
+  pName_ =
+    UpdateConfig'
+      { configData = pConfigData_,
+        configId = pConfigId_,
+        configType = pConfigType_,
+        name = pName_
+      }
+
+-- | Parameters of a @Config@.
+updateConfig_configData :: Lens.Lens' UpdateConfig ConfigTypeData
+updateConfig_configData = Lens.lens (\UpdateConfig' {configData} -> configData) (\s@UpdateConfig' {} a -> s {configData = a} :: UpdateConfig)
+
+-- | UUID of a @Config@.
+updateConfig_configId :: Lens.Lens' UpdateConfig Prelude.Text
+updateConfig_configId = Lens.lens (\UpdateConfig' {configId} -> configId) (\s@UpdateConfig' {} a -> s {configId = a} :: UpdateConfig)
+
+-- | Type of a @Config@.
+updateConfig_configType :: Lens.Lens' UpdateConfig ConfigCapabilityType
+updateConfig_configType = Lens.lens (\UpdateConfig' {configType} -> configType) (\s@UpdateConfig' {} a -> s {configType = a} :: UpdateConfig)
+
+-- | Name of a @Config@.
+updateConfig_name :: Lens.Lens' UpdateConfig Prelude.Text
+updateConfig_name = Lens.lens (\UpdateConfig' {name} -> name) (\s@UpdateConfig' {} a -> s {name = a} :: UpdateConfig)
+
+instance Core.AWSRequest UpdateConfig where
+  type AWSResponse UpdateConfig = ConfigIdResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable UpdateConfig where
+  hashWithSalt _salt UpdateConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` configData
+      `Prelude.hashWithSalt` configId
+      `Prelude.hashWithSalt` configType
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData UpdateConfig where
+  rnf UpdateConfig' {..} =
+    Prelude.rnf configData
+      `Prelude.seq` Prelude.rnf configId
+      `Prelude.seq` Prelude.rnf configType
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders UpdateConfig where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateConfig where
+  toJSON UpdateConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("configData" Data..= configData),
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath UpdateConfig where
+  toPath UpdateConfig' {..} =
+    Prelude.mconcat
+      [ "/config/",
+        Data.toBS configType,
+        "/",
+        Data.toBS configId
+      ]
+
+instance Data.ToQuery UpdateConfig where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/UpdateEphemeris.hs b/gen/Amazonka/GroundStation/UpdateEphemeris.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/UpdateEphemeris.hs
@@ -0,0 +1,186 @@
+{-# 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.GroundStation.UpdateEphemeris
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing ephemeris
+module Amazonka.GroundStation.UpdateEphemeris
+  ( -- * Creating a Request
+    UpdateEphemeris (..),
+    newUpdateEphemeris,
+
+    -- * Request Lenses
+    updateEphemeris_name,
+    updateEphemeris_priority,
+    updateEphemeris_enabled,
+    updateEphemeris_ephemerisId,
+
+    -- * Destructuring the Response
+    EphemerisIdResponse (..),
+    newEphemerisIdResponse,
+
+    -- * Response Lenses
+    ephemerisIdResponse_ephemerisId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateEphemeris' smart constructor.
+data UpdateEphemeris = UpdateEphemeris'
+  { -- | A name string associated with the ephemeris. Used as a human-readable
+    -- identifier for the ephemeris.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Customer-provided priority score to establish the order in which
+    -- overlapping ephemerides should be used.
+    --
+    -- The default for customer-provided ephemeris priority is 1, and higher
+    -- numbers take precedence.
+    --
+    -- Priority must be 1 or greater
+    priority :: Prelude.Maybe Prelude.Natural,
+    -- | Whether the ephemeris is enabled or not. Changing this value will not
+    -- require the ephemeris to be re-validated.
+    enabled :: Prelude.Bool,
+    -- | The AWS Ground Station ephemeris ID.
+    ephemerisId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateEphemeris' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'updateEphemeris_name' - A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+--
+-- 'priority', 'updateEphemeris_priority' - Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+--
+-- 'enabled', 'updateEphemeris_enabled' - Whether the ephemeris is enabled or not. Changing this value will not
+-- require the ephemeris to be re-validated.
+--
+-- 'ephemerisId', 'updateEphemeris_ephemerisId' - The AWS Ground Station ephemeris ID.
+newUpdateEphemeris ::
+  -- | 'enabled'
+  Prelude.Bool ->
+  -- | 'ephemerisId'
+  Prelude.Text ->
+  UpdateEphemeris
+newUpdateEphemeris pEnabled_ pEphemerisId_ =
+  UpdateEphemeris'
+    { name = Prelude.Nothing,
+      priority = Prelude.Nothing,
+      enabled = pEnabled_,
+      ephemerisId = pEphemerisId_
+    }
+
+-- | A name string associated with the ephemeris. Used as a human-readable
+-- identifier for the ephemeris.
+updateEphemeris_name :: Lens.Lens' UpdateEphemeris (Prelude.Maybe Prelude.Text)
+updateEphemeris_name = Lens.lens (\UpdateEphemeris' {name} -> name) (\s@UpdateEphemeris' {} a -> s {name = a} :: UpdateEphemeris)
+
+-- | Customer-provided priority score to establish the order in which
+-- overlapping ephemerides should be used.
+--
+-- The default for customer-provided ephemeris priority is 1, and higher
+-- numbers take precedence.
+--
+-- Priority must be 1 or greater
+updateEphemeris_priority :: Lens.Lens' UpdateEphemeris (Prelude.Maybe Prelude.Natural)
+updateEphemeris_priority = Lens.lens (\UpdateEphemeris' {priority} -> priority) (\s@UpdateEphemeris' {} a -> s {priority = a} :: UpdateEphemeris)
+
+-- | Whether the ephemeris is enabled or not. Changing this value will not
+-- require the ephemeris to be re-validated.
+updateEphemeris_enabled :: Lens.Lens' UpdateEphemeris Prelude.Bool
+updateEphemeris_enabled = Lens.lens (\UpdateEphemeris' {enabled} -> enabled) (\s@UpdateEphemeris' {} a -> s {enabled = a} :: UpdateEphemeris)
+
+-- | The AWS Ground Station ephemeris ID.
+updateEphemeris_ephemerisId :: Lens.Lens' UpdateEphemeris Prelude.Text
+updateEphemeris_ephemerisId = Lens.lens (\UpdateEphemeris' {ephemerisId} -> ephemerisId) (\s@UpdateEphemeris' {} a -> s {ephemerisId = a} :: UpdateEphemeris)
+
+instance Core.AWSRequest UpdateEphemeris where
+  type
+    AWSResponse UpdateEphemeris =
+      EphemerisIdResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable UpdateEphemeris where
+  hashWithSalt _salt UpdateEphemeris' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` priority
+      `Prelude.hashWithSalt` enabled
+      `Prelude.hashWithSalt` ephemerisId
+
+instance Prelude.NFData UpdateEphemeris where
+  rnf UpdateEphemeris' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf priority
+      `Prelude.seq` Prelude.rnf enabled
+      `Prelude.seq` Prelude.rnf ephemerisId
+
+instance Data.ToHeaders UpdateEphemeris where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateEphemeris where
+  toJSON UpdateEphemeris' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("name" Data..=) Prelude.<$> name,
+            ("priority" Data..=) Prelude.<$> priority,
+            Prelude.Just ("enabled" Data..= enabled)
+          ]
+      )
+
+instance Data.ToPath UpdateEphemeris where
+  toPath UpdateEphemeris' {..} =
+    Prelude.mconcat
+      ["/ephemeris/", Data.toBS ephemerisId]
+
+instance Data.ToQuery UpdateEphemeris where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/UpdateMissionProfile.hs b/gen/Amazonka/GroundStation/UpdateMissionProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/UpdateMissionProfile.hs
@@ -0,0 +1,225 @@
+{-# 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.GroundStation.UpdateMissionProfile
+-- 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 mission profile.
+--
+-- Updating a mission profile will not update the execution parameters for
+-- existing future contacts.
+module Amazonka.GroundStation.UpdateMissionProfile
+  ( -- * Creating a Request
+    UpdateMissionProfile (..),
+    newUpdateMissionProfile,
+
+    -- * Request Lenses
+    updateMissionProfile_contactPostPassDurationSeconds,
+    updateMissionProfile_contactPrePassDurationSeconds,
+    updateMissionProfile_dataflowEdges,
+    updateMissionProfile_minimumViableContactDurationSeconds,
+    updateMissionProfile_name,
+    updateMissionProfile_trackingConfigArn,
+    updateMissionProfile_missionProfileId,
+
+    -- * Destructuring the Response
+    MissionProfileIdResponse (..),
+    newMissionProfileIdResponse,
+
+    -- * Response Lenses
+    missionProfileIdResponse_missionProfileId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- |
+--
+-- /See:/ 'newUpdateMissionProfile' smart constructor.
+data UpdateMissionProfile = UpdateMissionProfile'
+  { -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    contactPostPassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Amount of time after a contact ends that you’d like to receive a
+    -- CloudWatch event indicating the pass has finished.
+    contactPrePassDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+    -- @Config@ and a /to/ @Config@.
+    dataflowEdges :: Prelude.Maybe [Prelude.NonEmpty Prelude.Text],
+    -- | Smallest amount of time in seconds that you’d like to see for an
+    -- available contact. AWS Ground Station will not present you with contacts
+    -- shorter than this duration.
+    minimumViableContactDurationSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | Name of a mission profile.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | ARN of a tracking @Config@.
+    trackingConfigArn :: Prelude.Maybe Prelude.Text,
+    -- | UUID of a mission profile.
+    missionProfileId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMissionProfile' 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:
+--
+-- 'contactPostPassDurationSeconds', 'updateMissionProfile_contactPostPassDurationSeconds' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'contactPrePassDurationSeconds', 'updateMissionProfile_contactPrePassDurationSeconds' - Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+--
+-- 'dataflowEdges', 'updateMissionProfile_dataflowEdges' - A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+--
+-- 'minimumViableContactDurationSeconds', 'updateMissionProfile_minimumViableContactDurationSeconds' - Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+--
+-- 'name', 'updateMissionProfile_name' - Name of a mission profile.
+--
+-- 'trackingConfigArn', 'updateMissionProfile_trackingConfigArn' - ARN of a tracking @Config@.
+--
+-- 'missionProfileId', 'updateMissionProfile_missionProfileId' - UUID of a mission profile.
+newUpdateMissionProfile ::
+  -- | 'missionProfileId'
+  Prelude.Text ->
+  UpdateMissionProfile
+newUpdateMissionProfile pMissionProfileId_ =
+  UpdateMissionProfile'
+    { contactPostPassDurationSeconds =
+        Prelude.Nothing,
+      contactPrePassDurationSeconds = Prelude.Nothing,
+      dataflowEdges = Prelude.Nothing,
+      minimumViableContactDurationSeconds =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      trackingConfigArn = Prelude.Nothing,
+      missionProfileId = pMissionProfileId_
+    }
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+updateMissionProfile_contactPostPassDurationSeconds :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe Prelude.Natural)
+updateMissionProfile_contactPostPassDurationSeconds = Lens.lens (\UpdateMissionProfile' {contactPostPassDurationSeconds} -> contactPostPassDurationSeconds) (\s@UpdateMissionProfile' {} a -> s {contactPostPassDurationSeconds = a} :: UpdateMissionProfile)
+
+-- | Amount of time after a contact ends that you’d like to receive a
+-- CloudWatch event indicating the pass has finished.
+updateMissionProfile_contactPrePassDurationSeconds :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe Prelude.Natural)
+updateMissionProfile_contactPrePassDurationSeconds = Lens.lens (\UpdateMissionProfile' {contactPrePassDurationSeconds} -> contactPrePassDurationSeconds) (\s@UpdateMissionProfile' {} a -> s {contactPrePassDurationSeconds = a} :: UpdateMissionProfile)
+
+-- | A list of lists of ARNs. Each list of ARNs is an edge, with a /from/
+-- @Config@ and a /to/ @Config@.
+updateMissionProfile_dataflowEdges :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe [Prelude.NonEmpty Prelude.Text])
+updateMissionProfile_dataflowEdges = Lens.lens (\UpdateMissionProfile' {dataflowEdges} -> dataflowEdges) (\s@UpdateMissionProfile' {} a -> s {dataflowEdges = a} :: UpdateMissionProfile) Prelude.. Lens.mapping Lens.coerced
+
+-- | Smallest amount of time in seconds that you’d like to see for an
+-- available contact. AWS Ground Station will not present you with contacts
+-- shorter than this duration.
+updateMissionProfile_minimumViableContactDurationSeconds :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe Prelude.Natural)
+updateMissionProfile_minimumViableContactDurationSeconds = Lens.lens (\UpdateMissionProfile' {minimumViableContactDurationSeconds} -> minimumViableContactDurationSeconds) (\s@UpdateMissionProfile' {} a -> s {minimumViableContactDurationSeconds = a} :: UpdateMissionProfile)
+
+-- | Name of a mission profile.
+updateMissionProfile_name :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe Prelude.Text)
+updateMissionProfile_name = Lens.lens (\UpdateMissionProfile' {name} -> name) (\s@UpdateMissionProfile' {} a -> s {name = a} :: UpdateMissionProfile)
+
+-- | ARN of a tracking @Config@.
+updateMissionProfile_trackingConfigArn :: Lens.Lens' UpdateMissionProfile (Prelude.Maybe Prelude.Text)
+updateMissionProfile_trackingConfigArn = Lens.lens (\UpdateMissionProfile' {trackingConfigArn} -> trackingConfigArn) (\s@UpdateMissionProfile' {} a -> s {trackingConfigArn = a} :: UpdateMissionProfile)
+
+-- | UUID of a mission profile.
+updateMissionProfile_missionProfileId :: Lens.Lens' UpdateMissionProfile Prelude.Text
+updateMissionProfile_missionProfileId = Lens.lens (\UpdateMissionProfile' {missionProfileId} -> missionProfileId) (\s@UpdateMissionProfile' {} a -> s {missionProfileId = a} :: UpdateMissionProfile)
+
+instance Core.AWSRequest UpdateMissionProfile where
+  type
+    AWSResponse UpdateMissionProfile =
+      MissionProfileIdResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      (\s h x -> Data.eitherParseJSON x)
+
+instance Prelude.Hashable UpdateMissionProfile where
+  hashWithSalt _salt UpdateMissionProfile' {..} =
+    _salt
+      `Prelude.hashWithSalt` contactPostPassDurationSeconds
+      `Prelude.hashWithSalt` contactPrePassDurationSeconds
+      `Prelude.hashWithSalt` dataflowEdges
+      `Prelude.hashWithSalt` minimumViableContactDurationSeconds
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` trackingConfigArn
+      `Prelude.hashWithSalt` missionProfileId
+
+instance Prelude.NFData UpdateMissionProfile where
+  rnf UpdateMissionProfile' {..} =
+    Prelude.rnf contactPostPassDurationSeconds
+      `Prelude.seq` Prelude.rnf contactPrePassDurationSeconds
+      `Prelude.seq` Prelude.rnf dataflowEdges
+      `Prelude.seq` Prelude.rnf minimumViableContactDurationSeconds
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf trackingConfigArn
+      `Prelude.seq` Prelude.rnf missionProfileId
+
+instance Data.ToHeaders UpdateMissionProfile where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateMissionProfile where
+  toJSON UpdateMissionProfile' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("contactPostPassDurationSeconds" Data..=)
+              Prelude.<$> contactPostPassDurationSeconds,
+            ("contactPrePassDurationSeconds" Data..=)
+              Prelude.<$> contactPrePassDurationSeconds,
+            ("dataflowEdges" Data..=) Prelude.<$> dataflowEdges,
+            ("minimumViableContactDurationSeconds" Data..=)
+              Prelude.<$> minimumViableContactDurationSeconds,
+            ("name" Data..=) Prelude.<$> name,
+            ("trackingConfigArn" Data..=)
+              Prelude.<$> trackingConfigArn
+          ]
+      )
+
+instance Data.ToPath UpdateMissionProfile where
+  toPath UpdateMissionProfile' {..} =
+    Prelude.mconcat
+      ["/missionprofile/", Data.toBS missionProfileId]
+
+instance Data.ToQuery UpdateMissionProfile where
+  toQuery = Prelude.const Prelude.mempty
diff --git a/gen/Amazonka/GroundStation/Waiters.hs b/gen/Amazonka/GroundStation/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/GroundStation/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.GroundStation.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.GroundStation.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.GroundStation.Lens
+import Amazonka.GroundStation.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.GroundStation
+import Test.Amazonka.GroundStation.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "GroundStation"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/GroundStation.hs b/test/Test/Amazonka/Gen/GroundStation.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/GroundStation.hs
@@ -0,0 +1,638 @@
+{-# 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.GroundStation
+-- 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.GroundStation where
+
+import Amazonka.GroundStation
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.GroundStation.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestCancelContact $
+--             newCancelContact
+--
+--         , requestCreateConfig $
+--             newCreateConfig
+--
+--         , requestCreateDataflowEndpointGroup $
+--             newCreateDataflowEndpointGroup
+--
+--         , requestCreateEphemeris $
+--             newCreateEphemeris
+--
+--         , requestCreateMissionProfile $
+--             newCreateMissionProfile
+--
+--         , requestDeleteConfig $
+--             newDeleteConfig
+--
+--         , requestDeleteDataflowEndpointGroup $
+--             newDeleteDataflowEndpointGroup
+--
+--         , requestDeleteEphemeris $
+--             newDeleteEphemeris
+--
+--         , requestDeleteMissionProfile $
+--             newDeleteMissionProfile
+--
+--         , requestDescribeContact $
+--             newDescribeContact
+--
+--         , requestDescribeEphemeris $
+--             newDescribeEphemeris
+--
+--         , requestGetConfig $
+--             newGetConfig
+--
+--         , requestGetDataflowEndpointGroup $
+--             newGetDataflowEndpointGroup
+--
+--         , requestGetMinuteUsage $
+--             newGetMinuteUsage
+--
+--         , requestGetMissionProfile $
+--             newGetMissionProfile
+--
+--         , requestGetSatellite $
+--             newGetSatellite
+--
+--         , requestListConfigs $
+--             newListConfigs
+--
+--         , requestListContacts $
+--             newListContacts
+--
+--         , requestListDataflowEndpointGroups $
+--             newListDataflowEndpointGroups
+--
+--         , requestListEphemerides $
+--             newListEphemerides
+--
+--         , requestListGroundStations $
+--             newListGroundStations
+--
+--         , requestListMissionProfiles $
+--             newListMissionProfiles
+--
+--         , requestListSatellites $
+--             newListSatellites
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestReserveContact $
+--             newReserveContact
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateConfig $
+--             newUpdateConfig
+--
+--         , requestUpdateEphemeris $
+--             newUpdateEphemeris
+--
+--         , requestUpdateMissionProfile $
+--             newUpdateMissionProfile
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCancelContact $
+--             newContactIdResponse
+--
+--         , responseCreateConfig $
+--             newConfigIdResponse
+--
+--         , responseCreateDataflowEndpointGroup $
+--             newDataflowEndpointGroupIdResponse
+--
+--         , responseCreateEphemeris $
+--             newEphemerisIdResponse
+--
+--         , responseCreateMissionProfile $
+--             newMissionProfileIdResponse
+--
+--         , responseDeleteConfig $
+--             newConfigIdResponse
+--
+--         , responseDeleteDataflowEndpointGroup $
+--             newDataflowEndpointGroupIdResponse
+--
+--         , responseDeleteEphemeris $
+--             newEphemerisIdResponse
+--
+--         , responseDeleteMissionProfile $
+--             newMissionProfileIdResponse
+--
+--         , responseDescribeContact $
+--             newDescribeContactResponse
+--
+--         , responseDescribeEphemeris $
+--             newDescribeEphemerisResponse
+--
+--         , responseGetConfig $
+--             newGetConfigResponse
+--
+--         , responseGetDataflowEndpointGroup $
+--             newGetDataflowEndpointGroupResponse
+--
+--         , responseGetMinuteUsage $
+--             newGetMinuteUsageResponse
+--
+--         , responseGetMissionProfile $
+--             newGetMissionProfileResponse
+--
+--         , responseGetSatellite $
+--             newGetSatelliteResponse
+--
+--         , responseListConfigs $
+--             newListConfigsResponse
+--
+--         , responseListContacts $
+--             newListContactsResponse
+--
+--         , responseListDataflowEndpointGroups $
+--             newListDataflowEndpointGroupsResponse
+--
+--         , responseListEphemerides $
+--             newListEphemeridesResponse
+--
+--         , responseListGroundStations $
+--             newListGroundStationsResponse
+--
+--         , responseListMissionProfiles $
+--             newListMissionProfilesResponse
+--
+--         , responseListSatellites $
+--             newListSatellitesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseReserveContact $
+--             newContactIdResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateConfig $
+--             newConfigIdResponse
+--
+--         , responseUpdateEphemeris $
+--             newEphemerisIdResponse
+--
+--         , responseUpdateMissionProfile $
+--             newMissionProfileIdResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCancelContact :: CancelContact -> TestTree
+requestCancelContact =
+  req
+    "CancelContact"
+    "fixture/CancelContact.yaml"
+
+requestCreateConfig :: CreateConfig -> TestTree
+requestCreateConfig =
+  req
+    "CreateConfig"
+    "fixture/CreateConfig.yaml"
+
+requestCreateDataflowEndpointGroup :: CreateDataflowEndpointGroup -> TestTree
+requestCreateDataflowEndpointGroup =
+  req
+    "CreateDataflowEndpointGroup"
+    "fixture/CreateDataflowEndpointGroup.yaml"
+
+requestCreateEphemeris :: CreateEphemeris -> TestTree
+requestCreateEphemeris =
+  req
+    "CreateEphemeris"
+    "fixture/CreateEphemeris.yaml"
+
+requestCreateMissionProfile :: CreateMissionProfile -> TestTree
+requestCreateMissionProfile =
+  req
+    "CreateMissionProfile"
+    "fixture/CreateMissionProfile.yaml"
+
+requestDeleteConfig :: DeleteConfig -> TestTree
+requestDeleteConfig =
+  req
+    "DeleteConfig"
+    "fixture/DeleteConfig.yaml"
+
+requestDeleteDataflowEndpointGroup :: DeleteDataflowEndpointGroup -> TestTree
+requestDeleteDataflowEndpointGroup =
+  req
+    "DeleteDataflowEndpointGroup"
+    "fixture/DeleteDataflowEndpointGroup.yaml"
+
+requestDeleteEphemeris :: DeleteEphemeris -> TestTree
+requestDeleteEphemeris =
+  req
+    "DeleteEphemeris"
+    "fixture/DeleteEphemeris.yaml"
+
+requestDeleteMissionProfile :: DeleteMissionProfile -> TestTree
+requestDeleteMissionProfile =
+  req
+    "DeleteMissionProfile"
+    "fixture/DeleteMissionProfile.yaml"
+
+requestDescribeContact :: DescribeContact -> TestTree
+requestDescribeContact =
+  req
+    "DescribeContact"
+    "fixture/DescribeContact.yaml"
+
+requestDescribeEphemeris :: DescribeEphemeris -> TestTree
+requestDescribeEphemeris =
+  req
+    "DescribeEphemeris"
+    "fixture/DescribeEphemeris.yaml"
+
+requestGetConfig :: GetConfig -> TestTree
+requestGetConfig =
+  req
+    "GetConfig"
+    "fixture/GetConfig.yaml"
+
+requestGetDataflowEndpointGroup :: GetDataflowEndpointGroup -> TestTree
+requestGetDataflowEndpointGroup =
+  req
+    "GetDataflowEndpointGroup"
+    "fixture/GetDataflowEndpointGroup.yaml"
+
+requestGetMinuteUsage :: GetMinuteUsage -> TestTree
+requestGetMinuteUsage =
+  req
+    "GetMinuteUsage"
+    "fixture/GetMinuteUsage.yaml"
+
+requestGetMissionProfile :: GetMissionProfile -> TestTree
+requestGetMissionProfile =
+  req
+    "GetMissionProfile"
+    "fixture/GetMissionProfile.yaml"
+
+requestGetSatellite :: GetSatellite -> TestTree
+requestGetSatellite =
+  req
+    "GetSatellite"
+    "fixture/GetSatellite.yaml"
+
+requestListConfigs :: ListConfigs -> TestTree
+requestListConfigs =
+  req
+    "ListConfigs"
+    "fixture/ListConfigs.yaml"
+
+requestListContacts :: ListContacts -> TestTree
+requestListContacts =
+  req
+    "ListContacts"
+    "fixture/ListContacts.yaml"
+
+requestListDataflowEndpointGroups :: ListDataflowEndpointGroups -> TestTree
+requestListDataflowEndpointGroups =
+  req
+    "ListDataflowEndpointGroups"
+    "fixture/ListDataflowEndpointGroups.yaml"
+
+requestListEphemerides :: ListEphemerides -> TestTree
+requestListEphemerides =
+  req
+    "ListEphemerides"
+    "fixture/ListEphemerides.yaml"
+
+requestListGroundStations :: ListGroundStations -> TestTree
+requestListGroundStations =
+  req
+    "ListGroundStations"
+    "fixture/ListGroundStations.yaml"
+
+requestListMissionProfiles :: ListMissionProfiles -> TestTree
+requestListMissionProfiles =
+  req
+    "ListMissionProfiles"
+    "fixture/ListMissionProfiles.yaml"
+
+requestListSatellites :: ListSatellites -> TestTree
+requestListSatellites =
+  req
+    "ListSatellites"
+    "fixture/ListSatellites.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestReserveContact :: ReserveContact -> TestTree
+requestReserveContact =
+  req
+    "ReserveContact"
+    "fixture/ReserveContact.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateConfig :: UpdateConfig -> TestTree
+requestUpdateConfig =
+  req
+    "UpdateConfig"
+    "fixture/UpdateConfig.yaml"
+
+requestUpdateEphemeris :: UpdateEphemeris -> TestTree
+requestUpdateEphemeris =
+  req
+    "UpdateEphemeris"
+    "fixture/UpdateEphemeris.yaml"
+
+requestUpdateMissionProfile :: UpdateMissionProfile -> TestTree
+requestUpdateMissionProfile =
+  req
+    "UpdateMissionProfile"
+    "fixture/UpdateMissionProfile.yaml"
+
+-- Responses
+
+responseCancelContact :: ContactIdResponse -> TestTree
+responseCancelContact =
+  res
+    "CancelContactResponse"
+    "fixture/CancelContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CancelContact)
+
+responseCreateConfig :: ConfigIdResponse -> TestTree
+responseCreateConfig =
+  res
+    "CreateConfigResponse"
+    "fixture/CreateConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateConfig)
+
+responseCreateDataflowEndpointGroup :: DataflowEndpointGroupIdResponse -> TestTree
+responseCreateDataflowEndpointGroup =
+  res
+    "CreateDataflowEndpointGroupResponse"
+    "fixture/CreateDataflowEndpointGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataflowEndpointGroup)
+
+responseCreateEphemeris :: EphemerisIdResponse -> TestTree
+responseCreateEphemeris =
+  res
+    "CreateEphemerisResponse"
+    "fixture/CreateEphemerisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateEphemeris)
+
+responseCreateMissionProfile :: MissionProfileIdResponse -> TestTree
+responseCreateMissionProfile =
+  res
+    "CreateMissionProfileResponse"
+    "fixture/CreateMissionProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateMissionProfile)
+
+responseDeleteConfig :: ConfigIdResponse -> TestTree
+responseDeleteConfig =
+  res
+    "DeleteConfigResponse"
+    "fixture/DeleteConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteConfig)
+
+responseDeleteDataflowEndpointGroup :: DataflowEndpointGroupIdResponse -> TestTree
+responseDeleteDataflowEndpointGroup =
+  res
+    "DeleteDataflowEndpointGroupResponse"
+    "fixture/DeleteDataflowEndpointGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDataflowEndpointGroup)
+
+responseDeleteEphemeris :: EphemerisIdResponse -> TestTree
+responseDeleteEphemeris =
+  res
+    "DeleteEphemerisResponse"
+    "fixture/DeleteEphemerisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteEphemeris)
+
+responseDeleteMissionProfile :: MissionProfileIdResponse -> TestTree
+responseDeleteMissionProfile =
+  res
+    "DeleteMissionProfileResponse"
+    "fixture/DeleteMissionProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteMissionProfile)
+
+responseDescribeContact :: DescribeContactResponse -> TestTree
+responseDescribeContact =
+  res
+    "DescribeContactResponse"
+    "fixture/DescribeContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeContact)
+
+responseDescribeEphemeris :: DescribeEphemerisResponse -> TestTree
+responseDescribeEphemeris =
+  res
+    "DescribeEphemerisResponse"
+    "fixture/DescribeEphemerisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEphemeris)
+
+responseGetConfig :: GetConfigResponse -> TestTree
+responseGetConfig =
+  res
+    "GetConfigResponse"
+    "fixture/GetConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetConfig)
+
+responseGetDataflowEndpointGroup :: GetDataflowEndpointGroupResponse -> TestTree
+responseGetDataflowEndpointGroup =
+  res
+    "GetDataflowEndpointGroupResponse"
+    "fixture/GetDataflowEndpointGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDataflowEndpointGroup)
+
+responseGetMinuteUsage :: GetMinuteUsageResponse -> TestTree
+responseGetMinuteUsage =
+  res
+    "GetMinuteUsageResponse"
+    "fixture/GetMinuteUsageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetMinuteUsage)
+
+responseGetMissionProfile :: GetMissionProfileResponse -> TestTree
+responseGetMissionProfile =
+  res
+    "GetMissionProfileResponse"
+    "fixture/GetMissionProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetMissionProfile)
+
+responseGetSatellite :: GetSatelliteResponse -> TestTree
+responseGetSatellite =
+  res
+    "GetSatelliteResponse"
+    "fixture/GetSatelliteResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetSatellite)
+
+responseListConfigs :: ListConfigsResponse -> TestTree
+responseListConfigs =
+  res
+    "ListConfigsResponse"
+    "fixture/ListConfigsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListConfigs)
+
+responseListContacts :: ListContactsResponse -> TestTree
+responseListContacts =
+  res
+    "ListContactsResponse"
+    "fixture/ListContactsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListContacts)
+
+responseListDataflowEndpointGroups :: ListDataflowEndpointGroupsResponse -> TestTree
+responseListDataflowEndpointGroups =
+  res
+    "ListDataflowEndpointGroupsResponse"
+    "fixture/ListDataflowEndpointGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDataflowEndpointGroups)
+
+responseListEphemerides :: ListEphemeridesResponse -> TestTree
+responseListEphemerides =
+  res
+    "ListEphemeridesResponse"
+    "fixture/ListEphemeridesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEphemerides)
+
+responseListGroundStations :: ListGroundStationsResponse -> TestTree
+responseListGroundStations =
+  res
+    "ListGroundStationsResponse"
+    "fixture/ListGroundStationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGroundStations)
+
+responseListMissionProfiles :: ListMissionProfilesResponse -> TestTree
+responseListMissionProfiles =
+  res
+    "ListMissionProfilesResponse"
+    "fixture/ListMissionProfilesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMissionProfiles)
+
+responseListSatellites :: ListSatellitesResponse -> TestTree
+responseListSatellites =
+  res
+    "ListSatellitesResponse"
+    "fixture/ListSatellitesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSatellites)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseReserveContact :: ContactIdResponse -> TestTree
+responseReserveContact =
+  res
+    "ReserveContactResponse"
+    "fixture/ReserveContactResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ReserveContact)
+
+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)
+
+responseUpdateConfig :: ConfigIdResponse -> TestTree
+responseUpdateConfig =
+  res
+    "UpdateConfigResponse"
+    "fixture/UpdateConfigResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateConfig)
+
+responseUpdateEphemeris :: EphemerisIdResponse -> TestTree
+responseUpdateEphemeris =
+  res
+    "UpdateEphemerisResponse"
+    "fixture/UpdateEphemerisResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateEphemeris)
+
+responseUpdateMissionProfile :: MissionProfileIdResponse -> TestTree
+responseUpdateMissionProfile =
+  res
+    "UpdateMissionProfileResponse"
+    "fixture/UpdateMissionProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateMissionProfile)
diff --git a/test/Test/Amazonka/GroundStation.hs b/test/Test/Amazonka/GroundStation.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/GroundStation.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.GroundStation
+-- 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.GroundStation
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/GroundStation/Internal.hs b/test/Test/Amazonka/GroundStation/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/GroundStation/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.GroundStation.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.GroundStation.Internal where
