diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,9 +7,8 @@
 
 
 ## Version
-
-`1.6.1`
-
+ 
+`2.0` - Derived from API version @2015-09-21@ of the AWS service descriptions, licensed under Apache 2.0.
 
 ## Description
 
@@ -26,7 +25,7 @@
 The provided lenses should be compatible with any of the major lens libraries
 [lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
 
-See [Network.AWS.ECR](http://hackage.haskell.org/package/amazonka-ecr/docs/Network-AWS-ECR.html)
+See [Amazonka.ECR](http://hackage.haskell.org/package/amazonka-ecr/docs/Amazonka-ECR.html)
 or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
 
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import           Distribution.Simple
-main = defaultMain
diff --git a/amazonka-ecr.cabal b/amazonka-ecr.cabal
--- a/amazonka-ecr.cabal
+++ b/amazonka-ecr.cabal
@@ -1,107 +1,185 @@
-name:                  amazonka-ecr
-version:               1.6.1
-synopsis:              Amazon EC2 Container Registry SDK.
-homepage:              https://github.com/brendanhay/amazonka
-bug-reports:           https://github.com/brendanhay/amazonka/issues
-license:               MPL-2.0
-license-file:          LICENSE
-author:                Brendan Hay
-maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-copyright:             Copyright (c) 2013-2018 Brendan Hay
-category:              Network, AWS, Cloud, Distributed Computing
-build-type:            Simple
-cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+cabal-version:      2.2
+name:               amazonka-ecr
+version:            2.0
+synopsis:           Amazon EC2 Container Registry SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
 description:
-    The types from this library are intended to be used with
-    <http://hackage.haskell.org/package/amazonka amazonka>, which provides
-    mechanisms for specifying AuthN/AuthZ information, sending requests,
-    and receiving responses.
-    .
-    Lenses are used for constructing and manipulating types,
-    due to the depth of nesting of AWS types and transparency regarding
-    de/serialisation into more palatable Haskell values.
-    The provided lenses should be compatible with any of the major lens libraries
-    such as <http://hackage.haskell.org/package/lens lens> or
-    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
-    .
-    See "Network.AWS.ECR" or <https://aws.amazon.com/documentation/ the AWS documentation>
-    to get started.
+  Derived from API version @2015-09-21@ 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.ECR.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.ECR" 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-ecr
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-ecr
 
 library
-    default-language:  Haskell2010
-    hs-source-dirs:    src gen
-
-    ghc-options:
-        -Wall
-        -fwarn-incomplete-uni-patterns
-        -fwarn-incomplete-record-updates
-        -funbox-strict-fields
-
-    exposed-modules:
-          Network.AWS.ECR
-        , Network.AWS.ECR.BatchCheckLayerAvailability
-        , Network.AWS.ECR.BatchDeleteImage
-        , Network.AWS.ECR.BatchGetImage
-        , Network.AWS.ECR.CompleteLayerUpload
-        , Network.AWS.ECR.CreateRepository
-        , Network.AWS.ECR.DeleteLifecyclePolicy
-        , Network.AWS.ECR.DeleteRepository
-        , Network.AWS.ECR.DeleteRepositoryPolicy
-        , Network.AWS.ECR.DescribeImages
-        , Network.AWS.ECR.DescribeRepositories
-        , Network.AWS.ECR.GetAuthorizationToken
-        , Network.AWS.ECR.GetDownloadURLForLayer
-        , Network.AWS.ECR.GetLifecyclePolicy
-        , Network.AWS.ECR.GetLifecyclePolicyPreview
-        , Network.AWS.ECR.GetRepositoryPolicy
-        , Network.AWS.ECR.InitiateLayerUpload
-        , Network.AWS.ECR.ListImages
-        , Network.AWS.ECR.PutImage
-        , Network.AWS.ECR.PutLifecyclePolicy
-        , Network.AWS.ECR.SetRepositoryPolicy
-        , Network.AWS.ECR.StartLifecyclePolicyPreview
-        , Network.AWS.ECR.Types
-        , Network.AWS.ECR.UploadLayerPart
-        , Network.AWS.ECR.Waiters
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
 
-    other-modules:
-          Network.AWS.ECR.Types.Product
-        , Network.AWS.ECR.Types.Sum
+  exposed-modules:
+    Amazonka.ECR
+    Amazonka.ECR.BatchCheckLayerAvailability
+    Amazonka.ECR.BatchDeleteImage
+    Amazonka.ECR.BatchGetImage
+    Amazonka.ECR.BatchGetRepositoryScanningConfiguration
+    Amazonka.ECR.CompleteLayerUpload
+    Amazonka.ECR.CreatePullThroughCacheRule
+    Amazonka.ECR.CreateRepository
+    Amazonka.ECR.DeleteLifecyclePolicy
+    Amazonka.ECR.DeletePullThroughCacheRule
+    Amazonka.ECR.DeleteRegistryPolicy
+    Amazonka.ECR.DeleteRepository
+    Amazonka.ECR.DeleteRepositoryPolicy
+    Amazonka.ECR.DescribeImageReplicationStatus
+    Amazonka.ECR.DescribeImages
+    Amazonka.ECR.DescribeImageScanFindings
+    Amazonka.ECR.DescribePullThroughCacheRules
+    Amazonka.ECR.DescribeRegistry
+    Amazonka.ECR.DescribeRepositories
+    Amazonka.ECR.GetAuthorizationToken
+    Amazonka.ECR.GetDownloadUrlForLayer
+    Amazonka.ECR.GetLifecyclePolicy
+    Amazonka.ECR.GetLifecyclePolicyPreview
+    Amazonka.ECR.GetRegistryPolicy
+    Amazonka.ECR.GetRegistryScanningConfiguration
+    Amazonka.ECR.GetRepositoryPolicy
+    Amazonka.ECR.InitiateLayerUpload
+    Amazonka.ECR.Lens
+    Amazonka.ECR.ListImages
+    Amazonka.ECR.ListTagsForResource
+    Amazonka.ECR.PutImage
+    Amazonka.ECR.PutImageScanningConfiguration
+    Amazonka.ECR.PutImageTagMutability
+    Amazonka.ECR.PutLifecyclePolicy
+    Amazonka.ECR.PutRegistryPolicy
+    Amazonka.ECR.PutRegistryScanningConfiguration
+    Amazonka.ECR.PutReplicationConfiguration
+    Amazonka.ECR.SetRepositoryPolicy
+    Amazonka.ECR.StartImageScan
+    Amazonka.ECR.StartLifecyclePolicyPreview
+    Amazonka.ECR.TagResource
+    Amazonka.ECR.Types
+    Amazonka.ECR.Types.Attribute
+    Amazonka.ECR.Types.AuthorizationData
+    Amazonka.ECR.Types.AwsEcrContainerImageDetails
+    Amazonka.ECR.Types.CvssScore
+    Amazonka.ECR.Types.CvssScoreAdjustment
+    Amazonka.ECR.Types.CvssScoreDetails
+    Amazonka.ECR.Types.DescribeImagesFilter
+    Amazonka.ECR.Types.EncryptionConfiguration
+    Amazonka.ECR.Types.EncryptionType
+    Amazonka.ECR.Types.EnhancedImageScanFinding
+    Amazonka.ECR.Types.FindingSeverity
+    Amazonka.ECR.Types.Image
+    Amazonka.ECR.Types.ImageActionType
+    Amazonka.ECR.Types.ImageDetail
+    Amazonka.ECR.Types.ImageFailure
+    Amazonka.ECR.Types.ImageFailureCode
+    Amazonka.ECR.Types.ImageIdentifier
+    Amazonka.ECR.Types.ImageReplicationStatus
+    Amazonka.ECR.Types.ImageScanFinding
+    Amazonka.ECR.Types.ImageScanFindings
+    Amazonka.ECR.Types.ImageScanFindingsSummary
+    Amazonka.ECR.Types.ImageScanningConfiguration
+    Amazonka.ECR.Types.ImageScanStatus
+    Amazonka.ECR.Types.ImageTagMutability
+    Amazonka.ECR.Types.Layer
+    Amazonka.ECR.Types.LayerAvailability
+    Amazonka.ECR.Types.LayerFailure
+    Amazonka.ECR.Types.LayerFailureCode
+    Amazonka.ECR.Types.LifecyclePolicyPreviewFilter
+    Amazonka.ECR.Types.LifecyclePolicyPreviewResult
+    Amazonka.ECR.Types.LifecyclePolicyPreviewStatus
+    Amazonka.ECR.Types.LifecyclePolicyPreviewSummary
+    Amazonka.ECR.Types.LifecyclePolicyRuleAction
+    Amazonka.ECR.Types.ListImagesFilter
+    Amazonka.ECR.Types.PackageVulnerabilityDetails
+    Amazonka.ECR.Types.PullThroughCacheRule
+    Amazonka.ECR.Types.Recommendation
+    Amazonka.ECR.Types.RegistryScanningConfiguration
+    Amazonka.ECR.Types.RegistryScanningRule
+    Amazonka.ECR.Types.Remediation
+    Amazonka.ECR.Types.ReplicationConfiguration
+    Amazonka.ECR.Types.ReplicationDestination
+    Amazonka.ECR.Types.ReplicationRule
+    Amazonka.ECR.Types.ReplicationStatus
+    Amazonka.ECR.Types.Repository
+    Amazonka.ECR.Types.RepositoryFilter
+    Amazonka.ECR.Types.RepositoryFilterType
+    Amazonka.ECR.Types.RepositoryScanningConfiguration
+    Amazonka.ECR.Types.RepositoryScanningConfigurationFailure
+    Amazonka.ECR.Types.Resource
+    Amazonka.ECR.Types.ResourceDetails
+    Amazonka.ECR.Types.ScanFrequency
+    Amazonka.ECR.Types.ScanningConfigurationFailureCode
+    Amazonka.ECR.Types.ScanningRepositoryFilter
+    Amazonka.ECR.Types.ScanningRepositoryFilterType
+    Amazonka.ECR.Types.ScanStatus
+    Amazonka.ECR.Types.ScanType
+    Amazonka.ECR.Types.ScoreDetails
+    Amazonka.ECR.Types.Tag
+    Amazonka.ECR.Types.TagStatus
+    Amazonka.ECR.Types.VulnerablePackage
+    Amazonka.ECR.UntagResource
+    Amazonka.ECR.UploadLayerPart
+    Amazonka.ECR.Waiters
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , base          >= 4.7     && < 5
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
 
 test-suite amazonka-ecr-test
-    type:              exitcode-stdio-1.0
-    default-language:  Haskell2010
-    hs-source-dirs:    test
-    main-is:           Main.hs
-
-    ghc-options:       -Wall -threaded
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
 
-    -- This section is encoded by the template and any modules added by
-    -- hand outside these namespaces will not correctly be added to the
-    -- distribution package.
-    other-modules:
-          Test.AWS.ECR
-        , Test.AWS.Gen.ECR
-        , Test.AWS.ECR.Internal
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.ECR
+    Test.Amazonka.ECR.Internal
+    Test.Amazonka.Gen.ECR
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , amazonka-test == 1.6.1.*
-        , amazonka-ecr
-        , base
-        , bytestring
-        , tasty
-        , tasty-hunit
-        , text
-        , time
-        , unordered-containers
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-ecr
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchCheckLayerAvailability.yaml b/fixture/BatchCheckLayerAvailability.yaml
--- a/fixture/BatchCheckLayerAvailability.yaml
+++ b/fixture/BatchCheckLayerAvailability.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/BatchDeleteImage.yaml b/fixture/BatchDeleteImage.yaml
--- a/fixture/BatchDeleteImage.yaml
+++ b/fixture/BatchDeleteImage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/BatchGetImage.yaml b/fixture/BatchGetImage.yaml
--- a/fixture/BatchGetImage.yaml
+++ b/fixture/BatchGetImage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/BatchGetRepositoryScanningConfiguration.yaml b/fixture/BatchGetRepositoryScanningConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetRepositoryScanningConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/BatchGetRepositoryScanningConfigurationResponse.proto b/fixture/BatchGetRepositoryScanningConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetRepositoryScanningConfigurationResponse.proto
diff --git a/fixture/CompleteLayerUpload.yaml b/fixture/CompleteLayerUpload.yaml
--- a/fixture/CompleteLayerUpload.yaml
+++ b/fixture/CompleteLayerUpload.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/CreatePullThroughCacheRule.yaml b/fixture/CreatePullThroughCacheRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePullThroughCacheRule.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/CreatePullThroughCacheRuleResponse.proto b/fixture/CreatePullThroughCacheRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePullThroughCacheRuleResponse.proto
diff --git a/fixture/CreateRepository.yaml b/fixture/CreateRepository.yaml
--- a/fixture/CreateRepository.yaml
+++ b/fixture/CreateRepository.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DeleteLifecyclePolicy.yaml b/fixture/DeleteLifecyclePolicy.yaml
--- a/fixture/DeleteLifecyclePolicy.yaml
+++ b/fixture/DeleteLifecyclePolicy.yaml
@@ -1,8 +1,8 @@
 ---
 method: POST
 headers:
-  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
-  Host:                  ecr.us-east-1.amazonaws.com
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
   Content-Type:          application/x-www-form-urlencoded; charset=utf-8
   X-Amz-Content-SHA256:  abcdef
   X-Amz-Date:            20091028T223200Z
diff --git a/fixture/DeletePullThroughCacheRule.yaml b/fixture/DeletePullThroughCacheRule.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePullThroughCacheRule.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DeletePullThroughCacheRuleResponse.proto b/fixture/DeletePullThroughCacheRuleResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePullThroughCacheRuleResponse.proto
diff --git a/fixture/DeleteRegistryPolicy.yaml b/fixture/DeleteRegistryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRegistryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DeleteRegistryPolicyResponse.proto b/fixture/DeleteRegistryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRegistryPolicyResponse.proto
diff --git a/fixture/DeleteRepository.yaml b/fixture/DeleteRepository.yaml
--- a/fixture/DeleteRepository.yaml
+++ b/fixture/DeleteRepository.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DeleteRepositoryPolicy.yaml b/fixture/DeleteRepositoryPolicy.yaml
--- a/fixture/DeleteRepositoryPolicy.yaml
+++ b/fixture/DeleteRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribeImageReplicationStatus.yaml b/fixture/DescribeImageReplicationStatus.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageReplicationStatus.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribeImageReplicationStatusResponse.proto b/fixture/DescribeImageReplicationStatusResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageReplicationStatusResponse.proto
diff --git a/fixture/DescribeImageScanFindings.yaml b/fixture/DescribeImageScanFindings.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageScanFindings.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribeImageScanFindingsResponse.proto b/fixture/DescribeImageScanFindingsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeImageScanFindingsResponse.proto
diff --git a/fixture/DescribeImages.yaml b/fixture/DescribeImages.yaml
--- a/fixture/DescribeImages.yaml
+++ b/fixture/DescribeImages.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribePullThroughCacheRules.yaml b/fixture/DescribePullThroughCacheRules.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePullThroughCacheRules.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribePullThroughCacheRulesResponse.proto b/fixture/DescribePullThroughCacheRulesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePullThroughCacheRulesResponse.proto
diff --git a/fixture/DescribeRegistry.yaml b/fixture/DescribeRegistry.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRegistry.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/DescribeRegistryResponse.proto b/fixture/DescribeRegistryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRegistryResponse.proto
diff --git a/fixture/DescribeRepositories.yaml b/fixture/DescribeRepositories.yaml
--- a/fixture/DescribeRepositories.yaml
+++ b/fixture/DescribeRepositories.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/GetAuthorizationToken.yaml b/fixture/GetAuthorizationToken.yaml
--- a/fixture/GetAuthorizationToken.yaml
+++ b/fixture/GetAuthorizationToken.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/GetDownloadURLForLayer.yaml b/fixture/GetDownloadURLForLayer.yaml
deleted file mode 100644
--- a/fixture/GetDownloadURLForLayer.yaml
+++ /dev/null
diff --git a/fixture/GetDownloadURLForLayerResponse.proto b/fixture/GetDownloadURLForLayerResponse.proto
deleted file mode 100644
--- a/fixture/GetDownloadURLForLayerResponse.proto
+++ /dev/null
diff --git a/fixture/GetDownloadUrlForLayer.yaml b/fixture/GetDownloadUrlForLayer.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDownloadUrlForLayer.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/GetDownloadUrlForLayerResponse.proto b/fixture/GetDownloadUrlForLayerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDownloadUrlForLayerResponse.proto
diff --git a/fixture/GetLifecyclePolicy.yaml b/fixture/GetLifecyclePolicy.yaml
--- a/fixture/GetLifecyclePolicy.yaml
+++ b/fixture/GetLifecyclePolicy.yaml
@@ -1,8 +1,8 @@
 ---
 method: POST
 headers:
-  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
-  Host:                  ecr.us-east-1.amazonaws.com
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
   Content-Type:          application/x-www-form-urlencoded; charset=utf-8
   X-Amz-Content-SHA256:  abcdef
   X-Amz-Date:            20091028T223200Z
diff --git a/fixture/GetLifecyclePolicyPreview.yaml b/fixture/GetLifecyclePolicyPreview.yaml
--- a/fixture/GetLifecyclePolicyPreview.yaml
+++ b/fixture/GetLifecyclePolicyPreview.yaml
@@ -1,8 +1,8 @@
 ---
 method: POST
 headers:
-  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
-  Host:                  ecr.us-east-1.amazonaws.com
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
   Content-Type:          application/x-www-form-urlencoded; charset=utf-8
   X-Amz-Content-SHA256:  abcdef
   X-Amz-Date:            20091028T223200Z
diff --git a/fixture/GetRegistryPolicy.yaml b/fixture/GetRegistryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/GetRegistryPolicyResponse.proto b/fixture/GetRegistryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryPolicyResponse.proto
diff --git a/fixture/GetRegistryScanningConfiguration.yaml b/fixture/GetRegistryScanningConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryScanningConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/GetRegistryScanningConfigurationResponse.proto b/fixture/GetRegistryScanningConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRegistryScanningConfigurationResponse.proto
diff --git a/fixture/GetRepositoryPolicy.yaml b/fixture/GetRepositoryPolicy.yaml
--- a/fixture/GetRepositoryPolicy.yaml
+++ b/fixture/GetRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/InitiateLayerUpload.yaml b/fixture/InitiateLayerUpload.yaml
--- a/fixture/InitiateLayerUpload.yaml
+++ b/fixture/InitiateLayerUpload.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/ListImages.yaml b/fixture/ListImages.yaml
--- a/fixture/ListImages.yaml
+++ b/fixture/ListImages.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutImage.yaml b/fixture/PutImage.yaml
--- a/fixture/PutImage.yaml
+++ b/fixture/PutImage.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutImageScanningConfiguration.yaml b/fixture/PutImageScanningConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutImageScanningConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutImageScanningConfigurationResponse.proto b/fixture/PutImageScanningConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutImageScanningConfigurationResponse.proto
diff --git a/fixture/PutImageTagMutability.yaml b/fixture/PutImageTagMutability.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutImageTagMutability.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutImageTagMutabilityResponse.proto b/fixture/PutImageTagMutabilityResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutImageTagMutabilityResponse.proto
diff --git a/fixture/PutLifecyclePolicy.yaml b/fixture/PutLifecyclePolicy.yaml
--- a/fixture/PutLifecyclePolicy.yaml
+++ b/fixture/PutLifecyclePolicy.yaml
@@ -1,8 +1,8 @@
 ---
 method: POST
 headers:
-  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
-  Host:                  ecr.us-east-1.amazonaws.com
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
   Content-Type:          application/x-www-form-urlencoded; charset=utf-8
   X-Amz-Content-SHA256:  abcdef
   X-Amz-Date:            20091028T223200Z
diff --git a/fixture/PutRegistryPolicy.yaml b/fixture/PutRegistryPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutRegistryPolicyResponse.proto b/fixture/PutRegistryPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryPolicyResponse.proto
diff --git a/fixture/PutRegistryScanningConfiguration.yaml b/fixture/PutRegistryScanningConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryScanningConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutRegistryScanningConfigurationResponse.proto b/fixture/PutRegistryScanningConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRegistryScanningConfigurationResponse.proto
diff --git a/fixture/PutReplicationConfiguration.yaml b/fixture/PutReplicationConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutReplicationConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/PutReplicationConfigurationResponse.proto b/fixture/PutReplicationConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutReplicationConfigurationResponse.proto
diff --git a/fixture/SetRepositoryPolicy.yaml b/fixture/SetRepositoryPolicy.yaml
--- a/fixture/SetRepositoryPolicy.yaml
+++ b/fixture/SetRepositoryPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/StartImageScan.yaml b/fixture/StartImageScan.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartImageScan.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/StartImageScanResponse.proto b/fixture/StartImageScanResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartImageScanResponse.proto
diff --git a/fixture/StartLifecyclePolicyPreview.yaml b/fixture/StartLifecyclePolicyPreview.yaml
--- a/fixture/StartLifecyclePolicyPreview.yaml
+++ b/fixture/StartLifecyclePolicyPreview.yaml
@@ -1,8 +1,8 @@
 ---
 method: POST
 headers:
-  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
-  Host:                  ecr.us-east-1.amazonaws.com
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
   Content-Type:          application/x-www-form-urlencoded; charset=utf-8
   X-Amz-Content-SHA256:  abcdef
   X-Amz-Date:            20091028T223200Z
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/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.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/UploadLayerPart.yaml b/fixture/UploadLayerPart.yaml
--- a/fixture/UploadLayerPart.yaml
+++ b/fixture/UploadLayerPart.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/api.ecr/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  api.ecr.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/gen/Amazonka/ECR.hs b/gen/Amazonka/ECR.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR.hs
@@ -0,0 +1,694 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.ECR
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2015-09-21@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Elastic Container Registry
+--
+-- Amazon Elastic Container Registry (Amazon ECR) is a managed container
+-- image registry service. Customers can use the familiar Docker CLI, or
+-- their preferred client, to push, pull, and manage images. Amazon ECR
+-- provides a secure, scalable, and reliable registry for your Docker or
+-- Open Container Initiative (OCI) images. Amazon ECR supports private
+-- repositories with resource-based permissions using IAM so that specific
+-- users or Amazon EC2 instances can access repositories and images.
+--
+-- Amazon ECR has service endpoints in each supported Region. For more
+-- information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/ecr.html Amazon ECR endpoints>
+-- in the /Amazon Web Services General Reference/.
+module Amazonka.ECR
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** EmptyUploadException
+    _EmptyUploadException,
+
+    -- ** ImageAlreadyExistsException
+    _ImageAlreadyExistsException,
+
+    -- ** ImageDigestDoesNotMatchException
+    _ImageDigestDoesNotMatchException,
+
+    -- ** ImageNotFoundException
+    _ImageNotFoundException,
+
+    -- ** ImageTagAlreadyExistsException
+    _ImageTagAlreadyExistsException,
+
+    -- ** InvalidLayerException
+    _InvalidLayerException,
+
+    -- ** InvalidLayerPartException
+    _InvalidLayerPartException,
+
+    -- ** InvalidParameterException
+    _InvalidParameterException,
+
+    -- ** InvalidTagParameterException
+    _InvalidTagParameterException,
+
+    -- ** KmsException
+    _KmsException,
+
+    -- ** LayerAlreadyExistsException
+    _LayerAlreadyExistsException,
+
+    -- ** LayerInaccessibleException
+    _LayerInaccessibleException,
+
+    -- ** LayerPartTooSmallException
+    _LayerPartTooSmallException,
+
+    -- ** LayersNotFoundException
+    _LayersNotFoundException,
+
+    -- ** LifecyclePolicyNotFoundException
+    _LifecyclePolicyNotFoundException,
+
+    -- ** LifecyclePolicyPreviewInProgressException
+    _LifecyclePolicyPreviewInProgressException,
+
+    -- ** LifecyclePolicyPreviewNotFoundException
+    _LifecyclePolicyPreviewNotFoundException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** PullThroughCacheRuleAlreadyExistsException
+    _PullThroughCacheRuleAlreadyExistsException,
+
+    -- ** PullThroughCacheRuleNotFoundException
+    _PullThroughCacheRuleNotFoundException,
+
+    -- ** ReferencedImagesNotFoundException
+    _ReferencedImagesNotFoundException,
+
+    -- ** RegistryPolicyNotFoundException
+    _RegistryPolicyNotFoundException,
+
+    -- ** RepositoryAlreadyExistsException
+    _RepositoryAlreadyExistsException,
+
+    -- ** RepositoryNotEmptyException
+    _RepositoryNotEmptyException,
+
+    -- ** RepositoryNotFoundException
+    _RepositoryNotFoundException,
+
+    -- ** RepositoryPolicyNotFoundException
+    _RepositoryPolicyNotFoundException,
+
+    -- ** ScanNotFoundException
+    _ScanNotFoundException,
+
+    -- ** ServerException
+    _ServerException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- ** UnsupportedImageTypeException
+    _UnsupportedImageTypeException,
+
+    -- ** UnsupportedUpstreamRegistryException
+    _UnsupportedUpstreamRegistryException,
+
+    -- ** UploadNotFoundException
+    _UploadNotFoundException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- ** ImageScanComplete
+    newImageScanComplete,
+
+    -- ** LifecyclePolicyPreviewComplete
+    newLifecyclePolicyPreviewComplete,
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchCheckLayerAvailability
+    BatchCheckLayerAvailability (BatchCheckLayerAvailability'),
+    newBatchCheckLayerAvailability,
+    BatchCheckLayerAvailabilityResponse (BatchCheckLayerAvailabilityResponse'),
+    newBatchCheckLayerAvailabilityResponse,
+
+    -- ** BatchDeleteImage
+    BatchDeleteImage (BatchDeleteImage'),
+    newBatchDeleteImage,
+    BatchDeleteImageResponse (BatchDeleteImageResponse'),
+    newBatchDeleteImageResponse,
+
+    -- ** BatchGetImage
+    BatchGetImage (BatchGetImage'),
+    newBatchGetImage,
+    BatchGetImageResponse (BatchGetImageResponse'),
+    newBatchGetImageResponse,
+
+    -- ** BatchGetRepositoryScanningConfiguration
+    BatchGetRepositoryScanningConfiguration (BatchGetRepositoryScanningConfiguration'),
+    newBatchGetRepositoryScanningConfiguration,
+    BatchGetRepositoryScanningConfigurationResponse (BatchGetRepositoryScanningConfigurationResponse'),
+    newBatchGetRepositoryScanningConfigurationResponse,
+
+    -- ** CompleteLayerUpload
+    CompleteLayerUpload (CompleteLayerUpload'),
+    newCompleteLayerUpload,
+    CompleteLayerUploadResponse (CompleteLayerUploadResponse'),
+    newCompleteLayerUploadResponse,
+
+    -- ** CreatePullThroughCacheRule
+    CreatePullThroughCacheRule (CreatePullThroughCacheRule'),
+    newCreatePullThroughCacheRule,
+    CreatePullThroughCacheRuleResponse (CreatePullThroughCacheRuleResponse'),
+    newCreatePullThroughCacheRuleResponse,
+
+    -- ** CreateRepository
+    CreateRepository (CreateRepository'),
+    newCreateRepository,
+    CreateRepositoryResponse (CreateRepositoryResponse'),
+    newCreateRepositoryResponse,
+
+    -- ** DeleteLifecyclePolicy
+    DeleteLifecyclePolicy (DeleteLifecyclePolicy'),
+    newDeleteLifecyclePolicy,
+    DeleteLifecyclePolicyResponse (DeleteLifecyclePolicyResponse'),
+    newDeleteLifecyclePolicyResponse,
+
+    -- ** DeletePullThroughCacheRule
+    DeletePullThroughCacheRule (DeletePullThroughCacheRule'),
+    newDeletePullThroughCacheRule,
+    DeletePullThroughCacheRuleResponse (DeletePullThroughCacheRuleResponse'),
+    newDeletePullThroughCacheRuleResponse,
+
+    -- ** DeleteRegistryPolicy
+    DeleteRegistryPolicy (DeleteRegistryPolicy'),
+    newDeleteRegistryPolicy,
+    DeleteRegistryPolicyResponse (DeleteRegistryPolicyResponse'),
+    newDeleteRegistryPolicyResponse,
+
+    -- ** DeleteRepository
+    DeleteRepository (DeleteRepository'),
+    newDeleteRepository,
+    DeleteRepositoryResponse (DeleteRepositoryResponse'),
+    newDeleteRepositoryResponse,
+
+    -- ** DeleteRepositoryPolicy
+    DeleteRepositoryPolicy (DeleteRepositoryPolicy'),
+    newDeleteRepositoryPolicy,
+    DeleteRepositoryPolicyResponse (DeleteRepositoryPolicyResponse'),
+    newDeleteRepositoryPolicyResponse,
+
+    -- ** DescribeImageReplicationStatus
+    DescribeImageReplicationStatus (DescribeImageReplicationStatus'),
+    newDescribeImageReplicationStatus,
+    DescribeImageReplicationStatusResponse (DescribeImageReplicationStatusResponse'),
+    newDescribeImageReplicationStatusResponse,
+
+    -- ** DescribeImageScanFindings (Paginated)
+    DescribeImageScanFindings (DescribeImageScanFindings'),
+    newDescribeImageScanFindings,
+    DescribeImageScanFindingsResponse (DescribeImageScanFindingsResponse'),
+    newDescribeImageScanFindingsResponse,
+
+    -- ** DescribeImages (Paginated)
+    DescribeImages (DescribeImages'),
+    newDescribeImages,
+    DescribeImagesResponse (DescribeImagesResponse'),
+    newDescribeImagesResponse,
+
+    -- ** DescribePullThroughCacheRules (Paginated)
+    DescribePullThroughCacheRules (DescribePullThroughCacheRules'),
+    newDescribePullThroughCacheRules,
+    DescribePullThroughCacheRulesResponse (DescribePullThroughCacheRulesResponse'),
+    newDescribePullThroughCacheRulesResponse,
+
+    -- ** DescribeRegistry
+    DescribeRegistry (DescribeRegistry'),
+    newDescribeRegistry,
+    DescribeRegistryResponse (DescribeRegistryResponse'),
+    newDescribeRegistryResponse,
+
+    -- ** DescribeRepositories (Paginated)
+    DescribeRepositories (DescribeRepositories'),
+    newDescribeRepositories,
+    DescribeRepositoriesResponse (DescribeRepositoriesResponse'),
+    newDescribeRepositoriesResponse,
+
+    -- ** GetAuthorizationToken
+    GetAuthorizationToken (GetAuthorizationToken'),
+    newGetAuthorizationToken,
+    GetAuthorizationTokenResponse (GetAuthorizationTokenResponse'),
+    newGetAuthorizationTokenResponse,
+
+    -- ** GetDownloadUrlForLayer
+    GetDownloadUrlForLayer (GetDownloadUrlForLayer'),
+    newGetDownloadUrlForLayer,
+    GetDownloadUrlForLayerResponse (GetDownloadUrlForLayerResponse'),
+    newGetDownloadUrlForLayerResponse,
+
+    -- ** GetLifecyclePolicy
+    GetLifecyclePolicy (GetLifecyclePolicy'),
+    newGetLifecyclePolicy,
+    GetLifecyclePolicyResponse (GetLifecyclePolicyResponse'),
+    newGetLifecyclePolicyResponse,
+
+    -- ** GetLifecyclePolicyPreview (Paginated)
+    GetLifecyclePolicyPreview (GetLifecyclePolicyPreview'),
+    newGetLifecyclePolicyPreview,
+    GetLifecyclePolicyPreviewResponse (GetLifecyclePolicyPreviewResponse'),
+    newGetLifecyclePolicyPreviewResponse,
+
+    -- ** GetRegistryPolicy
+    GetRegistryPolicy (GetRegistryPolicy'),
+    newGetRegistryPolicy,
+    GetRegistryPolicyResponse (GetRegistryPolicyResponse'),
+    newGetRegistryPolicyResponse,
+
+    -- ** GetRegistryScanningConfiguration
+    GetRegistryScanningConfiguration (GetRegistryScanningConfiguration'),
+    newGetRegistryScanningConfiguration,
+    GetRegistryScanningConfigurationResponse (GetRegistryScanningConfigurationResponse'),
+    newGetRegistryScanningConfigurationResponse,
+
+    -- ** GetRepositoryPolicy
+    GetRepositoryPolicy (GetRepositoryPolicy'),
+    newGetRepositoryPolicy,
+    GetRepositoryPolicyResponse (GetRepositoryPolicyResponse'),
+    newGetRepositoryPolicyResponse,
+
+    -- ** InitiateLayerUpload
+    InitiateLayerUpload (InitiateLayerUpload'),
+    newInitiateLayerUpload,
+    InitiateLayerUploadResponse (InitiateLayerUploadResponse'),
+    newInitiateLayerUploadResponse,
+
+    -- ** ListImages (Paginated)
+    ListImages (ListImages'),
+    newListImages,
+    ListImagesResponse (ListImagesResponse'),
+    newListImagesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutImage
+    PutImage (PutImage'),
+    newPutImage,
+    PutImageResponse (PutImageResponse'),
+    newPutImageResponse,
+
+    -- ** PutImageScanningConfiguration
+    PutImageScanningConfiguration (PutImageScanningConfiguration'),
+    newPutImageScanningConfiguration,
+    PutImageScanningConfigurationResponse (PutImageScanningConfigurationResponse'),
+    newPutImageScanningConfigurationResponse,
+
+    -- ** PutImageTagMutability
+    PutImageTagMutability (PutImageTagMutability'),
+    newPutImageTagMutability,
+    PutImageTagMutabilityResponse (PutImageTagMutabilityResponse'),
+    newPutImageTagMutabilityResponse,
+
+    -- ** PutLifecyclePolicy
+    PutLifecyclePolicy (PutLifecyclePolicy'),
+    newPutLifecyclePolicy,
+    PutLifecyclePolicyResponse (PutLifecyclePolicyResponse'),
+    newPutLifecyclePolicyResponse,
+
+    -- ** PutRegistryPolicy
+    PutRegistryPolicy (PutRegistryPolicy'),
+    newPutRegistryPolicy,
+    PutRegistryPolicyResponse (PutRegistryPolicyResponse'),
+    newPutRegistryPolicyResponse,
+
+    -- ** PutRegistryScanningConfiguration
+    PutRegistryScanningConfiguration (PutRegistryScanningConfiguration'),
+    newPutRegistryScanningConfiguration,
+    PutRegistryScanningConfigurationResponse (PutRegistryScanningConfigurationResponse'),
+    newPutRegistryScanningConfigurationResponse,
+
+    -- ** PutReplicationConfiguration
+    PutReplicationConfiguration (PutReplicationConfiguration'),
+    newPutReplicationConfiguration,
+    PutReplicationConfigurationResponse (PutReplicationConfigurationResponse'),
+    newPutReplicationConfigurationResponse,
+
+    -- ** SetRepositoryPolicy
+    SetRepositoryPolicy (SetRepositoryPolicy'),
+    newSetRepositoryPolicy,
+    SetRepositoryPolicyResponse (SetRepositoryPolicyResponse'),
+    newSetRepositoryPolicyResponse,
+
+    -- ** StartImageScan
+    StartImageScan (StartImageScan'),
+    newStartImageScan,
+    StartImageScanResponse (StartImageScanResponse'),
+    newStartImageScanResponse,
+
+    -- ** StartLifecyclePolicyPreview
+    StartLifecyclePolicyPreview (StartLifecyclePolicyPreview'),
+    newStartLifecyclePolicyPreview,
+    StartLifecyclePolicyPreviewResponse (StartLifecyclePolicyPreviewResponse'),
+    newStartLifecyclePolicyPreviewResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UploadLayerPart
+    UploadLayerPart (UploadLayerPart'),
+    newUploadLayerPart,
+    UploadLayerPartResponse (UploadLayerPartResponse'),
+    newUploadLayerPartResponse,
+
+    -- * Types
+
+    -- ** EncryptionType
+    EncryptionType (..),
+
+    -- ** FindingSeverity
+    FindingSeverity (..),
+
+    -- ** ImageActionType
+    ImageActionType (..),
+
+    -- ** ImageFailureCode
+    ImageFailureCode (..),
+
+    -- ** ImageTagMutability
+    ImageTagMutability (..),
+
+    -- ** LayerAvailability
+    LayerAvailability (..),
+
+    -- ** LayerFailureCode
+    LayerFailureCode (..),
+
+    -- ** LifecyclePolicyPreviewStatus
+    LifecyclePolicyPreviewStatus (..),
+
+    -- ** ReplicationStatus
+    ReplicationStatus (..),
+
+    -- ** RepositoryFilterType
+    RepositoryFilterType (..),
+
+    -- ** ScanFrequency
+    ScanFrequency (..),
+
+    -- ** ScanStatus
+    ScanStatus (..),
+
+    -- ** ScanType
+    ScanType (..),
+
+    -- ** ScanningConfigurationFailureCode
+    ScanningConfigurationFailureCode (..),
+
+    -- ** ScanningRepositoryFilterType
+    ScanningRepositoryFilterType (..),
+
+    -- ** TagStatus
+    TagStatus (..),
+
+    -- ** Attribute
+    Attribute (Attribute'),
+    newAttribute,
+
+    -- ** AuthorizationData
+    AuthorizationData (AuthorizationData'),
+    newAuthorizationData,
+
+    -- ** AwsEcrContainerImageDetails
+    AwsEcrContainerImageDetails (AwsEcrContainerImageDetails'),
+    newAwsEcrContainerImageDetails,
+
+    -- ** CvssScore
+    CvssScore (CvssScore'),
+    newCvssScore,
+
+    -- ** CvssScoreAdjustment
+    CvssScoreAdjustment (CvssScoreAdjustment'),
+    newCvssScoreAdjustment,
+
+    -- ** CvssScoreDetails
+    CvssScoreDetails (CvssScoreDetails'),
+    newCvssScoreDetails,
+
+    -- ** DescribeImagesFilter
+    DescribeImagesFilter (DescribeImagesFilter'),
+    newDescribeImagesFilter,
+
+    -- ** EncryptionConfiguration
+    EncryptionConfiguration (EncryptionConfiguration'),
+    newEncryptionConfiguration,
+
+    -- ** EnhancedImageScanFinding
+    EnhancedImageScanFinding (EnhancedImageScanFinding'),
+    newEnhancedImageScanFinding,
+
+    -- ** Image
+    Image (Image'),
+    newImage,
+
+    -- ** ImageDetail
+    ImageDetail (ImageDetail'),
+    newImageDetail,
+
+    -- ** ImageFailure
+    ImageFailure (ImageFailure'),
+    newImageFailure,
+
+    -- ** ImageIdentifier
+    ImageIdentifier (ImageIdentifier'),
+    newImageIdentifier,
+
+    -- ** ImageReplicationStatus
+    ImageReplicationStatus (ImageReplicationStatus'),
+    newImageReplicationStatus,
+
+    -- ** ImageScanFinding
+    ImageScanFinding (ImageScanFinding'),
+    newImageScanFinding,
+
+    -- ** ImageScanFindings
+    ImageScanFindings (ImageScanFindings'),
+    newImageScanFindings,
+
+    -- ** ImageScanFindingsSummary
+    ImageScanFindingsSummary (ImageScanFindingsSummary'),
+    newImageScanFindingsSummary,
+
+    -- ** ImageScanStatus
+    ImageScanStatus (ImageScanStatus'),
+    newImageScanStatus,
+
+    -- ** ImageScanningConfiguration
+    ImageScanningConfiguration (ImageScanningConfiguration'),
+    newImageScanningConfiguration,
+
+    -- ** Layer
+    Layer (Layer'),
+    newLayer,
+
+    -- ** LayerFailure
+    LayerFailure (LayerFailure'),
+    newLayerFailure,
+
+    -- ** LifecyclePolicyPreviewFilter
+    LifecyclePolicyPreviewFilter (LifecyclePolicyPreviewFilter'),
+    newLifecyclePolicyPreviewFilter,
+
+    -- ** LifecyclePolicyPreviewResult
+    LifecyclePolicyPreviewResult (LifecyclePolicyPreviewResult'),
+    newLifecyclePolicyPreviewResult,
+
+    -- ** LifecyclePolicyPreviewSummary
+    LifecyclePolicyPreviewSummary (LifecyclePolicyPreviewSummary'),
+    newLifecyclePolicyPreviewSummary,
+
+    -- ** LifecyclePolicyRuleAction
+    LifecyclePolicyRuleAction (LifecyclePolicyRuleAction'),
+    newLifecyclePolicyRuleAction,
+
+    -- ** ListImagesFilter
+    ListImagesFilter (ListImagesFilter'),
+    newListImagesFilter,
+
+    -- ** PackageVulnerabilityDetails
+    PackageVulnerabilityDetails (PackageVulnerabilityDetails'),
+    newPackageVulnerabilityDetails,
+
+    -- ** PullThroughCacheRule
+    PullThroughCacheRule (PullThroughCacheRule'),
+    newPullThroughCacheRule,
+
+    -- ** Recommendation
+    Recommendation (Recommendation'),
+    newRecommendation,
+
+    -- ** RegistryScanningConfiguration
+    RegistryScanningConfiguration (RegistryScanningConfiguration'),
+    newRegistryScanningConfiguration,
+
+    -- ** RegistryScanningRule
+    RegistryScanningRule (RegistryScanningRule'),
+    newRegistryScanningRule,
+
+    -- ** Remediation
+    Remediation (Remediation'),
+    newRemediation,
+
+    -- ** ReplicationConfiguration
+    ReplicationConfiguration (ReplicationConfiguration'),
+    newReplicationConfiguration,
+
+    -- ** ReplicationDestination
+    ReplicationDestination (ReplicationDestination'),
+    newReplicationDestination,
+
+    -- ** ReplicationRule
+    ReplicationRule (ReplicationRule'),
+    newReplicationRule,
+
+    -- ** Repository
+    Repository (Repository'),
+    newRepository,
+
+    -- ** RepositoryFilter
+    RepositoryFilter (RepositoryFilter'),
+    newRepositoryFilter,
+
+    -- ** RepositoryScanningConfiguration
+    RepositoryScanningConfiguration (RepositoryScanningConfiguration'),
+    newRepositoryScanningConfiguration,
+
+    -- ** RepositoryScanningConfigurationFailure
+    RepositoryScanningConfigurationFailure (RepositoryScanningConfigurationFailure'),
+    newRepositoryScanningConfigurationFailure,
+
+    -- ** Resource
+    Resource (Resource'),
+    newResource,
+
+    -- ** ResourceDetails
+    ResourceDetails (ResourceDetails'),
+    newResourceDetails,
+
+    -- ** ScanningRepositoryFilter
+    ScanningRepositoryFilter (ScanningRepositoryFilter'),
+    newScanningRepositoryFilter,
+
+    -- ** ScoreDetails
+    ScoreDetails (ScoreDetails'),
+    newScoreDetails,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** VulnerablePackage
+    VulnerablePackage (VulnerablePackage'),
+    newVulnerablePackage,
+  )
+where
+
+import Amazonka.ECR.BatchCheckLayerAvailability
+import Amazonka.ECR.BatchDeleteImage
+import Amazonka.ECR.BatchGetImage
+import Amazonka.ECR.BatchGetRepositoryScanningConfiguration
+import Amazonka.ECR.CompleteLayerUpload
+import Amazonka.ECR.CreatePullThroughCacheRule
+import Amazonka.ECR.CreateRepository
+import Amazonka.ECR.DeleteLifecyclePolicy
+import Amazonka.ECR.DeletePullThroughCacheRule
+import Amazonka.ECR.DeleteRegistryPolicy
+import Amazonka.ECR.DeleteRepository
+import Amazonka.ECR.DeleteRepositoryPolicy
+import Amazonka.ECR.DescribeImageReplicationStatus
+import Amazonka.ECR.DescribeImageScanFindings
+import Amazonka.ECR.DescribeImages
+import Amazonka.ECR.DescribePullThroughCacheRules
+import Amazonka.ECR.DescribeRegistry
+import Amazonka.ECR.DescribeRepositories
+import Amazonka.ECR.GetAuthorizationToken
+import Amazonka.ECR.GetDownloadUrlForLayer
+import Amazonka.ECR.GetLifecyclePolicy
+import Amazonka.ECR.GetLifecyclePolicyPreview
+import Amazonka.ECR.GetRegistryPolicy
+import Amazonka.ECR.GetRegistryScanningConfiguration
+import Amazonka.ECR.GetRepositoryPolicy
+import Amazonka.ECR.InitiateLayerUpload
+import Amazonka.ECR.Lens
+import Amazonka.ECR.ListImages
+import Amazonka.ECR.ListTagsForResource
+import Amazonka.ECR.PutImage
+import Amazonka.ECR.PutImageScanningConfiguration
+import Amazonka.ECR.PutImageTagMutability
+import Amazonka.ECR.PutLifecyclePolicy
+import Amazonka.ECR.PutRegistryPolicy
+import Amazonka.ECR.PutRegistryScanningConfiguration
+import Amazonka.ECR.PutReplicationConfiguration
+import Amazonka.ECR.SetRepositoryPolicy
+import Amazonka.ECR.StartImageScan
+import Amazonka.ECR.StartLifecyclePolicyPreview
+import Amazonka.ECR.TagResource
+import Amazonka.ECR.Types
+import Amazonka.ECR.UntagResource
+import Amazonka.ECR.UploadLayerPart
+import Amazonka.ECR.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 'ECR'.
+
+-- $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/ECR/BatchCheckLayerAvailability.hs b/gen/Amazonka/ECR/BatchCheckLayerAvailability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/BatchCheckLayerAvailability.hs
@@ -0,0 +1,241 @@
+{-# 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.ECR.BatchCheckLayerAvailability
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Checks the availability of one or more image layers in a repository.
+--
+-- When an image is pushed to a repository, each image layer is checked to
+-- verify if it has been uploaded before. If it has been uploaded, then the
+-- image layer is skipped.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.BatchCheckLayerAvailability
+  ( -- * Creating a Request
+    BatchCheckLayerAvailability (..),
+    newBatchCheckLayerAvailability,
+
+    -- * Request Lenses
+    batchCheckLayerAvailability_registryId,
+    batchCheckLayerAvailability_repositoryName,
+    batchCheckLayerAvailability_layerDigests,
+
+    -- * Destructuring the Response
+    BatchCheckLayerAvailabilityResponse (..),
+    newBatchCheckLayerAvailabilityResponse,
+
+    -- * Response Lenses
+    batchCheckLayerAvailabilityResponse_failures,
+    batchCheckLayerAvailabilityResponse_layers,
+    batchCheckLayerAvailabilityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchCheckLayerAvailability' smart constructor.
+data BatchCheckLayerAvailability = BatchCheckLayerAvailability'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the image layers to check. If you do not specify a registry,
+    -- the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that is associated with the image layers to
+    -- check.
+    repositoryName :: Prelude.Text,
+    -- | The digests of the image layers to check.
+    layerDigests :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCheckLayerAvailability' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'batchCheckLayerAvailability_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the image layers to check. If you do not specify a registry,
+-- the default registry is assumed.
+--
+-- 'repositoryName', 'batchCheckLayerAvailability_repositoryName' - The name of the repository that is associated with the image layers to
+-- check.
+--
+-- 'layerDigests', 'batchCheckLayerAvailability_layerDigests' - The digests of the image layers to check.
+newBatchCheckLayerAvailability ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'layerDigests'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchCheckLayerAvailability
+newBatchCheckLayerAvailability
+  pRepositoryName_
+  pLayerDigests_ =
+    BatchCheckLayerAvailability'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        layerDigests =
+          Lens.coerced Lens.# pLayerDigests_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the image layers to check. If you do not specify a registry,
+-- the default registry is assumed.
+batchCheckLayerAvailability_registryId :: Lens.Lens' BatchCheckLayerAvailability (Prelude.Maybe Prelude.Text)
+batchCheckLayerAvailability_registryId = Lens.lens (\BatchCheckLayerAvailability' {registryId} -> registryId) (\s@BatchCheckLayerAvailability' {} a -> s {registryId = a} :: BatchCheckLayerAvailability)
+
+-- | The name of the repository that is associated with the image layers to
+-- check.
+batchCheckLayerAvailability_repositoryName :: Lens.Lens' BatchCheckLayerAvailability Prelude.Text
+batchCheckLayerAvailability_repositoryName = Lens.lens (\BatchCheckLayerAvailability' {repositoryName} -> repositoryName) (\s@BatchCheckLayerAvailability' {} a -> s {repositoryName = a} :: BatchCheckLayerAvailability)
+
+-- | The digests of the image layers to check.
+batchCheckLayerAvailability_layerDigests :: Lens.Lens' BatchCheckLayerAvailability (Prelude.NonEmpty Prelude.Text)
+batchCheckLayerAvailability_layerDigests = Lens.lens (\BatchCheckLayerAvailability' {layerDigests} -> layerDigests) (\s@BatchCheckLayerAvailability' {} a -> s {layerDigests = a} :: BatchCheckLayerAvailability) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchCheckLayerAvailability where
+  type
+    AWSResponse BatchCheckLayerAvailability =
+      BatchCheckLayerAvailabilityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchCheckLayerAvailabilityResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "layers" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchCheckLayerAvailability where
+  hashWithSalt _salt BatchCheckLayerAvailability' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` layerDigests
+
+instance Prelude.NFData BatchCheckLayerAvailability where
+  rnf BatchCheckLayerAvailability' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf layerDigests
+
+instance Data.ToHeaders BatchCheckLayerAvailability where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.BatchCheckLayerAvailability" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchCheckLayerAvailability where
+  toJSON BatchCheckLayerAvailability' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("layerDigests" Data..= layerDigests)
+          ]
+      )
+
+instance Data.ToPath BatchCheckLayerAvailability where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchCheckLayerAvailability where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchCheckLayerAvailabilityResponse' smart constructor.
+data BatchCheckLayerAvailabilityResponse = BatchCheckLayerAvailabilityResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [LayerFailure],
+    -- | A list of image layer objects corresponding to the image layer
+    -- references in the request.
+    layers :: Prelude.Maybe [Layer],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCheckLayerAvailabilityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchCheckLayerAvailabilityResponse_failures' - Any failures associated with the call.
+--
+-- 'layers', 'batchCheckLayerAvailabilityResponse_layers' - A list of image layer objects corresponding to the image layer
+-- references in the request.
+--
+-- 'httpStatus', 'batchCheckLayerAvailabilityResponse_httpStatus' - The response's http status code.
+newBatchCheckLayerAvailabilityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchCheckLayerAvailabilityResponse
+newBatchCheckLayerAvailabilityResponse pHttpStatus_ =
+  BatchCheckLayerAvailabilityResponse'
+    { failures =
+        Prelude.Nothing,
+      layers = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Any failures associated with the call.
+batchCheckLayerAvailabilityResponse_failures :: Lens.Lens' BatchCheckLayerAvailabilityResponse (Prelude.Maybe [LayerFailure])
+batchCheckLayerAvailabilityResponse_failures = Lens.lens (\BatchCheckLayerAvailabilityResponse' {failures} -> failures) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {failures = a} :: BatchCheckLayerAvailabilityResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of image layer objects corresponding to the image layer
+-- references in the request.
+batchCheckLayerAvailabilityResponse_layers :: Lens.Lens' BatchCheckLayerAvailabilityResponse (Prelude.Maybe [Layer])
+batchCheckLayerAvailabilityResponse_layers = Lens.lens (\BatchCheckLayerAvailabilityResponse' {layers} -> layers) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {layers = a} :: BatchCheckLayerAvailabilityResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchCheckLayerAvailabilityResponse_httpStatus :: Lens.Lens' BatchCheckLayerAvailabilityResponse Prelude.Int
+batchCheckLayerAvailabilityResponse_httpStatus = Lens.lens (\BatchCheckLayerAvailabilityResponse' {httpStatus} -> httpStatus) (\s@BatchCheckLayerAvailabilityResponse' {} a -> s {httpStatus = a} :: BatchCheckLayerAvailabilityResponse)
+
+instance
+  Prelude.NFData
+    BatchCheckLayerAvailabilityResponse
+  where
+  rnf BatchCheckLayerAvailabilityResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf layers
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/BatchDeleteImage.hs b/gen/Amazonka/ECR/BatchDeleteImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/BatchDeleteImage.hs
@@ -0,0 +1,235 @@
+{-# 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.ECR.BatchDeleteImage
+-- 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 list of specified images within a repository. Images are
+-- specified with either an @imageTag@ or @imageDigest@.
+--
+-- You can remove a tag from an image by specifying the image\'s tag in
+-- your request. When you remove the last tag from an image, the image is
+-- deleted from your repository.
+--
+-- You can completely delete an image (and all of its tags) by specifying
+-- the image\'s digest in your request.
+module Amazonka.ECR.BatchDeleteImage
+  ( -- * Creating a Request
+    BatchDeleteImage (..),
+    newBatchDeleteImage,
+
+    -- * Request Lenses
+    batchDeleteImage_registryId,
+    batchDeleteImage_repositoryName,
+    batchDeleteImage_imageIds,
+
+    -- * Destructuring the Response
+    BatchDeleteImageResponse (..),
+    newBatchDeleteImageResponse,
+
+    -- * Response Lenses
+    batchDeleteImageResponse_failures,
+    batchDeleteImageResponse_imageIds,
+    batchDeleteImageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | Deletes specified images within a specified repository. Images are
+-- specified with either the @imageTag@ or @imageDigest@.
+--
+-- /See:/ 'newBatchDeleteImage' smart constructor.
+data BatchDeleteImage = BatchDeleteImage'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the image to delete. If you do not specify a registry, the
+    -- default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository that contains the image to delete.
+    repositoryName :: Prelude.Text,
+    -- | A list of image ID references that correspond to images to delete. The
+    -- format of the @imageIds@ reference is @imageTag=tag@ or
+    -- @imageDigest=digest@.
+    imageIds :: [ImageIdentifier]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'batchDeleteImage_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the image to delete. If you do not specify a registry, the
+-- default registry is assumed.
+--
+-- 'repositoryName', 'batchDeleteImage_repositoryName' - The repository that contains the image to delete.
+--
+-- 'imageIds', 'batchDeleteImage_imageIds' - A list of image ID references that correspond to images to delete. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+newBatchDeleteImage ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  BatchDeleteImage
+newBatchDeleteImage pRepositoryName_ =
+  BatchDeleteImage'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageIds = Prelude.mempty
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the image to delete. If you do not specify a registry, the
+-- default registry is assumed.
+batchDeleteImage_registryId :: Lens.Lens' BatchDeleteImage (Prelude.Maybe Prelude.Text)
+batchDeleteImage_registryId = Lens.lens (\BatchDeleteImage' {registryId} -> registryId) (\s@BatchDeleteImage' {} a -> s {registryId = a} :: BatchDeleteImage)
+
+-- | The repository that contains the image to delete.
+batchDeleteImage_repositoryName :: Lens.Lens' BatchDeleteImage Prelude.Text
+batchDeleteImage_repositoryName = Lens.lens (\BatchDeleteImage' {repositoryName} -> repositoryName) (\s@BatchDeleteImage' {} a -> s {repositoryName = a} :: BatchDeleteImage)
+
+-- | A list of image ID references that correspond to images to delete. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+batchDeleteImage_imageIds :: Lens.Lens' BatchDeleteImage [ImageIdentifier]
+batchDeleteImage_imageIds = Lens.lens (\BatchDeleteImage' {imageIds} -> imageIds) (\s@BatchDeleteImage' {} a -> s {imageIds = a} :: BatchDeleteImage) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchDeleteImage where
+  type
+    AWSResponse BatchDeleteImage =
+      BatchDeleteImageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDeleteImageResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "imageIds" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchDeleteImage where
+  hashWithSalt _salt BatchDeleteImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageIds
+
+instance Prelude.NFData BatchDeleteImage where
+  rnf BatchDeleteImage' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageIds
+
+instance Data.ToHeaders BatchDeleteImage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.BatchDeleteImage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchDeleteImage where
+  toJSON BatchDeleteImage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageIds" Data..= imageIds)
+          ]
+      )
+
+instance Data.ToPath BatchDeleteImage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchDeleteImage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDeleteImageResponse' smart constructor.
+data BatchDeleteImageResponse = BatchDeleteImageResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [ImageFailure],
+    -- | The image IDs of the deleted images.
+    imageIds :: Prelude.Maybe [ImageIdentifier],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteImageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchDeleteImageResponse_failures' - Any failures associated with the call.
+--
+-- 'imageIds', 'batchDeleteImageResponse_imageIds' - The image IDs of the deleted images.
+--
+-- 'httpStatus', 'batchDeleteImageResponse_httpStatus' - The response's http status code.
+newBatchDeleteImageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDeleteImageResponse
+newBatchDeleteImageResponse pHttpStatus_ =
+  BatchDeleteImageResponse'
+    { failures =
+        Prelude.Nothing,
+      imageIds = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Any failures associated with the call.
+batchDeleteImageResponse_failures :: Lens.Lens' BatchDeleteImageResponse (Prelude.Maybe [ImageFailure])
+batchDeleteImageResponse_failures = Lens.lens (\BatchDeleteImageResponse' {failures} -> failures) (\s@BatchDeleteImageResponse' {} a -> s {failures = a} :: BatchDeleteImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The image IDs of the deleted images.
+batchDeleteImageResponse_imageIds :: Lens.Lens' BatchDeleteImageResponse (Prelude.Maybe [ImageIdentifier])
+batchDeleteImageResponse_imageIds = Lens.lens (\BatchDeleteImageResponse' {imageIds} -> imageIds) (\s@BatchDeleteImageResponse' {} a -> s {imageIds = a} :: BatchDeleteImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDeleteImageResponse_httpStatus :: Lens.Lens' BatchDeleteImageResponse Prelude.Int
+batchDeleteImageResponse_httpStatus = Lens.lens (\BatchDeleteImageResponse' {httpStatus} -> httpStatus) (\s@BatchDeleteImageResponse' {} a -> s {httpStatus = a} :: BatchDeleteImageResponse)
+
+instance Prelude.NFData BatchDeleteImageResponse where
+  rnf BatchDeleteImageResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/BatchGetImage.hs b/gen/Amazonka/ECR/BatchGetImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/BatchGetImage.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.ECR.BatchGetImage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets detailed information for an image. Images are specified with either
+-- an @imageTag@ or @imageDigest@.
+--
+-- When an image is pulled, the BatchGetImage API is called once to
+-- retrieve the image manifest.
+module Amazonka.ECR.BatchGetImage
+  ( -- * Creating a Request
+    BatchGetImage (..),
+    newBatchGetImage,
+
+    -- * Request Lenses
+    batchGetImage_acceptedMediaTypes,
+    batchGetImage_registryId,
+    batchGetImage_repositoryName,
+    batchGetImage_imageIds,
+
+    -- * Destructuring the Response
+    BatchGetImageResponse (..),
+    newBatchGetImageResponse,
+
+    -- * Response Lenses
+    batchGetImageResponse_failures,
+    batchGetImageResponse_images,
+    batchGetImageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetImage' smart constructor.
+data BatchGetImage = BatchGetImage'
+  { -- | The accepted media types for the request.
+    --
+    -- Valid values: @application\/vnd.docker.distribution.manifest.v1+json@ |
+    -- @application\/vnd.docker.distribution.manifest.v2+json@ |
+    -- @application\/vnd.oci.image.manifest.v1+json@
+    acceptedMediaTypes :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the images to describe. If you do not specify a registry, the
+    -- default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository that contains the images to describe.
+    repositoryName :: Prelude.Text,
+    -- | A list of image ID references that correspond to images to describe. The
+    -- format of the @imageIds@ reference is @imageTag=tag@ or
+    -- @imageDigest=digest@.
+    imageIds :: [ImageIdentifier]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acceptedMediaTypes', 'batchGetImage_acceptedMediaTypes' - The accepted media types for the request.
+--
+-- Valid values: @application\/vnd.docker.distribution.manifest.v1+json@ |
+-- @application\/vnd.docker.distribution.manifest.v2+json@ |
+-- @application\/vnd.oci.image.manifest.v1+json@
+--
+-- 'registryId', 'batchGetImage_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the images to describe. If you do not specify a registry, the
+-- default registry is assumed.
+--
+-- 'repositoryName', 'batchGetImage_repositoryName' - The repository that contains the images to describe.
+--
+-- 'imageIds', 'batchGetImage_imageIds' - A list of image ID references that correspond to images to describe. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+newBatchGetImage ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  BatchGetImage
+newBatchGetImage pRepositoryName_ =
+  BatchGetImage'
+    { acceptedMediaTypes =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageIds = Prelude.mempty
+    }
+
+-- | The accepted media types for the request.
+--
+-- Valid values: @application\/vnd.docker.distribution.manifest.v1+json@ |
+-- @application\/vnd.docker.distribution.manifest.v2+json@ |
+-- @application\/vnd.oci.image.manifest.v1+json@
+batchGetImage_acceptedMediaTypes :: Lens.Lens' BatchGetImage (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+batchGetImage_acceptedMediaTypes = Lens.lens (\BatchGetImage' {acceptedMediaTypes} -> acceptedMediaTypes) (\s@BatchGetImage' {} a -> s {acceptedMediaTypes = a} :: BatchGetImage) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the images to describe. If you do not specify a registry, the
+-- default registry is assumed.
+batchGetImage_registryId :: Lens.Lens' BatchGetImage (Prelude.Maybe Prelude.Text)
+batchGetImage_registryId = Lens.lens (\BatchGetImage' {registryId} -> registryId) (\s@BatchGetImage' {} a -> s {registryId = a} :: BatchGetImage)
+
+-- | The repository that contains the images to describe.
+batchGetImage_repositoryName :: Lens.Lens' BatchGetImage Prelude.Text
+batchGetImage_repositoryName = Lens.lens (\BatchGetImage' {repositoryName} -> repositoryName) (\s@BatchGetImage' {} a -> s {repositoryName = a} :: BatchGetImage)
+
+-- | A list of image ID references that correspond to images to describe. The
+-- format of the @imageIds@ reference is @imageTag=tag@ or
+-- @imageDigest=digest@.
+batchGetImage_imageIds :: Lens.Lens' BatchGetImage [ImageIdentifier]
+batchGetImage_imageIds = Lens.lens (\BatchGetImage' {imageIds} -> imageIds) (\s@BatchGetImage' {} a -> s {imageIds = a} :: BatchGetImage) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchGetImage where
+  type
+    AWSResponse BatchGetImage =
+      BatchGetImageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetImageResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "images" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchGetImage where
+  hashWithSalt _salt BatchGetImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` acceptedMediaTypes
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageIds
+
+instance Prelude.NFData BatchGetImage where
+  rnf BatchGetImage' {..} =
+    Prelude.rnf acceptedMediaTypes
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageIds
+
+instance Data.ToHeaders BatchGetImage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.BatchGetImage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetImage where
+  toJSON BatchGetImage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("acceptedMediaTypes" Data..=)
+              Prelude.<$> acceptedMediaTypes,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageIds" Data..= imageIds)
+          ]
+      )
+
+instance Data.ToPath BatchGetImage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery BatchGetImage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetImageResponse' smart constructor.
+data BatchGetImageResponse = BatchGetImageResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [ImageFailure],
+    -- | A list of image objects corresponding to the image references in the
+    -- request.
+    images :: Prelude.Maybe [Image],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetImageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchGetImageResponse_failures' - Any failures associated with the call.
+--
+-- 'images', 'batchGetImageResponse_images' - A list of image objects corresponding to the image references in the
+-- request.
+--
+-- 'httpStatus', 'batchGetImageResponse_httpStatus' - The response's http status code.
+newBatchGetImageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetImageResponse
+newBatchGetImageResponse pHttpStatus_ =
+  BatchGetImageResponse'
+    { failures = Prelude.Nothing,
+      images = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Any failures associated with the call.
+batchGetImageResponse_failures :: Lens.Lens' BatchGetImageResponse (Prelude.Maybe [ImageFailure])
+batchGetImageResponse_failures = Lens.lens (\BatchGetImageResponse' {failures} -> failures) (\s@BatchGetImageResponse' {} a -> s {failures = a} :: BatchGetImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of image objects corresponding to the image references in the
+-- request.
+batchGetImageResponse_images :: Lens.Lens' BatchGetImageResponse (Prelude.Maybe [Image])
+batchGetImageResponse_images = Lens.lens (\BatchGetImageResponse' {images} -> images) (\s@BatchGetImageResponse' {} a -> s {images = a} :: BatchGetImageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchGetImageResponse_httpStatus :: Lens.Lens' BatchGetImageResponse Prelude.Int
+batchGetImageResponse_httpStatus = Lens.lens (\BatchGetImageResponse' {httpStatus} -> httpStatus) (\s@BatchGetImageResponse' {} a -> s {httpStatus = a} :: BatchGetImageResponse)
+
+instance Prelude.NFData BatchGetImageResponse where
+  rnf BatchGetImageResponse' {..} =
+    Prelude.rnf failures
+      `Prelude.seq` Prelude.rnf images
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/BatchGetRepositoryScanningConfiguration.hs b/gen/Amazonka/ECR/BatchGetRepositoryScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/BatchGetRepositoryScanningConfiguration.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.ECR.BatchGetRepositoryScanningConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the scanning configuration for one or more repositories.
+module Amazonka.ECR.BatchGetRepositoryScanningConfiguration
+  ( -- * Creating a Request
+    BatchGetRepositoryScanningConfiguration (..),
+    newBatchGetRepositoryScanningConfiguration,
+
+    -- * Request Lenses
+    batchGetRepositoryScanningConfiguration_repositoryNames,
+
+    -- * Destructuring the Response
+    BatchGetRepositoryScanningConfigurationResponse (..),
+    newBatchGetRepositoryScanningConfigurationResponse,
+
+    -- * Response Lenses
+    batchGetRepositoryScanningConfigurationResponse_failures,
+    batchGetRepositoryScanningConfigurationResponse_scanningConfigurations,
+    batchGetRepositoryScanningConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetRepositoryScanningConfiguration' smart constructor.
+data BatchGetRepositoryScanningConfiguration = BatchGetRepositoryScanningConfiguration'
+  { -- | One or more repository names to get the scanning configuration for.
+    repositoryNames :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetRepositoryScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'repositoryNames', 'batchGetRepositoryScanningConfiguration_repositoryNames' - One or more repository names to get the scanning configuration for.
+newBatchGetRepositoryScanningConfiguration ::
+  -- | 'repositoryNames'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchGetRepositoryScanningConfiguration
+newBatchGetRepositoryScanningConfiguration
+  pRepositoryNames_ =
+    BatchGetRepositoryScanningConfiguration'
+      { repositoryNames =
+          Lens.coerced
+            Lens.# pRepositoryNames_
+      }
+
+-- | One or more repository names to get the scanning configuration for.
+batchGetRepositoryScanningConfiguration_repositoryNames :: Lens.Lens' BatchGetRepositoryScanningConfiguration (Prelude.NonEmpty Prelude.Text)
+batchGetRepositoryScanningConfiguration_repositoryNames = Lens.lens (\BatchGetRepositoryScanningConfiguration' {repositoryNames} -> repositoryNames) (\s@BatchGetRepositoryScanningConfiguration' {} a -> s {repositoryNames = a} :: BatchGetRepositoryScanningConfiguration) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchGetRepositoryScanningConfiguration
+  where
+  type
+    AWSResponse
+      BatchGetRepositoryScanningConfiguration =
+      BatchGetRepositoryScanningConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetRepositoryScanningConfigurationResponse'
+            Prelude.<$> (x Data..?> "failures" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "scanningConfigurations"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetRepositoryScanningConfiguration
+  where
+  hashWithSalt
+    _salt
+    BatchGetRepositoryScanningConfiguration' {..} =
+      _salt `Prelude.hashWithSalt` repositoryNames
+
+instance
+  Prelude.NFData
+    BatchGetRepositoryScanningConfiguration
+  where
+  rnf BatchGetRepositoryScanningConfiguration' {..} =
+    Prelude.rnf repositoryNames
+
+instance
+  Data.ToHeaders
+    BatchGetRepositoryScanningConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.BatchGetRepositoryScanningConfiguration" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    BatchGetRepositoryScanningConfiguration
+  where
+  toJSON BatchGetRepositoryScanningConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("repositoryNames" Data..= repositoryNames)
+          ]
+      )
+
+instance
+  Data.ToPath
+    BatchGetRepositoryScanningConfiguration
+  where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    BatchGetRepositoryScanningConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetRepositoryScanningConfigurationResponse' smart constructor.
+data BatchGetRepositoryScanningConfigurationResponse = BatchGetRepositoryScanningConfigurationResponse'
+  { -- | Any failures associated with the call.
+    failures :: Prelude.Maybe [RepositoryScanningConfigurationFailure],
+    -- | The scanning configuration for the requested repositories.
+    scanningConfigurations :: Prelude.Maybe [RepositoryScanningConfiguration],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetRepositoryScanningConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failures', 'batchGetRepositoryScanningConfigurationResponse_failures' - Any failures associated with the call.
+--
+-- 'scanningConfigurations', 'batchGetRepositoryScanningConfigurationResponse_scanningConfigurations' - The scanning configuration for the requested repositories.
+--
+-- 'httpStatus', 'batchGetRepositoryScanningConfigurationResponse_httpStatus' - The response's http status code.
+newBatchGetRepositoryScanningConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetRepositoryScanningConfigurationResponse
+newBatchGetRepositoryScanningConfigurationResponse
+  pHttpStatus_ =
+    BatchGetRepositoryScanningConfigurationResponse'
+      { failures =
+          Prelude.Nothing,
+        scanningConfigurations =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | Any failures associated with the call.
+batchGetRepositoryScanningConfigurationResponse_failures :: Lens.Lens' BatchGetRepositoryScanningConfigurationResponse (Prelude.Maybe [RepositoryScanningConfigurationFailure])
+batchGetRepositoryScanningConfigurationResponse_failures = Lens.lens (\BatchGetRepositoryScanningConfigurationResponse' {failures} -> failures) (\s@BatchGetRepositoryScanningConfigurationResponse' {} a -> s {failures = a} :: BatchGetRepositoryScanningConfigurationResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The scanning configuration for the requested repositories.
+batchGetRepositoryScanningConfigurationResponse_scanningConfigurations :: Lens.Lens' BatchGetRepositoryScanningConfigurationResponse (Prelude.Maybe [RepositoryScanningConfiguration])
+batchGetRepositoryScanningConfigurationResponse_scanningConfigurations = Lens.lens (\BatchGetRepositoryScanningConfigurationResponse' {scanningConfigurations} -> scanningConfigurations) (\s@BatchGetRepositoryScanningConfigurationResponse' {} a -> s {scanningConfigurations = a} :: BatchGetRepositoryScanningConfigurationResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchGetRepositoryScanningConfigurationResponse_httpStatus :: Lens.Lens' BatchGetRepositoryScanningConfigurationResponse Prelude.Int
+batchGetRepositoryScanningConfigurationResponse_httpStatus = Lens.lens (\BatchGetRepositoryScanningConfigurationResponse' {httpStatus} -> httpStatus) (\s@BatchGetRepositoryScanningConfigurationResponse' {} a -> s {httpStatus = a} :: BatchGetRepositoryScanningConfigurationResponse)
+
+instance
+  Prelude.NFData
+    BatchGetRepositoryScanningConfigurationResponse
+  where
+  rnf
+    BatchGetRepositoryScanningConfigurationResponse' {..} =
+      Prelude.rnf failures
+        `Prelude.seq` Prelude.rnf scanningConfigurations
+        `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/CompleteLayerUpload.hs b/gen/Amazonka/ECR/CompleteLayerUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/CompleteLayerUpload.hs
@@ -0,0 +1,275 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.CompleteLayerUpload
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Informs Amazon ECR that the image layer upload has completed for a
+-- specified registry, repository name, and upload ID. You can optionally
+-- provide a @sha256@ digest of the image layer for data validation
+-- purposes.
+--
+-- When an image is pushed, the CompleteLayerUpload API is called once per
+-- each new image layer to verify that the upload has completed.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.CompleteLayerUpload
+  ( -- * Creating a Request
+    CompleteLayerUpload (..),
+    newCompleteLayerUpload,
+
+    -- * Request Lenses
+    completeLayerUpload_registryId,
+    completeLayerUpload_repositoryName,
+    completeLayerUpload_uploadId,
+    completeLayerUpload_layerDigests,
+
+    -- * Destructuring the Response
+    CompleteLayerUploadResponse (..),
+    newCompleteLayerUploadResponse,
+
+    -- * Response Lenses
+    completeLayerUploadResponse_layerDigest,
+    completeLayerUploadResponse_registryId,
+    completeLayerUploadResponse_repositoryName,
+    completeLayerUploadResponse_uploadId,
+    completeLayerUploadResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCompleteLayerUpload' smart constructor.
+data CompleteLayerUpload = CompleteLayerUpload'
+  { -- | The Amazon Web Services account ID associated with the registry to which
+    -- to upload layers. If you do not specify a registry, the default registry
+    -- is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to associate with the image layer.
+    repositoryName :: Prelude.Text,
+    -- | The upload ID from a previous InitiateLayerUpload operation to associate
+    -- with the image layer.
+    uploadId :: Prelude.Text,
+    -- | The @sha256@ digest of the image layer.
+    layerDigests :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompleteLayerUpload' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'completeLayerUpload_registryId' - The Amazon Web Services account ID associated with the registry to which
+-- to upload layers. If you do not specify a registry, the default registry
+-- is assumed.
+--
+-- 'repositoryName', 'completeLayerUpload_repositoryName' - The name of the repository to associate with the image layer.
+--
+-- 'uploadId', 'completeLayerUpload_uploadId' - The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the image layer.
+--
+-- 'layerDigests', 'completeLayerUpload_layerDigests' - The @sha256@ digest of the image layer.
+newCompleteLayerUpload ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'uploadId'
+  Prelude.Text ->
+  -- | 'layerDigests'
+  Prelude.NonEmpty Prelude.Text ->
+  CompleteLayerUpload
+newCompleteLayerUpload
+  pRepositoryName_
+  pUploadId_
+  pLayerDigests_ =
+    CompleteLayerUpload'
+      { registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        uploadId = pUploadId_,
+        layerDigests = Lens.coerced Lens.# pLayerDigests_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry to which
+-- to upload layers. If you do not specify a registry, the default registry
+-- is assumed.
+completeLayerUpload_registryId :: Lens.Lens' CompleteLayerUpload (Prelude.Maybe Prelude.Text)
+completeLayerUpload_registryId = Lens.lens (\CompleteLayerUpload' {registryId} -> registryId) (\s@CompleteLayerUpload' {} a -> s {registryId = a} :: CompleteLayerUpload)
+
+-- | The name of the repository to associate with the image layer.
+completeLayerUpload_repositoryName :: Lens.Lens' CompleteLayerUpload Prelude.Text
+completeLayerUpload_repositoryName = Lens.lens (\CompleteLayerUpload' {repositoryName} -> repositoryName) (\s@CompleteLayerUpload' {} a -> s {repositoryName = a} :: CompleteLayerUpload)
+
+-- | The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the image layer.
+completeLayerUpload_uploadId :: Lens.Lens' CompleteLayerUpload Prelude.Text
+completeLayerUpload_uploadId = Lens.lens (\CompleteLayerUpload' {uploadId} -> uploadId) (\s@CompleteLayerUpload' {} a -> s {uploadId = a} :: CompleteLayerUpload)
+
+-- | The @sha256@ digest of the image layer.
+completeLayerUpload_layerDigests :: Lens.Lens' CompleteLayerUpload (Prelude.NonEmpty Prelude.Text)
+completeLayerUpload_layerDigests = Lens.lens (\CompleteLayerUpload' {layerDigests} -> layerDigests) (\s@CompleteLayerUpload' {} a -> s {layerDigests = a} :: CompleteLayerUpload) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CompleteLayerUpload where
+  type
+    AWSResponse CompleteLayerUpload =
+      CompleteLayerUploadResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CompleteLayerUploadResponse'
+            Prelude.<$> (x Data..?> "layerDigest")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CompleteLayerUpload where
+  hashWithSalt _salt CompleteLayerUpload' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` uploadId
+      `Prelude.hashWithSalt` layerDigests
+
+instance Prelude.NFData CompleteLayerUpload where
+  rnf CompleteLayerUpload' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf layerDigests
+
+instance Data.ToHeaders CompleteLayerUpload where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.CompleteLayerUpload" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CompleteLayerUpload where
+  toJSON CompleteLayerUpload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("uploadId" Data..= uploadId),
+            Prelude.Just ("layerDigests" Data..= layerDigests)
+          ]
+      )
+
+instance Data.ToPath CompleteLayerUpload where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CompleteLayerUpload where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCompleteLayerUploadResponse' smart constructor.
+data CompleteLayerUploadResponse = CompleteLayerUploadResponse'
+  { -- | The @sha256@ digest of the image layer.
+    layerDigest :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The upload ID associated with the layer.
+    uploadId :: 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 'CompleteLayerUploadResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'layerDigest', 'completeLayerUploadResponse_layerDigest' - The @sha256@ digest of the image layer.
+--
+-- 'registryId', 'completeLayerUploadResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'completeLayerUploadResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'uploadId', 'completeLayerUploadResponse_uploadId' - The upload ID associated with the layer.
+--
+-- 'httpStatus', 'completeLayerUploadResponse_httpStatus' - The response's http status code.
+newCompleteLayerUploadResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CompleteLayerUploadResponse
+newCompleteLayerUploadResponse pHttpStatus_ =
+  CompleteLayerUploadResponse'
+    { layerDigest =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The @sha256@ digest of the image layer.
+completeLayerUploadResponse_layerDigest :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_layerDigest = Lens.lens (\CompleteLayerUploadResponse' {layerDigest} -> layerDigest) (\s@CompleteLayerUploadResponse' {} a -> s {layerDigest = a} :: CompleteLayerUploadResponse)
+
+-- | The registry ID associated with the request.
+completeLayerUploadResponse_registryId :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_registryId = Lens.lens (\CompleteLayerUploadResponse' {registryId} -> registryId) (\s@CompleteLayerUploadResponse' {} a -> s {registryId = a} :: CompleteLayerUploadResponse)
+
+-- | The repository name associated with the request.
+completeLayerUploadResponse_repositoryName :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_repositoryName = Lens.lens (\CompleteLayerUploadResponse' {repositoryName} -> repositoryName) (\s@CompleteLayerUploadResponse' {} a -> s {repositoryName = a} :: CompleteLayerUploadResponse)
+
+-- | The upload ID associated with the layer.
+completeLayerUploadResponse_uploadId :: Lens.Lens' CompleteLayerUploadResponse (Prelude.Maybe Prelude.Text)
+completeLayerUploadResponse_uploadId = Lens.lens (\CompleteLayerUploadResponse' {uploadId} -> uploadId) (\s@CompleteLayerUploadResponse' {} a -> s {uploadId = a} :: CompleteLayerUploadResponse)
+
+-- | The response's http status code.
+completeLayerUploadResponse_httpStatus :: Lens.Lens' CompleteLayerUploadResponse Prelude.Int
+completeLayerUploadResponse_httpStatus = Lens.lens (\CompleteLayerUploadResponse' {httpStatus} -> httpStatus) (\s@CompleteLayerUploadResponse' {} a -> s {httpStatus = a} :: CompleteLayerUploadResponse)
+
+instance Prelude.NFData CompleteLayerUploadResponse where
+  rnf CompleteLayerUploadResponse' {..} =
+    Prelude.rnf layerDigest
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/CreatePullThroughCacheRule.hs b/gen/Amazonka/ECR/CreatePullThroughCacheRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/CreatePullThroughCacheRule.hs
@@ -0,0 +1,265 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.CreatePullThroughCacheRule
+-- 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 pull through cache rule. A pull through cache rule provides a
+-- way to cache images from an external public registry in your Amazon ECR
+-- private registry.
+module Amazonka.ECR.CreatePullThroughCacheRule
+  ( -- * Creating a Request
+    CreatePullThroughCacheRule (..),
+    newCreatePullThroughCacheRule,
+
+    -- * Request Lenses
+    createPullThroughCacheRule_registryId,
+    createPullThroughCacheRule_ecrRepositoryPrefix,
+    createPullThroughCacheRule_upstreamRegistryUrl,
+
+    -- * Destructuring the Response
+    CreatePullThroughCacheRuleResponse (..),
+    newCreatePullThroughCacheRuleResponse,
+
+    -- * Response Lenses
+    createPullThroughCacheRuleResponse_createdAt,
+    createPullThroughCacheRuleResponse_ecrRepositoryPrefix,
+    createPullThroughCacheRuleResponse_registryId,
+    createPullThroughCacheRuleResponse_upstreamRegistryUrl,
+    createPullThroughCacheRuleResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePullThroughCacheRule' smart constructor.
+data CreatePullThroughCacheRule = CreatePullThroughCacheRule'
+  { -- | The Amazon Web Services account ID associated with the registry to
+    -- create the pull through cache rule for. If you do not specify a
+    -- registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name prefix to use when caching images from the source
+    -- registry.
+    ecrRepositoryPrefix :: Prelude.Text,
+    -- | The registry URL of the upstream public registry to use as the source
+    -- for the pull through cache rule.
+    upstreamRegistryUrl :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePullThroughCacheRule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'createPullThroughCacheRule_registryId' - The Amazon Web Services account ID associated with the registry to
+-- create the pull through cache rule for. If you do not specify a
+-- registry, the default registry is assumed.
+--
+-- 'ecrRepositoryPrefix', 'createPullThroughCacheRule_ecrRepositoryPrefix' - The repository name prefix to use when caching images from the source
+-- registry.
+--
+-- 'upstreamRegistryUrl', 'createPullThroughCacheRule_upstreamRegistryUrl' - The registry URL of the upstream public registry to use as the source
+-- for the pull through cache rule.
+newCreatePullThroughCacheRule ::
+  -- | 'ecrRepositoryPrefix'
+  Prelude.Text ->
+  -- | 'upstreamRegistryUrl'
+  Prelude.Text ->
+  CreatePullThroughCacheRule
+newCreatePullThroughCacheRule
+  pEcrRepositoryPrefix_
+  pUpstreamRegistryUrl_ =
+    CreatePullThroughCacheRule'
+      { registryId =
+          Prelude.Nothing,
+        ecrRepositoryPrefix = pEcrRepositoryPrefix_,
+        upstreamRegistryUrl = pUpstreamRegistryUrl_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry to
+-- create the pull through cache rule for. If you do not specify a
+-- registry, the default registry is assumed.
+createPullThroughCacheRule_registryId :: Lens.Lens' CreatePullThroughCacheRule (Prelude.Maybe Prelude.Text)
+createPullThroughCacheRule_registryId = Lens.lens (\CreatePullThroughCacheRule' {registryId} -> registryId) (\s@CreatePullThroughCacheRule' {} a -> s {registryId = a} :: CreatePullThroughCacheRule)
+
+-- | The repository name prefix to use when caching images from the source
+-- registry.
+createPullThroughCacheRule_ecrRepositoryPrefix :: Lens.Lens' CreatePullThroughCacheRule Prelude.Text
+createPullThroughCacheRule_ecrRepositoryPrefix = Lens.lens (\CreatePullThroughCacheRule' {ecrRepositoryPrefix} -> ecrRepositoryPrefix) (\s@CreatePullThroughCacheRule' {} a -> s {ecrRepositoryPrefix = a} :: CreatePullThroughCacheRule)
+
+-- | The registry URL of the upstream public registry to use as the source
+-- for the pull through cache rule.
+createPullThroughCacheRule_upstreamRegistryUrl :: Lens.Lens' CreatePullThroughCacheRule Prelude.Text
+createPullThroughCacheRule_upstreamRegistryUrl = Lens.lens (\CreatePullThroughCacheRule' {upstreamRegistryUrl} -> upstreamRegistryUrl) (\s@CreatePullThroughCacheRule' {} a -> s {upstreamRegistryUrl = a} :: CreatePullThroughCacheRule)
+
+instance Core.AWSRequest CreatePullThroughCacheRule where
+  type
+    AWSResponse CreatePullThroughCacheRule =
+      CreatePullThroughCacheRuleResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePullThroughCacheRuleResponse'
+            Prelude.<$> (x Data..?> "createdAt")
+            Prelude.<*> (x Data..?> "ecrRepositoryPrefix")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "upstreamRegistryUrl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreatePullThroughCacheRule where
+  hashWithSalt _salt CreatePullThroughCacheRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` ecrRepositoryPrefix
+      `Prelude.hashWithSalt` upstreamRegistryUrl
+
+instance Prelude.NFData CreatePullThroughCacheRule where
+  rnf CreatePullThroughCacheRule' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf ecrRepositoryPrefix
+      `Prelude.seq` Prelude.rnf upstreamRegistryUrl
+
+instance Data.ToHeaders CreatePullThroughCacheRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.CreatePullThroughCacheRule" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePullThroughCacheRule where
+  toJSON CreatePullThroughCacheRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("ecrRepositoryPrefix" Data..= ecrRepositoryPrefix),
+            Prelude.Just
+              ("upstreamRegistryUrl" Data..= upstreamRegistryUrl)
+          ]
+      )
+
+instance Data.ToPath CreatePullThroughCacheRule where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreatePullThroughCacheRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePullThroughCacheRuleResponse' smart constructor.
+data CreatePullThroughCacheRuleResponse = CreatePullThroughCacheRuleResponse'
+  { -- | The date and time, in JavaScript date format, when the pull through
+    -- cache rule was created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon ECR repository prefix associated with the pull through cache
+    -- rule.
+    ecrRepositoryPrefix :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The upstream registry URL associated with the pull through cache rule.
+    upstreamRegistryUrl :: 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 'CreatePullThroughCacheRuleResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'createPullThroughCacheRuleResponse_createdAt' - The date and time, in JavaScript date format, when the pull through
+-- cache rule was created.
+--
+-- 'ecrRepositoryPrefix', 'createPullThroughCacheRuleResponse_ecrRepositoryPrefix' - The Amazon ECR repository prefix associated with the pull through cache
+-- rule.
+--
+-- 'registryId', 'createPullThroughCacheRuleResponse_registryId' - The registry ID associated with the request.
+--
+-- 'upstreamRegistryUrl', 'createPullThroughCacheRuleResponse_upstreamRegistryUrl' - The upstream registry URL associated with the pull through cache rule.
+--
+-- 'httpStatus', 'createPullThroughCacheRuleResponse_httpStatus' - The response's http status code.
+newCreatePullThroughCacheRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreatePullThroughCacheRuleResponse
+newCreatePullThroughCacheRuleResponse pHttpStatus_ =
+  CreatePullThroughCacheRuleResponse'
+    { createdAt =
+        Prelude.Nothing,
+      ecrRepositoryPrefix = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      upstreamRegistryUrl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The date and time, in JavaScript date format, when the pull through
+-- cache rule was created.
+createPullThroughCacheRuleResponse_createdAt :: Lens.Lens' CreatePullThroughCacheRuleResponse (Prelude.Maybe Prelude.UTCTime)
+createPullThroughCacheRuleResponse_createdAt = Lens.lens (\CreatePullThroughCacheRuleResponse' {createdAt} -> createdAt) (\s@CreatePullThroughCacheRuleResponse' {} a -> s {createdAt = a} :: CreatePullThroughCacheRuleResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon ECR repository prefix associated with the pull through cache
+-- rule.
+createPullThroughCacheRuleResponse_ecrRepositoryPrefix :: Lens.Lens' CreatePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+createPullThroughCacheRuleResponse_ecrRepositoryPrefix = Lens.lens (\CreatePullThroughCacheRuleResponse' {ecrRepositoryPrefix} -> ecrRepositoryPrefix) (\s@CreatePullThroughCacheRuleResponse' {} a -> s {ecrRepositoryPrefix = a} :: CreatePullThroughCacheRuleResponse)
+
+-- | The registry ID associated with the request.
+createPullThroughCacheRuleResponse_registryId :: Lens.Lens' CreatePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+createPullThroughCacheRuleResponse_registryId = Lens.lens (\CreatePullThroughCacheRuleResponse' {registryId} -> registryId) (\s@CreatePullThroughCacheRuleResponse' {} a -> s {registryId = a} :: CreatePullThroughCacheRuleResponse)
+
+-- | The upstream registry URL associated with the pull through cache rule.
+createPullThroughCacheRuleResponse_upstreamRegistryUrl :: Lens.Lens' CreatePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+createPullThroughCacheRuleResponse_upstreamRegistryUrl = Lens.lens (\CreatePullThroughCacheRuleResponse' {upstreamRegistryUrl} -> upstreamRegistryUrl) (\s@CreatePullThroughCacheRuleResponse' {} a -> s {upstreamRegistryUrl = a} :: CreatePullThroughCacheRuleResponse)
+
+-- | The response's http status code.
+createPullThroughCacheRuleResponse_httpStatus :: Lens.Lens' CreatePullThroughCacheRuleResponse Prelude.Int
+createPullThroughCacheRuleResponse_httpStatus = Lens.lens (\CreatePullThroughCacheRuleResponse' {httpStatus} -> httpStatus) (\s@CreatePullThroughCacheRuleResponse' {} a -> s {httpStatus = a} :: CreatePullThroughCacheRuleResponse)
+
+instance
+  Prelude.NFData
+    CreatePullThroughCacheRuleResponse
+  where
+  rnf CreatePullThroughCacheRuleResponse' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf ecrRepositoryPrefix
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf upstreamRegistryUrl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/CreateRepository.hs b/gen/Amazonka/ECR/CreateRepository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/CreateRepository.hs
@@ -0,0 +1,290 @@
+{-# 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.ECR.CreateRepository
+-- 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 repository. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html Amazon ECR repositories>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.CreateRepository
+  ( -- * Creating a Request
+    CreateRepository (..),
+    newCreateRepository,
+
+    -- * Request Lenses
+    createRepository_encryptionConfiguration,
+    createRepository_imageScanningConfiguration,
+    createRepository_imageTagMutability,
+    createRepository_registryId,
+    createRepository_tags,
+    createRepository_repositoryName,
+
+    -- * Destructuring the Response
+    CreateRepositoryResponse (..),
+    newCreateRepositoryResponse,
+
+    -- * Response Lenses
+    createRepositoryResponse_repository,
+    createRepositoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateRepository' smart constructor.
+data CreateRepository = CreateRepository'
+  { -- | The encryption configuration for the repository. This determines how the
+    -- contents of your repository are encrypted at rest.
+    encryptionConfiguration :: Prelude.Maybe EncryptionConfiguration,
+    -- | The image scanning configuration for the repository. This determines
+    -- whether images are scanned for known vulnerabilities after being pushed
+    -- to the repository.
+    imageScanningConfiguration :: Prelude.Maybe ImageScanningConfiguration,
+    -- | The tag mutability setting for the repository. If this parameter is
+    -- omitted, the default setting of @MUTABLE@ will be used which will allow
+    -- image tags to be overwritten. If @IMMUTABLE@ is specified, all image
+    -- tags within the repository will be immutable which will prevent them
+    -- from being overwritten.
+    imageTagMutability :: Prelude.Maybe ImageTagMutability,
+    -- | The Amazon Web Services account ID associated with the registry to
+    -- create the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The metadata that you apply to the repository to help you categorize and
+    -- organize them. Each tag consists of a key and an optional value, both of
+    -- which you define. Tag keys can have a maximum character length of 128
+    -- characters, and tag values can have a maximum length of 256 characters.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name to use for the repository. The repository name may be specified
+    -- on its own (such as @nginx-web-app@) or it can be prepended with a
+    -- namespace to group the repository into a category (such as
+    -- @project-a\/nginx-web-app@).
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRepository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'encryptionConfiguration', 'createRepository_encryptionConfiguration' - The encryption configuration for the repository. This determines how the
+-- contents of your repository are encrypted at rest.
+--
+-- 'imageScanningConfiguration', 'createRepository_imageScanningConfiguration' - The image scanning configuration for the repository. This determines
+-- whether images are scanned for known vulnerabilities after being pushed
+-- to the repository.
+--
+-- 'imageTagMutability', 'createRepository_imageTagMutability' - The tag mutability setting for the repository. If this parameter is
+-- omitted, the default setting of @MUTABLE@ will be used which will allow
+-- image tags to be overwritten. If @IMMUTABLE@ is specified, all image
+-- tags within the repository will be immutable which will prevent them
+-- from being overwritten.
+--
+-- 'registryId', 'createRepository_registryId' - The Amazon Web Services account ID associated with the registry to
+-- create the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'tags', 'createRepository_tags' - The metadata that you apply to the repository to help you categorize and
+-- organize them. Each tag consists of a key and an optional value, both of
+-- which you define. Tag keys can have a maximum character length of 128
+-- characters, and tag values can have a maximum length of 256 characters.
+--
+-- 'repositoryName', 'createRepository_repositoryName' - The name to use for the repository. The repository name may be specified
+-- on its own (such as @nginx-web-app@) or it can be prepended with a
+-- namespace to group the repository into a category (such as
+-- @project-a\/nginx-web-app@).
+newCreateRepository ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  CreateRepository
+newCreateRepository pRepositoryName_ =
+  CreateRepository'
+    { encryptionConfiguration =
+        Prelude.Nothing,
+      imageScanningConfiguration = Prelude.Nothing,
+      imageTagMutability = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The encryption configuration for the repository. This determines how the
+-- contents of your repository are encrypted at rest.
+createRepository_encryptionConfiguration :: Lens.Lens' CreateRepository (Prelude.Maybe EncryptionConfiguration)
+createRepository_encryptionConfiguration = Lens.lens (\CreateRepository' {encryptionConfiguration} -> encryptionConfiguration) (\s@CreateRepository' {} a -> s {encryptionConfiguration = a} :: CreateRepository)
+
+-- | The image scanning configuration for the repository. This determines
+-- whether images are scanned for known vulnerabilities after being pushed
+-- to the repository.
+createRepository_imageScanningConfiguration :: Lens.Lens' CreateRepository (Prelude.Maybe ImageScanningConfiguration)
+createRepository_imageScanningConfiguration = Lens.lens (\CreateRepository' {imageScanningConfiguration} -> imageScanningConfiguration) (\s@CreateRepository' {} a -> s {imageScanningConfiguration = a} :: CreateRepository)
+
+-- | The tag mutability setting for the repository. If this parameter is
+-- omitted, the default setting of @MUTABLE@ will be used which will allow
+-- image tags to be overwritten. If @IMMUTABLE@ is specified, all image
+-- tags within the repository will be immutable which will prevent them
+-- from being overwritten.
+createRepository_imageTagMutability :: Lens.Lens' CreateRepository (Prelude.Maybe ImageTagMutability)
+createRepository_imageTagMutability = Lens.lens (\CreateRepository' {imageTagMutability} -> imageTagMutability) (\s@CreateRepository' {} a -> s {imageTagMutability = a} :: CreateRepository)
+
+-- | The Amazon Web Services account ID associated with the registry to
+-- create the repository. If you do not specify a registry, the default
+-- registry is assumed.
+createRepository_registryId :: Lens.Lens' CreateRepository (Prelude.Maybe Prelude.Text)
+createRepository_registryId = Lens.lens (\CreateRepository' {registryId} -> registryId) (\s@CreateRepository' {} a -> s {registryId = a} :: CreateRepository)
+
+-- | The metadata that you apply to the repository to help you categorize and
+-- organize them. Each tag consists of a key and an optional value, both of
+-- which you define. Tag keys can have a maximum character length of 128
+-- characters, and tag values can have a maximum length of 256 characters.
+createRepository_tags :: Lens.Lens' CreateRepository (Prelude.Maybe [Tag])
+createRepository_tags = Lens.lens (\CreateRepository' {tags} -> tags) (\s@CreateRepository' {} a -> s {tags = a} :: CreateRepository) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name to use for the repository. The repository name may be specified
+-- on its own (such as @nginx-web-app@) or it can be prepended with a
+-- namespace to group the repository into a category (such as
+-- @project-a\/nginx-web-app@).
+createRepository_repositoryName :: Lens.Lens' CreateRepository Prelude.Text
+createRepository_repositoryName = Lens.lens (\CreateRepository' {repositoryName} -> repositoryName) (\s@CreateRepository' {} a -> s {repositoryName = a} :: CreateRepository)
+
+instance Core.AWSRequest CreateRepository where
+  type
+    AWSResponse CreateRepository =
+      CreateRepositoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRepositoryResponse'
+            Prelude.<$> (x Data..?> "repository")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateRepository where
+  hashWithSalt _salt CreateRepository' {..} =
+    _salt
+      `Prelude.hashWithSalt` encryptionConfiguration
+      `Prelude.hashWithSalt` imageScanningConfiguration
+      `Prelude.hashWithSalt` imageTagMutability
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData CreateRepository where
+  rnf CreateRepository' {..} =
+    Prelude.rnf encryptionConfiguration
+      `Prelude.seq` Prelude.rnf imageScanningConfiguration
+      `Prelude.seq` Prelude.rnf imageTagMutability
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders CreateRepository where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.CreateRepository" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRepository where
+  toJSON CreateRepository' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("encryptionConfiguration" Data..=)
+              Prelude.<$> encryptionConfiguration,
+            ("imageScanningConfiguration" Data..=)
+              Prelude.<$> imageScanningConfiguration,
+            ("imageTagMutability" Data..=)
+              Prelude.<$> imageTagMutability,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath CreateRepository where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateRepository where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateRepositoryResponse' smart constructor.
+data CreateRepositoryResponse = CreateRepositoryResponse'
+  { -- | The repository that was created.
+    repository :: Prelude.Maybe Repository,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRepositoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'repository', 'createRepositoryResponse_repository' - The repository that was created.
+--
+-- 'httpStatus', 'createRepositoryResponse_httpStatus' - The response's http status code.
+newCreateRepositoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateRepositoryResponse
+newCreateRepositoryResponse pHttpStatus_ =
+  CreateRepositoryResponse'
+    { repository =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The repository that was created.
+createRepositoryResponse_repository :: Lens.Lens' CreateRepositoryResponse (Prelude.Maybe Repository)
+createRepositoryResponse_repository = Lens.lens (\CreateRepositoryResponse' {repository} -> repository) (\s@CreateRepositoryResponse' {} a -> s {repository = a} :: CreateRepositoryResponse)
+
+-- | The response's http status code.
+createRepositoryResponse_httpStatus :: Lens.Lens' CreateRepositoryResponse Prelude.Int
+createRepositoryResponse_httpStatus = Lens.lens (\CreateRepositoryResponse' {httpStatus} -> httpStatus) (\s@CreateRepositoryResponse' {} a -> s {httpStatus = a} :: CreateRepositoryResponse)
+
+instance Prelude.NFData CreateRepositoryResponse where
+  rnf CreateRepositoryResponse' {..} =
+    Prelude.rnf repository
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DeleteLifecyclePolicy.hs b/gen/Amazonka/ECR/DeleteLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DeleteLifecyclePolicy.hs
@@ -0,0 +1,230 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.DeleteLifecyclePolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the lifecycle policy associated with the specified repository.
+module Amazonka.ECR.DeleteLifecyclePolicy
+  ( -- * Creating a Request
+    DeleteLifecyclePolicy (..),
+    newDeleteLifecyclePolicy,
+
+    -- * Request Lenses
+    deleteLifecyclePolicy_registryId,
+    deleteLifecyclePolicy_repositoryName,
+
+    -- * Destructuring the Response
+    DeleteLifecyclePolicyResponse (..),
+    newDeleteLifecyclePolicyResponse,
+
+    -- * Response Lenses
+    deleteLifecyclePolicyResponse_lastEvaluatedAt,
+    deleteLifecyclePolicyResponse_lifecyclePolicyText,
+    deleteLifecyclePolicyResponse_registryId,
+    deleteLifecyclePolicyResponse_repositoryName,
+    deleteLifecyclePolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteLifecyclePolicy' smart constructor.
+data DeleteLifecyclePolicy = DeleteLifecyclePolicy'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteLifecyclePolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'deleteLifecyclePolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'deleteLifecyclePolicy_repositoryName' - The name of the repository.
+newDeleteLifecyclePolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DeleteLifecyclePolicy
+newDeleteLifecyclePolicy pRepositoryName_ =
+  DeleteLifecyclePolicy'
+    { registryId =
+        Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+deleteLifecyclePolicy_registryId :: Lens.Lens' DeleteLifecyclePolicy (Prelude.Maybe Prelude.Text)
+deleteLifecyclePolicy_registryId = Lens.lens (\DeleteLifecyclePolicy' {registryId} -> registryId) (\s@DeleteLifecyclePolicy' {} a -> s {registryId = a} :: DeleteLifecyclePolicy)
+
+-- | The name of the repository.
+deleteLifecyclePolicy_repositoryName :: Lens.Lens' DeleteLifecyclePolicy Prelude.Text
+deleteLifecyclePolicy_repositoryName = Lens.lens (\DeleteLifecyclePolicy' {repositoryName} -> repositoryName) (\s@DeleteLifecyclePolicy' {} a -> s {repositoryName = a} :: DeleteLifecyclePolicy)
+
+instance Core.AWSRequest DeleteLifecyclePolicy where
+  type
+    AWSResponse DeleteLifecyclePolicy =
+      DeleteLifecyclePolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteLifecyclePolicyResponse'
+            Prelude.<$> (x Data..?> "lastEvaluatedAt")
+            Prelude.<*> (x Data..?> "lifecyclePolicyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteLifecyclePolicy where
+  hashWithSalt _salt DeleteLifecyclePolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DeleteLifecyclePolicy where
+  rnf DeleteLifecyclePolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DeleteLifecyclePolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DeleteLifecyclePolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteLifecyclePolicy where
+  toJSON DeleteLifecyclePolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DeleteLifecyclePolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteLifecyclePolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteLifecyclePolicyResponse' smart constructor.
+data DeleteLifecyclePolicyResponse = DeleteLifecyclePolicyResponse'
+  { -- | The time stamp of the last time that the lifecycle policy was run.
+    lastEvaluatedAt :: Prelude.Maybe Data.POSIX,
+    -- | The JSON lifecycle policy text.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'DeleteLifecyclePolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastEvaluatedAt', 'deleteLifecyclePolicyResponse_lastEvaluatedAt' - The time stamp of the last time that the lifecycle policy was run.
+--
+-- 'lifecyclePolicyText', 'deleteLifecyclePolicyResponse_lifecyclePolicyText' - The JSON lifecycle policy text.
+--
+-- 'registryId', 'deleteLifecyclePolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'deleteLifecyclePolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'deleteLifecyclePolicyResponse_httpStatus' - The response's http status code.
+newDeleteLifecyclePolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteLifecyclePolicyResponse
+newDeleteLifecyclePolicyResponse pHttpStatus_ =
+  DeleteLifecyclePolicyResponse'
+    { lastEvaluatedAt =
+        Prelude.Nothing,
+      lifecyclePolicyText = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time stamp of the last time that the lifecycle policy was run.
+deleteLifecyclePolicyResponse_lastEvaluatedAt :: Lens.Lens' DeleteLifecyclePolicyResponse (Prelude.Maybe Prelude.UTCTime)
+deleteLifecyclePolicyResponse_lastEvaluatedAt = Lens.lens (\DeleteLifecyclePolicyResponse' {lastEvaluatedAt} -> lastEvaluatedAt) (\s@DeleteLifecyclePolicyResponse' {} a -> s {lastEvaluatedAt = a} :: DeleteLifecyclePolicyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The JSON lifecycle policy text.
+deleteLifecyclePolicyResponse_lifecyclePolicyText :: Lens.Lens' DeleteLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+deleteLifecyclePolicyResponse_lifecyclePolicyText = Lens.lens (\DeleteLifecyclePolicyResponse' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@DeleteLifecyclePolicyResponse' {} a -> s {lifecyclePolicyText = a} :: DeleteLifecyclePolicyResponse)
+
+-- | The registry ID associated with the request.
+deleteLifecyclePolicyResponse_registryId :: Lens.Lens' DeleteLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+deleteLifecyclePolicyResponse_registryId = Lens.lens (\DeleteLifecyclePolicyResponse' {registryId} -> registryId) (\s@DeleteLifecyclePolicyResponse' {} a -> s {registryId = a} :: DeleteLifecyclePolicyResponse)
+
+-- | The repository name associated with the request.
+deleteLifecyclePolicyResponse_repositoryName :: Lens.Lens' DeleteLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+deleteLifecyclePolicyResponse_repositoryName = Lens.lens (\DeleteLifecyclePolicyResponse' {repositoryName} -> repositoryName) (\s@DeleteLifecyclePolicyResponse' {} a -> s {repositoryName = a} :: DeleteLifecyclePolicyResponse)
+
+-- | The response's http status code.
+deleteLifecyclePolicyResponse_httpStatus :: Lens.Lens' DeleteLifecyclePolicyResponse Prelude.Int
+deleteLifecyclePolicyResponse_httpStatus = Lens.lens (\DeleteLifecyclePolicyResponse' {httpStatus} -> httpStatus) (\s@DeleteLifecyclePolicyResponse' {} a -> s {httpStatus = a} :: DeleteLifecyclePolicyResponse)
+
+instance Prelude.NFData DeleteLifecyclePolicyResponse where
+  rnf DeleteLifecyclePolicyResponse' {..} =
+    Prelude.rnf lastEvaluatedAt
+      `Prelude.seq` Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DeletePullThroughCacheRule.hs b/gen/Amazonka/ECR/DeletePullThroughCacheRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DeletePullThroughCacheRule.hs
@@ -0,0 +1,236 @@
+{-# 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.ECR.DeletePullThroughCacheRule
+-- 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 pull through cache rule.
+module Amazonka.ECR.DeletePullThroughCacheRule
+  ( -- * Creating a Request
+    DeletePullThroughCacheRule (..),
+    newDeletePullThroughCacheRule,
+
+    -- * Request Lenses
+    deletePullThroughCacheRule_registryId,
+    deletePullThroughCacheRule_ecrRepositoryPrefix,
+
+    -- * Destructuring the Response
+    DeletePullThroughCacheRuleResponse (..),
+    newDeletePullThroughCacheRuleResponse,
+
+    -- * Response Lenses
+    deletePullThroughCacheRuleResponse_createdAt,
+    deletePullThroughCacheRuleResponse_ecrRepositoryPrefix,
+    deletePullThroughCacheRuleResponse_registryId,
+    deletePullThroughCacheRuleResponse_upstreamRegistryUrl,
+    deletePullThroughCacheRuleResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePullThroughCacheRule' smart constructor.
+data DeletePullThroughCacheRule = DeletePullThroughCacheRule'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the pull through cache rule. If you do not specify a registry,
+    -- the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon ECR repository prefix associated with the pull through cache
+    -- rule to delete.
+    ecrRepositoryPrefix :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePullThroughCacheRule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'deletePullThroughCacheRule_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the pull through cache rule. If you do not specify a registry,
+-- the default registry is assumed.
+--
+-- 'ecrRepositoryPrefix', 'deletePullThroughCacheRule_ecrRepositoryPrefix' - The Amazon ECR repository prefix associated with the pull through cache
+-- rule to delete.
+newDeletePullThroughCacheRule ::
+  -- | 'ecrRepositoryPrefix'
+  Prelude.Text ->
+  DeletePullThroughCacheRule
+newDeletePullThroughCacheRule pEcrRepositoryPrefix_ =
+  DeletePullThroughCacheRule'
+    { registryId =
+        Prelude.Nothing,
+      ecrRepositoryPrefix = pEcrRepositoryPrefix_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the pull through cache rule. If you do not specify a registry,
+-- the default registry is assumed.
+deletePullThroughCacheRule_registryId :: Lens.Lens' DeletePullThroughCacheRule (Prelude.Maybe Prelude.Text)
+deletePullThroughCacheRule_registryId = Lens.lens (\DeletePullThroughCacheRule' {registryId} -> registryId) (\s@DeletePullThroughCacheRule' {} a -> s {registryId = a} :: DeletePullThroughCacheRule)
+
+-- | The Amazon ECR repository prefix associated with the pull through cache
+-- rule to delete.
+deletePullThroughCacheRule_ecrRepositoryPrefix :: Lens.Lens' DeletePullThroughCacheRule Prelude.Text
+deletePullThroughCacheRule_ecrRepositoryPrefix = Lens.lens (\DeletePullThroughCacheRule' {ecrRepositoryPrefix} -> ecrRepositoryPrefix) (\s@DeletePullThroughCacheRule' {} a -> s {ecrRepositoryPrefix = a} :: DeletePullThroughCacheRule)
+
+instance Core.AWSRequest DeletePullThroughCacheRule where
+  type
+    AWSResponse DeletePullThroughCacheRule =
+      DeletePullThroughCacheRuleResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeletePullThroughCacheRuleResponse'
+            Prelude.<$> (x Data..?> "createdAt")
+            Prelude.<*> (x Data..?> "ecrRepositoryPrefix")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "upstreamRegistryUrl")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePullThroughCacheRule where
+  hashWithSalt _salt DeletePullThroughCacheRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` ecrRepositoryPrefix
+
+instance Prelude.NFData DeletePullThroughCacheRule where
+  rnf DeletePullThroughCacheRule' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf ecrRepositoryPrefix
+
+instance Data.ToHeaders DeletePullThroughCacheRule where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DeletePullThroughCacheRule" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeletePullThroughCacheRule where
+  toJSON DeletePullThroughCacheRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("ecrRepositoryPrefix" Data..= ecrRepositoryPrefix)
+          ]
+      )
+
+instance Data.ToPath DeletePullThroughCacheRule where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeletePullThroughCacheRule where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeletePullThroughCacheRuleResponse' smart constructor.
+data DeletePullThroughCacheRuleResponse = DeletePullThroughCacheRuleResponse'
+  { -- | The timestamp associated with the pull through cache rule.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon ECR repository prefix associated with the request.
+    ecrRepositoryPrefix :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The upstream registry URL associated with the pull through cache rule.
+    upstreamRegistryUrl :: 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 'DeletePullThroughCacheRuleResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'deletePullThroughCacheRuleResponse_createdAt' - The timestamp associated with the pull through cache rule.
+--
+-- 'ecrRepositoryPrefix', 'deletePullThroughCacheRuleResponse_ecrRepositoryPrefix' - The Amazon ECR repository prefix associated with the request.
+--
+-- 'registryId', 'deletePullThroughCacheRuleResponse_registryId' - The registry ID associated with the request.
+--
+-- 'upstreamRegistryUrl', 'deletePullThroughCacheRuleResponse_upstreamRegistryUrl' - The upstream registry URL associated with the pull through cache rule.
+--
+-- 'httpStatus', 'deletePullThroughCacheRuleResponse_httpStatus' - The response's http status code.
+newDeletePullThroughCacheRuleResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePullThroughCacheRuleResponse
+newDeletePullThroughCacheRuleResponse pHttpStatus_ =
+  DeletePullThroughCacheRuleResponse'
+    { createdAt =
+        Prelude.Nothing,
+      ecrRepositoryPrefix = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      upstreamRegistryUrl = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The timestamp associated with the pull through cache rule.
+deletePullThroughCacheRuleResponse_createdAt :: Lens.Lens' DeletePullThroughCacheRuleResponse (Prelude.Maybe Prelude.UTCTime)
+deletePullThroughCacheRuleResponse_createdAt = Lens.lens (\DeletePullThroughCacheRuleResponse' {createdAt} -> createdAt) (\s@DeletePullThroughCacheRuleResponse' {} a -> s {createdAt = a} :: DeletePullThroughCacheRuleResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon ECR repository prefix associated with the request.
+deletePullThroughCacheRuleResponse_ecrRepositoryPrefix :: Lens.Lens' DeletePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+deletePullThroughCacheRuleResponse_ecrRepositoryPrefix = Lens.lens (\DeletePullThroughCacheRuleResponse' {ecrRepositoryPrefix} -> ecrRepositoryPrefix) (\s@DeletePullThroughCacheRuleResponse' {} a -> s {ecrRepositoryPrefix = a} :: DeletePullThroughCacheRuleResponse)
+
+-- | The registry ID associated with the request.
+deletePullThroughCacheRuleResponse_registryId :: Lens.Lens' DeletePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+deletePullThroughCacheRuleResponse_registryId = Lens.lens (\DeletePullThroughCacheRuleResponse' {registryId} -> registryId) (\s@DeletePullThroughCacheRuleResponse' {} a -> s {registryId = a} :: DeletePullThroughCacheRuleResponse)
+
+-- | The upstream registry URL associated with the pull through cache rule.
+deletePullThroughCacheRuleResponse_upstreamRegistryUrl :: Lens.Lens' DeletePullThroughCacheRuleResponse (Prelude.Maybe Prelude.Text)
+deletePullThroughCacheRuleResponse_upstreamRegistryUrl = Lens.lens (\DeletePullThroughCacheRuleResponse' {upstreamRegistryUrl} -> upstreamRegistryUrl) (\s@DeletePullThroughCacheRuleResponse' {} a -> s {upstreamRegistryUrl = a} :: DeletePullThroughCacheRuleResponse)
+
+-- | The response's http status code.
+deletePullThroughCacheRuleResponse_httpStatus :: Lens.Lens' DeletePullThroughCacheRuleResponse Prelude.Int
+deletePullThroughCacheRuleResponse_httpStatus = Lens.lens (\DeletePullThroughCacheRuleResponse' {httpStatus} -> httpStatus) (\s@DeletePullThroughCacheRuleResponse' {} a -> s {httpStatus = a} :: DeletePullThroughCacheRuleResponse)
+
+instance
+  Prelude.NFData
+    DeletePullThroughCacheRuleResponse
+  where
+  rnf DeletePullThroughCacheRuleResponse' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf ecrRepositoryPrefix
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf upstreamRegistryUrl
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DeleteRegistryPolicy.hs b/gen/Amazonka/ECR/DeleteRegistryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DeleteRegistryPolicy.hs
@@ -0,0 +1,160 @@
+{-# 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.ECR.DeleteRegistryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the registry permissions policy.
+module Amazonka.ECR.DeleteRegistryPolicy
+  ( -- * Creating a Request
+    DeleteRegistryPolicy (..),
+    newDeleteRegistryPolicy,
+
+    -- * Destructuring the Response
+    DeleteRegistryPolicyResponse (..),
+    newDeleteRegistryPolicyResponse,
+
+    -- * Response Lenses
+    deleteRegistryPolicyResponse_policyText,
+    deleteRegistryPolicyResponse_registryId,
+    deleteRegistryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRegistryPolicy' smart constructor.
+data DeleteRegistryPolicy = DeleteRegistryPolicy'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRegistryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteRegistryPolicy ::
+  DeleteRegistryPolicy
+newDeleteRegistryPolicy = DeleteRegistryPolicy'
+
+instance Core.AWSRequest DeleteRegistryPolicy where
+  type
+    AWSResponse DeleteRegistryPolicy =
+      DeleteRegistryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRegistryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRegistryPolicy where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData DeleteRegistryPolicy where
+  rnf _ = ()
+
+instance Data.ToHeaders DeleteRegistryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DeleteRegistryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRegistryPolicy where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath DeleteRegistryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRegistryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRegistryPolicyResponse' smart constructor.
+data DeleteRegistryPolicyResponse = DeleteRegistryPolicyResponse'
+  { -- | The contents of the registry permissions policy that was deleted.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: 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 'DeleteRegistryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'deleteRegistryPolicyResponse_policyText' - The contents of the registry permissions policy that was deleted.
+--
+-- 'registryId', 'deleteRegistryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'httpStatus', 'deleteRegistryPolicyResponse_httpStatus' - The response's http status code.
+newDeleteRegistryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRegistryPolicyResponse
+newDeleteRegistryPolicyResponse pHttpStatus_ =
+  DeleteRegistryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The contents of the registry permissions policy that was deleted.
+deleteRegistryPolicyResponse_policyText :: Lens.Lens' DeleteRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRegistryPolicyResponse_policyText = Lens.lens (\DeleteRegistryPolicyResponse' {policyText} -> policyText) (\s@DeleteRegistryPolicyResponse' {} a -> s {policyText = a} :: DeleteRegistryPolicyResponse)
+
+-- | The registry ID associated with the request.
+deleteRegistryPolicyResponse_registryId :: Lens.Lens' DeleteRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRegistryPolicyResponse_registryId = Lens.lens (\DeleteRegistryPolicyResponse' {registryId} -> registryId) (\s@DeleteRegistryPolicyResponse' {} a -> s {registryId = a} :: DeleteRegistryPolicyResponse)
+
+-- | The response's http status code.
+deleteRegistryPolicyResponse_httpStatus :: Lens.Lens' DeleteRegistryPolicyResponse Prelude.Int
+deleteRegistryPolicyResponse_httpStatus = Lens.lens (\DeleteRegistryPolicyResponse' {httpStatus} -> httpStatus) (\s@DeleteRegistryPolicyResponse' {} a -> s {httpStatus = a} :: DeleteRegistryPolicyResponse)
+
+instance Prelude.NFData DeleteRegistryPolicyResponse where
+  rnf DeleteRegistryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DeleteRepository.hs b/gen/Amazonka/ECR/DeleteRepository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DeleteRepository.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.DeleteRepository
+-- 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 repository. If the repository contains images, you must either
+-- delete all images in the repository or use the @force@ option to delete
+-- the repository.
+module Amazonka.ECR.DeleteRepository
+  ( -- * Creating a Request
+    DeleteRepository (..),
+    newDeleteRepository,
+
+    -- * Request Lenses
+    deleteRepository_force,
+    deleteRepository_registryId,
+    deleteRepository_repositoryName,
+
+    -- * Destructuring the Response
+    DeleteRepositoryResponse (..),
+    newDeleteRepositoryResponse,
+
+    -- * Response Lenses
+    deleteRepositoryResponse_repository,
+    deleteRepositoryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRepository' smart constructor.
+data DeleteRepository = DeleteRepository'
+  { -- | If a repository contains images, forces the deletion.
+    force :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository to delete. If you do not specify a registry, the
+    -- default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to delete.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'force', 'deleteRepository_force' - If a repository contains images, forces the deletion.
+--
+-- 'registryId', 'deleteRepository_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository to delete. If you do not specify a registry, the
+-- default registry is assumed.
+--
+-- 'repositoryName', 'deleteRepository_repositoryName' - The name of the repository to delete.
+newDeleteRepository ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DeleteRepository
+newDeleteRepository pRepositoryName_ =
+  DeleteRepository'
+    { force = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | If a repository contains images, forces the deletion.
+deleteRepository_force :: Lens.Lens' DeleteRepository (Prelude.Maybe Prelude.Bool)
+deleteRepository_force = Lens.lens (\DeleteRepository' {force} -> force) (\s@DeleteRepository' {} a -> s {force = a} :: DeleteRepository)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository to delete. If you do not specify a registry, the
+-- default registry is assumed.
+deleteRepository_registryId :: Lens.Lens' DeleteRepository (Prelude.Maybe Prelude.Text)
+deleteRepository_registryId = Lens.lens (\DeleteRepository' {registryId} -> registryId) (\s@DeleteRepository' {} a -> s {registryId = a} :: DeleteRepository)
+
+-- | The name of the repository to delete.
+deleteRepository_repositoryName :: Lens.Lens' DeleteRepository Prelude.Text
+deleteRepository_repositoryName = Lens.lens (\DeleteRepository' {repositoryName} -> repositoryName) (\s@DeleteRepository' {} a -> s {repositoryName = a} :: DeleteRepository)
+
+instance Core.AWSRequest DeleteRepository where
+  type
+    AWSResponse DeleteRepository =
+      DeleteRepositoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRepositoryResponse'
+            Prelude.<$> (x Data..?> "repository")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRepository where
+  hashWithSalt _salt DeleteRepository' {..} =
+    _salt
+      `Prelude.hashWithSalt` force
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DeleteRepository where
+  rnf DeleteRepository' {..} =
+    Prelude.rnf force
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DeleteRepository where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DeleteRepository" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRepository where
+  toJSON DeleteRepository' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("force" Data..=) Prelude.<$> force,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DeleteRepository where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRepository where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRepositoryResponse' smart constructor.
+data DeleteRepositoryResponse = DeleteRepositoryResponse'
+  { -- | The repository that was deleted.
+    repository :: Prelude.Maybe Repository,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepositoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'repository', 'deleteRepositoryResponse_repository' - The repository that was deleted.
+--
+-- 'httpStatus', 'deleteRepositoryResponse_httpStatus' - The response's http status code.
+newDeleteRepositoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRepositoryResponse
+newDeleteRepositoryResponse pHttpStatus_ =
+  DeleteRepositoryResponse'
+    { repository =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The repository that was deleted.
+deleteRepositoryResponse_repository :: Lens.Lens' DeleteRepositoryResponse (Prelude.Maybe Repository)
+deleteRepositoryResponse_repository = Lens.lens (\DeleteRepositoryResponse' {repository} -> repository) (\s@DeleteRepositoryResponse' {} a -> s {repository = a} :: DeleteRepositoryResponse)
+
+-- | The response's http status code.
+deleteRepositoryResponse_httpStatus :: Lens.Lens' DeleteRepositoryResponse Prelude.Int
+deleteRepositoryResponse_httpStatus = Lens.lens (\DeleteRepositoryResponse' {httpStatus} -> httpStatus) (\s@DeleteRepositoryResponse' {} a -> s {httpStatus = a} :: DeleteRepositoryResponse)
+
+instance Prelude.NFData DeleteRepositoryResponse where
+  rnf DeleteRepositoryResponse' {..} =
+    Prelude.rnf repository
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DeleteRepositoryPolicy.hs b/gen/Amazonka/ECR/DeleteRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DeleteRepositoryPolicy.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.ECR.DeleteRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the repository policy associated with the specified repository.
+module Amazonka.ECR.DeleteRepositoryPolicy
+  ( -- * Creating a Request
+    DeleteRepositoryPolicy (..),
+    newDeleteRepositoryPolicy,
+
+    -- * Request Lenses
+    deleteRepositoryPolicy_registryId,
+    deleteRepositoryPolicy_repositoryName,
+
+    -- * Destructuring the Response
+    DeleteRepositoryPolicyResponse (..),
+    newDeleteRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    deleteRepositoryPolicyResponse_policyText,
+    deleteRepositoryPolicyResponse_registryId,
+    deleteRepositoryPolicyResponse_repositoryName,
+    deleteRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRepositoryPolicy' smart constructor.
+data DeleteRepositoryPolicy = DeleteRepositoryPolicy'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository policy to delete. If you do not specify a
+    -- registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that is associated with the repository policy
+    -- to delete.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'deleteRepositoryPolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository policy to delete. If you do not specify a
+-- registry, the default registry is assumed.
+--
+-- 'repositoryName', 'deleteRepositoryPolicy_repositoryName' - The name of the repository that is associated with the repository policy
+-- to delete.
+newDeleteRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DeleteRepositoryPolicy
+newDeleteRepositoryPolicy pRepositoryName_ =
+  DeleteRepositoryPolicy'
+    { registryId =
+        Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository policy to delete. If you do not specify a
+-- registry, the default registry is assumed.
+deleteRepositoryPolicy_registryId :: Lens.Lens' DeleteRepositoryPolicy (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicy_registryId = Lens.lens (\DeleteRepositoryPolicy' {registryId} -> registryId) (\s@DeleteRepositoryPolicy' {} a -> s {registryId = a} :: DeleteRepositoryPolicy)
+
+-- | The name of the repository that is associated with the repository policy
+-- to delete.
+deleteRepositoryPolicy_repositoryName :: Lens.Lens' DeleteRepositoryPolicy Prelude.Text
+deleteRepositoryPolicy_repositoryName = Lens.lens (\DeleteRepositoryPolicy' {repositoryName} -> repositoryName) (\s@DeleteRepositoryPolicy' {} a -> s {repositoryName = a} :: DeleteRepositoryPolicy)
+
+instance Core.AWSRequest DeleteRepositoryPolicy where
+  type
+    AWSResponse DeleteRepositoryPolicy =
+      DeleteRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRepositoryPolicy where
+  hashWithSalt _salt DeleteRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DeleteRepositoryPolicy where
+  rnf DeleteRepositoryPolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DeleteRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRepositoryPolicy where
+  toJSON DeleteRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DeleteRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRepositoryPolicyResponse' smart constructor.
+data DeleteRepositoryPolicyResponse = DeleteRepositoryPolicyResponse'
+  { -- | The JSON repository policy that was deleted from the repository.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'DeleteRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'deleteRepositoryPolicyResponse_policyText' - The JSON repository policy that was deleted from the repository.
+--
+-- 'registryId', 'deleteRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'deleteRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'deleteRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newDeleteRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRepositoryPolicyResponse
+newDeleteRepositoryPolicyResponse pHttpStatus_ =
+  DeleteRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy that was deleted from the repository.
+deleteRepositoryPolicyResponse_policyText :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_policyText = Lens.lens (\DeleteRepositoryPolicyResponse' {policyText} -> policyText) (\s@DeleteRepositoryPolicyResponse' {} a -> s {policyText = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+deleteRepositoryPolicyResponse_registryId :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_registryId = Lens.lens (\DeleteRepositoryPolicyResponse' {registryId} -> registryId) (\s@DeleteRepositoryPolicyResponse' {} a -> s {registryId = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+deleteRepositoryPolicyResponse_repositoryName :: Lens.Lens' DeleteRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+deleteRepositoryPolicyResponse_repositoryName = Lens.lens (\DeleteRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@DeleteRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: DeleteRepositoryPolicyResponse)
+
+-- | The response's http status code.
+deleteRepositoryPolicyResponse_httpStatus :: Lens.Lens' DeleteRepositoryPolicyResponse Prelude.Int
+deleteRepositoryPolicyResponse_httpStatus = Lens.lens (\DeleteRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@DeleteRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: DeleteRepositoryPolicyResponse)
+
+instance
+  Prelude.NFData
+    DeleteRepositoryPolicyResponse
+  where
+  rnf DeleteRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribeImageReplicationStatus.hs b/gen/Amazonka/ECR/DescribeImageReplicationStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribeImageReplicationStatus.hs
@@ -0,0 +1,255 @@
+{-# 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.ECR.DescribeImageReplicationStatus
+-- 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 replication status for a specified image.
+module Amazonka.ECR.DescribeImageReplicationStatus
+  ( -- * Creating a Request
+    DescribeImageReplicationStatus (..),
+    newDescribeImageReplicationStatus,
+
+    -- * Request Lenses
+    describeImageReplicationStatus_registryId,
+    describeImageReplicationStatus_repositoryName,
+    describeImageReplicationStatus_imageId,
+
+    -- * Destructuring the Response
+    DescribeImageReplicationStatusResponse (..),
+    newDescribeImageReplicationStatusResponse,
+
+    -- * Response Lenses
+    describeImageReplicationStatusResponse_imageId,
+    describeImageReplicationStatusResponse_replicationStatuses,
+    describeImageReplicationStatusResponse_repositoryName,
+    describeImageReplicationStatusResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeImageReplicationStatus' smart constructor.
+data DescribeImageReplicationStatus = DescribeImageReplicationStatus'
+  { -- | The Amazon Web Services account ID associated with the registry. If you
+    -- do not specify a registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that the image is in.
+    repositoryName :: Prelude.Text,
+    imageId :: ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImageReplicationStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'describeImageReplicationStatus_registryId' - The Amazon Web Services account ID associated with the registry. If you
+-- do not specify a registry, the default registry is assumed.
+--
+-- 'repositoryName', 'describeImageReplicationStatus_repositoryName' - The name of the repository that the image is in.
+--
+-- 'imageId', 'describeImageReplicationStatus_imageId' - Undocumented member.
+newDescribeImageReplicationStatus ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageId'
+  ImageIdentifier ->
+  DescribeImageReplicationStatus
+newDescribeImageReplicationStatus
+  pRepositoryName_
+  pImageId_ =
+    DescribeImageReplicationStatus'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        imageId = pImageId_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry. If you
+-- do not specify a registry, the default registry is assumed.
+describeImageReplicationStatus_registryId :: Lens.Lens' DescribeImageReplicationStatus (Prelude.Maybe Prelude.Text)
+describeImageReplicationStatus_registryId = Lens.lens (\DescribeImageReplicationStatus' {registryId} -> registryId) (\s@DescribeImageReplicationStatus' {} a -> s {registryId = a} :: DescribeImageReplicationStatus)
+
+-- | The name of the repository that the image is in.
+describeImageReplicationStatus_repositoryName :: Lens.Lens' DescribeImageReplicationStatus Prelude.Text
+describeImageReplicationStatus_repositoryName = Lens.lens (\DescribeImageReplicationStatus' {repositoryName} -> repositoryName) (\s@DescribeImageReplicationStatus' {} a -> s {repositoryName = a} :: DescribeImageReplicationStatus)
+
+-- | Undocumented member.
+describeImageReplicationStatus_imageId :: Lens.Lens' DescribeImageReplicationStatus ImageIdentifier
+describeImageReplicationStatus_imageId = Lens.lens (\DescribeImageReplicationStatus' {imageId} -> imageId) (\s@DescribeImageReplicationStatus' {} a -> s {imageId = a} :: DescribeImageReplicationStatus)
+
+instance
+  Core.AWSRequest
+    DescribeImageReplicationStatus
+  where
+  type
+    AWSResponse DescribeImageReplicationStatus =
+      DescribeImageReplicationStatusResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeImageReplicationStatusResponse'
+            Prelude.<$> (x Data..?> "imageId")
+            Prelude.<*> ( x
+                            Data..?> "replicationStatuses"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeImageReplicationStatus
+  where
+  hashWithSalt
+    _salt
+    DescribeImageReplicationStatus' {..} =
+      _salt
+        `Prelude.hashWithSalt` registryId
+        `Prelude.hashWithSalt` repositoryName
+        `Prelude.hashWithSalt` imageId
+
+instance
+  Prelude.NFData
+    DescribeImageReplicationStatus
+  where
+  rnf DescribeImageReplicationStatus' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageId
+
+instance
+  Data.ToHeaders
+    DescribeImageReplicationStatus
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribeImageReplicationStatus" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeImageReplicationStatus where
+  toJSON DescribeImageReplicationStatus' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageId" Data..= imageId)
+          ]
+      )
+
+instance Data.ToPath DescribeImageReplicationStatus where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeImageReplicationStatus where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeImageReplicationStatusResponse' smart constructor.
+data DescribeImageReplicationStatusResponse = DescribeImageReplicationStatusResponse'
+  { imageId :: Prelude.Maybe ImageIdentifier,
+    -- | The replication status details for the images in the specified
+    -- repository.
+    replicationStatuses :: Prelude.Maybe [ImageReplicationStatus],
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'DescribeImageReplicationStatusResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageId', 'describeImageReplicationStatusResponse_imageId' - Undocumented member.
+--
+-- 'replicationStatuses', 'describeImageReplicationStatusResponse_replicationStatuses' - The replication status details for the images in the specified
+-- repository.
+--
+-- 'repositoryName', 'describeImageReplicationStatusResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'describeImageReplicationStatusResponse_httpStatus' - The response's http status code.
+newDescribeImageReplicationStatusResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeImageReplicationStatusResponse
+newDescribeImageReplicationStatusResponse
+  pHttpStatus_ =
+    DescribeImageReplicationStatusResponse'
+      { imageId =
+          Prelude.Nothing,
+        replicationStatuses =
+          Prelude.Nothing,
+        repositoryName = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | Undocumented member.
+describeImageReplicationStatusResponse_imageId :: Lens.Lens' DescribeImageReplicationStatusResponse (Prelude.Maybe ImageIdentifier)
+describeImageReplicationStatusResponse_imageId = Lens.lens (\DescribeImageReplicationStatusResponse' {imageId} -> imageId) (\s@DescribeImageReplicationStatusResponse' {} a -> s {imageId = a} :: DescribeImageReplicationStatusResponse)
+
+-- | The replication status details for the images in the specified
+-- repository.
+describeImageReplicationStatusResponse_replicationStatuses :: Lens.Lens' DescribeImageReplicationStatusResponse (Prelude.Maybe [ImageReplicationStatus])
+describeImageReplicationStatusResponse_replicationStatuses = Lens.lens (\DescribeImageReplicationStatusResponse' {replicationStatuses} -> replicationStatuses) (\s@DescribeImageReplicationStatusResponse' {} a -> s {replicationStatuses = a} :: DescribeImageReplicationStatusResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The repository name associated with the request.
+describeImageReplicationStatusResponse_repositoryName :: Lens.Lens' DescribeImageReplicationStatusResponse (Prelude.Maybe Prelude.Text)
+describeImageReplicationStatusResponse_repositoryName = Lens.lens (\DescribeImageReplicationStatusResponse' {repositoryName} -> repositoryName) (\s@DescribeImageReplicationStatusResponse' {} a -> s {repositoryName = a} :: DescribeImageReplicationStatusResponse)
+
+-- | The response's http status code.
+describeImageReplicationStatusResponse_httpStatus :: Lens.Lens' DescribeImageReplicationStatusResponse Prelude.Int
+describeImageReplicationStatusResponse_httpStatus = Lens.lens (\DescribeImageReplicationStatusResponse' {httpStatus} -> httpStatus) (\s@DescribeImageReplicationStatusResponse' {} a -> s {httpStatus = a} :: DescribeImageReplicationStatusResponse)
+
+instance
+  Prelude.NFData
+    DescribeImageReplicationStatusResponse
+  where
+  rnf DescribeImageReplicationStatusResponse' {..} =
+    Prelude.rnf imageId
+      `Prelude.seq` Prelude.rnf replicationStatuses
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribeImageScanFindings.hs b/gen/Amazonka/ECR/DescribeImageScanFindings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribeImageScanFindings.hs
@@ -0,0 +1,377 @@
+{-# 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.ECR.DescribeImageScanFindings
+-- 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 scan findings for the specified image.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.DescribeImageScanFindings
+  ( -- * Creating a Request
+    DescribeImageScanFindings (..),
+    newDescribeImageScanFindings,
+
+    -- * Request Lenses
+    describeImageScanFindings_maxResults,
+    describeImageScanFindings_nextToken,
+    describeImageScanFindings_registryId,
+    describeImageScanFindings_repositoryName,
+    describeImageScanFindings_imageId,
+
+    -- * Destructuring the Response
+    DescribeImageScanFindingsResponse (..),
+    newDescribeImageScanFindingsResponse,
+
+    -- * Response Lenses
+    describeImageScanFindingsResponse_imageId,
+    describeImageScanFindingsResponse_imageScanFindings,
+    describeImageScanFindingsResponse_imageScanStatus,
+    describeImageScanFindingsResponse_nextToken,
+    describeImageScanFindingsResponse_registryId,
+    describeImageScanFindingsResponse_repositoryName,
+    describeImageScanFindingsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeImageScanFindings' smart constructor.
+data DescribeImageScanFindings = DescribeImageScanFindings'
+  { -- | The maximum number of image scan results returned by
+    -- @DescribeImageScanFindings@ in paginated output. When this parameter is
+    -- used, @DescribeImageScanFindings@ only returns @maxResults@ results in a
+    -- single page along with a @nextToken@ response element. The remaining
+    -- results of the initial request can be seen by sending another
+    -- @DescribeImageScanFindings@ request with the returned @nextToken@ value.
+    -- This value can be between 1 and 1000. If this parameter is not used,
+    -- then @DescribeImageScanFindings@ returns up to 100 results and a
+    -- @nextToken@ value, if applicable.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeImageScanFindings@ request where @maxResults@ was used and the
+    -- results exceeded the value of that parameter. Pagination continues from
+    -- the end of the previous results that returned the @nextToken@ value.
+    -- This value is null when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to describe the image scan findings
+    -- for. If you do not specify a registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository for the image for which to describe the scan findings.
+    repositoryName :: Prelude.Text,
+    imageId :: ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImageScanFindings' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeImageScanFindings_maxResults' - The maximum number of image scan results returned by
+-- @DescribeImageScanFindings@ in paginated output. When this parameter is
+-- used, @DescribeImageScanFindings@ only returns @maxResults@ results in a
+-- single page along with a @nextToken@ response element. The remaining
+-- results of the initial request can be seen by sending another
+-- @DescribeImageScanFindings@ request with the returned @nextToken@ value.
+-- This value can be between 1 and 1000. If this parameter is not used,
+-- then @DescribeImageScanFindings@ returns up to 100 results and a
+-- @nextToken@ value, if applicable.
+--
+-- 'nextToken', 'describeImageScanFindings_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeImageScanFindings@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is null when there are no more results to return.
+--
+-- 'registryId', 'describeImageScanFindings_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to describe the image scan findings
+-- for. If you do not specify a registry, the default registry is assumed.
+--
+-- 'repositoryName', 'describeImageScanFindings_repositoryName' - The repository for the image for which to describe the scan findings.
+--
+-- 'imageId', 'describeImageScanFindings_imageId' - Undocumented member.
+newDescribeImageScanFindings ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageId'
+  ImageIdentifier ->
+  DescribeImageScanFindings
+newDescribeImageScanFindings
+  pRepositoryName_
+  pImageId_ =
+    DescribeImageScanFindings'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        imageId = pImageId_
+      }
+
+-- | The maximum number of image scan results returned by
+-- @DescribeImageScanFindings@ in paginated output. When this parameter is
+-- used, @DescribeImageScanFindings@ only returns @maxResults@ results in a
+-- single page along with a @nextToken@ response element. The remaining
+-- results of the initial request can be seen by sending another
+-- @DescribeImageScanFindings@ request with the returned @nextToken@ value.
+-- This value can be between 1 and 1000. If this parameter is not used,
+-- then @DescribeImageScanFindings@ returns up to 100 results and a
+-- @nextToken@ value, if applicable.
+describeImageScanFindings_maxResults :: Lens.Lens' DescribeImageScanFindings (Prelude.Maybe Prelude.Natural)
+describeImageScanFindings_maxResults = Lens.lens (\DescribeImageScanFindings' {maxResults} -> maxResults) (\s@DescribeImageScanFindings' {} a -> s {maxResults = a} :: DescribeImageScanFindings)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeImageScanFindings@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is null when there are no more results to return.
+describeImageScanFindings_nextToken :: Lens.Lens' DescribeImageScanFindings (Prelude.Maybe Prelude.Text)
+describeImageScanFindings_nextToken = Lens.lens (\DescribeImageScanFindings' {nextToken} -> nextToken) (\s@DescribeImageScanFindings' {} a -> s {nextToken = a} :: DescribeImageScanFindings)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to describe the image scan findings
+-- for. If you do not specify a registry, the default registry is assumed.
+describeImageScanFindings_registryId :: Lens.Lens' DescribeImageScanFindings (Prelude.Maybe Prelude.Text)
+describeImageScanFindings_registryId = Lens.lens (\DescribeImageScanFindings' {registryId} -> registryId) (\s@DescribeImageScanFindings' {} a -> s {registryId = a} :: DescribeImageScanFindings)
+
+-- | The repository for the image for which to describe the scan findings.
+describeImageScanFindings_repositoryName :: Lens.Lens' DescribeImageScanFindings Prelude.Text
+describeImageScanFindings_repositoryName = Lens.lens (\DescribeImageScanFindings' {repositoryName} -> repositoryName) (\s@DescribeImageScanFindings' {} a -> s {repositoryName = a} :: DescribeImageScanFindings)
+
+-- | Undocumented member.
+describeImageScanFindings_imageId :: Lens.Lens' DescribeImageScanFindings ImageIdentifier
+describeImageScanFindings_imageId = Lens.lens (\DescribeImageScanFindings' {imageId} -> imageId) (\s@DescribeImageScanFindings' {} a -> s {imageId = a} :: DescribeImageScanFindings)
+
+instance Core.AWSPager DescribeImageScanFindings where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeImageScanFindingsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeImageScanFindingsResponse_imageScanFindings
+            Prelude.. Lens._Just
+            Prelude.. imageScanFindings_findings
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeImageScanFindingsResponse_imageScanFindings
+            Prelude.. Lens._Just
+            Prelude.. imageScanFindings_enhancedFindings
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeImageScanFindings_nextToken
+          Lens..~ rs
+          Lens.^? describeImageScanFindingsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeImageScanFindings where
+  type
+    AWSResponse DescribeImageScanFindings =
+      DescribeImageScanFindingsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeImageScanFindingsResponse'
+            Prelude.<$> (x Data..?> "imageId")
+            Prelude.<*> (x Data..?> "imageScanFindings")
+            Prelude.<*> (x Data..?> "imageScanStatus")
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeImageScanFindings where
+  hashWithSalt _salt DescribeImageScanFindings' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageId
+
+instance Prelude.NFData DescribeImageScanFindings where
+  rnf DescribeImageScanFindings' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageId
+
+instance Data.ToHeaders DescribeImageScanFindings where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribeImageScanFindings" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeImageScanFindings where
+  toJSON DescribeImageScanFindings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageId" Data..= imageId)
+          ]
+      )
+
+instance Data.ToPath DescribeImageScanFindings where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeImageScanFindings where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeImageScanFindingsResponse' smart constructor.
+data DescribeImageScanFindingsResponse = DescribeImageScanFindingsResponse'
+  { imageId :: Prelude.Maybe ImageIdentifier,
+    -- | The information contained in the image scan findings.
+    imageScanFindings :: Prelude.Maybe ImageScanFindings,
+    -- | The current state of the scan.
+    imageScanStatus :: Prelude.Maybe ImageScanStatus,
+    -- | The @nextToken@ value to include in a future @DescribeImageScanFindings@
+    -- request. When the results of a @DescribeImageScanFindings@ request
+    -- exceed @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is null when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'DescribeImageScanFindingsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageId', 'describeImageScanFindingsResponse_imageId' - Undocumented member.
+--
+-- 'imageScanFindings', 'describeImageScanFindingsResponse_imageScanFindings' - The information contained in the image scan findings.
+--
+-- 'imageScanStatus', 'describeImageScanFindingsResponse_imageScanStatus' - The current state of the scan.
+--
+-- 'nextToken', 'describeImageScanFindingsResponse_nextToken' - The @nextToken@ value to include in a future @DescribeImageScanFindings@
+-- request. When the results of a @DescribeImageScanFindings@ request
+-- exceed @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is null when there are no more results to return.
+--
+-- 'registryId', 'describeImageScanFindingsResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'describeImageScanFindingsResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'describeImageScanFindingsResponse_httpStatus' - The response's http status code.
+newDescribeImageScanFindingsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeImageScanFindingsResponse
+newDescribeImageScanFindingsResponse pHttpStatus_ =
+  DescribeImageScanFindingsResponse'
+    { imageId =
+        Prelude.Nothing,
+      imageScanFindings = Prelude.Nothing,
+      imageScanStatus = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+describeImageScanFindingsResponse_imageId :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe ImageIdentifier)
+describeImageScanFindingsResponse_imageId = Lens.lens (\DescribeImageScanFindingsResponse' {imageId} -> imageId) (\s@DescribeImageScanFindingsResponse' {} a -> s {imageId = a} :: DescribeImageScanFindingsResponse)
+
+-- | The information contained in the image scan findings.
+describeImageScanFindingsResponse_imageScanFindings :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe ImageScanFindings)
+describeImageScanFindingsResponse_imageScanFindings = Lens.lens (\DescribeImageScanFindingsResponse' {imageScanFindings} -> imageScanFindings) (\s@DescribeImageScanFindingsResponse' {} a -> s {imageScanFindings = a} :: DescribeImageScanFindingsResponse)
+
+-- | The current state of the scan.
+describeImageScanFindingsResponse_imageScanStatus :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe ImageScanStatus)
+describeImageScanFindingsResponse_imageScanStatus = Lens.lens (\DescribeImageScanFindingsResponse' {imageScanStatus} -> imageScanStatus) (\s@DescribeImageScanFindingsResponse' {} a -> s {imageScanStatus = a} :: DescribeImageScanFindingsResponse)
+
+-- | The @nextToken@ value to include in a future @DescribeImageScanFindings@
+-- request. When the results of a @DescribeImageScanFindings@ request
+-- exceed @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is null when there are no more results to return.
+describeImageScanFindingsResponse_nextToken :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe Prelude.Text)
+describeImageScanFindingsResponse_nextToken = Lens.lens (\DescribeImageScanFindingsResponse' {nextToken} -> nextToken) (\s@DescribeImageScanFindingsResponse' {} a -> s {nextToken = a} :: DescribeImageScanFindingsResponse)
+
+-- | The registry ID associated with the request.
+describeImageScanFindingsResponse_registryId :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe Prelude.Text)
+describeImageScanFindingsResponse_registryId = Lens.lens (\DescribeImageScanFindingsResponse' {registryId} -> registryId) (\s@DescribeImageScanFindingsResponse' {} a -> s {registryId = a} :: DescribeImageScanFindingsResponse)
+
+-- | The repository name associated with the request.
+describeImageScanFindingsResponse_repositoryName :: Lens.Lens' DescribeImageScanFindingsResponse (Prelude.Maybe Prelude.Text)
+describeImageScanFindingsResponse_repositoryName = Lens.lens (\DescribeImageScanFindingsResponse' {repositoryName} -> repositoryName) (\s@DescribeImageScanFindingsResponse' {} a -> s {repositoryName = a} :: DescribeImageScanFindingsResponse)
+
+-- | The response's http status code.
+describeImageScanFindingsResponse_httpStatus :: Lens.Lens' DescribeImageScanFindingsResponse Prelude.Int
+describeImageScanFindingsResponse_httpStatus = Lens.lens (\DescribeImageScanFindingsResponse' {httpStatus} -> httpStatus) (\s@DescribeImageScanFindingsResponse' {} a -> s {httpStatus = a} :: DescribeImageScanFindingsResponse)
+
+instance
+  Prelude.NFData
+    DescribeImageScanFindingsResponse
+  where
+  rnf DescribeImageScanFindingsResponse' {..} =
+    Prelude.rnf imageId
+      `Prelude.seq` Prelude.rnf imageScanFindings
+      `Prelude.seq` Prelude.rnf imageScanStatus
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribeImages.hs b/gen/Amazonka/ECR/DescribeImages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribeImages.hs
@@ -0,0 +1,338 @@
+{-# 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.ECR.DescribeImages
+-- 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 metadata about the images in a repository.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.DescribeImages
+  ( -- * Creating a Request
+    DescribeImages (..),
+    newDescribeImages,
+
+    -- * Request Lenses
+    describeImages_filter,
+    describeImages_imageIds,
+    describeImages_maxResults,
+    describeImages_nextToken,
+    describeImages_registryId,
+    describeImages_repositoryName,
+
+    -- * Destructuring the Response
+    DescribeImagesResponse (..),
+    newDescribeImagesResponse,
+
+    -- * Response Lenses
+    describeImagesResponse_imageDetails,
+    describeImagesResponse_nextToken,
+    describeImagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeImages' smart constructor.
+data DescribeImages = DescribeImages'
+  { -- | The filter key and value with which to filter your @DescribeImages@
+    -- results.
+    filter' :: Prelude.Maybe DescribeImagesFilter,
+    -- | The list of image IDs for the requested repository.
+    imageIds :: Prelude.Maybe [ImageIdentifier],
+    -- | The maximum number of repository results returned by @DescribeImages@ in
+    -- paginated output. When this parameter is used, @DescribeImages@ only
+    -- returns @maxResults@ results in a single page along with a @nextToken@
+    -- response element. The remaining results of the initial request can be
+    -- seen by sending another @DescribeImages@ request with the returned
+    -- @nextToken@ value. This value can be between 1 and 1000. If this
+    -- parameter is not used, then @DescribeImages@ returns up to 100 results
+    -- and a @nextToken@ value, if applicable. This option cannot be used when
+    -- you specify images with @imageIds@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeImages@ request where @maxResults@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value. This value
+    -- is @null@ when there are no more results to return. This option cannot
+    -- be used when you specify images with @imageIds@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to describe images. If you do not
+    -- specify a registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository that contains the images to describe.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImages' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'describeImages_filter' - The filter key and value with which to filter your @DescribeImages@
+-- results.
+--
+-- 'imageIds', 'describeImages_imageIds' - The list of image IDs for the requested repository.
+--
+-- 'maxResults', 'describeImages_maxResults' - The maximum number of repository results returned by @DescribeImages@ in
+-- paginated output. When this parameter is used, @DescribeImages@ only
+-- returns @maxResults@ results in a single page along with a @nextToken@
+-- response element. The remaining results of the initial request can be
+-- seen by sending another @DescribeImages@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 1000. If this
+-- parameter is not used, then @DescribeImages@ returns up to 100 results
+-- and a @nextToken@ value, if applicable. This option cannot be used when
+-- you specify images with @imageIds@.
+--
+-- 'nextToken', 'describeImages_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeImages@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+--
+-- 'registryId', 'describeImages_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to describe images. If you do not
+-- specify a registry, the default registry is assumed.
+--
+-- 'repositoryName', 'describeImages_repositoryName' - The repository that contains the images to describe.
+newDescribeImages ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  DescribeImages
+newDescribeImages pRepositoryName_ =
+  DescribeImages'
+    { filter' = Prelude.Nothing,
+      imageIds = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The filter key and value with which to filter your @DescribeImages@
+-- results.
+describeImages_filter :: Lens.Lens' DescribeImages (Prelude.Maybe DescribeImagesFilter)
+describeImages_filter = Lens.lens (\DescribeImages' {filter'} -> filter') (\s@DescribeImages' {} a -> s {filter' = a} :: DescribeImages)
+
+-- | The list of image IDs for the requested repository.
+describeImages_imageIds :: Lens.Lens' DescribeImages (Prelude.Maybe [ImageIdentifier])
+describeImages_imageIds = Lens.lens (\DescribeImages' {imageIds} -> imageIds) (\s@DescribeImages' {} a -> s {imageIds = a} :: DescribeImages) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of repository results returned by @DescribeImages@ in
+-- paginated output. When this parameter is used, @DescribeImages@ only
+-- returns @maxResults@ results in a single page along with a @nextToken@
+-- response element. The remaining results of the initial request can be
+-- seen by sending another @DescribeImages@ request with the returned
+-- @nextToken@ value. This value can be between 1 and 1000. If this
+-- parameter is not used, then @DescribeImages@ returns up to 100 results
+-- and a @nextToken@ value, if applicable. This option cannot be used when
+-- you specify images with @imageIds@.
+describeImages_maxResults :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Natural)
+describeImages_maxResults = Lens.lens (\DescribeImages' {maxResults} -> maxResults) (\s@DescribeImages' {} a -> s {maxResults = a} :: DescribeImages)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeImages@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value. This value
+-- is @null@ when there are no more results to return. This option cannot
+-- be used when you specify images with @imageIds@.
+describeImages_nextToken :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Text)
+describeImages_nextToken = Lens.lens (\DescribeImages' {nextToken} -> nextToken) (\s@DescribeImages' {} a -> s {nextToken = a} :: DescribeImages)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to describe images. If you do not
+-- specify a registry, the default registry is assumed.
+describeImages_registryId :: Lens.Lens' DescribeImages (Prelude.Maybe Prelude.Text)
+describeImages_registryId = Lens.lens (\DescribeImages' {registryId} -> registryId) (\s@DescribeImages' {} a -> s {registryId = a} :: DescribeImages)
+
+-- | The repository that contains the images to describe.
+describeImages_repositoryName :: Lens.Lens' DescribeImages Prelude.Text
+describeImages_repositoryName = Lens.lens (\DescribeImages' {repositoryName} -> repositoryName) (\s@DescribeImages' {} a -> s {repositoryName = a} :: DescribeImages)
+
+instance Core.AWSPager DescribeImages where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeImagesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeImagesResponse_imageDetails
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeImages_nextToken
+          Lens..~ rs
+          Lens.^? describeImagesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeImages where
+  type
+    AWSResponse DescribeImages =
+      DescribeImagesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeImagesResponse'
+            Prelude.<$> (x Data..?> "imageDetails" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeImages where
+  hashWithSalt _salt DescribeImages' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` imageIds
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData DescribeImages where
+  rnf DescribeImages' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders DescribeImages where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribeImages" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeImages where
+  toJSON DescribeImages' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filter" Data..=) Prelude.<$> filter',
+            ("imageIds" Data..=) Prelude.<$> imageIds,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath DescribeImages where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeImages where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeImagesResponse' smart constructor.
+data DescribeImagesResponse = DescribeImagesResponse'
+  { -- | A list of ImageDetail objects that contain data about the image.
+    imageDetails :: Prelude.Maybe [ImageDetail],
+    -- | The @nextToken@ value to include in a future @DescribeImages@ request.
+    -- When the results of a @DescribeImages@ request exceed @maxResults@, this
+    -- value can be used to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    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 'DescribeImagesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDetails', 'describeImagesResponse_imageDetails' - A list of ImageDetail objects that contain data about the image.
+--
+-- 'nextToken', 'describeImagesResponse_nextToken' - The @nextToken@ value to include in a future @DescribeImages@ request.
+-- When the results of a @DescribeImages@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'describeImagesResponse_httpStatus' - The response's http status code.
+newDescribeImagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeImagesResponse
+newDescribeImagesResponse pHttpStatus_ =
+  DescribeImagesResponse'
+    { imageDetails =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of ImageDetail objects that contain data about the image.
+describeImagesResponse_imageDetails :: Lens.Lens' DescribeImagesResponse (Prelude.Maybe [ImageDetail])
+describeImagesResponse_imageDetails = Lens.lens (\DescribeImagesResponse' {imageDetails} -> imageDetails) (\s@DescribeImagesResponse' {} a -> s {imageDetails = a} :: DescribeImagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The @nextToken@ value to include in a future @DescribeImages@ request.
+-- When the results of a @DescribeImages@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+describeImagesResponse_nextToken :: Lens.Lens' DescribeImagesResponse (Prelude.Maybe Prelude.Text)
+describeImagesResponse_nextToken = Lens.lens (\DescribeImagesResponse' {nextToken} -> nextToken) (\s@DescribeImagesResponse' {} a -> s {nextToken = a} :: DescribeImagesResponse)
+
+-- | The response's http status code.
+describeImagesResponse_httpStatus :: Lens.Lens' DescribeImagesResponse Prelude.Int
+describeImagesResponse_httpStatus = Lens.lens (\DescribeImagesResponse' {httpStatus} -> httpStatus) (\s@DescribeImagesResponse' {} a -> s {httpStatus = a} :: DescribeImagesResponse)
+
+instance Prelude.NFData DescribeImagesResponse where
+  rnf DescribeImagesResponse' {..} =
+    Prelude.rnf imageDetails
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribePullThroughCacheRules.hs b/gen/Amazonka/ECR/DescribePullThroughCacheRules.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribePullThroughCacheRules.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.ECR.DescribePullThroughCacheRules
+-- 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 pull through cache rules for a registry.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.DescribePullThroughCacheRules
+  ( -- * Creating a Request
+    DescribePullThroughCacheRules (..),
+    newDescribePullThroughCacheRules,
+
+    -- * Request Lenses
+    describePullThroughCacheRules_ecrRepositoryPrefixes,
+    describePullThroughCacheRules_maxResults,
+    describePullThroughCacheRules_nextToken,
+    describePullThroughCacheRules_registryId,
+
+    -- * Destructuring the Response
+    DescribePullThroughCacheRulesResponse (..),
+    newDescribePullThroughCacheRulesResponse,
+
+    -- * Response Lenses
+    describePullThroughCacheRulesResponse_nextToken,
+    describePullThroughCacheRulesResponse_pullThroughCacheRules,
+    describePullThroughCacheRulesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePullThroughCacheRules' smart constructor.
+data DescribePullThroughCacheRules = DescribePullThroughCacheRules'
+  { -- | The Amazon ECR repository prefixes associated with the pull through
+    -- cache rules to return. If no repository prefix value is specified, all
+    -- pull through cache rules are returned.
+    ecrRepositoryPrefixes :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The maximum number of pull through cache rules returned by
+    -- @DescribePullThroughCacheRulesRequest@ in paginated output. When this
+    -- parameter is used, @DescribePullThroughCacheRulesRequest@ only returns
+    -- @maxResults@ results in a single page along with a @nextToken@ response
+    -- element. The remaining results of the initial request can be seen by
+    -- sending another @DescribePullThroughCacheRulesRequest@ request with the
+    -- returned @nextToken@ value. This value can be between 1 and 1000. If
+    -- this parameter is not used, then @DescribePullThroughCacheRulesRequest@
+    -- returns up to 100 results and a @nextToken@ value, if applicable.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribePullThroughCacheRulesRequest@ request where @maxResults@ was
+    -- used and the results exceeded the value of that parameter. Pagination
+    -- continues from the end of the previous results that returned the
+    -- @nextToken@ value. This value is null when there are no more results to
+    -- return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry to
+    -- return the pull through cache rules for. If you do not specify a
+    -- registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePullThroughCacheRules' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ecrRepositoryPrefixes', 'describePullThroughCacheRules_ecrRepositoryPrefixes' - The Amazon ECR repository prefixes associated with the pull through
+-- cache rules to return. If no repository prefix value is specified, all
+-- pull through cache rules are returned.
+--
+-- 'maxResults', 'describePullThroughCacheRules_maxResults' - The maximum number of pull through cache rules returned by
+-- @DescribePullThroughCacheRulesRequest@ in paginated output. When this
+-- parameter is used, @DescribePullThroughCacheRulesRequest@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @DescribePullThroughCacheRulesRequest@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 1000. If
+-- this parameter is not used, then @DescribePullThroughCacheRulesRequest@
+-- returns up to 100 results and a @nextToken@ value, if applicable.
+--
+-- 'nextToken', 'describePullThroughCacheRules_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribePullThroughCacheRulesRequest@ request where @maxResults@ was
+-- used and the results exceeded the value of that parameter. Pagination
+-- continues from the end of the previous results that returned the
+-- @nextToken@ value. This value is null when there are no more results to
+-- return.
+--
+-- 'registryId', 'describePullThroughCacheRules_registryId' - The Amazon Web Services account ID associated with the registry to
+-- return the pull through cache rules for. If you do not specify a
+-- registry, the default registry is assumed.
+newDescribePullThroughCacheRules ::
+  DescribePullThroughCacheRules
+newDescribePullThroughCacheRules =
+  DescribePullThroughCacheRules'
+    { ecrRepositoryPrefixes =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing
+    }
+
+-- | The Amazon ECR repository prefixes associated with the pull through
+-- cache rules to return. If no repository prefix value is specified, all
+-- pull through cache rules are returned.
+describePullThroughCacheRules_ecrRepositoryPrefixes :: Lens.Lens' DescribePullThroughCacheRules (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+describePullThroughCacheRules_ecrRepositoryPrefixes = Lens.lens (\DescribePullThroughCacheRules' {ecrRepositoryPrefixes} -> ecrRepositoryPrefixes) (\s@DescribePullThroughCacheRules' {} a -> s {ecrRepositoryPrefixes = a} :: DescribePullThroughCacheRules) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of pull through cache rules returned by
+-- @DescribePullThroughCacheRulesRequest@ in paginated output. When this
+-- parameter is used, @DescribePullThroughCacheRulesRequest@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @DescribePullThroughCacheRulesRequest@ request with the
+-- returned @nextToken@ value. This value can be between 1 and 1000. If
+-- this parameter is not used, then @DescribePullThroughCacheRulesRequest@
+-- returns up to 100 results and a @nextToken@ value, if applicable.
+describePullThroughCacheRules_maxResults :: Lens.Lens' DescribePullThroughCacheRules (Prelude.Maybe Prelude.Natural)
+describePullThroughCacheRules_maxResults = Lens.lens (\DescribePullThroughCacheRules' {maxResults} -> maxResults) (\s@DescribePullThroughCacheRules' {} a -> s {maxResults = a} :: DescribePullThroughCacheRules)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribePullThroughCacheRulesRequest@ request where @maxResults@ was
+-- used and the results exceeded the value of that parameter. Pagination
+-- continues from the end of the previous results that returned the
+-- @nextToken@ value. This value is null when there are no more results to
+-- return.
+describePullThroughCacheRules_nextToken :: Lens.Lens' DescribePullThroughCacheRules (Prelude.Maybe Prelude.Text)
+describePullThroughCacheRules_nextToken = Lens.lens (\DescribePullThroughCacheRules' {nextToken} -> nextToken) (\s@DescribePullThroughCacheRules' {} a -> s {nextToken = a} :: DescribePullThroughCacheRules)
+
+-- | The Amazon Web Services account ID associated with the registry to
+-- return the pull through cache rules for. If you do not specify a
+-- registry, the default registry is assumed.
+describePullThroughCacheRules_registryId :: Lens.Lens' DescribePullThroughCacheRules (Prelude.Maybe Prelude.Text)
+describePullThroughCacheRules_registryId = Lens.lens (\DescribePullThroughCacheRules' {registryId} -> registryId) (\s@DescribePullThroughCacheRules' {} a -> s {registryId = a} :: DescribePullThroughCacheRules)
+
+instance Core.AWSPager DescribePullThroughCacheRules where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describePullThroughCacheRulesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describePullThroughCacheRulesResponse_pullThroughCacheRules
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describePullThroughCacheRules_nextToken
+          Lens..~ rs
+          Lens.^? describePullThroughCacheRulesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    DescribePullThroughCacheRules
+  where
+  type
+    AWSResponse DescribePullThroughCacheRules =
+      DescribePullThroughCacheRulesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePullThroughCacheRulesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "pullThroughCacheRules"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribePullThroughCacheRules
+  where
+  hashWithSalt _salt DescribePullThroughCacheRules' {..} =
+    _salt
+      `Prelude.hashWithSalt` ecrRepositoryPrefixes
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+
+instance Prelude.NFData DescribePullThroughCacheRules where
+  rnf DescribePullThroughCacheRules' {..} =
+    Prelude.rnf ecrRepositoryPrefixes
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+
+instance Data.ToHeaders DescribePullThroughCacheRules where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribePullThroughCacheRules" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribePullThroughCacheRules where
+  toJSON DescribePullThroughCacheRules' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ecrRepositoryPrefixes" Data..=)
+              Prelude.<$> ecrRepositoryPrefixes,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId
+          ]
+      )
+
+instance Data.ToPath DescribePullThroughCacheRules where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribePullThroughCacheRules where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePullThroughCacheRulesResponse' smart constructor.
+data DescribePullThroughCacheRulesResponse = DescribePullThroughCacheRulesResponse'
+  { -- | The @nextToken@ value to include in a future
+    -- @DescribePullThroughCacheRulesRequest@ request. When the results of a
+    -- @DescribePullThroughCacheRulesRequest@ request exceed @maxResults@, this
+    -- value can be used to retrieve the next page of results. This value is
+    -- null when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The details of the pull through cache rules.
+    pullThroughCacheRules :: Prelude.Maybe [PullThroughCacheRule],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePullThroughCacheRulesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describePullThroughCacheRulesResponse_nextToken' - The @nextToken@ value to include in a future
+-- @DescribePullThroughCacheRulesRequest@ request. When the results of a
+-- @DescribePullThroughCacheRulesRequest@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- null when there are no more results to return.
+--
+-- 'pullThroughCacheRules', 'describePullThroughCacheRulesResponse_pullThroughCacheRules' - The details of the pull through cache rules.
+--
+-- 'httpStatus', 'describePullThroughCacheRulesResponse_httpStatus' - The response's http status code.
+newDescribePullThroughCacheRulesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribePullThroughCacheRulesResponse
+newDescribePullThroughCacheRulesResponse pHttpStatus_ =
+  DescribePullThroughCacheRulesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      pullThroughCacheRules =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The @nextToken@ value to include in a future
+-- @DescribePullThroughCacheRulesRequest@ request. When the results of a
+-- @DescribePullThroughCacheRulesRequest@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- null when there are no more results to return.
+describePullThroughCacheRulesResponse_nextToken :: Lens.Lens' DescribePullThroughCacheRulesResponse (Prelude.Maybe Prelude.Text)
+describePullThroughCacheRulesResponse_nextToken = Lens.lens (\DescribePullThroughCacheRulesResponse' {nextToken} -> nextToken) (\s@DescribePullThroughCacheRulesResponse' {} a -> s {nextToken = a} :: DescribePullThroughCacheRulesResponse)
+
+-- | The details of the pull through cache rules.
+describePullThroughCacheRulesResponse_pullThroughCacheRules :: Lens.Lens' DescribePullThroughCacheRulesResponse (Prelude.Maybe [PullThroughCacheRule])
+describePullThroughCacheRulesResponse_pullThroughCacheRules = Lens.lens (\DescribePullThroughCacheRulesResponse' {pullThroughCacheRules} -> pullThroughCacheRules) (\s@DescribePullThroughCacheRulesResponse' {} a -> s {pullThroughCacheRules = a} :: DescribePullThroughCacheRulesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePullThroughCacheRulesResponse_httpStatus :: Lens.Lens' DescribePullThroughCacheRulesResponse Prelude.Int
+describePullThroughCacheRulesResponse_httpStatus = Lens.lens (\DescribePullThroughCacheRulesResponse' {httpStatus} -> httpStatus) (\s@DescribePullThroughCacheRulesResponse' {} a -> s {httpStatus = a} :: DescribePullThroughCacheRulesResponse)
+
+instance
+  Prelude.NFData
+    DescribePullThroughCacheRulesResponse
+  where
+  rnf DescribePullThroughCacheRulesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf pullThroughCacheRules
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribeRegistry.hs b/gen/Amazonka/ECR/DescribeRegistry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribeRegistry.hs
@@ -0,0 +1,162 @@
+{-# 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.ECR.DescribeRegistry
+-- 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 the settings for a registry. The replication configuration for
+-- a repository can be created or updated with the
+-- PutReplicationConfiguration API action.
+module Amazonka.ECR.DescribeRegistry
+  ( -- * Creating a Request
+    DescribeRegistry (..),
+    newDescribeRegistry,
+
+    -- * Destructuring the Response
+    DescribeRegistryResponse (..),
+    newDescribeRegistryResponse,
+
+    -- * Response Lenses
+    describeRegistryResponse_registryId,
+    describeRegistryResponse_replicationConfiguration,
+    describeRegistryResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRegistry' smart constructor.
+data DescribeRegistry = DescribeRegistry'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRegistry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDescribeRegistry ::
+  DescribeRegistry
+newDescribeRegistry = DescribeRegistry'
+
+instance Core.AWSRequest DescribeRegistry where
+  type
+    AWSResponse DescribeRegistry =
+      DescribeRegistryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRegistryResponse'
+            Prelude.<$> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "replicationConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRegistry where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData DescribeRegistry where
+  rnf _ = ()
+
+instance Data.ToHeaders DescribeRegistry where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribeRegistry" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRegistry where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath DescribeRegistry where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRegistry where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRegistryResponse' smart constructor.
+data DescribeRegistryResponse = DescribeRegistryResponse'
+  { -- | The ID of the registry.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The replication configuration for the registry.
+    replicationConfiguration :: Prelude.Maybe ReplicationConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRegistryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'describeRegistryResponse_registryId' - The ID of the registry.
+--
+-- 'replicationConfiguration', 'describeRegistryResponse_replicationConfiguration' - The replication configuration for the registry.
+--
+-- 'httpStatus', 'describeRegistryResponse_httpStatus' - The response's http status code.
+newDescribeRegistryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRegistryResponse
+newDescribeRegistryResponse pHttpStatus_ =
+  DescribeRegistryResponse'
+    { registryId =
+        Prelude.Nothing,
+      replicationConfiguration = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ID of the registry.
+describeRegistryResponse_registryId :: Lens.Lens' DescribeRegistryResponse (Prelude.Maybe Prelude.Text)
+describeRegistryResponse_registryId = Lens.lens (\DescribeRegistryResponse' {registryId} -> registryId) (\s@DescribeRegistryResponse' {} a -> s {registryId = a} :: DescribeRegistryResponse)
+
+-- | The replication configuration for the registry.
+describeRegistryResponse_replicationConfiguration :: Lens.Lens' DescribeRegistryResponse (Prelude.Maybe ReplicationConfiguration)
+describeRegistryResponse_replicationConfiguration = Lens.lens (\DescribeRegistryResponse' {replicationConfiguration} -> replicationConfiguration) (\s@DescribeRegistryResponse' {} a -> s {replicationConfiguration = a} :: DescribeRegistryResponse)
+
+-- | The response's http status code.
+describeRegistryResponse_httpStatus :: Lens.Lens' DescribeRegistryResponse Prelude.Int
+describeRegistryResponse_httpStatus = Lens.lens (\DescribeRegistryResponse' {httpStatus} -> httpStatus) (\s@DescribeRegistryResponse' {} a -> s {httpStatus = a} :: DescribeRegistryResponse)
+
+instance Prelude.NFData DescribeRegistryResponse where
+  rnf DescribeRegistryResponse' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf replicationConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/DescribeRepositories.hs b/gen/Amazonka/ECR/DescribeRepositories.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/DescribeRepositories.hs
@@ -0,0 +1,322 @@
+{-# 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.ECR.DescribeRepositories
+-- 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 image repositories in a registry.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.DescribeRepositories
+  ( -- * Creating a Request
+    DescribeRepositories (..),
+    newDescribeRepositories,
+
+    -- * Request Lenses
+    describeRepositories_maxResults,
+    describeRepositories_nextToken,
+    describeRepositories_registryId,
+    describeRepositories_repositoryNames,
+
+    -- * Destructuring the Response
+    DescribeRepositoriesResponse (..),
+    newDescribeRepositoriesResponse,
+
+    -- * Response Lenses
+    describeRepositoriesResponse_nextToken,
+    describeRepositoriesResponse_repositories,
+    describeRepositoriesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRepositories' smart constructor.
+data DescribeRepositories = DescribeRepositories'
+  { -- | The maximum number of repository results returned by
+    -- @DescribeRepositories@ in paginated output. When this parameter is used,
+    -- @DescribeRepositories@ only returns @maxResults@ results in a single
+    -- page along with a @nextToken@ response element. The remaining results of
+    -- the initial request can be seen by sending another
+    -- @DescribeRepositories@ request with the returned @nextToken@ value. This
+    -- value can be between 1 and 1000. If this parameter is not used, then
+    -- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+    -- value, if applicable. This option cannot be used when you specify
+    -- repositories with @repositoryNames@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @DescribeRepositories@ request where @maxResults@ was used and the
+    -- results exceeded the value of that parameter. Pagination continues from
+    -- the end of the previous results that returned the @nextToken@ value.
+    -- This value is @null@ when there are no more results to return. This
+    -- option cannot be used when you specify repositories with
+    -- @repositoryNames@.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repositories to be described. If you do not specify a
+    -- registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | A list of repositories to describe. If this parameter is omitted, then
+    -- all repositories in a registry are described.
+    repositoryNames :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRepositories' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeRepositories_maxResults' - The maximum number of repository results returned by
+-- @DescribeRepositories@ in paginated output. When this parameter is used,
+-- @DescribeRepositories@ only returns @maxResults@ results in a single
+-- page along with a @nextToken@ response element. The remaining results of
+-- the initial request can be seen by sending another
+-- @DescribeRepositories@ request with the returned @nextToken@ value. This
+-- value can be between 1 and 1000. If this parameter is not used, then
+-- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+-- value, if applicable. This option cannot be used when you specify
+-- repositories with @repositoryNames@.
+--
+-- 'nextToken', 'describeRepositories_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @DescribeRepositories@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is @null@ when there are no more results to return. This
+-- option cannot be used when you specify repositories with
+-- @repositoryNames@.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+--
+-- 'registryId', 'describeRepositories_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repositories to be described. If you do not specify a
+-- registry, the default registry is assumed.
+--
+-- 'repositoryNames', 'describeRepositories_repositoryNames' - A list of repositories to describe. If this parameter is omitted, then
+-- all repositories in a registry are described.
+newDescribeRepositories ::
+  DescribeRepositories
+newDescribeRepositories =
+  DescribeRepositories'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryNames = Prelude.Nothing
+    }
+
+-- | The maximum number of repository results returned by
+-- @DescribeRepositories@ in paginated output. When this parameter is used,
+-- @DescribeRepositories@ only returns @maxResults@ results in a single
+-- page along with a @nextToken@ response element. The remaining results of
+-- the initial request can be seen by sending another
+-- @DescribeRepositories@ request with the returned @nextToken@ value. This
+-- value can be between 1 and 1000. If this parameter is not used, then
+-- @DescribeRepositories@ returns up to 100 results and a @nextToken@
+-- value, if applicable. This option cannot be used when you specify
+-- repositories with @repositoryNames@.
+describeRepositories_maxResults :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Natural)
+describeRepositories_maxResults = Lens.lens (\DescribeRepositories' {maxResults} -> maxResults) (\s@DescribeRepositories' {} a -> s {maxResults = a} :: DescribeRepositories)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @DescribeRepositories@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+-- This value is @null@ when there are no more results to return. This
+-- option cannot be used when you specify repositories with
+-- @repositoryNames@.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+describeRepositories_nextToken :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Text)
+describeRepositories_nextToken = Lens.lens (\DescribeRepositories' {nextToken} -> nextToken) (\s@DescribeRepositories' {} a -> s {nextToken = a} :: DescribeRepositories)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repositories to be described. If you do not specify a
+-- registry, the default registry is assumed.
+describeRepositories_registryId :: Lens.Lens' DescribeRepositories (Prelude.Maybe Prelude.Text)
+describeRepositories_registryId = Lens.lens (\DescribeRepositories' {registryId} -> registryId) (\s@DescribeRepositories' {} a -> s {registryId = a} :: DescribeRepositories)
+
+-- | A list of repositories to describe. If this parameter is omitted, then
+-- all repositories in a registry are described.
+describeRepositories_repositoryNames :: Lens.Lens' DescribeRepositories (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+describeRepositories_repositoryNames = Lens.lens (\DescribeRepositories' {repositoryNames} -> repositoryNames) (\s@DescribeRepositories' {} a -> s {repositoryNames = a} :: DescribeRepositories) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSPager DescribeRepositories where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? describeRepositoriesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? describeRepositoriesResponse_repositories
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& describeRepositories_nextToken
+          Lens..~ rs
+          Lens.^? describeRepositoriesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest DescribeRepositories where
+  type
+    AWSResponse DescribeRepositories =
+      DescribeRepositoriesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRepositoriesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "repositories" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRepositories where
+  hashWithSalt _salt DescribeRepositories' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryNames
+
+instance Prelude.NFData DescribeRepositories where
+  rnf DescribeRepositories' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryNames
+
+instance Data.ToHeaders DescribeRepositories where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.DescribeRepositories" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRepositories where
+  toJSON DescribeRepositories' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            ("repositoryNames" Data..=)
+              Prelude.<$> repositoryNames
+          ]
+      )
+
+instance Data.ToPath DescribeRepositories where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRepositories where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRepositoriesResponse' smart constructor.
+data DescribeRepositoriesResponse = DescribeRepositoriesResponse'
+  { -- | The @nextToken@ value to include in a future @DescribeRepositories@
+    -- request. When the results of a @DescribeRepositories@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of repository objects corresponding to valid repositories.
+    repositories :: Prelude.Maybe [Repository],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRepositoriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.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', 'describeRepositoriesResponse_nextToken' - The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'repositories', 'describeRepositoriesResponse_repositories' - A list of repository objects corresponding to valid repositories.
+--
+-- 'httpStatus', 'describeRepositoriesResponse_httpStatus' - The response's http status code.
+newDescribeRepositoriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRepositoriesResponse
+newDescribeRepositoriesResponse pHttpStatus_ =
+  DescribeRepositoriesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      repositories = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The @nextToken@ value to include in a future @DescribeRepositories@
+-- request. When the results of a @DescribeRepositories@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+describeRepositoriesResponse_nextToken :: Lens.Lens' DescribeRepositoriesResponse (Prelude.Maybe Prelude.Text)
+describeRepositoriesResponse_nextToken = Lens.lens (\DescribeRepositoriesResponse' {nextToken} -> nextToken) (\s@DescribeRepositoriesResponse' {} a -> s {nextToken = a} :: DescribeRepositoriesResponse)
+
+-- | A list of repository objects corresponding to valid repositories.
+describeRepositoriesResponse_repositories :: Lens.Lens' DescribeRepositoriesResponse (Prelude.Maybe [Repository])
+describeRepositoriesResponse_repositories = Lens.lens (\DescribeRepositoriesResponse' {repositories} -> repositories) (\s@DescribeRepositoriesResponse' {} a -> s {repositories = a} :: DescribeRepositoriesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeRepositoriesResponse_httpStatus :: Lens.Lens' DescribeRepositoriesResponse Prelude.Int
+describeRepositoriesResponse_httpStatus = Lens.lens (\DescribeRepositoriesResponse' {httpStatus} -> httpStatus) (\s@DescribeRepositoriesResponse' {} a -> s {httpStatus = a} :: DescribeRepositoriesResponse)
+
+instance Prelude.NFData DescribeRepositoriesResponse where
+  rnf DescribeRepositoriesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf repositories
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetAuthorizationToken.hs b/gen/Amazonka/ECR/GetAuthorizationToken.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetAuthorizationToken.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.GetAuthorizationToken
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves an authorization token. An authorization token represents your
+-- IAM authentication credentials and can be used to access any Amazon ECR
+-- registry that your IAM principal has access to. The authorization token
+-- is valid for 12 hours.
+--
+-- The @authorizationToken@ returned is a base64 encoded string that can be
+-- decoded and used in a @docker login@ command to authenticate to a
+-- registry. The CLI offers an @get-login-password@ command that simplifies
+-- the login process. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth Registry authentication>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.GetAuthorizationToken
+  ( -- * Creating a Request
+    GetAuthorizationToken (..),
+    newGetAuthorizationToken,
+
+    -- * Request Lenses
+    getAuthorizationToken_registryIds,
+
+    -- * Destructuring the Response
+    GetAuthorizationTokenResponse (..),
+    newGetAuthorizationTokenResponse,
+
+    -- * Response Lenses
+    getAuthorizationTokenResponse_authorizationData,
+    getAuthorizationTokenResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAuthorizationToken' smart constructor.
+data GetAuthorizationToken = GetAuthorizationToken'
+  { -- | A list of Amazon Web Services account IDs that are associated with the
+    -- registries for which to get AuthorizationData objects. If you do not
+    -- specify a registry, the default registry is assumed.
+    registryIds :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAuthorizationToken' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryIds', 'getAuthorizationToken_registryIds' - A list of Amazon Web Services account IDs that are associated with the
+-- registries for which to get AuthorizationData objects. If you do not
+-- specify a registry, the default registry is assumed.
+newGetAuthorizationToken ::
+  GetAuthorizationToken
+newGetAuthorizationToken =
+  GetAuthorizationToken'
+    { registryIds =
+        Prelude.Nothing
+    }
+
+-- | A list of Amazon Web Services account IDs that are associated with the
+-- registries for which to get AuthorizationData objects. If you do not
+-- specify a registry, the default registry is assumed.
+getAuthorizationToken_registryIds :: Lens.Lens' GetAuthorizationToken (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+getAuthorizationToken_registryIds = Lens.lens (\GetAuthorizationToken' {registryIds} -> registryIds) (\s@GetAuthorizationToken' {} a -> s {registryIds = a} :: GetAuthorizationToken) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSRequest GetAuthorizationToken where
+  type
+    AWSResponse GetAuthorizationToken =
+      GetAuthorizationTokenResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAuthorizationTokenResponse'
+            Prelude.<$> ( x
+                            Data..?> "authorizationData"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAuthorizationToken where
+  hashWithSalt _salt GetAuthorizationToken' {..} =
+    _salt `Prelude.hashWithSalt` registryIds
+
+instance Prelude.NFData GetAuthorizationToken where
+  rnf GetAuthorizationToken' {..} =
+    Prelude.rnf registryIds
+
+instance Data.ToHeaders GetAuthorizationToken where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetAuthorizationToken" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetAuthorizationToken where
+  toJSON GetAuthorizationToken' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("registryIds" Data..=) Prelude.<$> registryIds]
+      )
+
+instance Data.ToPath GetAuthorizationToken where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetAuthorizationToken where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetAuthorizationTokenResponse' smart constructor.
+data GetAuthorizationTokenResponse = GetAuthorizationTokenResponse'
+  { -- | A list of authorization token data objects that correspond to the
+    -- @registryIds@ values in the request.
+    authorizationData :: Prelude.Maybe [AuthorizationData],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAuthorizationTokenResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'authorizationData', 'getAuthorizationTokenResponse_authorizationData' - A list of authorization token data objects that correspond to the
+-- @registryIds@ values in the request.
+--
+-- 'httpStatus', 'getAuthorizationTokenResponse_httpStatus' - The response's http status code.
+newGetAuthorizationTokenResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAuthorizationTokenResponse
+newGetAuthorizationTokenResponse pHttpStatus_ =
+  GetAuthorizationTokenResponse'
+    { authorizationData =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of authorization token data objects that correspond to the
+-- @registryIds@ values in the request.
+getAuthorizationTokenResponse_authorizationData :: Lens.Lens' GetAuthorizationTokenResponse (Prelude.Maybe [AuthorizationData])
+getAuthorizationTokenResponse_authorizationData = Lens.lens (\GetAuthorizationTokenResponse' {authorizationData} -> authorizationData) (\s@GetAuthorizationTokenResponse' {} a -> s {authorizationData = a} :: GetAuthorizationTokenResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getAuthorizationTokenResponse_httpStatus :: Lens.Lens' GetAuthorizationTokenResponse Prelude.Int
+getAuthorizationTokenResponse_httpStatus = Lens.lens (\GetAuthorizationTokenResponse' {httpStatus} -> httpStatus) (\s@GetAuthorizationTokenResponse' {} a -> s {httpStatus = a} :: GetAuthorizationTokenResponse)
+
+instance Prelude.NFData GetAuthorizationTokenResponse where
+  rnf GetAuthorizationTokenResponse' {..} =
+    Prelude.rnf authorizationData
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetDownloadUrlForLayer.hs b/gen/Amazonka/ECR/GetDownloadUrlForLayer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetDownloadUrlForLayer.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.GetDownloadUrlForLayer
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the pre-signed Amazon S3 download URL corresponding to an
+-- image layer. You can only get URLs for image layers that are referenced
+-- in an image.
+--
+-- When an image is pulled, the GetDownloadUrlForLayer API is called once
+-- per image layer that is not already cached.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.GetDownloadUrlForLayer
+  ( -- * Creating a Request
+    GetDownloadUrlForLayer (..),
+    newGetDownloadUrlForLayer,
+
+    -- * Request Lenses
+    getDownloadUrlForLayer_registryId,
+    getDownloadUrlForLayer_repositoryName,
+    getDownloadUrlForLayer_layerDigest,
+
+    -- * Destructuring the Response
+    GetDownloadUrlForLayerResponse (..),
+    newGetDownloadUrlForLayerResponse,
+
+    -- * Response Lenses
+    getDownloadUrlForLayerResponse_downloadUrl,
+    getDownloadUrlForLayerResponse_layerDigest,
+    getDownloadUrlForLayerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetDownloadUrlForLayer' smart constructor.
+data GetDownloadUrlForLayer = GetDownloadUrlForLayer'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the image layer to download. If you do not specify a registry,
+    -- the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that is associated with the image layer to
+    -- download.
+    repositoryName :: Prelude.Text,
+    -- | The digest of the image layer to download.
+    layerDigest :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDownloadUrlForLayer' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getDownloadUrlForLayer_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the image layer to download. If you do not specify a registry,
+-- the default registry is assumed.
+--
+-- 'repositoryName', 'getDownloadUrlForLayer_repositoryName' - The name of the repository that is associated with the image layer to
+-- download.
+--
+-- 'layerDigest', 'getDownloadUrlForLayer_layerDigest' - The digest of the image layer to download.
+newGetDownloadUrlForLayer ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'layerDigest'
+  Prelude.Text ->
+  GetDownloadUrlForLayer
+newGetDownloadUrlForLayer
+  pRepositoryName_
+  pLayerDigest_ =
+    GetDownloadUrlForLayer'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        layerDigest = pLayerDigest_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the image layer to download. If you do not specify a registry,
+-- the default registry is assumed.
+getDownloadUrlForLayer_registryId :: Lens.Lens' GetDownloadUrlForLayer (Prelude.Maybe Prelude.Text)
+getDownloadUrlForLayer_registryId = Lens.lens (\GetDownloadUrlForLayer' {registryId} -> registryId) (\s@GetDownloadUrlForLayer' {} a -> s {registryId = a} :: GetDownloadUrlForLayer)
+
+-- | The name of the repository that is associated with the image layer to
+-- download.
+getDownloadUrlForLayer_repositoryName :: Lens.Lens' GetDownloadUrlForLayer Prelude.Text
+getDownloadUrlForLayer_repositoryName = Lens.lens (\GetDownloadUrlForLayer' {repositoryName} -> repositoryName) (\s@GetDownloadUrlForLayer' {} a -> s {repositoryName = a} :: GetDownloadUrlForLayer)
+
+-- | The digest of the image layer to download.
+getDownloadUrlForLayer_layerDigest :: Lens.Lens' GetDownloadUrlForLayer Prelude.Text
+getDownloadUrlForLayer_layerDigest = Lens.lens (\GetDownloadUrlForLayer' {layerDigest} -> layerDigest) (\s@GetDownloadUrlForLayer' {} a -> s {layerDigest = a} :: GetDownloadUrlForLayer)
+
+instance Core.AWSRequest GetDownloadUrlForLayer where
+  type
+    AWSResponse GetDownloadUrlForLayer =
+      GetDownloadUrlForLayerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDownloadUrlForLayerResponse'
+            Prelude.<$> (x Data..?> "downloadUrl")
+            Prelude.<*> (x Data..?> "layerDigest")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDownloadUrlForLayer where
+  hashWithSalt _salt GetDownloadUrlForLayer' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` layerDigest
+
+instance Prelude.NFData GetDownloadUrlForLayer where
+  rnf GetDownloadUrlForLayer' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf layerDigest
+
+instance Data.ToHeaders GetDownloadUrlForLayer where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetDownloadUrlForLayer" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetDownloadUrlForLayer where
+  toJSON GetDownloadUrlForLayer' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("layerDigest" Data..= layerDigest)
+          ]
+      )
+
+instance Data.ToPath GetDownloadUrlForLayer where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetDownloadUrlForLayer where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDownloadUrlForLayerResponse' smart constructor.
+data GetDownloadUrlForLayerResponse = GetDownloadUrlForLayerResponse'
+  { -- | The pre-signed Amazon S3 download URL for the requested layer.
+    downloadUrl :: Prelude.Maybe Prelude.Text,
+    -- | The digest of the image layer to download.
+    layerDigest :: 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 'GetDownloadUrlForLayerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'downloadUrl', 'getDownloadUrlForLayerResponse_downloadUrl' - The pre-signed Amazon S3 download URL for the requested layer.
+--
+-- 'layerDigest', 'getDownloadUrlForLayerResponse_layerDigest' - The digest of the image layer to download.
+--
+-- 'httpStatus', 'getDownloadUrlForLayerResponse_httpStatus' - The response's http status code.
+newGetDownloadUrlForLayerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDownloadUrlForLayerResponse
+newGetDownloadUrlForLayerResponse pHttpStatus_ =
+  GetDownloadUrlForLayerResponse'
+    { downloadUrl =
+        Prelude.Nothing,
+      layerDigest = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The pre-signed Amazon S3 download URL for the requested layer.
+getDownloadUrlForLayerResponse_downloadUrl :: Lens.Lens' GetDownloadUrlForLayerResponse (Prelude.Maybe Prelude.Text)
+getDownloadUrlForLayerResponse_downloadUrl = Lens.lens (\GetDownloadUrlForLayerResponse' {downloadUrl} -> downloadUrl) (\s@GetDownloadUrlForLayerResponse' {} a -> s {downloadUrl = a} :: GetDownloadUrlForLayerResponse)
+
+-- | The digest of the image layer to download.
+getDownloadUrlForLayerResponse_layerDigest :: Lens.Lens' GetDownloadUrlForLayerResponse (Prelude.Maybe Prelude.Text)
+getDownloadUrlForLayerResponse_layerDigest = Lens.lens (\GetDownloadUrlForLayerResponse' {layerDigest} -> layerDigest) (\s@GetDownloadUrlForLayerResponse' {} a -> s {layerDigest = a} :: GetDownloadUrlForLayerResponse)
+
+-- | The response's http status code.
+getDownloadUrlForLayerResponse_httpStatus :: Lens.Lens' GetDownloadUrlForLayerResponse Prelude.Int
+getDownloadUrlForLayerResponse_httpStatus = Lens.lens (\GetDownloadUrlForLayerResponse' {httpStatus} -> httpStatus) (\s@GetDownloadUrlForLayerResponse' {} a -> s {httpStatus = a} :: GetDownloadUrlForLayerResponse)
+
+instance
+  Prelude.NFData
+    GetDownloadUrlForLayerResponse
+  where
+  rnf GetDownloadUrlForLayerResponse' {..} =
+    Prelude.rnf downloadUrl
+      `Prelude.seq` Prelude.rnf layerDigest
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetLifecyclePolicy.hs b/gen/Amazonka/ECR/GetLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetLifecyclePolicy.hs
@@ -0,0 +1,229 @@
+{-# 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.ECR.GetLifecyclePolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the lifecycle policy for the specified repository.
+module Amazonka.ECR.GetLifecyclePolicy
+  ( -- * Creating a Request
+    GetLifecyclePolicy (..),
+    newGetLifecyclePolicy,
+
+    -- * Request Lenses
+    getLifecyclePolicy_registryId,
+    getLifecyclePolicy_repositoryName,
+
+    -- * Destructuring the Response
+    GetLifecyclePolicyResponse (..),
+    newGetLifecyclePolicyResponse,
+
+    -- * Response Lenses
+    getLifecyclePolicyResponse_lastEvaluatedAt,
+    getLifecyclePolicyResponse_lifecyclePolicyText,
+    getLifecyclePolicyResponse_registryId,
+    getLifecyclePolicyResponse_repositoryName,
+    getLifecyclePolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetLifecyclePolicy' smart constructor.
+data GetLifecyclePolicy = GetLifecyclePolicy'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLifecyclePolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getLifecyclePolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'getLifecyclePolicy_repositoryName' - The name of the repository.
+newGetLifecyclePolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  GetLifecyclePolicy
+newGetLifecyclePolicy pRepositoryName_ =
+  GetLifecyclePolicy'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+getLifecyclePolicy_registryId :: Lens.Lens' GetLifecyclePolicy (Prelude.Maybe Prelude.Text)
+getLifecyclePolicy_registryId = Lens.lens (\GetLifecyclePolicy' {registryId} -> registryId) (\s@GetLifecyclePolicy' {} a -> s {registryId = a} :: GetLifecyclePolicy)
+
+-- | The name of the repository.
+getLifecyclePolicy_repositoryName :: Lens.Lens' GetLifecyclePolicy Prelude.Text
+getLifecyclePolicy_repositoryName = Lens.lens (\GetLifecyclePolicy' {repositoryName} -> repositoryName) (\s@GetLifecyclePolicy' {} a -> s {repositoryName = a} :: GetLifecyclePolicy)
+
+instance Core.AWSRequest GetLifecyclePolicy where
+  type
+    AWSResponse GetLifecyclePolicy =
+      GetLifecyclePolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetLifecyclePolicyResponse'
+            Prelude.<$> (x Data..?> "lastEvaluatedAt")
+            Prelude.<*> (x Data..?> "lifecyclePolicyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetLifecyclePolicy where
+  hashWithSalt _salt GetLifecyclePolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData GetLifecyclePolicy where
+  rnf GetLifecyclePolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders GetLifecyclePolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetLifecyclePolicy where
+  toJSON GetLifecyclePolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath GetLifecyclePolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetLifecyclePolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetLifecyclePolicyResponse' smart constructor.
+data GetLifecyclePolicyResponse = GetLifecyclePolicyResponse'
+  { -- | The time stamp of the last time that the lifecycle policy was run.
+    lastEvaluatedAt :: Prelude.Maybe Data.POSIX,
+    -- | The JSON lifecycle policy text.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'GetLifecyclePolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastEvaluatedAt', 'getLifecyclePolicyResponse_lastEvaluatedAt' - The time stamp of the last time that the lifecycle policy was run.
+--
+-- 'lifecyclePolicyText', 'getLifecyclePolicyResponse_lifecyclePolicyText' - The JSON lifecycle policy text.
+--
+-- 'registryId', 'getLifecyclePolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'getLifecyclePolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'getLifecyclePolicyResponse_httpStatus' - The response's http status code.
+newGetLifecyclePolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetLifecyclePolicyResponse
+newGetLifecyclePolicyResponse pHttpStatus_ =
+  GetLifecyclePolicyResponse'
+    { lastEvaluatedAt =
+        Prelude.Nothing,
+      lifecyclePolicyText = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The time stamp of the last time that the lifecycle policy was run.
+getLifecyclePolicyResponse_lastEvaluatedAt :: Lens.Lens' GetLifecyclePolicyResponse (Prelude.Maybe Prelude.UTCTime)
+getLifecyclePolicyResponse_lastEvaluatedAt = Lens.lens (\GetLifecyclePolicyResponse' {lastEvaluatedAt} -> lastEvaluatedAt) (\s@GetLifecyclePolicyResponse' {} a -> s {lastEvaluatedAt = a} :: GetLifecyclePolicyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The JSON lifecycle policy text.
+getLifecyclePolicyResponse_lifecyclePolicyText :: Lens.Lens' GetLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyResponse_lifecyclePolicyText = Lens.lens (\GetLifecyclePolicyResponse' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@GetLifecyclePolicyResponse' {} a -> s {lifecyclePolicyText = a} :: GetLifecyclePolicyResponse)
+
+-- | The registry ID associated with the request.
+getLifecyclePolicyResponse_registryId :: Lens.Lens' GetLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyResponse_registryId = Lens.lens (\GetLifecyclePolicyResponse' {registryId} -> registryId) (\s@GetLifecyclePolicyResponse' {} a -> s {registryId = a} :: GetLifecyclePolicyResponse)
+
+-- | The repository name associated with the request.
+getLifecyclePolicyResponse_repositoryName :: Lens.Lens' GetLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyResponse_repositoryName = Lens.lens (\GetLifecyclePolicyResponse' {repositoryName} -> repositoryName) (\s@GetLifecyclePolicyResponse' {} a -> s {repositoryName = a} :: GetLifecyclePolicyResponse)
+
+-- | The response's http status code.
+getLifecyclePolicyResponse_httpStatus :: Lens.Lens' GetLifecyclePolicyResponse Prelude.Int
+getLifecyclePolicyResponse_httpStatus = Lens.lens (\GetLifecyclePolicyResponse' {httpStatus} -> httpStatus) (\s@GetLifecyclePolicyResponse' {} a -> s {httpStatus = a} :: GetLifecyclePolicyResponse)
+
+instance Prelude.NFData GetLifecyclePolicyResponse where
+  rnf GetLifecyclePolicyResponse' {..} =
+    Prelude.rnf lastEvaluatedAt
+      `Prelude.seq` Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetLifecyclePolicyPreview.hs b/gen/Amazonka/ECR/GetLifecyclePolicyPreview.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetLifecyclePolicyPreview.hs
@@ -0,0 +1,403 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.GetLifecyclePolicyPreview
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the results of the lifecycle policy preview request for the
+-- specified repository.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.GetLifecyclePolicyPreview
+  ( -- * Creating a Request
+    GetLifecyclePolicyPreview (..),
+    newGetLifecyclePolicyPreview,
+
+    -- * Request Lenses
+    getLifecyclePolicyPreview_filter,
+    getLifecyclePolicyPreview_imageIds,
+    getLifecyclePolicyPreview_maxResults,
+    getLifecyclePolicyPreview_nextToken,
+    getLifecyclePolicyPreview_registryId,
+    getLifecyclePolicyPreview_repositoryName,
+
+    -- * Destructuring the Response
+    GetLifecyclePolicyPreviewResponse (..),
+    newGetLifecyclePolicyPreviewResponse,
+
+    -- * Response Lenses
+    getLifecyclePolicyPreviewResponse_lifecyclePolicyText,
+    getLifecyclePolicyPreviewResponse_nextToken,
+    getLifecyclePolicyPreviewResponse_previewResults,
+    getLifecyclePolicyPreviewResponse_registryId,
+    getLifecyclePolicyPreviewResponse_repositoryName,
+    getLifecyclePolicyPreviewResponse_status,
+    getLifecyclePolicyPreviewResponse_summary,
+    getLifecyclePolicyPreviewResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetLifecyclePolicyPreview' smart constructor.
+data GetLifecyclePolicyPreview = GetLifecyclePolicyPreview'
+  { -- | An optional parameter that filters results based on image tag status and
+    -- all tags, if tagged.
+    filter' :: Prelude.Maybe LifecyclePolicyPreviewFilter,
+    -- | The list of imageIDs to be included.
+    imageIds :: Prelude.Maybe [ImageIdentifier],
+    -- | The maximum number of repository results returned by
+    -- @GetLifecyclePolicyPreviewRequest@ in  paginated output. When this
+    -- parameter is used, @GetLifecyclePolicyPreviewRequest@ only returns 
+    -- @maxResults@ results in a single page along with a @nextToken@  response
+    -- element. The remaining results of the initial request can be seen by
+    -- sending  another @GetLifecyclePolicyPreviewRequest@ request with the
+    -- returned @nextToken@  value. This value can be between 1 and 1000. If
+    -- this  parameter is not used, then @GetLifecyclePolicyPreviewRequest@
+    -- returns up to  100 results and a @nextToken@ value, if  applicable. This
+    -- option cannot be used when you specify images with @imageIds@.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated 
+    -- @GetLifecyclePolicyPreviewRequest@ request where @maxResults@ was used
+    -- and the  results exceeded the value of that parameter. Pagination
+    -- continues from the end of the  previous results that returned the
+    -- @nextToken@ value. This value is  @null@ when there are no more results
+    -- to return. This option cannot be used when you specify images with
+    -- @imageIds@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLifecyclePolicyPreview' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'getLifecyclePolicyPreview_filter' - An optional parameter that filters results based on image tag status and
+-- all tags, if tagged.
+--
+-- 'imageIds', 'getLifecyclePolicyPreview_imageIds' - The list of imageIDs to be included.
+--
+-- 'maxResults', 'getLifecyclePolicyPreview_maxResults' - The maximum number of repository results returned by
+-- @GetLifecyclePolicyPreviewRequest@ in  paginated output. When this
+-- parameter is used, @GetLifecyclePolicyPreviewRequest@ only returns 
+-- @maxResults@ results in a single page along with a @nextToken@  response
+-- element. The remaining results of the initial request can be seen by
+-- sending  another @GetLifecyclePolicyPreviewRequest@ request with the
+-- returned @nextToken@  value. This value can be between 1 and 1000. If
+-- this  parameter is not used, then @GetLifecyclePolicyPreviewRequest@
+-- returns up to  100 results and a @nextToken@ value, if  applicable. This
+-- option cannot be used when you specify images with @imageIds@.
+--
+-- 'nextToken', 'getLifecyclePolicyPreview_nextToken' - The @nextToken@ value returned from a previous paginated 
+-- @GetLifecyclePolicyPreviewRequest@ request where @maxResults@ was used
+-- and the  results exceeded the value of that parameter. Pagination
+-- continues from the end of the  previous results that returned the
+-- @nextToken@ value. This value is  @null@ when there are no more results
+-- to return. This option cannot be used when you specify images with
+-- @imageIds@.
+--
+-- 'registryId', 'getLifecyclePolicyPreview_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'getLifecyclePolicyPreview_repositoryName' - The name of the repository.
+newGetLifecyclePolicyPreview ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  GetLifecyclePolicyPreview
+newGetLifecyclePolicyPreview pRepositoryName_ =
+  GetLifecyclePolicyPreview'
+    { filter' =
+        Prelude.Nothing,
+      imageIds = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | An optional parameter that filters results based on image tag status and
+-- all tags, if tagged.
+getLifecyclePolicyPreview_filter :: Lens.Lens' GetLifecyclePolicyPreview (Prelude.Maybe LifecyclePolicyPreviewFilter)
+getLifecyclePolicyPreview_filter = Lens.lens (\GetLifecyclePolicyPreview' {filter'} -> filter') (\s@GetLifecyclePolicyPreview' {} a -> s {filter' = a} :: GetLifecyclePolicyPreview)
+
+-- | The list of imageIDs to be included.
+getLifecyclePolicyPreview_imageIds :: Lens.Lens' GetLifecyclePolicyPreview (Prelude.Maybe [ImageIdentifier])
+getLifecyclePolicyPreview_imageIds = Lens.lens (\GetLifecyclePolicyPreview' {imageIds} -> imageIds) (\s@GetLifecyclePolicyPreview' {} a -> s {imageIds = a} :: GetLifecyclePolicyPreview) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of repository results returned by
+-- @GetLifecyclePolicyPreviewRequest@ in  paginated output. When this
+-- parameter is used, @GetLifecyclePolicyPreviewRequest@ only returns 
+-- @maxResults@ results in a single page along with a @nextToken@  response
+-- element. The remaining results of the initial request can be seen by
+-- sending  another @GetLifecyclePolicyPreviewRequest@ request with the
+-- returned @nextToken@  value. This value can be between 1 and 1000. If
+-- this  parameter is not used, then @GetLifecyclePolicyPreviewRequest@
+-- returns up to  100 results and a @nextToken@ value, if  applicable. This
+-- option cannot be used when you specify images with @imageIds@.
+getLifecyclePolicyPreview_maxResults :: Lens.Lens' GetLifecyclePolicyPreview (Prelude.Maybe Prelude.Natural)
+getLifecyclePolicyPreview_maxResults = Lens.lens (\GetLifecyclePolicyPreview' {maxResults} -> maxResults) (\s@GetLifecyclePolicyPreview' {} a -> s {maxResults = a} :: GetLifecyclePolicyPreview)
+
+-- | The @nextToken@ value returned from a previous paginated 
+-- @GetLifecyclePolicyPreviewRequest@ request where @maxResults@ was used
+-- and the  results exceeded the value of that parameter. Pagination
+-- continues from the end of the  previous results that returned the
+-- @nextToken@ value. This value is  @null@ when there are no more results
+-- to return. This option cannot be used when you specify images with
+-- @imageIds@.
+getLifecyclePolicyPreview_nextToken :: Lens.Lens' GetLifecyclePolicyPreview (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreview_nextToken = Lens.lens (\GetLifecyclePolicyPreview' {nextToken} -> nextToken) (\s@GetLifecyclePolicyPreview' {} a -> s {nextToken = a} :: GetLifecyclePolicyPreview)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+getLifecyclePolicyPreview_registryId :: Lens.Lens' GetLifecyclePolicyPreview (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreview_registryId = Lens.lens (\GetLifecyclePolicyPreview' {registryId} -> registryId) (\s@GetLifecyclePolicyPreview' {} a -> s {registryId = a} :: GetLifecyclePolicyPreview)
+
+-- | The name of the repository.
+getLifecyclePolicyPreview_repositoryName :: Lens.Lens' GetLifecyclePolicyPreview Prelude.Text
+getLifecyclePolicyPreview_repositoryName = Lens.lens (\GetLifecyclePolicyPreview' {repositoryName} -> repositoryName) (\s@GetLifecyclePolicyPreview' {} a -> s {repositoryName = a} :: GetLifecyclePolicyPreview)
+
+instance Core.AWSPager GetLifecyclePolicyPreview where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getLifecyclePolicyPreviewResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? getLifecyclePolicyPreviewResponse_previewResults
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getLifecyclePolicyPreview_nextToken
+          Lens..~ rs
+          Lens.^? getLifecyclePolicyPreviewResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest GetLifecyclePolicyPreview where
+  type
+    AWSResponse GetLifecyclePolicyPreview =
+      GetLifecyclePolicyPreviewResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetLifecyclePolicyPreviewResponse'
+            Prelude.<$> (x Data..?> "lifecyclePolicyText")
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "previewResults" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (x Data..?> "summary")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetLifecyclePolicyPreview where
+  hashWithSalt _salt GetLifecyclePolicyPreview' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` imageIds
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData GetLifecyclePolicyPreview where
+  rnf GetLifecyclePolicyPreview' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders GetLifecyclePolicyPreview where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicyPreview" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetLifecyclePolicyPreview where
+  toJSON GetLifecyclePolicyPreview' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filter" Data..=) Prelude.<$> filter',
+            ("imageIds" Data..=) Prelude.<$> imageIds,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath GetLifecyclePolicyPreview where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetLifecyclePolicyPreview where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetLifecyclePolicyPreviewResponse' smart constructor.
+data GetLifecyclePolicyPreviewResponse = GetLifecyclePolicyPreviewResponse'
+  { -- | The JSON lifecycle policy text.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The @nextToken@ value to include in a future @GetLifecyclePolicyPreview@
+    -- request. When the results of a @GetLifecyclePolicyPreview@ request
+    -- exceed @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The results of the lifecycle policy preview request.
+    previewResults :: Prelude.Maybe [LifecyclePolicyPreviewResult],
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the lifecycle policy preview request.
+    status :: Prelude.Maybe LifecyclePolicyPreviewStatus,
+    -- | The list of images that is returned as a result of the action.
+    summary :: Prelude.Maybe LifecyclePolicyPreviewSummary,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetLifecyclePolicyPreviewResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lifecyclePolicyText', 'getLifecyclePolicyPreviewResponse_lifecyclePolicyText' - The JSON lifecycle policy text.
+--
+-- 'nextToken', 'getLifecyclePolicyPreviewResponse_nextToken' - The @nextToken@ value to include in a future @GetLifecyclePolicyPreview@
+-- request. When the results of a @GetLifecyclePolicyPreview@ request
+-- exceed @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'previewResults', 'getLifecyclePolicyPreviewResponse_previewResults' - The results of the lifecycle policy preview request.
+--
+-- 'registryId', 'getLifecyclePolicyPreviewResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'getLifecyclePolicyPreviewResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'status', 'getLifecyclePolicyPreviewResponse_status' - The status of the lifecycle policy preview request.
+--
+-- 'summary', 'getLifecyclePolicyPreviewResponse_summary' - The list of images that is returned as a result of the action.
+--
+-- 'httpStatus', 'getLifecyclePolicyPreviewResponse_httpStatus' - The response's http status code.
+newGetLifecyclePolicyPreviewResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetLifecyclePolicyPreviewResponse
+newGetLifecyclePolicyPreviewResponse pHttpStatus_ =
+  GetLifecyclePolicyPreviewResponse'
+    { lifecyclePolicyText =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      previewResults = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      summary = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON lifecycle policy text.
+getLifecyclePolicyPreviewResponse_lifecyclePolicyText :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreviewResponse_lifecyclePolicyText = Lens.lens (\GetLifecyclePolicyPreviewResponse' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {lifecyclePolicyText = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The @nextToken@ value to include in a future @GetLifecyclePolicyPreview@
+-- request. When the results of a @GetLifecyclePolicyPreview@ request
+-- exceed @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+getLifecyclePolicyPreviewResponse_nextToken :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreviewResponse_nextToken = Lens.lens (\GetLifecyclePolicyPreviewResponse' {nextToken} -> nextToken) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {nextToken = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The results of the lifecycle policy preview request.
+getLifecyclePolicyPreviewResponse_previewResults :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe [LifecyclePolicyPreviewResult])
+getLifecyclePolicyPreviewResponse_previewResults = Lens.lens (\GetLifecyclePolicyPreviewResponse' {previewResults} -> previewResults) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {previewResults = a} :: GetLifecyclePolicyPreviewResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The registry ID associated with the request.
+getLifecyclePolicyPreviewResponse_registryId :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreviewResponse_registryId = Lens.lens (\GetLifecyclePolicyPreviewResponse' {registryId} -> registryId) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {registryId = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The repository name associated with the request.
+getLifecyclePolicyPreviewResponse_repositoryName :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+getLifecyclePolicyPreviewResponse_repositoryName = Lens.lens (\GetLifecyclePolicyPreviewResponse' {repositoryName} -> repositoryName) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {repositoryName = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The status of the lifecycle policy preview request.
+getLifecyclePolicyPreviewResponse_status :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe LifecyclePolicyPreviewStatus)
+getLifecyclePolicyPreviewResponse_status = Lens.lens (\GetLifecyclePolicyPreviewResponse' {status} -> status) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {status = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The list of images that is returned as a result of the action.
+getLifecyclePolicyPreviewResponse_summary :: Lens.Lens' GetLifecyclePolicyPreviewResponse (Prelude.Maybe LifecyclePolicyPreviewSummary)
+getLifecyclePolicyPreviewResponse_summary = Lens.lens (\GetLifecyclePolicyPreviewResponse' {summary} -> summary) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {summary = a} :: GetLifecyclePolicyPreviewResponse)
+
+-- | The response's http status code.
+getLifecyclePolicyPreviewResponse_httpStatus :: Lens.Lens' GetLifecyclePolicyPreviewResponse Prelude.Int
+getLifecyclePolicyPreviewResponse_httpStatus = Lens.lens (\GetLifecyclePolicyPreviewResponse' {httpStatus} -> httpStatus) (\s@GetLifecyclePolicyPreviewResponse' {} a -> s {httpStatus = a} :: GetLifecyclePolicyPreviewResponse)
+
+instance
+  Prelude.NFData
+    GetLifecyclePolicyPreviewResponse
+  where
+  rnf GetLifecyclePolicyPreviewResponse' {..} =
+    Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf previewResults
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf summary
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetRegistryPolicy.hs b/gen/Amazonka/ECR/GetRegistryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetRegistryPolicy.hs
@@ -0,0 +1,160 @@
+{-# 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.ECR.GetRegistryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the permissions policy for a registry.
+module Amazonka.ECR.GetRegistryPolicy
+  ( -- * Creating a Request
+    GetRegistryPolicy (..),
+    newGetRegistryPolicy,
+
+    -- * Destructuring the Response
+    GetRegistryPolicyResponse (..),
+    newGetRegistryPolicyResponse,
+
+    -- * Response Lenses
+    getRegistryPolicyResponse_policyText,
+    getRegistryPolicyResponse_registryId,
+    getRegistryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRegistryPolicy' smart constructor.
+data GetRegistryPolicy = GetRegistryPolicy'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRegistryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newGetRegistryPolicy ::
+  GetRegistryPolicy
+newGetRegistryPolicy = GetRegistryPolicy'
+
+instance Core.AWSRequest GetRegistryPolicy where
+  type
+    AWSResponse GetRegistryPolicy =
+      GetRegistryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRegistryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRegistryPolicy where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData GetRegistryPolicy where
+  rnf _ = ()
+
+instance Data.ToHeaders GetRegistryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetRegistryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRegistryPolicy where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath GetRegistryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRegistryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRegistryPolicyResponse' smart constructor.
+data GetRegistryPolicyResponse = GetRegistryPolicyResponse'
+  { -- | The JSON text of the permissions policy for a registry.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the registry.
+    registryId :: 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 'GetRegistryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'getRegistryPolicyResponse_policyText' - The JSON text of the permissions policy for a registry.
+--
+-- 'registryId', 'getRegistryPolicyResponse_registryId' - The ID of the registry.
+--
+-- 'httpStatus', 'getRegistryPolicyResponse_httpStatus' - The response's http status code.
+newGetRegistryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRegistryPolicyResponse
+newGetRegistryPolicyResponse pHttpStatus_ =
+  GetRegistryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON text of the permissions policy for a registry.
+getRegistryPolicyResponse_policyText :: Lens.Lens' GetRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRegistryPolicyResponse_policyText = Lens.lens (\GetRegistryPolicyResponse' {policyText} -> policyText) (\s@GetRegistryPolicyResponse' {} a -> s {policyText = a} :: GetRegistryPolicyResponse)
+
+-- | The ID of the registry.
+getRegistryPolicyResponse_registryId :: Lens.Lens' GetRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRegistryPolicyResponse_registryId = Lens.lens (\GetRegistryPolicyResponse' {registryId} -> registryId) (\s@GetRegistryPolicyResponse' {} a -> s {registryId = a} :: GetRegistryPolicyResponse)
+
+-- | The response's http status code.
+getRegistryPolicyResponse_httpStatus :: Lens.Lens' GetRegistryPolicyResponse Prelude.Int
+getRegistryPolicyResponse_httpStatus = Lens.lens (\GetRegistryPolicyResponse' {httpStatus} -> httpStatus) (\s@GetRegistryPolicyResponse' {} a -> s {httpStatus = a} :: GetRegistryPolicyResponse)
+
+instance Prelude.NFData GetRegistryPolicyResponse where
+  rnf GetRegistryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetRegistryScanningConfiguration.hs b/gen/Amazonka/ECR/GetRegistryScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetRegistryScanningConfiguration.hs
@@ -0,0 +1,181 @@
+{-# 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.ECR.GetRegistryScanningConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the scanning configuration for a registry.
+module Amazonka.ECR.GetRegistryScanningConfiguration
+  ( -- * Creating a Request
+    GetRegistryScanningConfiguration (..),
+    newGetRegistryScanningConfiguration,
+
+    -- * Destructuring the Response
+    GetRegistryScanningConfigurationResponse (..),
+    newGetRegistryScanningConfigurationResponse,
+
+    -- * Response Lenses
+    getRegistryScanningConfigurationResponse_registryId,
+    getRegistryScanningConfigurationResponse_scanningConfiguration,
+    getRegistryScanningConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRegistryScanningConfiguration' smart constructor.
+data GetRegistryScanningConfiguration = GetRegistryScanningConfiguration'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRegistryScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newGetRegistryScanningConfiguration ::
+  GetRegistryScanningConfiguration
+newGetRegistryScanningConfiguration =
+  GetRegistryScanningConfiguration'
+
+instance
+  Core.AWSRequest
+    GetRegistryScanningConfiguration
+  where
+  type
+    AWSResponse GetRegistryScanningConfiguration =
+      GetRegistryScanningConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRegistryScanningConfigurationResponse'
+            Prelude.<$> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "scanningConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    GetRegistryScanningConfiguration
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance
+  Prelude.NFData
+    GetRegistryScanningConfiguration
+  where
+  rnf _ = ()
+
+instance
+  Data.ToHeaders
+    GetRegistryScanningConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetRegistryScanningConfiguration" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRegistryScanningConfiguration where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath GetRegistryScanningConfiguration where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    GetRegistryScanningConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRegistryScanningConfigurationResponse' smart constructor.
+data GetRegistryScanningConfigurationResponse = GetRegistryScanningConfigurationResponse'
+  { -- | The ID of the registry.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The scanning configuration for the registry.
+    scanningConfiguration :: Prelude.Maybe RegistryScanningConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRegistryScanningConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getRegistryScanningConfigurationResponse_registryId' - The ID of the registry.
+--
+-- 'scanningConfiguration', 'getRegistryScanningConfigurationResponse_scanningConfiguration' - The scanning configuration for the registry.
+--
+-- 'httpStatus', 'getRegistryScanningConfigurationResponse_httpStatus' - The response's http status code.
+newGetRegistryScanningConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRegistryScanningConfigurationResponse
+newGetRegistryScanningConfigurationResponse
+  pHttpStatus_ =
+    GetRegistryScanningConfigurationResponse'
+      { registryId =
+          Prelude.Nothing,
+        scanningConfiguration =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The ID of the registry.
+getRegistryScanningConfigurationResponse_registryId :: Lens.Lens' GetRegistryScanningConfigurationResponse (Prelude.Maybe Prelude.Text)
+getRegistryScanningConfigurationResponse_registryId = Lens.lens (\GetRegistryScanningConfigurationResponse' {registryId} -> registryId) (\s@GetRegistryScanningConfigurationResponse' {} a -> s {registryId = a} :: GetRegistryScanningConfigurationResponse)
+
+-- | The scanning configuration for the registry.
+getRegistryScanningConfigurationResponse_scanningConfiguration :: Lens.Lens' GetRegistryScanningConfigurationResponse (Prelude.Maybe RegistryScanningConfiguration)
+getRegistryScanningConfigurationResponse_scanningConfiguration = Lens.lens (\GetRegistryScanningConfigurationResponse' {scanningConfiguration} -> scanningConfiguration) (\s@GetRegistryScanningConfigurationResponse' {} a -> s {scanningConfiguration = a} :: GetRegistryScanningConfigurationResponse)
+
+-- | The response's http status code.
+getRegistryScanningConfigurationResponse_httpStatus :: Lens.Lens' GetRegistryScanningConfigurationResponse Prelude.Int
+getRegistryScanningConfigurationResponse_httpStatus = Lens.lens (\GetRegistryScanningConfigurationResponse' {httpStatus} -> httpStatus) (\s@GetRegistryScanningConfigurationResponse' {} a -> s {httpStatus = a} :: GetRegistryScanningConfigurationResponse)
+
+instance
+  Prelude.NFData
+    GetRegistryScanningConfigurationResponse
+  where
+  rnf GetRegistryScanningConfigurationResponse' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf scanningConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/GetRepositoryPolicy.hs b/gen/Amazonka/ECR/GetRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/GetRepositoryPolicy.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.GetRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the repository policy for the specified repository.
+module Amazonka.ECR.GetRepositoryPolicy
+  ( -- * Creating a Request
+    GetRepositoryPolicy (..),
+    newGetRepositoryPolicy,
+
+    -- * Request Lenses
+    getRepositoryPolicy_registryId,
+    getRepositoryPolicy_repositoryName,
+
+    -- * Destructuring the Response
+    GetRepositoryPolicyResponse (..),
+    newGetRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    getRepositoryPolicyResponse_policyText,
+    getRepositoryPolicyResponse_registryId,
+    getRepositoryPolicyResponse_repositoryName,
+    getRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetRepositoryPolicy' smart constructor.
+data GetRepositoryPolicy = GetRepositoryPolicy'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository with the policy to retrieve.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'getRepositoryPolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'getRepositoryPolicy_repositoryName' - The name of the repository with the policy to retrieve.
+newGetRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  GetRepositoryPolicy
+newGetRepositoryPolicy pRepositoryName_ =
+  GetRepositoryPolicy'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+getRepositoryPolicy_registryId :: Lens.Lens' GetRepositoryPolicy (Prelude.Maybe Prelude.Text)
+getRepositoryPolicy_registryId = Lens.lens (\GetRepositoryPolicy' {registryId} -> registryId) (\s@GetRepositoryPolicy' {} a -> s {registryId = a} :: GetRepositoryPolicy)
+
+-- | The name of the repository with the policy to retrieve.
+getRepositoryPolicy_repositoryName :: Lens.Lens' GetRepositoryPolicy Prelude.Text
+getRepositoryPolicy_repositoryName = Lens.lens (\GetRepositoryPolicy' {repositoryName} -> repositoryName) (\s@GetRepositoryPolicy' {} a -> s {repositoryName = a} :: GetRepositoryPolicy)
+
+instance Core.AWSRequest GetRepositoryPolicy where
+  type
+    AWSResponse GetRepositoryPolicy =
+      GetRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetRepositoryPolicy where
+  hashWithSalt _salt GetRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData GetRepositoryPolicy where
+  rnf GetRepositoryPolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders GetRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.GetRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetRepositoryPolicy where
+  toJSON GetRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath GetRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetRepositoryPolicyResponse' smart constructor.
+data GetRepositoryPolicyResponse = GetRepositoryPolicyResponse'
+  { -- | The JSON repository policy text associated with the repository.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'GetRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'getRepositoryPolicyResponse_policyText' - The JSON repository policy text associated with the repository.
+--
+-- 'registryId', 'getRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'getRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'getRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newGetRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetRepositoryPolicyResponse
+newGetRepositoryPolicyResponse pHttpStatus_ =
+  GetRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy text associated with the repository.
+getRepositoryPolicyResponse_policyText :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_policyText = Lens.lens (\GetRepositoryPolicyResponse' {policyText} -> policyText) (\s@GetRepositoryPolicyResponse' {} a -> s {policyText = a} :: GetRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+getRepositoryPolicyResponse_registryId :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_registryId = Lens.lens (\GetRepositoryPolicyResponse' {registryId} -> registryId) (\s@GetRepositoryPolicyResponse' {} a -> s {registryId = a} :: GetRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+getRepositoryPolicyResponse_repositoryName :: Lens.Lens' GetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+getRepositoryPolicyResponse_repositoryName = Lens.lens (\GetRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@GetRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: GetRepositoryPolicyResponse)
+
+-- | The response's http status code.
+getRepositoryPolicyResponse_httpStatus :: Lens.Lens' GetRepositoryPolicyResponse Prelude.Int
+getRepositoryPolicyResponse_httpStatus = Lens.lens (\GetRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@GetRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: GetRepositoryPolicyResponse)
+
+instance Prelude.NFData GetRepositoryPolicyResponse where
+  rnf GetRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/InitiateLayerUpload.hs b/gen/Amazonka/ECR/InitiateLayerUpload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/InitiateLayerUpload.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.InitiateLayerUpload
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Notifies Amazon ECR that you intend to upload an image layer.
+--
+-- When an image is pushed, the InitiateLayerUpload API is called once per
+-- image layer that has not already been uploaded. Whether or not an image
+-- layer has been uploaded is determined by the BatchCheckLayerAvailability
+-- API action.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.InitiateLayerUpload
+  ( -- * Creating a Request
+    InitiateLayerUpload (..),
+    newInitiateLayerUpload,
+
+    -- * Request Lenses
+    initiateLayerUpload_registryId,
+    initiateLayerUpload_repositoryName,
+
+    -- * Destructuring the Response
+    InitiateLayerUploadResponse (..),
+    newInitiateLayerUploadResponse,
+
+    -- * Response Lenses
+    initiateLayerUploadResponse_partSize,
+    initiateLayerUploadResponse_uploadId,
+    initiateLayerUploadResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newInitiateLayerUpload' smart constructor.
+data InitiateLayerUpload = InitiateLayerUpload'
+  { -- | The Amazon Web Services account ID associated with the registry to which
+    -- you intend to upload layers. If you do not specify a registry, the
+    -- default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which you intend to upload layers.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InitiateLayerUpload' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'initiateLayerUpload_registryId' - The Amazon Web Services account ID associated with the registry to which
+-- you intend to upload layers. If you do not specify a registry, the
+-- default registry is assumed.
+--
+-- 'repositoryName', 'initiateLayerUpload_repositoryName' - The name of the repository to which you intend to upload layers.
+newInitiateLayerUpload ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  InitiateLayerUpload
+newInitiateLayerUpload pRepositoryName_ =
+  InitiateLayerUpload'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry to which
+-- you intend to upload layers. If you do not specify a registry, the
+-- default registry is assumed.
+initiateLayerUpload_registryId :: Lens.Lens' InitiateLayerUpload (Prelude.Maybe Prelude.Text)
+initiateLayerUpload_registryId = Lens.lens (\InitiateLayerUpload' {registryId} -> registryId) (\s@InitiateLayerUpload' {} a -> s {registryId = a} :: InitiateLayerUpload)
+
+-- | The name of the repository to which you intend to upload layers.
+initiateLayerUpload_repositoryName :: Lens.Lens' InitiateLayerUpload Prelude.Text
+initiateLayerUpload_repositoryName = Lens.lens (\InitiateLayerUpload' {repositoryName} -> repositoryName) (\s@InitiateLayerUpload' {} a -> s {repositoryName = a} :: InitiateLayerUpload)
+
+instance Core.AWSRequest InitiateLayerUpload where
+  type
+    AWSResponse InitiateLayerUpload =
+      InitiateLayerUploadResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          InitiateLayerUploadResponse'
+            Prelude.<$> (x Data..?> "partSize")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable InitiateLayerUpload where
+  hashWithSalt _salt InitiateLayerUpload' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData InitiateLayerUpload where
+  rnf InitiateLayerUpload' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders InitiateLayerUpload where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.InitiateLayerUpload" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON InitiateLayerUpload where
+  toJSON InitiateLayerUpload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath InitiateLayerUpload where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery InitiateLayerUpload where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newInitiateLayerUploadResponse' smart constructor.
+data InitiateLayerUploadResponse = InitiateLayerUploadResponse'
+  { -- | The size, in bytes, that Amazon ECR expects future layer part uploads to
+    -- be.
+    partSize :: Prelude.Maybe Prelude.Natural,
+    -- | The upload ID for the layer upload. This parameter is passed to further
+    -- UploadLayerPart and CompleteLayerUpload operations.
+    uploadId :: 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 'InitiateLayerUploadResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'partSize', 'initiateLayerUploadResponse_partSize' - The size, in bytes, that Amazon ECR expects future layer part uploads to
+-- be.
+--
+-- 'uploadId', 'initiateLayerUploadResponse_uploadId' - The upload ID for the layer upload. This parameter is passed to further
+-- UploadLayerPart and CompleteLayerUpload operations.
+--
+-- 'httpStatus', 'initiateLayerUploadResponse_httpStatus' - The response's http status code.
+newInitiateLayerUploadResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  InitiateLayerUploadResponse
+newInitiateLayerUploadResponse pHttpStatus_ =
+  InitiateLayerUploadResponse'
+    { partSize =
+        Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The size, in bytes, that Amazon ECR expects future layer part uploads to
+-- be.
+initiateLayerUploadResponse_partSize :: Lens.Lens' InitiateLayerUploadResponse (Prelude.Maybe Prelude.Natural)
+initiateLayerUploadResponse_partSize = Lens.lens (\InitiateLayerUploadResponse' {partSize} -> partSize) (\s@InitiateLayerUploadResponse' {} a -> s {partSize = a} :: InitiateLayerUploadResponse)
+
+-- | The upload ID for the layer upload. This parameter is passed to further
+-- UploadLayerPart and CompleteLayerUpload operations.
+initiateLayerUploadResponse_uploadId :: Lens.Lens' InitiateLayerUploadResponse (Prelude.Maybe Prelude.Text)
+initiateLayerUploadResponse_uploadId = Lens.lens (\InitiateLayerUploadResponse' {uploadId} -> uploadId) (\s@InitiateLayerUploadResponse' {} a -> s {uploadId = a} :: InitiateLayerUploadResponse)
+
+-- | The response's http status code.
+initiateLayerUploadResponse_httpStatus :: Lens.Lens' InitiateLayerUploadResponse Prelude.Int
+initiateLayerUploadResponse_httpStatus = Lens.lens (\InitiateLayerUploadResponse' {httpStatus} -> httpStatus) (\s@InitiateLayerUploadResponse' {} a -> s {httpStatus = a} :: InitiateLayerUploadResponse)
+
+instance Prelude.NFData InitiateLayerUploadResponse where
+  rnf InitiateLayerUploadResponse' {..} =
+    Prelude.rnf partSize
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/Lens.hs b/gen/Amazonka/ECR/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Lens.hs
@@ -0,0 +1,699 @@
+{-# 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.ECR.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.ECR.Lens
+  ( -- * Operations
+
+    -- ** BatchCheckLayerAvailability
+    batchCheckLayerAvailability_registryId,
+    batchCheckLayerAvailability_repositoryName,
+    batchCheckLayerAvailability_layerDigests,
+    batchCheckLayerAvailabilityResponse_failures,
+    batchCheckLayerAvailabilityResponse_layers,
+    batchCheckLayerAvailabilityResponse_httpStatus,
+
+    -- ** BatchDeleteImage
+    batchDeleteImage_registryId,
+    batchDeleteImage_repositoryName,
+    batchDeleteImage_imageIds,
+    batchDeleteImageResponse_failures,
+    batchDeleteImageResponse_imageIds,
+    batchDeleteImageResponse_httpStatus,
+
+    -- ** BatchGetImage
+    batchGetImage_acceptedMediaTypes,
+    batchGetImage_registryId,
+    batchGetImage_repositoryName,
+    batchGetImage_imageIds,
+    batchGetImageResponse_failures,
+    batchGetImageResponse_images,
+    batchGetImageResponse_httpStatus,
+
+    -- ** BatchGetRepositoryScanningConfiguration
+    batchGetRepositoryScanningConfiguration_repositoryNames,
+    batchGetRepositoryScanningConfigurationResponse_failures,
+    batchGetRepositoryScanningConfigurationResponse_scanningConfigurations,
+    batchGetRepositoryScanningConfigurationResponse_httpStatus,
+
+    -- ** CompleteLayerUpload
+    completeLayerUpload_registryId,
+    completeLayerUpload_repositoryName,
+    completeLayerUpload_uploadId,
+    completeLayerUpload_layerDigests,
+    completeLayerUploadResponse_layerDigest,
+    completeLayerUploadResponse_registryId,
+    completeLayerUploadResponse_repositoryName,
+    completeLayerUploadResponse_uploadId,
+    completeLayerUploadResponse_httpStatus,
+
+    -- ** CreatePullThroughCacheRule
+    createPullThroughCacheRule_registryId,
+    createPullThroughCacheRule_ecrRepositoryPrefix,
+    createPullThroughCacheRule_upstreamRegistryUrl,
+    createPullThroughCacheRuleResponse_createdAt,
+    createPullThroughCacheRuleResponse_ecrRepositoryPrefix,
+    createPullThroughCacheRuleResponse_registryId,
+    createPullThroughCacheRuleResponse_upstreamRegistryUrl,
+    createPullThroughCacheRuleResponse_httpStatus,
+
+    -- ** CreateRepository
+    createRepository_encryptionConfiguration,
+    createRepository_imageScanningConfiguration,
+    createRepository_imageTagMutability,
+    createRepository_registryId,
+    createRepository_tags,
+    createRepository_repositoryName,
+    createRepositoryResponse_repository,
+    createRepositoryResponse_httpStatus,
+
+    -- ** DeleteLifecyclePolicy
+    deleteLifecyclePolicy_registryId,
+    deleteLifecyclePolicy_repositoryName,
+    deleteLifecyclePolicyResponse_lastEvaluatedAt,
+    deleteLifecyclePolicyResponse_lifecyclePolicyText,
+    deleteLifecyclePolicyResponse_registryId,
+    deleteLifecyclePolicyResponse_repositoryName,
+    deleteLifecyclePolicyResponse_httpStatus,
+
+    -- ** DeletePullThroughCacheRule
+    deletePullThroughCacheRule_registryId,
+    deletePullThroughCacheRule_ecrRepositoryPrefix,
+    deletePullThroughCacheRuleResponse_createdAt,
+    deletePullThroughCacheRuleResponse_ecrRepositoryPrefix,
+    deletePullThroughCacheRuleResponse_registryId,
+    deletePullThroughCacheRuleResponse_upstreamRegistryUrl,
+    deletePullThroughCacheRuleResponse_httpStatus,
+
+    -- ** DeleteRegistryPolicy
+    deleteRegistryPolicyResponse_policyText,
+    deleteRegistryPolicyResponse_registryId,
+    deleteRegistryPolicyResponse_httpStatus,
+
+    -- ** DeleteRepository
+    deleteRepository_force,
+    deleteRepository_registryId,
+    deleteRepository_repositoryName,
+    deleteRepositoryResponse_repository,
+    deleteRepositoryResponse_httpStatus,
+
+    -- ** DeleteRepositoryPolicy
+    deleteRepositoryPolicy_registryId,
+    deleteRepositoryPolicy_repositoryName,
+    deleteRepositoryPolicyResponse_policyText,
+    deleteRepositoryPolicyResponse_registryId,
+    deleteRepositoryPolicyResponse_repositoryName,
+    deleteRepositoryPolicyResponse_httpStatus,
+
+    -- ** DescribeImageReplicationStatus
+    describeImageReplicationStatus_registryId,
+    describeImageReplicationStatus_repositoryName,
+    describeImageReplicationStatus_imageId,
+    describeImageReplicationStatusResponse_imageId,
+    describeImageReplicationStatusResponse_replicationStatuses,
+    describeImageReplicationStatusResponse_repositoryName,
+    describeImageReplicationStatusResponse_httpStatus,
+
+    -- ** DescribeImageScanFindings
+    describeImageScanFindings_maxResults,
+    describeImageScanFindings_nextToken,
+    describeImageScanFindings_registryId,
+    describeImageScanFindings_repositoryName,
+    describeImageScanFindings_imageId,
+    describeImageScanFindingsResponse_imageId,
+    describeImageScanFindingsResponse_imageScanFindings,
+    describeImageScanFindingsResponse_imageScanStatus,
+    describeImageScanFindingsResponse_nextToken,
+    describeImageScanFindingsResponse_registryId,
+    describeImageScanFindingsResponse_repositoryName,
+    describeImageScanFindingsResponse_httpStatus,
+
+    -- ** DescribeImages
+    describeImages_filter,
+    describeImages_imageIds,
+    describeImages_maxResults,
+    describeImages_nextToken,
+    describeImages_registryId,
+    describeImages_repositoryName,
+    describeImagesResponse_imageDetails,
+    describeImagesResponse_nextToken,
+    describeImagesResponse_httpStatus,
+
+    -- ** DescribePullThroughCacheRules
+    describePullThroughCacheRules_ecrRepositoryPrefixes,
+    describePullThroughCacheRules_maxResults,
+    describePullThroughCacheRules_nextToken,
+    describePullThroughCacheRules_registryId,
+    describePullThroughCacheRulesResponse_nextToken,
+    describePullThroughCacheRulesResponse_pullThroughCacheRules,
+    describePullThroughCacheRulesResponse_httpStatus,
+
+    -- ** DescribeRegistry
+    describeRegistryResponse_registryId,
+    describeRegistryResponse_replicationConfiguration,
+    describeRegistryResponse_httpStatus,
+
+    -- ** DescribeRepositories
+    describeRepositories_maxResults,
+    describeRepositories_nextToken,
+    describeRepositories_registryId,
+    describeRepositories_repositoryNames,
+    describeRepositoriesResponse_nextToken,
+    describeRepositoriesResponse_repositories,
+    describeRepositoriesResponse_httpStatus,
+
+    -- ** GetAuthorizationToken
+    getAuthorizationToken_registryIds,
+    getAuthorizationTokenResponse_authorizationData,
+    getAuthorizationTokenResponse_httpStatus,
+
+    -- ** GetDownloadUrlForLayer
+    getDownloadUrlForLayer_registryId,
+    getDownloadUrlForLayer_repositoryName,
+    getDownloadUrlForLayer_layerDigest,
+    getDownloadUrlForLayerResponse_downloadUrl,
+    getDownloadUrlForLayerResponse_layerDigest,
+    getDownloadUrlForLayerResponse_httpStatus,
+
+    -- ** GetLifecyclePolicy
+    getLifecyclePolicy_registryId,
+    getLifecyclePolicy_repositoryName,
+    getLifecyclePolicyResponse_lastEvaluatedAt,
+    getLifecyclePolicyResponse_lifecyclePolicyText,
+    getLifecyclePolicyResponse_registryId,
+    getLifecyclePolicyResponse_repositoryName,
+    getLifecyclePolicyResponse_httpStatus,
+
+    -- ** GetLifecyclePolicyPreview
+    getLifecyclePolicyPreview_filter,
+    getLifecyclePolicyPreview_imageIds,
+    getLifecyclePolicyPreview_maxResults,
+    getLifecyclePolicyPreview_nextToken,
+    getLifecyclePolicyPreview_registryId,
+    getLifecyclePolicyPreview_repositoryName,
+    getLifecyclePolicyPreviewResponse_lifecyclePolicyText,
+    getLifecyclePolicyPreviewResponse_nextToken,
+    getLifecyclePolicyPreviewResponse_previewResults,
+    getLifecyclePolicyPreviewResponse_registryId,
+    getLifecyclePolicyPreviewResponse_repositoryName,
+    getLifecyclePolicyPreviewResponse_status,
+    getLifecyclePolicyPreviewResponse_summary,
+    getLifecyclePolicyPreviewResponse_httpStatus,
+
+    -- ** GetRegistryPolicy
+    getRegistryPolicyResponse_policyText,
+    getRegistryPolicyResponse_registryId,
+    getRegistryPolicyResponse_httpStatus,
+
+    -- ** GetRegistryScanningConfiguration
+    getRegistryScanningConfigurationResponse_registryId,
+    getRegistryScanningConfigurationResponse_scanningConfiguration,
+    getRegistryScanningConfigurationResponse_httpStatus,
+
+    -- ** GetRepositoryPolicy
+    getRepositoryPolicy_registryId,
+    getRepositoryPolicy_repositoryName,
+    getRepositoryPolicyResponse_policyText,
+    getRepositoryPolicyResponse_registryId,
+    getRepositoryPolicyResponse_repositoryName,
+    getRepositoryPolicyResponse_httpStatus,
+
+    -- ** InitiateLayerUpload
+    initiateLayerUpload_registryId,
+    initiateLayerUpload_repositoryName,
+    initiateLayerUploadResponse_partSize,
+    initiateLayerUploadResponse_uploadId,
+    initiateLayerUploadResponse_httpStatus,
+
+    -- ** ListImages
+    listImages_filter,
+    listImages_maxResults,
+    listImages_nextToken,
+    listImages_registryId,
+    listImages_repositoryName,
+    listImagesResponse_imageIds,
+    listImagesResponse_nextToken,
+    listImagesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** PutImage
+    putImage_imageDigest,
+    putImage_imageManifestMediaType,
+    putImage_imageTag,
+    putImage_registryId,
+    putImage_repositoryName,
+    putImage_imageManifest,
+    putImageResponse_image,
+    putImageResponse_httpStatus,
+
+    -- ** PutImageScanningConfiguration
+    putImageScanningConfiguration_registryId,
+    putImageScanningConfiguration_repositoryName,
+    putImageScanningConfiguration_imageScanningConfiguration,
+    putImageScanningConfigurationResponse_imageScanningConfiguration,
+    putImageScanningConfigurationResponse_registryId,
+    putImageScanningConfigurationResponse_repositoryName,
+    putImageScanningConfigurationResponse_httpStatus,
+
+    -- ** PutImageTagMutability
+    putImageTagMutability_registryId,
+    putImageTagMutability_repositoryName,
+    putImageTagMutability_imageTagMutability,
+    putImageTagMutabilityResponse_imageTagMutability,
+    putImageTagMutabilityResponse_registryId,
+    putImageTagMutabilityResponse_repositoryName,
+    putImageTagMutabilityResponse_httpStatus,
+
+    -- ** PutLifecyclePolicy
+    putLifecyclePolicy_registryId,
+    putLifecyclePolicy_repositoryName,
+    putLifecyclePolicy_lifecyclePolicyText,
+    putLifecyclePolicyResponse_lifecyclePolicyText,
+    putLifecyclePolicyResponse_registryId,
+    putLifecyclePolicyResponse_repositoryName,
+    putLifecyclePolicyResponse_httpStatus,
+
+    -- ** PutRegistryPolicy
+    putRegistryPolicy_policyText,
+    putRegistryPolicyResponse_policyText,
+    putRegistryPolicyResponse_registryId,
+    putRegistryPolicyResponse_httpStatus,
+
+    -- ** PutRegistryScanningConfiguration
+    putRegistryScanningConfiguration_rules,
+    putRegistryScanningConfiguration_scanType,
+    putRegistryScanningConfigurationResponse_registryScanningConfiguration,
+    putRegistryScanningConfigurationResponse_httpStatus,
+
+    -- ** PutReplicationConfiguration
+    putReplicationConfiguration_replicationConfiguration,
+    putReplicationConfigurationResponse_replicationConfiguration,
+    putReplicationConfigurationResponse_httpStatus,
+
+    -- ** SetRepositoryPolicy
+    setRepositoryPolicy_force,
+    setRepositoryPolicy_registryId,
+    setRepositoryPolicy_repositoryName,
+    setRepositoryPolicy_policyText,
+    setRepositoryPolicyResponse_policyText,
+    setRepositoryPolicyResponse_registryId,
+    setRepositoryPolicyResponse_repositoryName,
+    setRepositoryPolicyResponse_httpStatus,
+
+    -- ** StartImageScan
+    startImageScan_registryId,
+    startImageScan_repositoryName,
+    startImageScan_imageId,
+    startImageScanResponse_imageId,
+    startImageScanResponse_imageScanStatus,
+    startImageScanResponse_registryId,
+    startImageScanResponse_repositoryName,
+    startImageScanResponse_httpStatus,
+
+    -- ** StartLifecyclePolicyPreview
+    startLifecyclePolicyPreview_lifecyclePolicyText,
+    startLifecyclePolicyPreview_registryId,
+    startLifecyclePolicyPreview_repositoryName,
+    startLifecyclePolicyPreviewResponse_lifecyclePolicyText,
+    startLifecyclePolicyPreviewResponse_registryId,
+    startLifecyclePolicyPreviewResponse_repositoryName,
+    startLifecyclePolicyPreviewResponse_status,
+    startLifecyclePolicyPreviewResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UploadLayerPart
+    uploadLayerPart_registryId,
+    uploadLayerPart_repositoryName,
+    uploadLayerPart_uploadId,
+    uploadLayerPart_partFirstByte,
+    uploadLayerPart_partLastByte,
+    uploadLayerPart_layerPartBlob,
+    uploadLayerPartResponse_lastByteReceived,
+    uploadLayerPartResponse_registryId,
+    uploadLayerPartResponse_repositoryName,
+    uploadLayerPartResponse_uploadId,
+    uploadLayerPartResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Attribute
+    attribute_value,
+    attribute_key,
+
+    -- ** AuthorizationData
+    authorizationData_authorizationToken,
+    authorizationData_expiresAt,
+    authorizationData_proxyEndpoint,
+
+    -- ** AwsEcrContainerImageDetails
+    awsEcrContainerImageDetails_architecture,
+    awsEcrContainerImageDetails_author,
+    awsEcrContainerImageDetails_imageHash,
+    awsEcrContainerImageDetails_imageTags,
+    awsEcrContainerImageDetails_platform,
+    awsEcrContainerImageDetails_pushedAt,
+    awsEcrContainerImageDetails_registry,
+    awsEcrContainerImageDetails_repositoryName,
+
+    -- ** CvssScore
+    cvssScore_baseScore,
+    cvssScore_scoringVector,
+    cvssScore_source,
+    cvssScore_version,
+
+    -- ** CvssScoreAdjustment
+    cvssScoreAdjustment_metric,
+    cvssScoreAdjustment_reason,
+
+    -- ** CvssScoreDetails
+    cvssScoreDetails_adjustments,
+    cvssScoreDetails_score,
+    cvssScoreDetails_scoreSource,
+    cvssScoreDetails_scoringVector,
+    cvssScoreDetails_version,
+
+    -- ** DescribeImagesFilter
+    describeImagesFilter_tagStatus,
+
+    -- ** EncryptionConfiguration
+    encryptionConfiguration_kmsKey,
+    encryptionConfiguration_encryptionType,
+
+    -- ** EnhancedImageScanFinding
+    enhancedImageScanFinding_awsAccountId,
+    enhancedImageScanFinding_description,
+    enhancedImageScanFinding_findingArn,
+    enhancedImageScanFinding_firstObservedAt,
+    enhancedImageScanFinding_lastObservedAt,
+    enhancedImageScanFinding_packageVulnerabilityDetails,
+    enhancedImageScanFinding_remediation,
+    enhancedImageScanFinding_resources,
+    enhancedImageScanFinding_score,
+    enhancedImageScanFinding_scoreDetails,
+    enhancedImageScanFinding_severity,
+    enhancedImageScanFinding_status,
+    enhancedImageScanFinding_title,
+    enhancedImageScanFinding_type,
+    enhancedImageScanFinding_updatedAt,
+
+    -- ** Image
+    image_imageId,
+    image_imageManifest,
+    image_imageManifestMediaType,
+    image_registryId,
+    image_repositoryName,
+
+    -- ** ImageDetail
+    imageDetail_artifactMediaType,
+    imageDetail_imageDigest,
+    imageDetail_imageManifestMediaType,
+    imageDetail_imagePushedAt,
+    imageDetail_imageScanFindingsSummary,
+    imageDetail_imageScanStatus,
+    imageDetail_imageSizeInBytes,
+    imageDetail_imageTags,
+    imageDetail_lastRecordedPullTime,
+    imageDetail_registryId,
+    imageDetail_repositoryName,
+
+    -- ** ImageFailure
+    imageFailure_failureCode,
+    imageFailure_failureReason,
+    imageFailure_imageId,
+
+    -- ** ImageIdentifier
+    imageIdentifier_imageDigest,
+    imageIdentifier_imageTag,
+
+    -- ** ImageReplicationStatus
+    imageReplicationStatus_failureCode,
+    imageReplicationStatus_region,
+    imageReplicationStatus_registryId,
+    imageReplicationStatus_status,
+
+    -- ** ImageScanFinding
+    imageScanFinding_attributes,
+    imageScanFinding_description,
+    imageScanFinding_name,
+    imageScanFinding_severity,
+    imageScanFinding_uri,
+
+    -- ** ImageScanFindings
+    imageScanFindings_enhancedFindings,
+    imageScanFindings_findingSeverityCounts,
+    imageScanFindings_findings,
+    imageScanFindings_imageScanCompletedAt,
+    imageScanFindings_vulnerabilitySourceUpdatedAt,
+
+    -- ** ImageScanFindingsSummary
+    imageScanFindingsSummary_findingSeverityCounts,
+    imageScanFindingsSummary_imageScanCompletedAt,
+    imageScanFindingsSummary_vulnerabilitySourceUpdatedAt,
+
+    -- ** ImageScanStatus
+    imageScanStatus_description,
+    imageScanStatus_status,
+
+    -- ** ImageScanningConfiguration
+    imageScanningConfiguration_scanOnPush,
+
+    -- ** Layer
+    layer_layerAvailability,
+    layer_layerDigest,
+    layer_layerSize,
+    layer_mediaType,
+
+    -- ** LayerFailure
+    layerFailure_failureCode,
+    layerFailure_failureReason,
+    layerFailure_layerDigest,
+
+    -- ** LifecyclePolicyPreviewFilter
+    lifecyclePolicyPreviewFilter_tagStatus,
+
+    -- ** LifecyclePolicyPreviewResult
+    lifecyclePolicyPreviewResult_action,
+    lifecyclePolicyPreviewResult_appliedRulePriority,
+    lifecyclePolicyPreviewResult_imageDigest,
+    lifecyclePolicyPreviewResult_imagePushedAt,
+    lifecyclePolicyPreviewResult_imageTags,
+
+    -- ** LifecyclePolicyPreviewSummary
+    lifecyclePolicyPreviewSummary_expiringImageTotalCount,
+
+    -- ** LifecyclePolicyRuleAction
+    lifecyclePolicyRuleAction_type,
+
+    -- ** ListImagesFilter
+    listImagesFilter_tagStatus,
+
+    -- ** PackageVulnerabilityDetails
+    packageVulnerabilityDetails_cvss,
+    packageVulnerabilityDetails_referenceUrls,
+    packageVulnerabilityDetails_relatedVulnerabilities,
+    packageVulnerabilityDetails_source,
+    packageVulnerabilityDetails_sourceUrl,
+    packageVulnerabilityDetails_vendorCreatedAt,
+    packageVulnerabilityDetails_vendorSeverity,
+    packageVulnerabilityDetails_vendorUpdatedAt,
+    packageVulnerabilityDetails_vulnerabilityId,
+    packageVulnerabilityDetails_vulnerablePackages,
+
+    -- ** PullThroughCacheRule
+    pullThroughCacheRule_createdAt,
+    pullThroughCacheRule_ecrRepositoryPrefix,
+    pullThroughCacheRule_registryId,
+    pullThroughCacheRule_upstreamRegistryUrl,
+
+    -- ** Recommendation
+    recommendation_text,
+    recommendation_url,
+
+    -- ** RegistryScanningConfiguration
+    registryScanningConfiguration_rules,
+    registryScanningConfiguration_scanType,
+
+    -- ** RegistryScanningRule
+    registryScanningRule_scanFrequency,
+    registryScanningRule_repositoryFilters,
+
+    -- ** Remediation
+    remediation_recommendation,
+
+    -- ** ReplicationConfiguration
+    replicationConfiguration_rules,
+
+    -- ** ReplicationDestination
+    replicationDestination_region,
+    replicationDestination_registryId,
+
+    -- ** ReplicationRule
+    replicationRule_repositoryFilters,
+    replicationRule_destinations,
+
+    -- ** Repository
+    repository_createdAt,
+    repository_encryptionConfiguration,
+    repository_imageScanningConfiguration,
+    repository_imageTagMutability,
+    repository_registryId,
+    repository_repositoryArn,
+    repository_repositoryName,
+    repository_repositoryUri,
+
+    -- ** RepositoryFilter
+    repositoryFilter_filter,
+    repositoryFilter_filterType,
+
+    -- ** RepositoryScanningConfiguration
+    repositoryScanningConfiguration_appliedScanFilters,
+    repositoryScanningConfiguration_repositoryArn,
+    repositoryScanningConfiguration_repositoryName,
+    repositoryScanningConfiguration_scanFrequency,
+    repositoryScanningConfiguration_scanOnPush,
+
+    -- ** RepositoryScanningConfigurationFailure
+    repositoryScanningConfigurationFailure_failureCode,
+    repositoryScanningConfigurationFailure_failureReason,
+    repositoryScanningConfigurationFailure_repositoryName,
+
+    -- ** Resource
+    resource_details,
+    resource_id,
+    resource_tags,
+    resource_type,
+
+    -- ** ResourceDetails
+    resourceDetails_awsEcrContainerImage,
+
+    -- ** ScanningRepositoryFilter
+    scanningRepositoryFilter_filter,
+    scanningRepositoryFilter_filterType,
+
+    -- ** ScoreDetails
+    scoreDetails_cvss,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** VulnerablePackage
+    vulnerablePackage_arch,
+    vulnerablePackage_epoch,
+    vulnerablePackage_filePath,
+    vulnerablePackage_name,
+    vulnerablePackage_packageManager,
+    vulnerablePackage_release,
+    vulnerablePackage_sourceLayerHash,
+    vulnerablePackage_version,
+  )
+where
+
+import Amazonka.ECR.BatchCheckLayerAvailability
+import Amazonka.ECR.BatchDeleteImage
+import Amazonka.ECR.BatchGetImage
+import Amazonka.ECR.BatchGetRepositoryScanningConfiguration
+import Amazonka.ECR.CompleteLayerUpload
+import Amazonka.ECR.CreatePullThroughCacheRule
+import Amazonka.ECR.CreateRepository
+import Amazonka.ECR.DeleteLifecyclePolicy
+import Amazonka.ECR.DeletePullThroughCacheRule
+import Amazonka.ECR.DeleteRegistryPolicy
+import Amazonka.ECR.DeleteRepository
+import Amazonka.ECR.DeleteRepositoryPolicy
+import Amazonka.ECR.DescribeImageReplicationStatus
+import Amazonka.ECR.DescribeImageScanFindings
+import Amazonka.ECR.DescribeImages
+import Amazonka.ECR.DescribePullThroughCacheRules
+import Amazonka.ECR.DescribeRegistry
+import Amazonka.ECR.DescribeRepositories
+import Amazonka.ECR.GetAuthorizationToken
+import Amazonka.ECR.GetDownloadUrlForLayer
+import Amazonka.ECR.GetLifecyclePolicy
+import Amazonka.ECR.GetLifecyclePolicyPreview
+import Amazonka.ECR.GetRegistryPolicy
+import Amazonka.ECR.GetRegistryScanningConfiguration
+import Amazonka.ECR.GetRepositoryPolicy
+import Amazonka.ECR.InitiateLayerUpload
+import Amazonka.ECR.ListImages
+import Amazonka.ECR.ListTagsForResource
+import Amazonka.ECR.PutImage
+import Amazonka.ECR.PutImageScanningConfiguration
+import Amazonka.ECR.PutImageTagMutability
+import Amazonka.ECR.PutLifecyclePolicy
+import Amazonka.ECR.PutRegistryPolicy
+import Amazonka.ECR.PutRegistryScanningConfiguration
+import Amazonka.ECR.PutReplicationConfiguration
+import Amazonka.ECR.SetRepositoryPolicy
+import Amazonka.ECR.StartImageScan
+import Amazonka.ECR.StartLifecyclePolicyPreview
+import Amazonka.ECR.TagResource
+import Amazonka.ECR.Types.Attribute
+import Amazonka.ECR.Types.AuthorizationData
+import Amazonka.ECR.Types.AwsEcrContainerImageDetails
+import Amazonka.ECR.Types.CvssScore
+import Amazonka.ECR.Types.CvssScoreAdjustment
+import Amazonka.ECR.Types.CvssScoreDetails
+import Amazonka.ECR.Types.DescribeImagesFilter
+import Amazonka.ECR.Types.EncryptionConfiguration
+import Amazonka.ECR.Types.EnhancedImageScanFinding
+import Amazonka.ECR.Types.Image
+import Amazonka.ECR.Types.ImageDetail
+import Amazonka.ECR.Types.ImageFailure
+import Amazonka.ECR.Types.ImageIdentifier
+import Amazonka.ECR.Types.ImageReplicationStatus
+import Amazonka.ECR.Types.ImageScanFinding
+import Amazonka.ECR.Types.ImageScanFindings
+import Amazonka.ECR.Types.ImageScanFindingsSummary
+import Amazonka.ECR.Types.ImageScanStatus
+import Amazonka.ECR.Types.ImageScanningConfiguration
+import Amazonka.ECR.Types.Layer
+import Amazonka.ECR.Types.LayerFailure
+import Amazonka.ECR.Types.LifecyclePolicyPreviewFilter
+import Amazonka.ECR.Types.LifecyclePolicyPreviewResult
+import Amazonka.ECR.Types.LifecyclePolicyPreviewSummary
+import Amazonka.ECR.Types.LifecyclePolicyRuleAction
+import Amazonka.ECR.Types.ListImagesFilter
+import Amazonka.ECR.Types.PackageVulnerabilityDetails
+import Amazonka.ECR.Types.PullThroughCacheRule
+import Amazonka.ECR.Types.Recommendation
+import Amazonka.ECR.Types.RegistryScanningConfiguration
+import Amazonka.ECR.Types.RegistryScanningRule
+import Amazonka.ECR.Types.Remediation
+import Amazonka.ECR.Types.ReplicationConfiguration
+import Amazonka.ECR.Types.ReplicationDestination
+import Amazonka.ECR.Types.ReplicationRule
+import Amazonka.ECR.Types.Repository
+import Amazonka.ECR.Types.RepositoryFilter
+import Amazonka.ECR.Types.RepositoryScanningConfiguration
+import Amazonka.ECR.Types.RepositoryScanningConfigurationFailure
+import Amazonka.ECR.Types.Resource
+import Amazonka.ECR.Types.ResourceDetails
+import Amazonka.ECR.Types.ScanningRepositoryFilter
+import Amazonka.ECR.Types.ScoreDetails
+import Amazonka.ECR.Types.Tag
+import Amazonka.ECR.Types.VulnerablePackage
+import Amazonka.ECR.UntagResource
+import Amazonka.ECR.UploadLayerPart
diff --git a/gen/Amazonka/ECR/ListImages.hs b/gen/Amazonka/ECR/ListImages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/ListImages.hs
@@ -0,0 +1,326 @@
+{-# 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.ECR.ListImages
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the image IDs for the specified repository.
+--
+-- You can filter images based on whether or not they are tagged by using
+-- the @tagStatus@ filter and specifying either @TAGGED@, @UNTAGGED@ or
+-- @ANY@. For example, you can filter your results to return only
+-- @UNTAGGED@ images and then pipe that result to a BatchDeleteImage
+-- operation to delete them. Or, you can filter your results to return only
+-- @TAGGED@ images to list all of the tags in your repository.
+--
+-- This operation returns paginated results.
+module Amazonka.ECR.ListImages
+  ( -- * Creating a Request
+    ListImages (..),
+    newListImages,
+
+    -- * Request Lenses
+    listImages_filter,
+    listImages_maxResults,
+    listImages_nextToken,
+    listImages_registryId,
+    listImages_repositoryName,
+
+    -- * Destructuring the Response
+    ListImagesResponse (..),
+    newListImagesResponse,
+
+    -- * Response Lenses
+    listImagesResponse_imageIds,
+    listImagesResponse_nextToken,
+    listImagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListImages' smart constructor.
+data ListImages = ListImages'
+  { -- | The filter key and value with which to filter your @ListImages@ results.
+    filter' :: Prelude.Maybe ListImagesFilter,
+    -- | The maximum number of image results returned by @ListImages@ in
+    -- paginated output. When this parameter is used, @ListImages@ only returns
+    -- @maxResults@ results in a single page along with a @nextToken@ response
+    -- element. The remaining results of the initial request can be seen by
+    -- sending another @ListImages@ request with the returned @nextToken@
+    -- value. This value can be between 1 and 1000. If this parameter is not
+    -- used, then @ListImages@ returns up to 100 results and a @nextToken@
+    -- value, if applicable.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated @ListImages@
+    -- request where @maxResults@ was used and the results exceeded the value
+    -- of that parameter. Pagination continues from the end of the previous
+    -- results that returned the @nextToken@ value. This value is @null@ when
+    -- there are no more results to return.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to list images. If you do not specify a
+    -- registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository with image IDs to be listed.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListImages' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'listImages_filter' - The filter key and value with which to filter your @ListImages@ results.
+--
+-- 'maxResults', 'listImages_maxResults' - The maximum number of image results returned by @ListImages@ in
+-- paginated output. When this parameter is used, @ListImages@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @ListImages@ request with the returned @nextToken@
+-- value. This value can be between 1 and 1000. If this parameter is not
+-- used, then @ListImages@ returns up to 100 results and a @nextToken@
+-- value, if applicable.
+--
+-- 'nextToken', 'listImages_nextToken' - The @nextToken@ value returned from a previous paginated @ListImages@
+-- request where @maxResults@ was used and the results exceeded the value
+-- of that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value. This value is @null@ when
+-- there are no more results to return.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+--
+-- 'registryId', 'listImages_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to list images. If you do not specify a
+-- registry, the default registry is assumed.
+--
+-- 'repositoryName', 'listImages_repositoryName' - The repository with image IDs to be listed.
+newListImages ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  ListImages
+newListImages pRepositoryName_ =
+  ListImages'
+    { filter' = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The filter key and value with which to filter your @ListImages@ results.
+listImages_filter :: Lens.Lens' ListImages (Prelude.Maybe ListImagesFilter)
+listImages_filter = Lens.lens (\ListImages' {filter'} -> filter') (\s@ListImages' {} a -> s {filter' = a} :: ListImages)
+
+-- | The maximum number of image results returned by @ListImages@ in
+-- paginated output. When this parameter is used, @ListImages@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @ListImages@ request with the returned @nextToken@
+-- value. This value can be between 1 and 1000. If this parameter is not
+-- used, then @ListImages@ returns up to 100 results and a @nextToken@
+-- value, if applicable.
+listImages_maxResults :: Lens.Lens' ListImages (Prelude.Maybe Prelude.Natural)
+listImages_maxResults = Lens.lens (\ListImages' {maxResults} -> maxResults) (\s@ListImages' {} a -> s {maxResults = a} :: ListImages)
+
+-- | The @nextToken@ value returned from a previous paginated @ListImages@
+-- request where @maxResults@ was used and the results exceeded the value
+-- of that parameter. Pagination continues from the end of the previous
+-- results that returned the @nextToken@ value. This value is @null@ when
+-- there are no more results to return.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+listImages_nextToken :: Lens.Lens' ListImages (Prelude.Maybe Prelude.Text)
+listImages_nextToken = Lens.lens (\ListImages' {nextToken} -> nextToken) (\s@ListImages' {} a -> s {nextToken = a} :: ListImages)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to list images. If you do not specify a
+-- registry, the default registry is assumed.
+listImages_registryId :: Lens.Lens' ListImages (Prelude.Maybe Prelude.Text)
+listImages_registryId = Lens.lens (\ListImages' {registryId} -> registryId) (\s@ListImages' {} a -> s {registryId = a} :: ListImages)
+
+-- | The repository with image IDs to be listed.
+listImages_repositoryName :: Lens.Lens' ListImages Prelude.Text
+listImages_repositoryName = Lens.lens (\ListImages' {repositoryName} -> repositoryName) (\s@ListImages' {} a -> s {repositoryName = a} :: ListImages)
+
+instance Core.AWSPager ListImages where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listImagesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listImagesResponse_imageIds
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listImages_nextToken
+          Lens..~ rs
+          Lens.^? listImagesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListImages where
+  type AWSResponse ListImages = ListImagesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListImagesResponse'
+            Prelude.<$> (x Data..?> "imageIds" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListImages where
+  hashWithSalt _salt ListImages' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData ListImages where
+  rnf ListImages' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders ListImages where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.ListImages" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListImages where
+  toJSON ListImages' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filter" Data..=) Prelude.<$> filter',
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath ListImages where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListImages where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListImagesResponse' smart constructor.
+data ListImagesResponse = ListImagesResponse'
+  { -- | The list of image IDs for the requested repository.
+    imageIds :: Prelude.Maybe [ImageIdentifier],
+    -- | The @nextToken@ value to include in a future @ListImages@ request. When
+    -- the results of a @ListImages@ request exceed @maxResults@, this value
+    -- can be used to retrieve the next page of results. This value is @null@
+    -- when there are no more results to return.
+    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 'ListImagesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageIds', 'listImagesResponse_imageIds' - The list of image IDs for the requested repository.
+--
+-- 'nextToken', 'listImagesResponse_nextToken' - The @nextToken@ value to include in a future @ListImages@ request. When
+-- the results of a @ListImages@ request exceed @maxResults@, this value
+-- can be used to retrieve the next page of results. This value is @null@
+-- when there are no more results to return.
+--
+-- 'httpStatus', 'listImagesResponse_httpStatus' - The response's http status code.
+newListImagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListImagesResponse
+newListImagesResponse pHttpStatus_ =
+  ListImagesResponse'
+    { imageIds = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of image IDs for the requested repository.
+listImagesResponse_imageIds :: Lens.Lens' ListImagesResponse (Prelude.Maybe [ImageIdentifier])
+listImagesResponse_imageIds = Lens.lens (\ListImagesResponse' {imageIds} -> imageIds) (\s@ListImagesResponse' {} a -> s {imageIds = a} :: ListImagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The @nextToken@ value to include in a future @ListImages@ request. When
+-- the results of a @ListImages@ request exceed @maxResults@, this value
+-- can be used to retrieve the next page of results. This value is @null@
+-- when there are no more results to return.
+listImagesResponse_nextToken :: Lens.Lens' ListImagesResponse (Prelude.Maybe Prelude.Text)
+listImagesResponse_nextToken = Lens.lens (\ListImagesResponse' {nextToken} -> nextToken) (\s@ListImagesResponse' {} a -> s {nextToken = a} :: ListImagesResponse)
+
+-- | The response's http status code.
+listImagesResponse_httpStatus :: Lens.Lens' ListImagesResponse Prelude.Int
+listImagesResponse_httpStatus = Lens.lens (\ListImagesResponse' {httpStatus} -> httpStatus) (\s@ListImagesResponse' {} a -> s {httpStatus = a} :: ListImagesResponse)
+
+instance Prelude.NFData ListImagesResponse where
+  rnf ListImagesResponse' {..} =
+    Prelude.rnf imageIds
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/ListTagsForResource.hs b/gen/Amazonka/ECR/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/ListTagsForResource.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.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)
+--
+-- List the tags for an Amazon ECR resource.
+module Amazonka.ECR.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.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) that identifies the resource for which to
+    -- list the tags. Currently, the only supported resource is an Amazon ECR
+    -- repository.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) that identifies the resource for which to
+-- list the tags. Currently, the only supported resource is an Amazon ECR
+-- repository.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) that identifies the resource for which to
+-- list the tags. Currently, the only supported resource is an Amazon ECR
+-- repository.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "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
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("resourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The tags for the resource.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The tags for the resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The tags for the resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+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/ECR/PutImage.hs b/gen/Amazonka/ECR/PutImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutImage.hs
@@ -0,0 +1,266 @@
+{-# 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.ECR.PutImage
+-- 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 or updates the image manifest and tags associated with an image.
+--
+-- When an image is pushed and all new image layers have been uploaded, the
+-- PutImage API is called once to create or update the image manifest and
+-- the tags associated with the image.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.PutImage
+  ( -- * Creating a Request
+    PutImage (..),
+    newPutImage,
+
+    -- * Request Lenses
+    putImage_imageDigest,
+    putImage_imageManifestMediaType,
+    putImage_imageTag,
+    putImage_registryId,
+    putImage_repositoryName,
+    putImage_imageManifest,
+
+    -- * Destructuring the Response
+    PutImageResponse (..),
+    newPutImageResponse,
+
+    -- * Response Lenses
+    putImageResponse_image,
+    putImageResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutImage' smart constructor.
+data PutImage = PutImage'
+  { -- | The image digest of the image manifest corresponding to the image.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The media type of the image manifest. If you push an image manifest that
+    -- does not contain the @mediaType@ field, you must specify the
+    -- @imageManifestMediaType@ in the request.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The tag to associate with the image. This parameter is required for
+    -- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+    -- Initiative (OCI) formats.
+    imageTag :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to put the image. If you do not specify
+    -- a registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository in which to put the image.
+    repositoryName :: Prelude.Text,
+    -- | The image manifest corresponding to the image to be uploaded.
+    imageManifest :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDigest', 'putImage_imageDigest' - The image digest of the image manifest corresponding to the image.
+--
+-- 'imageManifestMediaType', 'putImage_imageManifestMediaType' - The media type of the image manifest. If you push an image manifest that
+-- does not contain the @mediaType@ field, you must specify the
+-- @imageManifestMediaType@ in the request.
+--
+-- 'imageTag', 'putImage_imageTag' - The tag to associate with the image. This parameter is required for
+-- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+-- Initiative (OCI) formats.
+--
+-- 'registryId', 'putImage_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to put the image. If you do not specify
+-- a registry, the default registry is assumed.
+--
+-- 'repositoryName', 'putImage_repositoryName' - The name of the repository in which to put the image.
+--
+-- 'imageManifest', 'putImage_imageManifest' - The image manifest corresponding to the image to be uploaded.
+newPutImage ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageManifest'
+  Prelude.Text ->
+  PutImage
+newPutImage pRepositoryName_ pImageManifest_ =
+  PutImage'
+    { imageDigest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      imageTag = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageManifest = pImageManifest_
+    }
+
+-- | The image digest of the image manifest corresponding to the image.
+putImage_imageDigest :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageDigest = Lens.lens (\PutImage' {imageDigest} -> imageDigest) (\s@PutImage' {} a -> s {imageDigest = a} :: PutImage)
+
+-- | The media type of the image manifest. If you push an image manifest that
+-- does not contain the @mediaType@ field, you must specify the
+-- @imageManifestMediaType@ in the request.
+putImage_imageManifestMediaType :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageManifestMediaType = Lens.lens (\PutImage' {imageManifestMediaType} -> imageManifestMediaType) (\s@PutImage' {} a -> s {imageManifestMediaType = a} :: PutImage)
+
+-- | The tag to associate with the image. This parameter is required for
+-- images that use the Docker Image Manifest V2 Schema 2 or Open Container
+-- Initiative (OCI) formats.
+putImage_imageTag :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_imageTag = Lens.lens (\PutImage' {imageTag} -> imageTag) (\s@PutImage' {} a -> s {imageTag = a} :: PutImage)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to put the image. If you do not specify
+-- a registry, the default registry is assumed.
+putImage_registryId :: Lens.Lens' PutImage (Prelude.Maybe Prelude.Text)
+putImage_registryId = Lens.lens (\PutImage' {registryId} -> registryId) (\s@PutImage' {} a -> s {registryId = a} :: PutImage)
+
+-- | The name of the repository in which to put the image.
+putImage_repositoryName :: Lens.Lens' PutImage Prelude.Text
+putImage_repositoryName = Lens.lens (\PutImage' {repositoryName} -> repositoryName) (\s@PutImage' {} a -> s {repositoryName = a} :: PutImage)
+
+-- | The image manifest corresponding to the image to be uploaded.
+putImage_imageManifest :: Lens.Lens' PutImage Prelude.Text
+putImage_imageManifest = Lens.lens (\PutImage' {imageManifest} -> imageManifest) (\s@PutImage' {} a -> s {imageManifest = a} :: PutImage)
+
+instance Core.AWSRequest PutImage where
+  type AWSResponse PutImage = PutImageResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutImageResponse'
+            Prelude.<$> (x Data..?> "image")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutImage where
+  hashWithSalt _salt PutImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` imageTag
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageManifest
+
+instance Prelude.NFData PutImage where
+  rnf PutImage' {..} =
+    Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf imageTag
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageManifest
+
+instance Data.ToHeaders PutImage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutImage" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutImage where
+  toJSON PutImage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("imageDigest" Data..=) Prelude.<$> imageDigest,
+            ("imageManifestMediaType" Data..=)
+              Prelude.<$> imageManifestMediaType,
+            ("imageTag" Data..=) Prelude.<$> imageTag,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just
+              ("imageManifest" Data..= imageManifest)
+          ]
+      )
+
+instance Data.ToPath PutImage where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutImage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutImageResponse' smart constructor.
+data PutImageResponse = PutImageResponse'
+  { -- | Details of the image uploaded.
+    image :: Prelude.Maybe Image,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImageResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'image', 'putImageResponse_image' - Details of the image uploaded.
+--
+-- 'httpStatus', 'putImageResponse_httpStatus' - The response's http status code.
+newPutImageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutImageResponse
+newPutImageResponse pHttpStatus_ =
+  PutImageResponse'
+    { image = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details of the image uploaded.
+putImageResponse_image :: Lens.Lens' PutImageResponse (Prelude.Maybe Image)
+putImageResponse_image = Lens.lens (\PutImageResponse' {image} -> image) (\s@PutImageResponse' {} a -> s {image = a} :: PutImageResponse)
+
+-- | The response's http status code.
+putImageResponse_httpStatus :: Lens.Lens' PutImageResponse Prelude.Int
+putImageResponse_httpStatus = Lens.lens (\PutImageResponse' {httpStatus} -> httpStatus) (\s@PutImageResponse' {} a -> s {httpStatus = a} :: PutImageResponse)
+
+instance Prelude.NFData PutImageResponse where
+  rnf PutImageResponse' {..} =
+    Prelude.rnf image
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutImageScanningConfiguration.hs b/gen/Amazonka/ECR/PutImageScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutImageScanningConfiguration.hs
@@ -0,0 +1,264 @@
+{-# 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.ECR.PutImageScanningConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- The @PutImageScanningConfiguration@ API is being deprecated, in favor of
+-- specifying the image scanning configuration at the registry level. For
+-- more information, see PutRegistryScanningConfiguration.
+--
+-- Updates the image scanning configuration for the specified repository.
+module Amazonka.ECR.PutImageScanningConfiguration
+  ( -- * Creating a Request
+    PutImageScanningConfiguration (..),
+    newPutImageScanningConfiguration,
+
+    -- * Request Lenses
+    putImageScanningConfiguration_registryId,
+    putImageScanningConfiguration_repositoryName,
+    putImageScanningConfiguration_imageScanningConfiguration,
+
+    -- * Destructuring the Response
+    PutImageScanningConfigurationResponse (..),
+    newPutImageScanningConfigurationResponse,
+
+    -- * Response Lenses
+    putImageScanningConfigurationResponse_imageScanningConfiguration,
+    putImageScanningConfigurationResponse_registryId,
+    putImageScanningConfigurationResponse_repositoryName,
+    putImageScanningConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutImageScanningConfiguration' smart constructor.
+data PutImageScanningConfiguration = PutImageScanningConfiguration'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to update the image scanning
+    -- configuration setting. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository in which to update the image scanning
+    -- configuration setting.
+    repositoryName :: Prelude.Text,
+    -- | The image scanning configuration for the repository. This setting
+    -- determines whether images are scanned for known vulnerabilities after
+    -- being pushed to the repository.
+    imageScanningConfiguration :: ImageScanningConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImageScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'putImageScanningConfiguration_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to update the image scanning
+-- configuration setting. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'putImageScanningConfiguration_repositoryName' - The name of the repository in which to update the image scanning
+-- configuration setting.
+--
+-- 'imageScanningConfiguration', 'putImageScanningConfiguration_imageScanningConfiguration' - The image scanning configuration for the repository. This setting
+-- determines whether images are scanned for known vulnerabilities after
+-- being pushed to the repository.
+newPutImageScanningConfiguration ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageScanningConfiguration'
+  ImageScanningConfiguration ->
+  PutImageScanningConfiguration
+newPutImageScanningConfiguration
+  pRepositoryName_
+  pImageScanningConfiguration_ =
+    PutImageScanningConfiguration'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        imageScanningConfiguration =
+          pImageScanningConfiguration_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to update the image scanning
+-- configuration setting. If you do not specify a registry, the default
+-- registry is assumed.
+putImageScanningConfiguration_registryId :: Lens.Lens' PutImageScanningConfiguration (Prelude.Maybe Prelude.Text)
+putImageScanningConfiguration_registryId = Lens.lens (\PutImageScanningConfiguration' {registryId} -> registryId) (\s@PutImageScanningConfiguration' {} a -> s {registryId = a} :: PutImageScanningConfiguration)
+
+-- | The name of the repository in which to update the image scanning
+-- configuration setting.
+putImageScanningConfiguration_repositoryName :: Lens.Lens' PutImageScanningConfiguration Prelude.Text
+putImageScanningConfiguration_repositoryName = Lens.lens (\PutImageScanningConfiguration' {repositoryName} -> repositoryName) (\s@PutImageScanningConfiguration' {} a -> s {repositoryName = a} :: PutImageScanningConfiguration)
+
+-- | The image scanning configuration for the repository. This setting
+-- determines whether images are scanned for known vulnerabilities after
+-- being pushed to the repository.
+putImageScanningConfiguration_imageScanningConfiguration :: Lens.Lens' PutImageScanningConfiguration ImageScanningConfiguration
+putImageScanningConfiguration_imageScanningConfiguration = Lens.lens (\PutImageScanningConfiguration' {imageScanningConfiguration} -> imageScanningConfiguration) (\s@PutImageScanningConfiguration' {} a -> s {imageScanningConfiguration = a} :: PutImageScanningConfiguration)
+
+instance
+  Core.AWSRequest
+    PutImageScanningConfiguration
+  where
+  type
+    AWSResponse PutImageScanningConfiguration =
+      PutImageScanningConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutImageScanningConfigurationResponse'
+            Prelude.<$> (x Data..?> "imageScanningConfiguration")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    PutImageScanningConfiguration
+  where
+  hashWithSalt _salt PutImageScanningConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageScanningConfiguration
+
+instance Prelude.NFData PutImageScanningConfiguration where
+  rnf PutImageScanningConfiguration' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageScanningConfiguration
+
+instance Data.ToHeaders PutImageScanningConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutImageScanningConfiguration" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutImageScanningConfiguration where
+  toJSON PutImageScanningConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just
+              ( "imageScanningConfiguration"
+                  Data..= imageScanningConfiguration
+              )
+          ]
+      )
+
+instance Data.ToPath PutImageScanningConfiguration where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutImageScanningConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutImageScanningConfigurationResponse' smart constructor.
+data PutImageScanningConfigurationResponse = PutImageScanningConfigurationResponse'
+  { -- | The image scanning configuration setting for the repository.
+    imageScanningConfiguration :: Prelude.Maybe ImageScanningConfiguration,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'PutImageScanningConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageScanningConfiguration', 'putImageScanningConfigurationResponse_imageScanningConfiguration' - The image scanning configuration setting for the repository.
+--
+-- 'registryId', 'putImageScanningConfigurationResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'putImageScanningConfigurationResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'putImageScanningConfigurationResponse_httpStatus' - The response's http status code.
+newPutImageScanningConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutImageScanningConfigurationResponse
+newPutImageScanningConfigurationResponse pHttpStatus_ =
+  PutImageScanningConfigurationResponse'
+    { imageScanningConfiguration =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The image scanning configuration setting for the repository.
+putImageScanningConfigurationResponse_imageScanningConfiguration :: Lens.Lens' PutImageScanningConfigurationResponse (Prelude.Maybe ImageScanningConfiguration)
+putImageScanningConfigurationResponse_imageScanningConfiguration = Lens.lens (\PutImageScanningConfigurationResponse' {imageScanningConfiguration} -> imageScanningConfiguration) (\s@PutImageScanningConfigurationResponse' {} a -> s {imageScanningConfiguration = a} :: PutImageScanningConfigurationResponse)
+
+-- | The registry ID associated with the request.
+putImageScanningConfigurationResponse_registryId :: Lens.Lens' PutImageScanningConfigurationResponse (Prelude.Maybe Prelude.Text)
+putImageScanningConfigurationResponse_registryId = Lens.lens (\PutImageScanningConfigurationResponse' {registryId} -> registryId) (\s@PutImageScanningConfigurationResponse' {} a -> s {registryId = a} :: PutImageScanningConfigurationResponse)
+
+-- | The repository name associated with the request.
+putImageScanningConfigurationResponse_repositoryName :: Lens.Lens' PutImageScanningConfigurationResponse (Prelude.Maybe Prelude.Text)
+putImageScanningConfigurationResponse_repositoryName = Lens.lens (\PutImageScanningConfigurationResponse' {repositoryName} -> repositoryName) (\s@PutImageScanningConfigurationResponse' {} a -> s {repositoryName = a} :: PutImageScanningConfigurationResponse)
+
+-- | The response's http status code.
+putImageScanningConfigurationResponse_httpStatus :: Lens.Lens' PutImageScanningConfigurationResponse Prelude.Int
+putImageScanningConfigurationResponse_httpStatus = Lens.lens (\PutImageScanningConfigurationResponse' {httpStatus} -> httpStatus) (\s@PutImageScanningConfigurationResponse' {} a -> s {httpStatus = a} :: PutImageScanningConfigurationResponse)
+
+instance
+  Prelude.NFData
+    PutImageScanningConfigurationResponse
+  where
+  rnf PutImageScanningConfigurationResponse' {..} =
+    Prelude.rnf imageScanningConfiguration
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutImageTagMutability.hs b/gen/Amazonka/ECR/PutImageTagMutability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutImageTagMutability.hs
@@ -0,0 +1,254 @@
+{-# 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.ECR.PutImageTagMutability
+-- 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 image tag mutability settings for the specified repository.
+-- For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html Image tag mutability>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.PutImageTagMutability
+  ( -- * Creating a Request
+    PutImageTagMutability (..),
+    newPutImageTagMutability,
+
+    -- * Request Lenses
+    putImageTagMutability_registryId,
+    putImageTagMutability_repositoryName,
+    putImageTagMutability_imageTagMutability,
+
+    -- * Destructuring the Response
+    PutImageTagMutabilityResponse (..),
+    newPutImageTagMutabilityResponse,
+
+    -- * Response Lenses
+    putImageTagMutabilityResponse_imageTagMutability,
+    putImageTagMutabilityResponse_registryId,
+    putImageTagMutabilityResponse_repositoryName,
+    putImageTagMutabilityResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutImageTagMutability' smart constructor.
+data PutImageTagMutability = PutImageTagMutability'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to update the image tag mutability
+    -- settings. If you do not specify a registry, the default registry is
+    -- assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository in which to update the image tag mutability
+    -- settings.
+    repositoryName :: Prelude.Text,
+    -- | The tag mutability setting for the repository. If @MUTABLE@ is
+    -- specified, image tags can be overwritten. If @IMMUTABLE@ is specified,
+    -- all image tags within the repository will be immutable which will
+    -- prevent them from being overwritten.
+    imageTagMutability :: ImageTagMutability
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutImageTagMutability' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'putImageTagMutability_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to update the image tag mutability
+-- settings. If you do not specify a registry, the default registry is
+-- assumed.
+--
+-- 'repositoryName', 'putImageTagMutability_repositoryName' - The name of the repository in which to update the image tag mutability
+-- settings.
+--
+-- 'imageTagMutability', 'putImageTagMutability_imageTagMutability' - The tag mutability setting for the repository. If @MUTABLE@ is
+-- specified, image tags can be overwritten. If @IMMUTABLE@ is specified,
+-- all image tags within the repository will be immutable which will
+-- prevent them from being overwritten.
+newPutImageTagMutability ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageTagMutability'
+  ImageTagMutability ->
+  PutImageTagMutability
+newPutImageTagMutability
+  pRepositoryName_
+  pImageTagMutability_ =
+    PutImageTagMutability'
+      { registryId =
+          Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        imageTagMutability = pImageTagMutability_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to update the image tag mutability
+-- settings. If you do not specify a registry, the default registry is
+-- assumed.
+putImageTagMutability_registryId :: Lens.Lens' PutImageTagMutability (Prelude.Maybe Prelude.Text)
+putImageTagMutability_registryId = Lens.lens (\PutImageTagMutability' {registryId} -> registryId) (\s@PutImageTagMutability' {} a -> s {registryId = a} :: PutImageTagMutability)
+
+-- | The name of the repository in which to update the image tag mutability
+-- settings.
+putImageTagMutability_repositoryName :: Lens.Lens' PutImageTagMutability Prelude.Text
+putImageTagMutability_repositoryName = Lens.lens (\PutImageTagMutability' {repositoryName} -> repositoryName) (\s@PutImageTagMutability' {} a -> s {repositoryName = a} :: PutImageTagMutability)
+
+-- | The tag mutability setting for the repository. If @MUTABLE@ is
+-- specified, image tags can be overwritten. If @IMMUTABLE@ is specified,
+-- all image tags within the repository will be immutable which will
+-- prevent them from being overwritten.
+putImageTagMutability_imageTagMutability :: Lens.Lens' PutImageTagMutability ImageTagMutability
+putImageTagMutability_imageTagMutability = Lens.lens (\PutImageTagMutability' {imageTagMutability} -> imageTagMutability) (\s@PutImageTagMutability' {} a -> s {imageTagMutability = a} :: PutImageTagMutability)
+
+instance Core.AWSRequest PutImageTagMutability where
+  type
+    AWSResponse PutImageTagMutability =
+      PutImageTagMutabilityResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutImageTagMutabilityResponse'
+            Prelude.<$> (x Data..?> "imageTagMutability")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutImageTagMutability where
+  hashWithSalt _salt PutImageTagMutability' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageTagMutability
+
+instance Prelude.NFData PutImageTagMutability where
+  rnf PutImageTagMutability' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageTagMutability
+
+instance Data.ToHeaders PutImageTagMutability where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutImageTagMutability" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutImageTagMutability where
+  toJSON PutImageTagMutability' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just
+              ("imageTagMutability" Data..= imageTagMutability)
+          ]
+      )
+
+instance Data.ToPath PutImageTagMutability where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutImageTagMutability where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutImageTagMutabilityResponse' smart constructor.
+data PutImageTagMutabilityResponse = PutImageTagMutabilityResponse'
+  { -- | The image tag mutability setting for the repository.
+    imageTagMutability :: Prelude.Maybe ImageTagMutability,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'PutImageTagMutabilityResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageTagMutability', 'putImageTagMutabilityResponse_imageTagMutability' - The image tag mutability setting for the repository.
+--
+-- 'registryId', 'putImageTagMutabilityResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'putImageTagMutabilityResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'putImageTagMutabilityResponse_httpStatus' - The response's http status code.
+newPutImageTagMutabilityResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutImageTagMutabilityResponse
+newPutImageTagMutabilityResponse pHttpStatus_ =
+  PutImageTagMutabilityResponse'
+    { imageTagMutability =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The image tag mutability setting for the repository.
+putImageTagMutabilityResponse_imageTagMutability :: Lens.Lens' PutImageTagMutabilityResponse (Prelude.Maybe ImageTagMutability)
+putImageTagMutabilityResponse_imageTagMutability = Lens.lens (\PutImageTagMutabilityResponse' {imageTagMutability} -> imageTagMutability) (\s@PutImageTagMutabilityResponse' {} a -> s {imageTagMutability = a} :: PutImageTagMutabilityResponse)
+
+-- | The registry ID associated with the request.
+putImageTagMutabilityResponse_registryId :: Lens.Lens' PutImageTagMutabilityResponse (Prelude.Maybe Prelude.Text)
+putImageTagMutabilityResponse_registryId = Lens.lens (\PutImageTagMutabilityResponse' {registryId} -> registryId) (\s@PutImageTagMutabilityResponse' {} a -> s {registryId = a} :: PutImageTagMutabilityResponse)
+
+-- | The repository name associated with the request.
+putImageTagMutabilityResponse_repositoryName :: Lens.Lens' PutImageTagMutabilityResponse (Prelude.Maybe Prelude.Text)
+putImageTagMutabilityResponse_repositoryName = Lens.lens (\PutImageTagMutabilityResponse' {repositoryName} -> repositoryName) (\s@PutImageTagMutabilityResponse' {} a -> s {repositoryName = a} :: PutImageTagMutabilityResponse)
+
+-- | The response's http status code.
+putImageTagMutabilityResponse_httpStatus :: Lens.Lens' PutImageTagMutabilityResponse Prelude.Int
+putImageTagMutabilityResponse_httpStatus = Lens.lens (\PutImageTagMutabilityResponse' {httpStatus} -> httpStatus) (\s@PutImageTagMutabilityResponse' {} a -> s {httpStatus = a} :: PutImageTagMutabilityResponse)
+
+instance Prelude.NFData PutImageTagMutabilityResponse where
+  rnf PutImageTagMutabilityResponse' {..} =
+    Prelude.rnf imageTagMutability
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutLifecyclePolicy.hs b/gen/Amazonka/ECR/PutLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutLifecyclePolicy.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.ECR.PutLifecyclePolicy
+-- 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 or updates the lifecycle policy for the specified repository.
+-- For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html Lifecycle policy template>.
+module Amazonka.ECR.PutLifecyclePolicy
+  ( -- * Creating a Request
+    PutLifecyclePolicy (..),
+    newPutLifecyclePolicy,
+
+    -- * Request Lenses
+    putLifecyclePolicy_registryId,
+    putLifecyclePolicy_repositoryName,
+    putLifecyclePolicy_lifecyclePolicyText,
+
+    -- * Destructuring the Response
+    PutLifecyclePolicyResponse (..),
+    newPutLifecyclePolicyResponse,
+
+    -- * Response Lenses
+    putLifecyclePolicyResponse_lifecyclePolicyText,
+    putLifecyclePolicyResponse_registryId,
+    putLifecyclePolicyResponse_repositoryName,
+    putLifecyclePolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutLifecyclePolicy' smart constructor.
+data PutLifecyclePolicy = PutLifecyclePolicy'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do  not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to receive the policy.
+    repositoryName :: Prelude.Text,
+    -- | The JSON repository policy text to apply to the repository.
+    lifecyclePolicyText :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutLifecyclePolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'putLifecyclePolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do  not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'putLifecyclePolicy_repositoryName' - The name of the repository to receive the policy.
+--
+-- 'lifecyclePolicyText', 'putLifecyclePolicy_lifecyclePolicyText' - The JSON repository policy text to apply to the repository.
+newPutLifecyclePolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'lifecyclePolicyText'
+  Prelude.Text ->
+  PutLifecyclePolicy
+newPutLifecyclePolicy
+  pRepositoryName_
+  pLifecyclePolicyText_ =
+    PutLifecyclePolicy'
+      { registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        lifecyclePolicyText = pLifecyclePolicyText_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do  not specify a registry, the default
+-- registry is assumed.
+putLifecyclePolicy_registryId :: Lens.Lens' PutLifecyclePolicy (Prelude.Maybe Prelude.Text)
+putLifecyclePolicy_registryId = Lens.lens (\PutLifecyclePolicy' {registryId} -> registryId) (\s@PutLifecyclePolicy' {} a -> s {registryId = a} :: PutLifecyclePolicy)
+
+-- | The name of the repository to receive the policy.
+putLifecyclePolicy_repositoryName :: Lens.Lens' PutLifecyclePolicy Prelude.Text
+putLifecyclePolicy_repositoryName = Lens.lens (\PutLifecyclePolicy' {repositoryName} -> repositoryName) (\s@PutLifecyclePolicy' {} a -> s {repositoryName = a} :: PutLifecyclePolicy)
+
+-- | The JSON repository policy text to apply to the repository.
+putLifecyclePolicy_lifecyclePolicyText :: Lens.Lens' PutLifecyclePolicy Prelude.Text
+putLifecyclePolicy_lifecyclePolicyText = Lens.lens (\PutLifecyclePolicy' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@PutLifecyclePolicy' {} a -> s {lifecyclePolicyText = a} :: PutLifecyclePolicy)
+
+instance Core.AWSRequest PutLifecyclePolicy where
+  type
+    AWSResponse PutLifecyclePolicy =
+      PutLifecyclePolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutLifecyclePolicyResponse'
+            Prelude.<$> (x Data..?> "lifecyclePolicyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutLifecyclePolicy where
+  hashWithSalt _salt PutLifecyclePolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` lifecyclePolicyText
+
+instance Prelude.NFData PutLifecyclePolicy where
+  rnf PutLifecyclePolicy' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf lifecyclePolicyText
+
+instance Data.ToHeaders PutLifecyclePolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutLifecyclePolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutLifecyclePolicy where
+  toJSON PutLifecyclePolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just
+              ("lifecyclePolicyText" Data..= lifecyclePolicyText)
+          ]
+      )
+
+instance Data.ToPath PutLifecyclePolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutLifecyclePolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutLifecyclePolicyResponse' smart constructor.
+data PutLifecyclePolicyResponse = PutLifecyclePolicyResponse'
+  { -- | The JSON repository policy text.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'PutLifecyclePolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lifecyclePolicyText', 'putLifecyclePolicyResponse_lifecyclePolicyText' - The JSON repository policy text.
+--
+-- 'registryId', 'putLifecyclePolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'putLifecyclePolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'putLifecyclePolicyResponse_httpStatus' - The response's http status code.
+newPutLifecyclePolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutLifecyclePolicyResponse
+newPutLifecyclePolicyResponse pHttpStatus_ =
+  PutLifecyclePolicyResponse'
+    { lifecyclePolicyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy text.
+putLifecyclePolicyResponse_lifecyclePolicyText :: Lens.Lens' PutLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+putLifecyclePolicyResponse_lifecyclePolicyText = Lens.lens (\PutLifecyclePolicyResponse' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@PutLifecyclePolicyResponse' {} a -> s {lifecyclePolicyText = a} :: PutLifecyclePolicyResponse)
+
+-- | The registry ID associated with the request.
+putLifecyclePolicyResponse_registryId :: Lens.Lens' PutLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+putLifecyclePolicyResponse_registryId = Lens.lens (\PutLifecyclePolicyResponse' {registryId} -> registryId) (\s@PutLifecyclePolicyResponse' {} a -> s {registryId = a} :: PutLifecyclePolicyResponse)
+
+-- | The repository name associated with the request.
+putLifecyclePolicyResponse_repositoryName :: Lens.Lens' PutLifecyclePolicyResponse (Prelude.Maybe Prelude.Text)
+putLifecyclePolicyResponse_repositoryName = Lens.lens (\PutLifecyclePolicyResponse' {repositoryName} -> repositoryName) (\s@PutLifecyclePolicyResponse' {} a -> s {repositoryName = a} :: PutLifecyclePolicyResponse)
+
+-- | The response's http status code.
+putLifecyclePolicyResponse_httpStatus :: Lens.Lens' PutLifecyclePolicyResponse Prelude.Int
+putLifecyclePolicyResponse_httpStatus = Lens.lens (\PutLifecyclePolicyResponse' {httpStatus} -> httpStatus) (\s@PutLifecyclePolicyResponse' {} a -> s {httpStatus = a} :: PutLifecyclePolicyResponse)
+
+instance Prelude.NFData PutLifecyclePolicyResponse where
+  rnf PutLifecyclePolicyResponse' {..} =
+    Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutRegistryPolicy.hs b/gen/Amazonka/ECR/PutRegistryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutRegistryPolicy.hs
@@ -0,0 +1,195 @@
+{-# 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.ECR.PutRegistryPolicy
+-- 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 or updates the permissions policy for your registry.
+--
+-- A registry policy is used to specify permissions for another Amazon Web
+-- Services account and is used when configuring cross-account replication.
+-- For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html Registry permissions>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.PutRegistryPolicy
+  ( -- * Creating a Request
+    PutRegistryPolicy (..),
+    newPutRegistryPolicy,
+
+    -- * Request Lenses
+    putRegistryPolicy_policyText,
+
+    -- * Destructuring the Response
+    PutRegistryPolicyResponse (..),
+    newPutRegistryPolicyResponse,
+
+    -- * Response Lenses
+    putRegistryPolicyResponse_policyText,
+    putRegistryPolicyResponse_registryId,
+    putRegistryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutRegistryPolicy' smart constructor.
+data PutRegistryPolicy = PutRegistryPolicy'
+  { -- | The JSON policy text to apply to your registry. The policy text follows
+    -- the same format as IAM policy text. For more information, see
+    -- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html Registry permissions>
+    -- in the /Amazon Elastic Container Registry User Guide/.
+    policyText :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRegistryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'putRegistryPolicy_policyText' - The JSON policy text to apply to your registry. The policy text follows
+-- the same format as IAM policy text. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html Registry permissions>
+-- in the /Amazon Elastic Container Registry User Guide/.
+newPutRegistryPolicy ::
+  -- | 'policyText'
+  Prelude.Text ->
+  PutRegistryPolicy
+newPutRegistryPolicy pPolicyText_ =
+  PutRegistryPolicy' {policyText = pPolicyText_}
+
+-- | The JSON policy text to apply to your registry. The policy text follows
+-- the same format as IAM policy text. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html Registry permissions>
+-- in the /Amazon Elastic Container Registry User Guide/.
+putRegistryPolicy_policyText :: Lens.Lens' PutRegistryPolicy Prelude.Text
+putRegistryPolicy_policyText = Lens.lens (\PutRegistryPolicy' {policyText} -> policyText) (\s@PutRegistryPolicy' {} a -> s {policyText = a} :: PutRegistryPolicy)
+
+instance Core.AWSRequest PutRegistryPolicy where
+  type
+    AWSResponse PutRegistryPolicy =
+      PutRegistryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutRegistryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutRegistryPolicy where
+  hashWithSalt _salt PutRegistryPolicy' {..} =
+    _salt `Prelude.hashWithSalt` policyText
+
+instance Prelude.NFData PutRegistryPolicy where
+  rnf PutRegistryPolicy' {..} = Prelude.rnf policyText
+
+instance Data.ToHeaders PutRegistryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutRegistryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRegistryPolicy where
+  toJSON PutRegistryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("policyText" Data..= policyText)]
+      )
+
+instance Data.ToPath PutRegistryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutRegistryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRegistryPolicyResponse' smart constructor.
+data PutRegistryPolicyResponse = PutRegistryPolicyResponse'
+  { -- | The JSON policy text for your registry.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID.
+    registryId :: 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 'PutRegistryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'putRegistryPolicyResponse_policyText' - The JSON policy text for your registry.
+--
+-- 'registryId', 'putRegistryPolicyResponse_registryId' - The registry ID.
+--
+-- 'httpStatus', 'putRegistryPolicyResponse_httpStatus' - The response's http status code.
+newPutRegistryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutRegistryPolicyResponse
+newPutRegistryPolicyResponse pHttpStatus_ =
+  PutRegistryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON policy text for your registry.
+putRegistryPolicyResponse_policyText :: Lens.Lens' PutRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+putRegistryPolicyResponse_policyText = Lens.lens (\PutRegistryPolicyResponse' {policyText} -> policyText) (\s@PutRegistryPolicyResponse' {} a -> s {policyText = a} :: PutRegistryPolicyResponse)
+
+-- | The registry ID.
+putRegistryPolicyResponse_registryId :: Lens.Lens' PutRegistryPolicyResponse (Prelude.Maybe Prelude.Text)
+putRegistryPolicyResponse_registryId = Lens.lens (\PutRegistryPolicyResponse' {registryId} -> registryId) (\s@PutRegistryPolicyResponse' {} a -> s {registryId = a} :: PutRegistryPolicyResponse)
+
+-- | The response's http status code.
+putRegistryPolicyResponse_httpStatus :: Lens.Lens' PutRegistryPolicyResponse Prelude.Int
+putRegistryPolicyResponse_httpStatus = Lens.lens (\PutRegistryPolicyResponse' {httpStatus} -> httpStatus) (\s@PutRegistryPolicyResponse' {} a -> s {httpStatus = a} :: PutRegistryPolicyResponse)
+
+instance Prelude.NFData PutRegistryPolicyResponse where
+  rnf PutRegistryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutRegistryScanningConfiguration.hs b/gen/Amazonka/ECR/PutRegistryScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutRegistryScanningConfiguration.hs
@@ -0,0 +1,245 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.PutRegistryScanningConfiguration
+-- 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 or updates the scanning configuration for your private registry.
+module Amazonka.ECR.PutRegistryScanningConfiguration
+  ( -- * Creating a Request
+    PutRegistryScanningConfiguration (..),
+    newPutRegistryScanningConfiguration,
+
+    -- * Request Lenses
+    putRegistryScanningConfiguration_rules,
+    putRegistryScanningConfiguration_scanType,
+
+    -- * Destructuring the Response
+    PutRegistryScanningConfigurationResponse (..),
+    newPutRegistryScanningConfigurationResponse,
+
+    -- * Response Lenses
+    putRegistryScanningConfigurationResponse_registryScanningConfiguration,
+    putRegistryScanningConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutRegistryScanningConfiguration' smart constructor.
+data PutRegistryScanningConfiguration = PutRegistryScanningConfiguration'
+  { -- | The scanning rules to use for the registry. A scanning rule is used to
+    -- determine which repository filters are used and at what frequency
+    -- scanning will occur.
+    rules :: Prelude.Maybe [RegistryScanningRule],
+    -- | The scanning type to set for the registry.
+    --
+    -- When a registry scanning configuration is not defined, by default the
+    -- @BASIC@ scan type is used. When basic scanning is used, you may specify
+    -- filters to determine which individual repositories, or all repositories,
+    -- are scanned when new images are pushed to those repositories.
+    -- Alternatively, you can do manual scans of images with basic scanning.
+    --
+    -- When the @ENHANCED@ scan type is set, Amazon Inspector provides
+    -- automated vulnerability scanning. You may choose between continuous
+    -- scanning or scan on push and you may specify filters to determine which
+    -- individual repositories, or all repositories, are scanned.
+    scanType :: Prelude.Maybe ScanType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRegistryScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rules', 'putRegistryScanningConfiguration_rules' - The scanning rules to use for the registry. A scanning rule is used to
+-- determine which repository filters are used and at what frequency
+-- scanning will occur.
+--
+-- 'scanType', 'putRegistryScanningConfiguration_scanType' - The scanning type to set for the registry.
+--
+-- When a registry scanning configuration is not defined, by default the
+-- @BASIC@ scan type is used. When basic scanning is used, you may specify
+-- filters to determine which individual repositories, or all repositories,
+-- are scanned when new images are pushed to those repositories.
+-- Alternatively, you can do manual scans of images with basic scanning.
+--
+-- When the @ENHANCED@ scan type is set, Amazon Inspector provides
+-- automated vulnerability scanning. You may choose between continuous
+-- scanning or scan on push and you may specify filters to determine which
+-- individual repositories, or all repositories, are scanned.
+newPutRegistryScanningConfiguration ::
+  PutRegistryScanningConfiguration
+newPutRegistryScanningConfiguration =
+  PutRegistryScanningConfiguration'
+    { rules =
+        Prelude.Nothing,
+      scanType = Prelude.Nothing
+    }
+
+-- | The scanning rules to use for the registry. A scanning rule is used to
+-- determine which repository filters are used and at what frequency
+-- scanning will occur.
+putRegistryScanningConfiguration_rules :: Lens.Lens' PutRegistryScanningConfiguration (Prelude.Maybe [RegistryScanningRule])
+putRegistryScanningConfiguration_rules = Lens.lens (\PutRegistryScanningConfiguration' {rules} -> rules) (\s@PutRegistryScanningConfiguration' {} a -> s {rules = a} :: PutRegistryScanningConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The scanning type to set for the registry.
+--
+-- When a registry scanning configuration is not defined, by default the
+-- @BASIC@ scan type is used. When basic scanning is used, you may specify
+-- filters to determine which individual repositories, or all repositories,
+-- are scanned when new images are pushed to those repositories.
+-- Alternatively, you can do manual scans of images with basic scanning.
+--
+-- When the @ENHANCED@ scan type is set, Amazon Inspector provides
+-- automated vulnerability scanning. You may choose between continuous
+-- scanning or scan on push and you may specify filters to determine which
+-- individual repositories, or all repositories, are scanned.
+putRegistryScanningConfiguration_scanType :: Lens.Lens' PutRegistryScanningConfiguration (Prelude.Maybe ScanType)
+putRegistryScanningConfiguration_scanType = Lens.lens (\PutRegistryScanningConfiguration' {scanType} -> scanType) (\s@PutRegistryScanningConfiguration' {} a -> s {scanType = a} :: PutRegistryScanningConfiguration)
+
+instance
+  Core.AWSRequest
+    PutRegistryScanningConfiguration
+  where
+  type
+    AWSResponse PutRegistryScanningConfiguration =
+      PutRegistryScanningConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutRegistryScanningConfigurationResponse'
+            Prelude.<$> (x Data..?> "registryScanningConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    PutRegistryScanningConfiguration
+  where
+  hashWithSalt
+    _salt
+    PutRegistryScanningConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` rules
+        `Prelude.hashWithSalt` scanType
+
+instance
+  Prelude.NFData
+    PutRegistryScanningConfiguration
+  where
+  rnf PutRegistryScanningConfiguration' {..} =
+    Prelude.rnf rules
+      `Prelude.seq` Prelude.rnf scanType
+
+instance
+  Data.ToHeaders
+    PutRegistryScanningConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutRegistryScanningConfiguration" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRegistryScanningConfiguration where
+  toJSON PutRegistryScanningConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("rules" Data..=) Prelude.<$> rules,
+            ("scanType" Data..=) Prelude.<$> scanType
+          ]
+      )
+
+instance Data.ToPath PutRegistryScanningConfiguration where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    PutRegistryScanningConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRegistryScanningConfigurationResponse' smart constructor.
+data PutRegistryScanningConfigurationResponse = PutRegistryScanningConfigurationResponse'
+  { -- | The scanning configuration for your registry.
+    registryScanningConfiguration :: Prelude.Maybe RegistryScanningConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRegistryScanningConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryScanningConfiguration', 'putRegistryScanningConfigurationResponse_registryScanningConfiguration' - The scanning configuration for your registry.
+--
+-- 'httpStatus', 'putRegistryScanningConfigurationResponse_httpStatus' - The response's http status code.
+newPutRegistryScanningConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutRegistryScanningConfigurationResponse
+newPutRegistryScanningConfigurationResponse
+  pHttpStatus_ =
+    PutRegistryScanningConfigurationResponse'
+      { registryScanningConfiguration =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The scanning configuration for your registry.
+putRegistryScanningConfigurationResponse_registryScanningConfiguration :: Lens.Lens' PutRegistryScanningConfigurationResponse (Prelude.Maybe RegistryScanningConfiguration)
+putRegistryScanningConfigurationResponse_registryScanningConfiguration = Lens.lens (\PutRegistryScanningConfigurationResponse' {registryScanningConfiguration} -> registryScanningConfiguration) (\s@PutRegistryScanningConfigurationResponse' {} a -> s {registryScanningConfiguration = a} :: PutRegistryScanningConfigurationResponse)
+
+-- | The response's http status code.
+putRegistryScanningConfigurationResponse_httpStatus :: Lens.Lens' PutRegistryScanningConfigurationResponse Prelude.Int
+putRegistryScanningConfigurationResponse_httpStatus = Lens.lens (\PutRegistryScanningConfigurationResponse' {httpStatus} -> httpStatus) (\s@PutRegistryScanningConfigurationResponse' {} a -> s {httpStatus = a} :: PutRegistryScanningConfigurationResponse)
+
+instance
+  Prelude.NFData
+    PutRegistryScanningConfigurationResponse
+  where
+  rnf PutRegistryScanningConfigurationResponse' {..} =
+    Prelude.rnf registryScanningConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/PutReplicationConfiguration.hs b/gen/Amazonka/ECR/PutReplicationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/PutReplicationConfiguration.hs
@@ -0,0 +1,193 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.PutReplicationConfiguration
+-- 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 or updates the replication configuration for a registry. The
+-- existing replication configuration for a repository can be retrieved
+-- with the DescribeRegistry API action. The first time the
+-- PutReplicationConfiguration API is called, a service-linked IAM role is
+-- created in your account for the replication process. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html Using service-linked roles for Amazon ECR>
+-- in the /Amazon Elastic Container Registry User Guide/.
+--
+-- When configuring cross-account replication, the destination account must
+-- grant the source account permission to replicate. This permission is
+-- controlled using a registry permissions policy. For more information,
+-- see PutRegistryPolicy.
+module Amazonka.ECR.PutReplicationConfiguration
+  ( -- * Creating a Request
+    PutReplicationConfiguration (..),
+    newPutReplicationConfiguration,
+
+    -- * Request Lenses
+    putReplicationConfiguration_replicationConfiguration,
+
+    -- * Destructuring the Response
+    PutReplicationConfigurationResponse (..),
+    newPutReplicationConfigurationResponse,
+
+    -- * Response Lenses
+    putReplicationConfigurationResponse_replicationConfiguration,
+    putReplicationConfigurationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutReplicationConfiguration' smart constructor.
+data PutReplicationConfiguration = PutReplicationConfiguration'
+  { -- | An object representing the replication configuration for a registry.
+    replicationConfiguration :: ReplicationConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutReplicationConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'replicationConfiguration', 'putReplicationConfiguration_replicationConfiguration' - An object representing the replication configuration for a registry.
+newPutReplicationConfiguration ::
+  -- | 'replicationConfiguration'
+  ReplicationConfiguration ->
+  PutReplicationConfiguration
+newPutReplicationConfiguration
+  pReplicationConfiguration_ =
+    PutReplicationConfiguration'
+      { replicationConfiguration =
+          pReplicationConfiguration_
+      }
+
+-- | An object representing the replication configuration for a registry.
+putReplicationConfiguration_replicationConfiguration :: Lens.Lens' PutReplicationConfiguration ReplicationConfiguration
+putReplicationConfiguration_replicationConfiguration = Lens.lens (\PutReplicationConfiguration' {replicationConfiguration} -> replicationConfiguration) (\s@PutReplicationConfiguration' {} a -> s {replicationConfiguration = a} :: PutReplicationConfiguration)
+
+instance Core.AWSRequest PutReplicationConfiguration where
+  type
+    AWSResponse PutReplicationConfiguration =
+      PutReplicationConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutReplicationConfigurationResponse'
+            Prelude.<$> (x Data..?> "replicationConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutReplicationConfiguration where
+  hashWithSalt _salt PutReplicationConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` replicationConfiguration
+
+instance Prelude.NFData PutReplicationConfiguration where
+  rnf PutReplicationConfiguration' {..} =
+    Prelude.rnf replicationConfiguration
+
+instance Data.ToHeaders PutReplicationConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.PutReplicationConfiguration" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutReplicationConfiguration where
+  toJSON PutReplicationConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "replicationConfiguration"
+                  Data..= replicationConfiguration
+              )
+          ]
+      )
+
+instance Data.ToPath PutReplicationConfiguration where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery PutReplicationConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutReplicationConfigurationResponse' smart constructor.
+data PutReplicationConfigurationResponse = PutReplicationConfigurationResponse'
+  { -- | The contents of the replication configuration for the registry.
+    replicationConfiguration :: Prelude.Maybe ReplicationConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutReplicationConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'replicationConfiguration', 'putReplicationConfigurationResponse_replicationConfiguration' - The contents of the replication configuration for the registry.
+--
+-- 'httpStatus', 'putReplicationConfigurationResponse_httpStatus' - The response's http status code.
+newPutReplicationConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutReplicationConfigurationResponse
+newPutReplicationConfigurationResponse pHttpStatus_ =
+  PutReplicationConfigurationResponse'
+    { replicationConfiguration =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The contents of the replication configuration for the registry.
+putReplicationConfigurationResponse_replicationConfiguration :: Lens.Lens' PutReplicationConfigurationResponse (Prelude.Maybe ReplicationConfiguration)
+putReplicationConfigurationResponse_replicationConfiguration = Lens.lens (\PutReplicationConfigurationResponse' {replicationConfiguration} -> replicationConfiguration) (\s@PutReplicationConfigurationResponse' {} a -> s {replicationConfiguration = a} :: PutReplicationConfigurationResponse)
+
+-- | The response's http status code.
+putReplicationConfigurationResponse_httpStatus :: Lens.Lens' PutReplicationConfigurationResponse Prelude.Int
+putReplicationConfigurationResponse_httpStatus = Lens.lens (\PutReplicationConfigurationResponse' {httpStatus} -> httpStatus) (\s@PutReplicationConfigurationResponse' {} a -> s {httpStatus = a} :: PutReplicationConfigurationResponse)
+
+instance
+  Prelude.NFData
+    PutReplicationConfigurationResponse
+  where
+  rnf PutReplicationConfigurationResponse' {..} =
+    Prelude.rnf replicationConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/SetRepositoryPolicy.hs b/gen/Amazonka/ECR/SetRepositoryPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/SetRepositoryPolicy.hs
@@ -0,0 +1,266 @@
+{-# 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.ECR.SetRepositoryPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Applies a repository policy to the specified repository to control
+-- access permissions. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html Amazon ECR Repository policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.SetRepositoryPolicy
+  ( -- * Creating a Request
+    SetRepositoryPolicy (..),
+    newSetRepositoryPolicy,
+
+    -- * Request Lenses
+    setRepositoryPolicy_force,
+    setRepositoryPolicy_registryId,
+    setRepositoryPolicy_repositoryName,
+    setRepositoryPolicy_policyText,
+
+    -- * Destructuring the Response
+    SetRepositoryPolicyResponse (..),
+    newSetRepositoryPolicyResponse,
+
+    -- * Response Lenses
+    setRepositoryPolicyResponse_policyText,
+    setRepositoryPolicyResponse_registryId,
+    setRepositoryPolicyResponse_repositoryName,
+    setRepositoryPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSetRepositoryPolicy' smart constructor.
+data SetRepositoryPolicy = SetRepositoryPolicy'
+  { -- | If the policy you are attempting to set on a repository policy would
+    -- prevent you from setting another policy in the future, you must force
+    -- the SetRepositoryPolicy operation. This is intended to prevent
+    -- accidental repository lock outs.
+    force :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to receive the policy.
+    repositoryName :: Prelude.Text,
+    -- | The JSON repository policy text to apply to the repository. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR repository policies>
+    -- in the /Amazon Elastic Container Registry User Guide/.
+    policyText :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SetRepositoryPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'force', 'setRepositoryPolicy_force' - If the policy you are attempting to set on a repository policy would
+-- prevent you from setting another policy in the future, you must force
+-- the SetRepositoryPolicy operation. This is intended to prevent
+-- accidental repository lock outs.
+--
+-- 'registryId', 'setRepositoryPolicy_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'setRepositoryPolicy_repositoryName' - The name of the repository to receive the policy.
+--
+-- 'policyText', 'setRepositoryPolicy_policyText' - The JSON repository policy text to apply to the repository. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR repository policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+newSetRepositoryPolicy ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'policyText'
+  Prelude.Text ->
+  SetRepositoryPolicy
+newSetRepositoryPolicy pRepositoryName_ pPolicyText_ =
+  SetRepositoryPolicy'
+    { force = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      policyText = pPolicyText_
+    }
+
+-- | If the policy you are attempting to set on a repository policy would
+-- prevent you from setting another policy in the future, you must force
+-- the SetRepositoryPolicy operation. This is intended to prevent
+-- accidental repository lock outs.
+setRepositoryPolicy_force :: Lens.Lens' SetRepositoryPolicy (Prelude.Maybe Prelude.Bool)
+setRepositoryPolicy_force = Lens.lens (\SetRepositoryPolicy' {force} -> force) (\s@SetRepositoryPolicy' {} a -> s {force = a} :: SetRepositoryPolicy)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+setRepositoryPolicy_registryId :: Lens.Lens' SetRepositoryPolicy (Prelude.Maybe Prelude.Text)
+setRepositoryPolicy_registryId = Lens.lens (\SetRepositoryPolicy' {registryId} -> registryId) (\s@SetRepositoryPolicy' {} a -> s {registryId = a} :: SetRepositoryPolicy)
+
+-- | The name of the repository to receive the policy.
+setRepositoryPolicy_repositoryName :: Lens.Lens' SetRepositoryPolicy Prelude.Text
+setRepositoryPolicy_repositoryName = Lens.lens (\SetRepositoryPolicy' {repositoryName} -> repositoryName) (\s@SetRepositoryPolicy' {} a -> s {repositoryName = a} :: SetRepositoryPolicy)
+
+-- | The JSON repository policy text to apply to the repository. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html Amazon ECR repository policies>
+-- in the /Amazon Elastic Container Registry User Guide/.
+setRepositoryPolicy_policyText :: Lens.Lens' SetRepositoryPolicy Prelude.Text
+setRepositoryPolicy_policyText = Lens.lens (\SetRepositoryPolicy' {policyText} -> policyText) (\s@SetRepositoryPolicy' {} a -> s {policyText = a} :: SetRepositoryPolicy)
+
+instance Core.AWSRequest SetRepositoryPolicy where
+  type
+    AWSResponse SetRepositoryPolicy =
+      SetRepositoryPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SetRepositoryPolicyResponse'
+            Prelude.<$> (x Data..?> "policyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SetRepositoryPolicy where
+  hashWithSalt _salt SetRepositoryPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` force
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` policyText
+
+instance Prelude.NFData SetRepositoryPolicy where
+  rnf SetRepositoryPolicy' {..} =
+    Prelude.rnf force
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf policyText
+
+instance Data.ToHeaders SetRepositoryPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.SetRepositoryPolicy" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SetRepositoryPolicy where
+  toJSON SetRepositoryPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("force" Data..=) Prelude.<$> force,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("policyText" Data..= policyText)
+          ]
+      )
+
+instance Data.ToPath SetRepositoryPolicy where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery SetRepositoryPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSetRepositoryPolicyResponse' smart constructor.
+data SetRepositoryPolicyResponse = SetRepositoryPolicyResponse'
+  { -- | The JSON repository policy text applied to the repository.
+    policyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'SetRepositoryPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'policyText', 'setRepositoryPolicyResponse_policyText' - The JSON repository policy text applied to the repository.
+--
+-- 'registryId', 'setRepositoryPolicyResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'setRepositoryPolicyResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'setRepositoryPolicyResponse_httpStatus' - The response's http status code.
+newSetRepositoryPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SetRepositoryPolicyResponse
+newSetRepositoryPolicyResponse pHttpStatus_ =
+  SetRepositoryPolicyResponse'
+    { policyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy text applied to the repository.
+setRepositoryPolicyResponse_policyText :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_policyText = Lens.lens (\SetRepositoryPolicyResponse' {policyText} -> policyText) (\s@SetRepositoryPolicyResponse' {} a -> s {policyText = a} :: SetRepositoryPolicyResponse)
+
+-- | The registry ID associated with the request.
+setRepositoryPolicyResponse_registryId :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_registryId = Lens.lens (\SetRepositoryPolicyResponse' {registryId} -> registryId) (\s@SetRepositoryPolicyResponse' {} a -> s {registryId = a} :: SetRepositoryPolicyResponse)
+
+-- | The repository name associated with the request.
+setRepositoryPolicyResponse_repositoryName :: Lens.Lens' SetRepositoryPolicyResponse (Prelude.Maybe Prelude.Text)
+setRepositoryPolicyResponse_repositoryName = Lens.lens (\SetRepositoryPolicyResponse' {repositoryName} -> repositoryName) (\s@SetRepositoryPolicyResponse' {} a -> s {repositoryName = a} :: SetRepositoryPolicyResponse)
+
+-- | The response's http status code.
+setRepositoryPolicyResponse_httpStatus :: Lens.Lens' SetRepositoryPolicyResponse Prelude.Int
+setRepositoryPolicyResponse_httpStatus = Lens.lens (\SetRepositoryPolicyResponse' {httpStatus} -> httpStatus) (\s@SetRepositoryPolicyResponse' {} a -> s {httpStatus = a} :: SetRepositoryPolicyResponse)
+
+instance Prelude.NFData SetRepositoryPolicyResponse where
+  rnf SetRepositoryPolicyResponse' {..} =
+    Prelude.rnf policyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/StartImageScan.hs b/gen/Amazonka/ECR/StartImageScan.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/StartImageScan.hs
@@ -0,0 +1,245 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.StartImageScan
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts an image vulnerability scan. An image scan can only be started
+-- once per 24 hours on an individual image. This limit includes if an
+-- image was scanned on initial push. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html Image scanning>
+-- in the /Amazon Elastic Container Registry User Guide/.
+module Amazonka.ECR.StartImageScan
+  ( -- * Creating a Request
+    StartImageScan (..),
+    newStartImageScan,
+
+    -- * Request Lenses
+    startImageScan_registryId,
+    startImageScan_repositoryName,
+    startImageScan_imageId,
+
+    -- * Destructuring the Response
+    StartImageScanResponse (..),
+    newStartImageScanResponse,
+
+    -- * Response Lenses
+    startImageScanResponse_imageId,
+    startImageScanResponse_imageScanStatus,
+    startImageScanResponse_registryId,
+    startImageScanResponse_repositoryName,
+    startImageScanResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartImageScan' smart constructor.
+data StartImageScan = StartImageScan'
+  { -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository in which to start an image scan request. If you
+    -- do not specify a registry, the default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository that contains the images to scan.
+    repositoryName :: Prelude.Text,
+    imageId :: ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartImageScan' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'startImageScan_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to start an image scan request. If you
+-- do not specify a registry, the default registry is assumed.
+--
+-- 'repositoryName', 'startImageScan_repositoryName' - The name of the repository that contains the images to scan.
+--
+-- 'imageId', 'startImageScan_imageId' - Undocumented member.
+newStartImageScan ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'imageId'
+  ImageIdentifier ->
+  StartImageScan
+newStartImageScan pRepositoryName_ pImageId_ =
+  StartImageScan'
+    { registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_,
+      imageId = pImageId_
+    }
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository in which to start an image scan request. If you
+-- do not specify a registry, the default registry is assumed.
+startImageScan_registryId :: Lens.Lens' StartImageScan (Prelude.Maybe Prelude.Text)
+startImageScan_registryId = Lens.lens (\StartImageScan' {registryId} -> registryId) (\s@StartImageScan' {} a -> s {registryId = a} :: StartImageScan)
+
+-- | The name of the repository that contains the images to scan.
+startImageScan_repositoryName :: Lens.Lens' StartImageScan Prelude.Text
+startImageScan_repositoryName = Lens.lens (\StartImageScan' {repositoryName} -> repositoryName) (\s@StartImageScan' {} a -> s {repositoryName = a} :: StartImageScan)
+
+-- | Undocumented member.
+startImageScan_imageId :: Lens.Lens' StartImageScan ImageIdentifier
+startImageScan_imageId = Lens.lens (\StartImageScan' {imageId} -> imageId) (\s@StartImageScan' {} a -> s {imageId = a} :: StartImageScan)
+
+instance Core.AWSRequest StartImageScan where
+  type
+    AWSResponse StartImageScan =
+      StartImageScanResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartImageScanResponse'
+            Prelude.<$> (x Data..?> "imageId")
+            Prelude.<*> (x Data..?> "imageScanStatus")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartImageScan where
+  hashWithSalt _salt StartImageScan' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` imageId
+
+instance Prelude.NFData StartImageScan where
+  rnf StartImageScan' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf imageId
+
+instance Data.ToHeaders StartImageScan where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.StartImageScan" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartImageScan where
+  toJSON StartImageScan' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("imageId" Data..= imageId)
+          ]
+      )
+
+instance Data.ToPath StartImageScan where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartImageScan where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartImageScanResponse' smart constructor.
+data StartImageScanResponse = StartImageScanResponse'
+  { imageId :: Prelude.Maybe ImageIdentifier,
+    -- | The current state of the scan.
+    imageScanStatus :: Prelude.Maybe ImageScanStatus,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: 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 'StartImageScanResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageId', 'startImageScanResponse_imageId' - Undocumented member.
+--
+-- 'imageScanStatus', 'startImageScanResponse_imageScanStatus' - The current state of the scan.
+--
+-- 'registryId', 'startImageScanResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'startImageScanResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'httpStatus', 'startImageScanResponse_httpStatus' - The response's http status code.
+newStartImageScanResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartImageScanResponse
+newStartImageScanResponse pHttpStatus_ =
+  StartImageScanResponse'
+    { imageId = Prelude.Nothing,
+      imageScanStatus = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Undocumented member.
+startImageScanResponse_imageId :: Lens.Lens' StartImageScanResponse (Prelude.Maybe ImageIdentifier)
+startImageScanResponse_imageId = Lens.lens (\StartImageScanResponse' {imageId} -> imageId) (\s@StartImageScanResponse' {} a -> s {imageId = a} :: StartImageScanResponse)
+
+-- | The current state of the scan.
+startImageScanResponse_imageScanStatus :: Lens.Lens' StartImageScanResponse (Prelude.Maybe ImageScanStatus)
+startImageScanResponse_imageScanStatus = Lens.lens (\StartImageScanResponse' {imageScanStatus} -> imageScanStatus) (\s@StartImageScanResponse' {} a -> s {imageScanStatus = a} :: StartImageScanResponse)
+
+-- | The registry ID associated with the request.
+startImageScanResponse_registryId :: Lens.Lens' StartImageScanResponse (Prelude.Maybe Prelude.Text)
+startImageScanResponse_registryId = Lens.lens (\StartImageScanResponse' {registryId} -> registryId) (\s@StartImageScanResponse' {} a -> s {registryId = a} :: StartImageScanResponse)
+
+-- | The repository name associated with the request.
+startImageScanResponse_repositoryName :: Lens.Lens' StartImageScanResponse (Prelude.Maybe Prelude.Text)
+startImageScanResponse_repositoryName = Lens.lens (\StartImageScanResponse' {repositoryName} -> repositoryName) (\s@StartImageScanResponse' {} a -> s {repositoryName = a} :: StartImageScanResponse)
+
+-- | The response's http status code.
+startImageScanResponse_httpStatus :: Lens.Lens' StartImageScanResponse Prelude.Int
+startImageScanResponse_httpStatus = Lens.lens (\StartImageScanResponse' {httpStatus} -> httpStatus) (\s@StartImageScanResponse' {} a -> s {httpStatus = a} :: StartImageScanResponse)
+
+instance Prelude.NFData StartImageScanResponse where
+  rnf StartImageScanResponse' {..} =
+    Prelude.rnf imageId
+      `Prelude.seq` Prelude.rnf imageScanStatus
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/StartLifecyclePolicyPreview.hs b/gen/Amazonka/ECR/StartLifecyclePolicyPreview.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/StartLifecyclePolicyPreview.hs
@@ -0,0 +1,252 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.StartLifecyclePolicyPreview
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a preview of a lifecycle policy for the specified repository.
+-- This allows you to see the results before associating the lifecycle
+-- policy with the repository.
+module Amazonka.ECR.StartLifecyclePolicyPreview
+  ( -- * Creating a Request
+    StartLifecyclePolicyPreview (..),
+    newStartLifecyclePolicyPreview,
+
+    -- * Request Lenses
+    startLifecyclePolicyPreview_lifecyclePolicyText,
+    startLifecyclePolicyPreview_registryId,
+    startLifecyclePolicyPreview_repositoryName,
+
+    -- * Destructuring the Response
+    StartLifecyclePolicyPreviewResponse (..),
+    newStartLifecyclePolicyPreviewResponse,
+
+    -- * Response Lenses
+    startLifecyclePolicyPreviewResponse_lifecyclePolicyText,
+    startLifecyclePolicyPreviewResponse_registryId,
+    startLifecyclePolicyPreviewResponse_repositoryName,
+    startLifecyclePolicyPreviewResponse_status,
+    startLifecyclePolicyPreviewResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartLifecyclePolicyPreview' smart constructor.
+data StartLifecyclePolicyPreview = StartLifecyclePolicyPreview'
+  { -- | The policy to be evaluated against. If you do not specify a policy, the
+    -- current policy for the repository is used.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository. If you do not specify a registry, the default
+    -- registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to be evaluated.
+    repositoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartLifecyclePolicyPreview' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lifecyclePolicyText', 'startLifecyclePolicyPreview_lifecyclePolicyText' - The policy to be evaluated against. If you do not specify a policy, the
+-- current policy for the repository is used.
+--
+-- 'registryId', 'startLifecyclePolicyPreview_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+--
+-- 'repositoryName', 'startLifecyclePolicyPreview_repositoryName' - The name of the repository to be evaluated.
+newStartLifecyclePolicyPreview ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  StartLifecyclePolicyPreview
+newStartLifecyclePolicyPreview pRepositoryName_ =
+  StartLifecyclePolicyPreview'
+    { lifecyclePolicyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = pRepositoryName_
+    }
+
+-- | The policy to be evaluated against. If you do not specify a policy, the
+-- current policy for the repository is used.
+startLifecyclePolicyPreview_lifecyclePolicyText :: Lens.Lens' StartLifecyclePolicyPreview (Prelude.Maybe Prelude.Text)
+startLifecyclePolicyPreview_lifecyclePolicyText = Lens.lens (\StartLifecyclePolicyPreview' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@StartLifecyclePolicyPreview' {} a -> s {lifecyclePolicyText = a} :: StartLifecyclePolicyPreview)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository. If you do not specify a registry, the default
+-- registry is assumed.
+startLifecyclePolicyPreview_registryId :: Lens.Lens' StartLifecyclePolicyPreview (Prelude.Maybe Prelude.Text)
+startLifecyclePolicyPreview_registryId = Lens.lens (\StartLifecyclePolicyPreview' {registryId} -> registryId) (\s@StartLifecyclePolicyPreview' {} a -> s {registryId = a} :: StartLifecyclePolicyPreview)
+
+-- | The name of the repository to be evaluated.
+startLifecyclePolicyPreview_repositoryName :: Lens.Lens' StartLifecyclePolicyPreview Prelude.Text
+startLifecyclePolicyPreview_repositoryName = Lens.lens (\StartLifecyclePolicyPreview' {repositoryName} -> repositoryName) (\s@StartLifecyclePolicyPreview' {} a -> s {repositoryName = a} :: StartLifecyclePolicyPreview)
+
+instance Core.AWSRequest StartLifecyclePolicyPreview where
+  type
+    AWSResponse StartLifecyclePolicyPreview =
+      StartLifecyclePolicyPreviewResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartLifecyclePolicyPreviewResponse'
+            Prelude.<$> (x Data..?> "lifecyclePolicyText")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartLifecyclePolicyPreview where
+  hashWithSalt _salt StartLifecyclePolicyPreview' {..} =
+    _salt
+      `Prelude.hashWithSalt` lifecyclePolicyText
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData StartLifecyclePolicyPreview where
+  rnf StartLifecyclePolicyPreview' {..} =
+    Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+
+instance Data.ToHeaders StartLifecyclePolicyPreview where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.StartLifecyclePolicyPreview" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartLifecyclePolicyPreview where
+  toJSON StartLifecyclePolicyPreview' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("lifecyclePolicyText" Data..=)
+              Prelude.<$> lifecyclePolicyText,
+            ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName)
+          ]
+      )
+
+instance Data.ToPath StartLifecyclePolicyPreview where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartLifecyclePolicyPreview where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartLifecyclePolicyPreviewResponse' smart constructor.
+data StartLifecyclePolicyPreviewResponse = StartLifecyclePolicyPreviewResponse'
+  { -- | The JSON repository policy text.
+    lifecyclePolicyText :: Prelude.Maybe Prelude.Text,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the lifecycle policy preview request.
+    status :: Prelude.Maybe LifecyclePolicyPreviewStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartLifecyclePolicyPreviewResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lifecyclePolicyText', 'startLifecyclePolicyPreviewResponse_lifecyclePolicyText' - The JSON repository policy text.
+--
+-- 'registryId', 'startLifecyclePolicyPreviewResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'startLifecyclePolicyPreviewResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'status', 'startLifecyclePolicyPreviewResponse_status' - The status of the lifecycle policy preview request.
+--
+-- 'httpStatus', 'startLifecyclePolicyPreviewResponse_httpStatus' - The response's http status code.
+newStartLifecyclePolicyPreviewResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartLifecyclePolicyPreviewResponse
+newStartLifecyclePolicyPreviewResponse pHttpStatus_ =
+  StartLifecyclePolicyPreviewResponse'
+    { lifecyclePolicyText =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The JSON repository policy text.
+startLifecyclePolicyPreviewResponse_lifecyclePolicyText :: Lens.Lens' StartLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+startLifecyclePolicyPreviewResponse_lifecyclePolicyText = Lens.lens (\StartLifecyclePolicyPreviewResponse' {lifecyclePolicyText} -> lifecyclePolicyText) (\s@StartLifecyclePolicyPreviewResponse' {} a -> s {lifecyclePolicyText = a} :: StartLifecyclePolicyPreviewResponse)
+
+-- | The registry ID associated with the request.
+startLifecyclePolicyPreviewResponse_registryId :: Lens.Lens' StartLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+startLifecyclePolicyPreviewResponse_registryId = Lens.lens (\StartLifecyclePolicyPreviewResponse' {registryId} -> registryId) (\s@StartLifecyclePolicyPreviewResponse' {} a -> s {registryId = a} :: StartLifecyclePolicyPreviewResponse)
+
+-- | The repository name associated with the request.
+startLifecyclePolicyPreviewResponse_repositoryName :: Lens.Lens' StartLifecyclePolicyPreviewResponse (Prelude.Maybe Prelude.Text)
+startLifecyclePolicyPreviewResponse_repositoryName = Lens.lens (\StartLifecyclePolicyPreviewResponse' {repositoryName} -> repositoryName) (\s@StartLifecyclePolicyPreviewResponse' {} a -> s {repositoryName = a} :: StartLifecyclePolicyPreviewResponse)
+
+-- | The status of the lifecycle policy preview request.
+startLifecyclePolicyPreviewResponse_status :: Lens.Lens' StartLifecyclePolicyPreviewResponse (Prelude.Maybe LifecyclePolicyPreviewStatus)
+startLifecyclePolicyPreviewResponse_status = Lens.lens (\StartLifecyclePolicyPreviewResponse' {status} -> status) (\s@StartLifecyclePolicyPreviewResponse' {} a -> s {status = a} :: StartLifecyclePolicyPreviewResponse)
+
+-- | The response's http status code.
+startLifecyclePolicyPreviewResponse_httpStatus :: Lens.Lens' StartLifecyclePolicyPreviewResponse Prelude.Int
+startLifecyclePolicyPreviewResponse_httpStatus = Lens.lens (\StartLifecyclePolicyPreviewResponse' {httpStatus} -> httpStatus) (\s@StartLifecyclePolicyPreviewResponse' {} a -> s {httpStatus = a} :: StartLifecyclePolicyPreviewResponse)
+
+instance
+  Prelude.NFData
+    StartLifecyclePolicyPreviewResponse
+  where
+  rnf StartLifecyclePolicyPreviewResponse' {..} =
+    Prelude.rnf lifecyclePolicyText
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/TagResource.hs b/gen/Amazonka/ECR/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/TagResource.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds specified tags to a resource with the specified ARN. Existing tags
+-- on a resource are not changed if they are not specified in the request
+-- parameters.
+module Amazonka.ECR.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.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the the resource to which to add tags.
+    -- Currently, the only supported resource is an Amazon ECR repository.
+    resourceArn :: Prelude.Text,
+    -- | The tags to add to the resource. A tag is an array of key-value pairs.
+    -- Tag keys can have a maximum character length of 128 characters, and tag
+    -- values can have a maximum length of 256 characters.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the the resource to which to add tags.
+-- Currently, the only supported resource is an Amazon ECR repository.
+--
+-- 'tags', 'tagResource_tags' - The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the the resource to which to add tags.
+-- Currently, the only supported resource is an Amazon ECR repository.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The tags to add to the resource. A tag is an array of key-value pairs.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+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
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.TagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+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/ECR/Types.hs b/gen/Amazonka/ECR/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types.hs
@@ -0,0 +1,835 @@
+{-# 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.ECR.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.ECR.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _EmptyUploadException,
+    _ImageAlreadyExistsException,
+    _ImageDigestDoesNotMatchException,
+    _ImageNotFoundException,
+    _ImageTagAlreadyExistsException,
+    _InvalidLayerException,
+    _InvalidLayerPartException,
+    _InvalidParameterException,
+    _InvalidTagParameterException,
+    _KmsException,
+    _LayerAlreadyExistsException,
+    _LayerInaccessibleException,
+    _LayerPartTooSmallException,
+    _LayersNotFoundException,
+    _LifecyclePolicyNotFoundException,
+    _LifecyclePolicyPreviewInProgressException,
+    _LifecyclePolicyPreviewNotFoundException,
+    _LimitExceededException,
+    _PullThroughCacheRuleAlreadyExistsException,
+    _PullThroughCacheRuleNotFoundException,
+    _ReferencedImagesNotFoundException,
+    _RegistryPolicyNotFoundException,
+    _RepositoryAlreadyExistsException,
+    _RepositoryNotEmptyException,
+    _RepositoryNotFoundException,
+    _RepositoryPolicyNotFoundException,
+    _ScanNotFoundException,
+    _ServerException,
+    _TooManyTagsException,
+    _UnsupportedImageTypeException,
+    _UnsupportedUpstreamRegistryException,
+    _UploadNotFoundException,
+    _ValidationException,
+
+    -- * EncryptionType
+    EncryptionType (..),
+
+    -- * FindingSeverity
+    FindingSeverity (..),
+
+    -- * ImageActionType
+    ImageActionType (..),
+
+    -- * ImageFailureCode
+    ImageFailureCode (..),
+
+    -- * ImageTagMutability
+    ImageTagMutability (..),
+
+    -- * LayerAvailability
+    LayerAvailability (..),
+
+    -- * LayerFailureCode
+    LayerFailureCode (..),
+
+    -- * LifecyclePolicyPreviewStatus
+    LifecyclePolicyPreviewStatus (..),
+
+    -- * ReplicationStatus
+    ReplicationStatus (..),
+
+    -- * RepositoryFilterType
+    RepositoryFilterType (..),
+
+    -- * ScanFrequency
+    ScanFrequency (..),
+
+    -- * ScanStatus
+    ScanStatus (..),
+
+    -- * ScanType
+    ScanType (..),
+
+    -- * ScanningConfigurationFailureCode
+    ScanningConfigurationFailureCode (..),
+
+    -- * ScanningRepositoryFilterType
+    ScanningRepositoryFilterType (..),
+
+    -- * TagStatus
+    TagStatus (..),
+
+    -- * Attribute
+    Attribute (..),
+    newAttribute,
+    attribute_value,
+    attribute_key,
+
+    -- * AuthorizationData
+    AuthorizationData (..),
+    newAuthorizationData,
+    authorizationData_authorizationToken,
+    authorizationData_expiresAt,
+    authorizationData_proxyEndpoint,
+
+    -- * AwsEcrContainerImageDetails
+    AwsEcrContainerImageDetails (..),
+    newAwsEcrContainerImageDetails,
+    awsEcrContainerImageDetails_architecture,
+    awsEcrContainerImageDetails_author,
+    awsEcrContainerImageDetails_imageHash,
+    awsEcrContainerImageDetails_imageTags,
+    awsEcrContainerImageDetails_platform,
+    awsEcrContainerImageDetails_pushedAt,
+    awsEcrContainerImageDetails_registry,
+    awsEcrContainerImageDetails_repositoryName,
+
+    -- * CvssScore
+    CvssScore (..),
+    newCvssScore,
+    cvssScore_baseScore,
+    cvssScore_scoringVector,
+    cvssScore_source,
+    cvssScore_version,
+
+    -- * CvssScoreAdjustment
+    CvssScoreAdjustment (..),
+    newCvssScoreAdjustment,
+    cvssScoreAdjustment_metric,
+    cvssScoreAdjustment_reason,
+
+    -- * CvssScoreDetails
+    CvssScoreDetails (..),
+    newCvssScoreDetails,
+    cvssScoreDetails_adjustments,
+    cvssScoreDetails_score,
+    cvssScoreDetails_scoreSource,
+    cvssScoreDetails_scoringVector,
+    cvssScoreDetails_version,
+
+    -- * DescribeImagesFilter
+    DescribeImagesFilter (..),
+    newDescribeImagesFilter,
+    describeImagesFilter_tagStatus,
+
+    -- * EncryptionConfiguration
+    EncryptionConfiguration (..),
+    newEncryptionConfiguration,
+    encryptionConfiguration_kmsKey,
+    encryptionConfiguration_encryptionType,
+
+    -- * EnhancedImageScanFinding
+    EnhancedImageScanFinding (..),
+    newEnhancedImageScanFinding,
+    enhancedImageScanFinding_awsAccountId,
+    enhancedImageScanFinding_description,
+    enhancedImageScanFinding_findingArn,
+    enhancedImageScanFinding_firstObservedAt,
+    enhancedImageScanFinding_lastObservedAt,
+    enhancedImageScanFinding_packageVulnerabilityDetails,
+    enhancedImageScanFinding_remediation,
+    enhancedImageScanFinding_resources,
+    enhancedImageScanFinding_score,
+    enhancedImageScanFinding_scoreDetails,
+    enhancedImageScanFinding_severity,
+    enhancedImageScanFinding_status,
+    enhancedImageScanFinding_title,
+    enhancedImageScanFinding_type,
+    enhancedImageScanFinding_updatedAt,
+
+    -- * Image
+    Image (..),
+    newImage,
+    image_imageId,
+    image_imageManifest,
+    image_imageManifestMediaType,
+    image_registryId,
+    image_repositoryName,
+
+    -- * ImageDetail
+    ImageDetail (..),
+    newImageDetail,
+    imageDetail_artifactMediaType,
+    imageDetail_imageDigest,
+    imageDetail_imageManifestMediaType,
+    imageDetail_imagePushedAt,
+    imageDetail_imageScanFindingsSummary,
+    imageDetail_imageScanStatus,
+    imageDetail_imageSizeInBytes,
+    imageDetail_imageTags,
+    imageDetail_lastRecordedPullTime,
+    imageDetail_registryId,
+    imageDetail_repositoryName,
+
+    -- * ImageFailure
+    ImageFailure (..),
+    newImageFailure,
+    imageFailure_failureCode,
+    imageFailure_failureReason,
+    imageFailure_imageId,
+
+    -- * ImageIdentifier
+    ImageIdentifier (..),
+    newImageIdentifier,
+    imageIdentifier_imageDigest,
+    imageIdentifier_imageTag,
+
+    -- * ImageReplicationStatus
+    ImageReplicationStatus (..),
+    newImageReplicationStatus,
+    imageReplicationStatus_failureCode,
+    imageReplicationStatus_region,
+    imageReplicationStatus_registryId,
+    imageReplicationStatus_status,
+
+    -- * ImageScanFinding
+    ImageScanFinding (..),
+    newImageScanFinding,
+    imageScanFinding_attributes,
+    imageScanFinding_description,
+    imageScanFinding_name,
+    imageScanFinding_severity,
+    imageScanFinding_uri,
+
+    -- * ImageScanFindings
+    ImageScanFindings (..),
+    newImageScanFindings,
+    imageScanFindings_enhancedFindings,
+    imageScanFindings_findingSeverityCounts,
+    imageScanFindings_findings,
+    imageScanFindings_imageScanCompletedAt,
+    imageScanFindings_vulnerabilitySourceUpdatedAt,
+
+    -- * ImageScanFindingsSummary
+    ImageScanFindingsSummary (..),
+    newImageScanFindingsSummary,
+    imageScanFindingsSummary_findingSeverityCounts,
+    imageScanFindingsSummary_imageScanCompletedAt,
+    imageScanFindingsSummary_vulnerabilitySourceUpdatedAt,
+
+    -- * ImageScanStatus
+    ImageScanStatus (..),
+    newImageScanStatus,
+    imageScanStatus_description,
+    imageScanStatus_status,
+
+    -- * ImageScanningConfiguration
+    ImageScanningConfiguration (..),
+    newImageScanningConfiguration,
+    imageScanningConfiguration_scanOnPush,
+
+    -- * Layer
+    Layer (..),
+    newLayer,
+    layer_layerAvailability,
+    layer_layerDigest,
+    layer_layerSize,
+    layer_mediaType,
+
+    -- * LayerFailure
+    LayerFailure (..),
+    newLayerFailure,
+    layerFailure_failureCode,
+    layerFailure_failureReason,
+    layerFailure_layerDigest,
+
+    -- * LifecyclePolicyPreviewFilter
+    LifecyclePolicyPreviewFilter (..),
+    newLifecyclePolicyPreviewFilter,
+    lifecyclePolicyPreviewFilter_tagStatus,
+
+    -- * LifecyclePolicyPreviewResult
+    LifecyclePolicyPreviewResult (..),
+    newLifecyclePolicyPreviewResult,
+    lifecyclePolicyPreviewResult_action,
+    lifecyclePolicyPreviewResult_appliedRulePriority,
+    lifecyclePolicyPreviewResult_imageDigest,
+    lifecyclePolicyPreviewResult_imagePushedAt,
+    lifecyclePolicyPreviewResult_imageTags,
+
+    -- * LifecyclePolicyPreviewSummary
+    LifecyclePolicyPreviewSummary (..),
+    newLifecyclePolicyPreviewSummary,
+    lifecyclePolicyPreviewSummary_expiringImageTotalCount,
+
+    -- * LifecyclePolicyRuleAction
+    LifecyclePolicyRuleAction (..),
+    newLifecyclePolicyRuleAction,
+    lifecyclePolicyRuleAction_type,
+
+    -- * ListImagesFilter
+    ListImagesFilter (..),
+    newListImagesFilter,
+    listImagesFilter_tagStatus,
+
+    -- * PackageVulnerabilityDetails
+    PackageVulnerabilityDetails (..),
+    newPackageVulnerabilityDetails,
+    packageVulnerabilityDetails_cvss,
+    packageVulnerabilityDetails_referenceUrls,
+    packageVulnerabilityDetails_relatedVulnerabilities,
+    packageVulnerabilityDetails_source,
+    packageVulnerabilityDetails_sourceUrl,
+    packageVulnerabilityDetails_vendorCreatedAt,
+    packageVulnerabilityDetails_vendorSeverity,
+    packageVulnerabilityDetails_vendorUpdatedAt,
+    packageVulnerabilityDetails_vulnerabilityId,
+    packageVulnerabilityDetails_vulnerablePackages,
+
+    -- * PullThroughCacheRule
+    PullThroughCacheRule (..),
+    newPullThroughCacheRule,
+    pullThroughCacheRule_createdAt,
+    pullThroughCacheRule_ecrRepositoryPrefix,
+    pullThroughCacheRule_registryId,
+    pullThroughCacheRule_upstreamRegistryUrl,
+
+    -- * Recommendation
+    Recommendation (..),
+    newRecommendation,
+    recommendation_text,
+    recommendation_url,
+
+    -- * RegistryScanningConfiguration
+    RegistryScanningConfiguration (..),
+    newRegistryScanningConfiguration,
+    registryScanningConfiguration_rules,
+    registryScanningConfiguration_scanType,
+
+    -- * RegistryScanningRule
+    RegistryScanningRule (..),
+    newRegistryScanningRule,
+    registryScanningRule_scanFrequency,
+    registryScanningRule_repositoryFilters,
+
+    -- * Remediation
+    Remediation (..),
+    newRemediation,
+    remediation_recommendation,
+
+    -- * ReplicationConfiguration
+    ReplicationConfiguration (..),
+    newReplicationConfiguration,
+    replicationConfiguration_rules,
+
+    -- * ReplicationDestination
+    ReplicationDestination (..),
+    newReplicationDestination,
+    replicationDestination_region,
+    replicationDestination_registryId,
+
+    -- * ReplicationRule
+    ReplicationRule (..),
+    newReplicationRule,
+    replicationRule_repositoryFilters,
+    replicationRule_destinations,
+
+    -- * Repository
+    Repository (..),
+    newRepository,
+    repository_createdAt,
+    repository_encryptionConfiguration,
+    repository_imageScanningConfiguration,
+    repository_imageTagMutability,
+    repository_registryId,
+    repository_repositoryArn,
+    repository_repositoryName,
+    repository_repositoryUri,
+
+    -- * RepositoryFilter
+    RepositoryFilter (..),
+    newRepositoryFilter,
+    repositoryFilter_filter,
+    repositoryFilter_filterType,
+
+    -- * RepositoryScanningConfiguration
+    RepositoryScanningConfiguration (..),
+    newRepositoryScanningConfiguration,
+    repositoryScanningConfiguration_appliedScanFilters,
+    repositoryScanningConfiguration_repositoryArn,
+    repositoryScanningConfiguration_repositoryName,
+    repositoryScanningConfiguration_scanFrequency,
+    repositoryScanningConfiguration_scanOnPush,
+
+    -- * RepositoryScanningConfigurationFailure
+    RepositoryScanningConfigurationFailure (..),
+    newRepositoryScanningConfigurationFailure,
+    repositoryScanningConfigurationFailure_failureCode,
+    repositoryScanningConfigurationFailure_failureReason,
+    repositoryScanningConfigurationFailure_repositoryName,
+
+    -- * Resource
+    Resource (..),
+    newResource,
+    resource_details,
+    resource_id,
+    resource_tags,
+    resource_type,
+
+    -- * ResourceDetails
+    ResourceDetails (..),
+    newResourceDetails,
+    resourceDetails_awsEcrContainerImage,
+
+    -- * ScanningRepositoryFilter
+    ScanningRepositoryFilter (..),
+    newScanningRepositoryFilter,
+    scanningRepositoryFilter_filter,
+    scanningRepositoryFilter_filterType,
+
+    -- * ScoreDetails
+    ScoreDetails (..),
+    newScoreDetails,
+    scoreDetails_cvss,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * VulnerablePackage
+    VulnerablePackage (..),
+    newVulnerablePackage,
+    vulnerablePackage_arch,
+    vulnerablePackage_epoch,
+    vulnerablePackage_filePath,
+    vulnerablePackage_name,
+    vulnerablePackage_packageManager,
+    vulnerablePackage_release,
+    vulnerablePackage_sourceLayerHash,
+    vulnerablePackage_version,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.ECR.Types.Attribute
+import Amazonka.ECR.Types.AuthorizationData
+import Amazonka.ECR.Types.AwsEcrContainerImageDetails
+import Amazonka.ECR.Types.CvssScore
+import Amazonka.ECR.Types.CvssScoreAdjustment
+import Amazonka.ECR.Types.CvssScoreDetails
+import Amazonka.ECR.Types.DescribeImagesFilter
+import Amazonka.ECR.Types.EncryptionConfiguration
+import Amazonka.ECR.Types.EncryptionType
+import Amazonka.ECR.Types.EnhancedImageScanFinding
+import Amazonka.ECR.Types.FindingSeverity
+import Amazonka.ECR.Types.Image
+import Amazonka.ECR.Types.ImageActionType
+import Amazonka.ECR.Types.ImageDetail
+import Amazonka.ECR.Types.ImageFailure
+import Amazonka.ECR.Types.ImageFailureCode
+import Amazonka.ECR.Types.ImageIdentifier
+import Amazonka.ECR.Types.ImageReplicationStatus
+import Amazonka.ECR.Types.ImageScanFinding
+import Amazonka.ECR.Types.ImageScanFindings
+import Amazonka.ECR.Types.ImageScanFindingsSummary
+import Amazonka.ECR.Types.ImageScanStatus
+import Amazonka.ECR.Types.ImageScanningConfiguration
+import Amazonka.ECR.Types.ImageTagMutability
+import Amazonka.ECR.Types.Layer
+import Amazonka.ECR.Types.LayerAvailability
+import Amazonka.ECR.Types.LayerFailure
+import Amazonka.ECR.Types.LayerFailureCode
+import Amazonka.ECR.Types.LifecyclePolicyPreviewFilter
+import Amazonka.ECR.Types.LifecyclePolicyPreviewResult
+import Amazonka.ECR.Types.LifecyclePolicyPreviewStatus
+import Amazonka.ECR.Types.LifecyclePolicyPreviewSummary
+import Amazonka.ECR.Types.LifecyclePolicyRuleAction
+import Amazonka.ECR.Types.ListImagesFilter
+import Amazonka.ECR.Types.PackageVulnerabilityDetails
+import Amazonka.ECR.Types.PullThroughCacheRule
+import Amazonka.ECR.Types.Recommendation
+import Amazonka.ECR.Types.RegistryScanningConfiguration
+import Amazonka.ECR.Types.RegistryScanningRule
+import Amazonka.ECR.Types.Remediation
+import Amazonka.ECR.Types.ReplicationConfiguration
+import Amazonka.ECR.Types.ReplicationDestination
+import Amazonka.ECR.Types.ReplicationRule
+import Amazonka.ECR.Types.ReplicationStatus
+import Amazonka.ECR.Types.Repository
+import Amazonka.ECR.Types.RepositoryFilter
+import Amazonka.ECR.Types.RepositoryFilterType
+import Amazonka.ECR.Types.RepositoryScanningConfiguration
+import Amazonka.ECR.Types.RepositoryScanningConfigurationFailure
+import Amazonka.ECR.Types.Resource
+import Amazonka.ECR.Types.ResourceDetails
+import Amazonka.ECR.Types.ScanFrequency
+import Amazonka.ECR.Types.ScanStatus
+import Amazonka.ECR.Types.ScanType
+import Amazonka.ECR.Types.ScanningConfigurationFailureCode
+import Amazonka.ECR.Types.ScanningRepositoryFilter
+import Amazonka.ECR.Types.ScanningRepositoryFilterType
+import Amazonka.ECR.Types.ScoreDetails
+import Amazonka.ECR.Types.Tag
+import Amazonka.ECR.Types.TagStatus
+import Amazonka.ECR.Types.VulnerablePackage
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2015-09-21@ of the Amazon EC2 Container Registry SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "ECR",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "api.ecr",
+      Core.signingName = "ecr",
+      Core.version = "2015-09-21",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "ECR",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The specified layer upload does not contain any layer parts.
+_EmptyUploadException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_EmptyUploadException =
+  Core._MatchServiceError
+    defaultService
+    "EmptyUploadException"
+
+-- | The specified image has already been pushed, and there were no changes
+-- to the manifest or image tag after the last push.
+_ImageAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ImageAlreadyExistsException"
+
+-- | The specified image digest does not match the digest that Amazon ECR
+-- calculated for the image.
+_ImageDigestDoesNotMatchException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageDigestDoesNotMatchException =
+  Core._MatchServiceError
+    defaultService
+    "ImageDigestDoesNotMatchException"
+
+-- | The image requested does not exist in the specified repository.
+_ImageNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ImageNotFoundException"
+
+-- | The specified image is tagged with a tag that already exists. The
+-- repository is configured for tag immutability.
+_ImageTagAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ImageTagAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ImageTagAlreadyExistsException"
+
+-- | The layer digest calculation performed by Amazon ECR upon receipt of the
+-- image layer does not match the digest specified.
+_InvalidLayerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidLayerException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidLayerException"
+
+-- | The layer part size is not valid, or the first byte specified is not
+-- consecutive to the last byte of a previous layer part upload.
+_InvalidLayerPartException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidLayerPartException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidLayerPartException"
+
+-- | The specified parameter is invalid. Review the available parameters for
+-- the API request.
+_InvalidParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidParameterException"
+
+-- | An invalid parameter has been specified. Tag keys can have a maximum
+-- character length of 128 characters, and tag values can have a maximum
+-- length of 256 characters.
+_InvalidTagParameterException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidTagParameterException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidTagParameterException"
+
+-- | The operation failed due to a KMS exception.
+_KmsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_KmsException =
+  Core._MatchServiceError
+    defaultService
+    "KmsException"
+
+-- | The image layer already exists in the associated repository.
+_LayerAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayerAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "LayerAlreadyExistsException"
+
+-- | The specified layer is not available because it is not associated with
+-- an image. Unassociated image layers may be cleaned up at any time.
+_LayerInaccessibleException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayerInaccessibleException =
+  Core._MatchServiceError
+    defaultService
+    "LayerInaccessibleException"
+
+-- | Layer parts must be at least 5 MiB in size.
+_LayerPartTooSmallException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayerPartTooSmallException =
+  Core._MatchServiceError
+    defaultService
+    "LayerPartTooSmallException"
+
+-- | The specified layers could not be found, or the specified layer is not
+-- valid for this repository.
+_LayersNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LayersNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "LayersNotFoundException"
+
+-- | The lifecycle policy could not be found, and no policy is set to the
+-- repository.
+_LifecyclePolicyNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LifecyclePolicyNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "LifecyclePolicyNotFoundException"
+
+-- | The previous lifecycle policy preview request has not completed. Wait
+-- and try again.
+_LifecyclePolicyPreviewInProgressException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LifecyclePolicyPreviewInProgressException =
+  Core._MatchServiceError
+    defaultService
+    "LifecyclePolicyPreviewInProgressException"
+
+-- | There is no dry run for this repository.
+_LifecyclePolicyPreviewNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LifecyclePolicyPreviewNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "LifecyclePolicyPreviewNotFoundException"
+
+-- | The operation did not succeed because it would have exceeded a service
+-- limit for your account. For more information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html Amazon ECR service quotas>
+-- in the Amazon Elastic Container Registry User Guide.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | A pull through cache rule with these settings already exists for the
+-- private registry.
+_PullThroughCacheRuleAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_PullThroughCacheRuleAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "PullThroughCacheRuleAlreadyExistsException"
+
+-- | The pull through cache rule was not found. Specify a valid pull through
+-- cache rule and try again.
+_PullThroughCacheRuleNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_PullThroughCacheRuleNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "PullThroughCacheRuleNotFoundException"
+
+-- | The manifest list is referencing an image that does not exist.
+_ReferencedImagesNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ReferencedImagesNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ReferencedImagesNotFoundException"
+
+-- | The registry doesn\'t have an associated registry policy.
+_RegistryPolicyNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RegistryPolicyNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RegistryPolicyNotFoundException"
+
+-- | The specified repository already exists in the specified registry.
+_RepositoryAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryAlreadyExistsException"
+
+-- | The specified repository contains images. To delete a repository that
+-- contains images, you must force the deletion with the @force@ parameter.
+_RepositoryNotEmptyException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryNotEmptyException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryNotEmptyException"
+
+-- | The specified repository could not be found. Check the spelling of the
+-- specified repository and ensure that you are performing operations on
+-- the correct registry.
+_RepositoryNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryNotFoundException"
+
+-- | The specified repository and registry combination does not have an
+-- associated repository policy.
+_RepositoryPolicyNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_RepositoryPolicyNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "RepositoryPolicyNotFoundException"
+
+-- | The specified image scan could not be found. Ensure that image scanning
+-- is enabled on the repository and try again.
+_ScanNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ScanNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ScanNotFoundException"
+
+-- | These errors are usually caused by a server-side issue.
+_ServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServerException =
+  Core._MatchServiceError
+    defaultService
+    "ServerException"
+
+-- | The list of tags on the repository is over the limit. The maximum number
+-- of tags that can be applied to a repository is 50.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
+
+-- | The image is of a type that cannot be scanned.
+_UnsupportedImageTypeException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnsupportedImageTypeException =
+  Core._MatchServiceError
+    defaultService
+    "UnsupportedImageTypeException"
+
+-- | The specified upstream registry isn\'t supported.
+_UnsupportedUpstreamRegistryException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnsupportedUpstreamRegistryException =
+  Core._MatchServiceError
+    defaultService
+    "UnsupportedUpstreamRegistryException"
+
+-- | The upload could not be found, or the specified upload ID is not valid
+-- for this repository.
+_UploadNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UploadNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "UploadNotFoundException"
+
+-- | There was an exception validating this request.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/ECR/Types/Attribute.hs b/gen/Amazonka/ECR/Types/Attribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Attribute.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.ECR.Types.Attribute
+-- 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.ECR.Types.Attribute 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
+
+-- | This data type is used in the ImageScanFinding data type.
+--
+-- /See:/ 'newAttribute' smart constructor.
+data Attribute = Attribute'
+  { -- | The value assigned to the attribute key.
+    value :: Prelude.Maybe Prelude.Text,
+    -- | The attribute key.
+    key :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Attribute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'value', 'attribute_value' - The value assigned to the attribute key.
+--
+-- 'key', 'attribute_key' - The attribute key.
+newAttribute ::
+  -- | 'key'
+  Prelude.Text ->
+  Attribute
+newAttribute pKey_ =
+  Attribute' {value = Prelude.Nothing, key = pKey_}
+
+-- | The value assigned to the attribute key.
+attribute_value :: Lens.Lens' Attribute (Prelude.Maybe Prelude.Text)
+attribute_value = Lens.lens (\Attribute' {value} -> value) (\s@Attribute' {} a -> s {value = a} :: Attribute)
+
+-- | The attribute key.
+attribute_key :: Lens.Lens' Attribute Prelude.Text
+attribute_key = Lens.lens (\Attribute' {key} -> key) (\s@Attribute' {} a -> s {key = a} :: Attribute)
+
+instance Data.FromJSON Attribute where
+  parseJSON =
+    Data.withObject
+      "Attribute"
+      ( \x ->
+          Attribute'
+            Prelude.<$> (x Data..:? "value")
+            Prelude.<*> (x Data..: "key")
+      )
+
+instance Prelude.Hashable Attribute where
+  hashWithSalt _salt Attribute' {..} =
+    _salt
+      `Prelude.hashWithSalt` value
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData Attribute where
+  rnf Attribute' {..} =
+    Prelude.rnf value `Prelude.seq` Prelude.rnf key
diff --git a/gen/Amazonka/ECR/Types/AuthorizationData.hs b/gen/Amazonka/ECR/Types/AuthorizationData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/AuthorizationData.hs
@@ -0,0 +1,118 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.AuthorizationData
+-- 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.ECR.Types.AuthorizationData where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing authorization data for an Amazon ECR registry.
+--
+-- /See:/ 'newAuthorizationData' smart constructor.
+data AuthorizationData = AuthorizationData'
+  { -- | A base64-encoded string that contains authorization data for the
+    -- specified Amazon ECR registry. When the string is decoded, it is
+    -- presented in the format @user:password@ for private registry
+    -- authentication using @docker login@.
+    authorizationToken :: Prelude.Maybe Prelude.Text,
+    -- | The Unix time in seconds and milliseconds when the authorization token
+    -- expires. Authorization tokens are valid for 12 hours.
+    expiresAt :: Prelude.Maybe Data.POSIX,
+    -- | The registry URL to use for this authorization token in a @docker login@
+    -- command. The Amazon ECR registry URL format is
+    -- @https:\/\/aws_account_id.dkr.ecr.region.amazonaws.com@. For example,
+    -- @https:\/\/012345678910.dkr.ecr.us-east-1.amazonaws.com@..
+    proxyEndpoint :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthorizationData' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'authorizationToken', 'authorizationData_authorizationToken' - A base64-encoded string that contains authorization data for the
+-- specified Amazon ECR registry. When the string is decoded, it is
+-- presented in the format @user:password@ for private registry
+-- authentication using @docker login@.
+--
+-- 'expiresAt', 'authorizationData_expiresAt' - The Unix time in seconds and milliseconds when the authorization token
+-- expires. Authorization tokens are valid for 12 hours.
+--
+-- 'proxyEndpoint', 'authorizationData_proxyEndpoint' - The registry URL to use for this authorization token in a @docker login@
+-- command. The Amazon ECR registry URL format is
+-- @https:\/\/aws_account_id.dkr.ecr.region.amazonaws.com@. For example,
+-- @https:\/\/012345678910.dkr.ecr.us-east-1.amazonaws.com@..
+newAuthorizationData ::
+  AuthorizationData
+newAuthorizationData =
+  AuthorizationData'
+    { authorizationToken =
+        Prelude.Nothing,
+      expiresAt = Prelude.Nothing,
+      proxyEndpoint = Prelude.Nothing
+    }
+
+-- | A base64-encoded string that contains authorization data for the
+-- specified Amazon ECR registry. When the string is decoded, it is
+-- presented in the format @user:password@ for private registry
+-- authentication using @docker login@.
+authorizationData_authorizationToken :: Lens.Lens' AuthorizationData (Prelude.Maybe Prelude.Text)
+authorizationData_authorizationToken = Lens.lens (\AuthorizationData' {authorizationToken} -> authorizationToken) (\s@AuthorizationData' {} a -> s {authorizationToken = a} :: AuthorizationData)
+
+-- | The Unix time in seconds and milliseconds when the authorization token
+-- expires. Authorization tokens are valid for 12 hours.
+authorizationData_expiresAt :: Lens.Lens' AuthorizationData (Prelude.Maybe Prelude.UTCTime)
+authorizationData_expiresAt = Lens.lens (\AuthorizationData' {expiresAt} -> expiresAt) (\s@AuthorizationData' {} a -> s {expiresAt = a} :: AuthorizationData) Prelude.. Lens.mapping Data._Time
+
+-- | The registry URL to use for this authorization token in a @docker login@
+-- command. The Amazon ECR registry URL format is
+-- @https:\/\/aws_account_id.dkr.ecr.region.amazonaws.com@. For example,
+-- @https:\/\/012345678910.dkr.ecr.us-east-1.amazonaws.com@..
+authorizationData_proxyEndpoint :: Lens.Lens' AuthorizationData (Prelude.Maybe Prelude.Text)
+authorizationData_proxyEndpoint = Lens.lens (\AuthorizationData' {proxyEndpoint} -> proxyEndpoint) (\s@AuthorizationData' {} a -> s {proxyEndpoint = a} :: AuthorizationData)
+
+instance Data.FromJSON AuthorizationData where
+  parseJSON =
+    Data.withObject
+      "AuthorizationData"
+      ( \x ->
+          AuthorizationData'
+            Prelude.<$> (x Data..:? "authorizationToken")
+            Prelude.<*> (x Data..:? "expiresAt")
+            Prelude.<*> (x Data..:? "proxyEndpoint")
+      )
+
+instance Prelude.Hashable AuthorizationData where
+  hashWithSalt _salt AuthorizationData' {..} =
+    _salt
+      `Prelude.hashWithSalt` authorizationToken
+      `Prelude.hashWithSalt` expiresAt
+      `Prelude.hashWithSalt` proxyEndpoint
+
+instance Prelude.NFData AuthorizationData where
+  rnf AuthorizationData' {..} =
+    Prelude.rnf authorizationToken
+      `Prelude.seq` Prelude.rnf expiresAt
+      `Prelude.seq` Prelude.rnf proxyEndpoint
diff --git a/gen/Amazonka/ECR/Types/AwsEcrContainerImageDetails.hs b/gen/Amazonka/ECR/Types/AwsEcrContainerImageDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/AwsEcrContainerImageDetails.hs
@@ -0,0 +1,157 @@
+{-# 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.ECR.Types.AwsEcrContainerImageDetails
+-- 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.ECR.Types.AwsEcrContainerImageDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The image details of the Amazon ECR container image.
+--
+-- /See:/ 'newAwsEcrContainerImageDetails' smart constructor.
+data AwsEcrContainerImageDetails = AwsEcrContainerImageDetails'
+  { -- | The architecture of the Amazon ECR container image.
+    architecture :: Prelude.Maybe Prelude.Text,
+    -- | The image author of the Amazon ECR container image.
+    author :: Prelude.Maybe Prelude.Text,
+    -- | The image hash of the Amazon ECR container image.
+    imageHash :: Prelude.Maybe Prelude.Text,
+    -- | The image tags attached to the Amazon ECR container image.
+    imageTags :: Prelude.Maybe [Prelude.Text],
+    -- | The platform of the Amazon ECR container image.
+    platform :: Prelude.Maybe Prelude.Text,
+    -- | The date and time the Amazon ECR container image was pushed.
+    pushedAt :: Prelude.Maybe Data.POSIX,
+    -- | The registry the Amazon ECR container image belongs to.
+    registry :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository the Amazon ECR container image resides in.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AwsEcrContainerImageDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'architecture', 'awsEcrContainerImageDetails_architecture' - The architecture of the Amazon ECR container image.
+--
+-- 'author', 'awsEcrContainerImageDetails_author' - The image author of the Amazon ECR container image.
+--
+-- 'imageHash', 'awsEcrContainerImageDetails_imageHash' - The image hash of the Amazon ECR container image.
+--
+-- 'imageTags', 'awsEcrContainerImageDetails_imageTags' - The image tags attached to the Amazon ECR container image.
+--
+-- 'platform', 'awsEcrContainerImageDetails_platform' - The platform of the Amazon ECR container image.
+--
+-- 'pushedAt', 'awsEcrContainerImageDetails_pushedAt' - The date and time the Amazon ECR container image was pushed.
+--
+-- 'registry', 'awsEcrContainerImageDetails_registry' - The registry the Amazon ECR container image belongs to.
+--
+-- 'repositoryName', 'awsEcrContainerImageDetails_repositoryName' - The name of the repository the Amazon ECR container image resides in.
+newAwsEcrContainerImageDetails ::
+  AwsEcrContainerImageDetails
+newAwsEcrContainerImageDetails =
+  AwsEcrContainerImageDetails'
+    { architecture =
+        Prelude.Nothing,
+      author = Prelude.Nothing,
+      imageHash = Prelude.Nothing,
+      imageTags = Prelude.Nothing,
+      platform = Prelude.Nothing,
+      pushedAt = Prelude.Nothing,
+      registry = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | The architecture of the Amazon ECR container image.
+awsEcrContainerImageDetails_architecture :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_architecture = Lens.lens (\AwsEcrContainerImageDetails' {architecture} -> architecture) (\s@AwsEcrContainerImageDetails' {} a -> s {architecture = a} :: AwsEcrContainerImageDetails)
+
+-- | The image author of the Amazon ECR container image.
+awsEcrContainerImageDetails_author :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_author = Lens.lens (\AwsEcrContainerImageDetails' {author} -> author) (\s@AwsEcrContainerImageDetails' {} a -> s {author = a} :: AwsEcrContainerImageDetails)
+
+-- | The image hash of the Amazon ECR container image.
+awsEcrContainerImageDetails_imageHash :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_imageHash = Lens.lens (\AwsEcrContainerImageDetails' {imageHash} -> imageHash) (\s@AwsEcrContainerImageDetails' {} a -> s {imageHash = a} :: AwsEcrContainerImageDetails)
+
+-- | The image tags attached to the Amazon ECR container image.
+awsEcrContainerImageDetails_imageTags :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe [Prelude.Text])
+awsEcrContainerImageDetails_imageTags = Lens.lens (\AwsEcrContainerImageDetails' {imageTags} -> imageTags) (\s@AwsEcrContainerImageDetails' {} a -> s {imageTags = a} :: AwsEcrContainerImageDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The platform of the Amazon ECR container image.
+awsEcrContainerImageDetails_platform :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_platform = Lens.lens (\AwsEcrContainerImageDetails' {platform} -> platform) (\s@AwsEcrContainerImageDetails' {} a -> s {platform = a} :: AwsEcrContainerImageDetails)
+
+-- | The date and time the Amazon ECR container image was pushed.
+awsEcrContainerImageDetails_pushedAt :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.UTCTime)
+awsEcrContainerImageDetails_pushedAt = Lens.lens (\AwsEcrContainerImageDetails' {pushedAt} -> pushedAt) (\s@AwsEcrContainerImageDetails' {} a -> s {pushedAt = a} :: AwsEcrContainerImageDetails) Prelude.. Lens.mapping Data._Time
+
+-- | The registry the Amazon ECR container image belongs to.
+awsEcrContainerImageDetails_registry :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_registry = Lens.lens (\AwsEcrContainerImageDetails' {registry} -> registry) (\s@AwsEcrContainerImageDetails' {} a -> s {registry = a} :: AwsEcrContainerImageDetails)
+
+-- | The name of the repository the Amazon ECR container image resides in.
+awsEcrContainerImageDetails_repositoryName :: Lens.Lens' AwsEcrContainerImageDetails (Prelude.Maybe Prelude.Text)
+awsEcrContainerImageDetails_repositoryName = Lens.lens (\AwsEcrContainerImageDetails' {repositoryName} -> repositoryName) (\s@AwsEcrContainerImageDetails' {} a -> s {repositoryName = a} :: AwsEcrContainerImageDetails)
+
+instance Data.FromJSON AwsEcrContainerImageDetails where
+  parseJSON =
+    Data.withObject
+      "AwsEcrContainerImageDetails"
+      ( \x ->
+          AwsEcrContainerImageDetails'
+            Prelude.<$> (x Data..:? "architecture")
+            Prelude.<*> (x Data..:? "author")
+            Prelude.<*> (x Data..:? "imageHash")
+            Prelude.<*> (x Data..:? "imageTags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "platform")
+            Prelude.<*> (x Data..:? "pushedAt")
+            Prelude.<*> (x Data..:? "registry")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance Prelude.Hashable AwsEcrContainerImageDetails where
+  hashWithSalt _salt AwsEcrContainerImageDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` architecture
+      `Prelude.hashWithSalt` author
+      `Prelude.hashWithSalt` imageHash
+      `Prelude.hashWithSalt` imageTags
+      `Prelude.hashWithSalt` platform
+      `Prelude.hashWithSalt` pushedAt
+      `Prelude.hashWithSalt` registry
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData AwsEcrContainerImageDetails where
+  rnf AwsEcrContainerImageDetails' {..} =
+    Prelude.rnf architecture
+      `Prelude.seq` Prelude.rnf author
+      `Prelude.seq` Prelude.rnf imageHash
+      `Prelude.seq` Prelude.rnf imageTags
+      `Prelude.seq` Prelude.rnf platform
+      `Prelude.seq` Prelude.rnf pushedAt
+      `Prelude.seq` Prelude.rnf registry
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECR/Types/CvssScore.hs b/gen/Amazonka/ECR/Types/CvssScore.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/CvssScore.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.ECR.Types.CvssScore
+-- 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.ECR.Types.CvssScore where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The CVSS score for a finding.
+--
+-- /See:/ 'newCvssScore' smart constructor.
+data CvssScore = CvssScore'
+  { -- | The base CVSS score used for the finding.
+    baseScore :: Prelude.Maybe Prelude.Double,
+    -- | The vector string of the CVSS score.
+    scoringVector :: Prelude.Maybe Prelude.Text,
+    -- | The source of the CVSS score.
+    source :: Prelude.Maybe Prelude.Text,
+    -- | The version of CVSS used for the score.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CvssScore' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'baseScore', 'cvssScore_baseScore' - The base CVSS score used for the finding.
+--
+-- 'scoringVector', 'cvssScore_scoringVector' - The vector string of the CVSS score.
+--
+-- 'source', 'cvssScore_source' - The source of the CVSS score.
+--
+-- 'version', 'cvssScore_version' - The version of CVSS used for the score.
+newCvssScore ::
+  CvssScore
+newCvssScore =
+  CvssScore'
+    { baseScore = Prelude.Nothing,
+      scoringVector = Prelude.Nothing,
+      source = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | The base CVSS score used for the finding.
+cvssScore_baseScore :: Lens.Lens' CvssScore (Prelude.Maybe Prelude.Double)
+cvssScore_baseScore = Lens.lens (\CvssScore' {baseScore} -> baseScore) (\s@CvssScore' {} a -> s {baseScore = a} :: CvssScore)
+
+-- | The vector string of the CVSS score.
+cvssScore_scoringVector :: Lens.Lens' CvssScore (Prelude.Maybe Prelude.Text)
+cvssScore_scoringVector = Lens.lens (\CvssScore' {scoringVector} -> scoringVector) (\s@CvssScore' {} a -> s {scoringVector = a} :: CvssScore)
+
+-- | The source of the CVSS score.
+cvssScore_source :: Lens.Lens' CvssScore (Prelude.Maybe Prelude.Text)
+cvssScore_source = Lens.lens (\CvssScore' {source} -> source) (\s@CvssScore' {} a -> s {source = a} :: CvssScore)
+
+-- | The version of CVSS used for the score.
+cvssScore_version :: Lens.Lens' CvssScore (Prelude.Maybe Prelude.Text)
+cvssScore_version = Lens.lens (\CvssScore' {version} -> version) (\s@CvssScore' {} a -> s {version = a} :: CvssScore)
+
+instance Data.FromJSON CvssScore where
+  parseJSON =
+    Data.withObject
+      "CvssScore"
+      ( \x ->
+          CvssScore'
+            Prelude.<$> (x Data..:? "baseScore")
+            Prelude.<*> (x Data..:? "scoringVector")
+            Prelude.<*> (x Data..:? "source")
+            Prelude.<*> (x Data..:? "version")
+      )
+
+instance Prelude.Hashable CvssScore where
+  hashWithSalt _salt CvssScore' {..} =
+    _salt
+      `Prelude.hashWithSalt` baseScore
+      `Prelude.hashWithSalt` scoringVector
+      `Prelude.hashWithSalt` source
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData CvssScore where
+  rnf CvssScore' {..} =
+    Prelude.rnf baseScore
+      `Prelude.seq` Prelude.rnf scoringVector
+      `Prelude.seq` Prelude.rnf source
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/ECR/Types/CvssScoreAdjustment.hs b/gen/Amazonka/ECR/Types/CvssScoreAdjustment.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/CvssScoreAdjustment.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.ECR.Types.CvssScoreAdjustment
+-- 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.ECR.Types.CvssScoreAdjustment 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 on adjustments Amazon Inspector made to the CVSS score for a
+-- finding.
+--
+-- /See:/ 'newCvssScoreAdjustment' smart constructor.
+data CvssScoreAdjustment = CvssScoreAdjustment'
+  { -- | The metric used to adjust the CVSS score.
+    metric :: Prelude.Maybe Prelude.Text,
+    -- | The reason the CVSS score has been adjustment.
+    reason :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CvssScoreAdjustment' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metric', 'cvssScoreAdjustment_metric' - The metric used to adjust the CVSS score.
+--
+-- 'reason', 'cvssScoreAdjustment_reason' - The reason the CVSS score has been adjustment.
+newCvssScoreAdjustment ::
+  CvssScoreAdjustment
+newCvssScoreAdjustment =
+  CvssScoreAdjustment'
+    { metric = Prelude.Nothing,
+      reason = Prelude.Nothing
+    }
+
+-- | The metric used to adjust the CVSS score.
+cvssScoreAdjustment_metric :: Lens.Lens' CvssScoreAdjustment (Prelude.Maybe Prelude.Text)
+cvssScoreAdjustment_metric = Lens.lens (\CvssScoreAdjustment' {metric} -> metric) (\s@CvssScoreAdjustment' {} a -> s {metric = a} :: CvssScoreAdjustment)
+
+-- | The reason the CVSS score has been adjustment.
+cvssScoreAdjustment_reason :: Lens.Lens' CvssScoreAdjustment (Prelude.Maybe Prelude.Text)
+cvssScoreAdjustment_reason = Lens.lens (\CvssScoreAdjustment' {reason} -> reason) (\s@CvssScoreAdjustment' {} a -> s {reason = a} :: CvssScoreAdjustment)
+
+instance Data.FromJSON CvssScoreAdjustment where
+  parseJSON =
+    Data.withObject
+      "CvssScoreAdjustment"
+      ( \x ->
+          CvssScoreAdjustment'
+            Prelude.<$> (x Data..:? "metric")
+            Prelude.<*> (x Data..:? "reason")
+      )
+
+instance Prelude.Hashable CvssScoreAdjustment where
+  hashWithSalt _salt CvssScoreAdjustment' {..} =
+    _salt
+      `Prelude.hashWithSalt` metric
+      `Prelude.hashWithSalt` reason
+
+instance Prelude.NFData CvssScoreAdjustment where
+  rnf CvssScoreAdjustment' {..} =
+    Prelude.rnf metric `Prelude.seq` Prelude.rnf reason
diff --git a/gen/Amazonka/ECR/Types/CvssScoreDetails.hs b/gen/Amazonka/ECR/Types/CvssScoreDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/CvssScoreDetails.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.CvssScoreDetails
+-- 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.ECR.Types.CvssScoreDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.CvssScoreAdjustment
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the CVSS score.
+--
+-- /See:/ 'newCvssScoreDetails' smart constructor.
+data CvssScoreDetails = CvssScoreDetails'
+  { -- | An object that contains details about adjustment Amazon Inspector made
+    -- to the CVSS score.
+    adjustments :: Prelude.Maybe [CvssScoreAdjustment],
+    -- | The CVSS score.
+    score :: Prelude.Maybe Prelude.Double,
+    -- | The source for the CVSS score.
+    scoreSource :: Prelude.Maybe Prelude.Text,
+    -- | The vector for the CVSS score.
+    scoringVector :: Prelude.Maybe Prelude.Text,
+    -- | The CVSS version used in scoring.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CvssScoreDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'adjustments', 'cvssScoreDetails_adjustments' - An object that contains details about adjustment Amazon Inspector made
+-- to the CVSS score.
+--
+-- 'score', 'cvssScoreDetails_score' - The CVSS score.
+--
+-- 'scoreSource', 'cvssScoreDetails_scoreSource' - The source for the CVSS score.
+--
+-- 'scoringVector', 'cvssScoreDetails_scoringVector' - The vector for the CVSS score.
+--
+-- 'version', 'cvssScoreDetails_version' - The CVSS version used in scoring.
+newCvssScoreDetails ::
+  CvssScoreDetails
+newCvssScoreDetails =
+  CvssScoreDetails'
+    { adjustments = Prelude.Nothing,
+      score = Prelude.Nothing,
+      scoreSource = Prelude.Nothing,
+      scoringVector = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | An object that contains details about adjustment Amazon Inspector made
+-- to the CVSS score.
+cvssScoreDetails_adjustments :: Lens.Lens' CvssScoreDetails (Prelude.Maybe [CvssScoreAdjustment])
+cvssScoreDetails_adjustments = Lens.lens (\CvssScoreDetails' {adjustments} -> adjustments) (\s@CvssScoreDetails' {} a -> s {adjustments = a} :: CvssScoreDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The CVSS score.
+cvssScoreDetails_score :: Lens.Lens' CvssScoreDetails (Prelude.Maybe Prelude.Double)
+cvssScoreDetails_score = Lens.lens (\CvssScoreDetails' {score} -> score) (\s@CvssScoreDetails' {} a -> s {score = a} :: CvssScoreDetails)
+
+-- | The source for the CVSS score.
+cvssScoreDetails_scoreSource :: Lens.Lens' CvssScoreDetails (Prelude.Maybe Prelude.Text)
+cvssScoreDetails_scoreSource = Lens.lens (\CvssScoreDetails' {scoreSource} -> scoreSource) (\s@CvssScoreDetails' {} a -> s {scoreSource = a} :: CvssScoreDetails)
+
+-- | The vector for the CVSS score.
+cvssScoreDetails_scoringVector :: Lens.Lens' CvssScoreDetails (Prelude.Maybe Prelude.Text)
+cvssScoreDetails_scoringVector = Lens.lens (\CvssScoreDetails' {scoringVector} -> scoringVector) (\s@CvssScoreDetails' {} a -> s {scoringVector = a} :: CvssScoreDetails)
+
+-- | The CVSS version used in scoring.
+cvssScoreDetails_version :: Lens.Lens' CvssScoreDetails (Prelude.Maybe Prelude.Text)
+cvssScoreDetails_version = Lens.lens (\CvssScoreDetails' {version} -> version) (\s@CvssScoreDetails' {} a -> s {version = a} :: CvssScoreDetails)
+
+instance Data.FromJSON CvssScoreDetails where
+  parseJSON =
+    Data.withObject
+      "CvssScoreDetails"
+      ( \x ->
+          CvssScoreDetails'
+            Prelude.<$> (x Data..:? "adjustments" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "score")
+            Prelude.<*> (x Data..:? "scoreSource")
+            Prelude.<*> (x Data..:? "scoringVector")
+            Prelude.<*> (x Data..:? "version")
+      )
+
+instance Prelude.Hashable CvssScoreDetails where
+  hashWithSalt _salt CvssScoreDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` adjustments
+      `Prelude.hashWithSalt` score
+      `Prelude.hashWithSalt` scoreSource
+      `Prelude.hashWithSalt` scoringVector
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData CvssScoreDetails where
+  rnf CvssScoreDetails' {..} =
+    Prelude.rnf adjustments
+      `Prelude.seq` Prelude.rnf score
+      `Prelude.seq` Prelude.rnf scoreSource
+      `Prelude.seq` Prelude.rnf scoringVector
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/ECR/Types/DescribeImagesFilter.hs b/gen/Amazonka/ECR/Types/DescribeImagesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/DescribeImagesFilter.hs
@@ -0,0 +1,70 @@
+{-# 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.ECR.Types.DescribeImagesFilter
+-- 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.ECR.Types.DescribeImagesFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.TagStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a filter on a DescribeImages operation.
+--
+-- /See:/ 'newDescribeImagesFilter' smart constructor.
+data DescribeImagesFilter = DescribeImagesFilter'
+  { -- | The tag status with which to filter your DescribeImages results. You can
+    -- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+    tagStatus :: Prelude.Maybe TagStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeImagesFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagStatus', 'describeImagesFilter_tagStatus' - The tag status with which to filter your DescribeImages results. You can
+-- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+newDescribeImagesFilter ::
+  DescribeImagesFilter
+newDescribeImagesFilter =
+  DescribeImagesFilter' {tagStatus = Prelude.Nothing}
+
+-- | The tag status with which to filter your DescribeImages results. You can
+-- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+describeImagesFilter_tagStatus :: Lens.Lens' DescribeImagesFilter (Prelude.Maybe TagStatus)
+describeImagesFilter_tagStatus = Lens.lens (\DescribeImagesFilter' {tagStatus} -> tagStatus) (\s@DescribeImagesFilter' {} a -> s {tagStatus = a} :: DescribeImagesFilter)
+
+instance Prelude.Hashable DescribeImagesFilter where
+  hashWithSalt _salt DescribeImagesFilter' {..} =
+    _salt `Prelude.hashWithSalt` tagStatus
+
+instance Prelude.NFData DescribeImagesFilter where
+  rnf DescribeImagesFilter' {..} = Prelude.rnf tagStatus
+
+instance Data.ToJSON DescribeImagesFilter where
+  toJSON DescribeImagesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("tagStatus" Data..=) Prelude.<$> tagStatus]
+      )
diff --git a/gen/Amazonka/ECR/Types/EncryptionConfiguration.hs b/gen/Amazonka/ECR/Types/EncryptionConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/EncryptionConfiguration.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.EncryptionConfiguration
+-- 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.ECR.Types.EncryptionConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.EncryptionType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The encryption configuration for the repository. This determines how the
+-- contents of your repository are encrypted at rest.
+--
+-- By default, when no encryption configuration is set or the @AES256@
+-- encryption type is used, Amazon ECR uses server-side encryption with
+-- Amazon S3-managed encryption keys which encrypts your data at rest using
+-- an AES-256 encryption algorithm. This does not require any action on
+-- your part.
+--
+-- For more control over the encryption of the contents of your repository,
+-- you can use server-side encryption with Key Management Service key
+-- stored in Key Management Service (KMS) to encrypt your images. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html Amazon ECR encryption at rest>
+-- in the /Amazon Elastic Container Registry User Guide/.
+--
+-- /See:/ 'newEncryptionConfiguration' smart constructor.
+data EncryptionConfiguration = EncryptionConfiguration'
+  { -- | If you use the @KMS@ encryption type, specify the KMS key to use for
+    -- encryption. The alias, key ID, or full ARN of the KMS key can be
+    -- specified. The key must exist in the same Region as the repository. If
+    -- no key is specified, the default Amazon Web Services managed KMS key for
+    -- Amazon ECR will be used.
+    kmsKey :: Prelude.Maybe Prelude.Text,
+    -- | The encryption type to use.
+    --
+    -- If you use the @KMS@ encryption type, the contents of the repository
+    -- will be encrypted using server-side encryption with Key Management
+    -- Service key stored in KMS. When you use KMS to encrypt your data, you
+    -- can either use the default Amazon Web Services managed KMS key for
+    -- Amazon ECR, or specify your own KMS key, which you already created. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)>
+    -- in the /Amazon Simple Storage Service Console Developer Guide/.
+    --
+    -- If you use the @AES256@ encryption type, Amazon ECR uses server-side
+    -- encryption with Amazon S3-managed encryption keys which encrypts the
+    -- images in the repository using an AES-256 encryption algorithm. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)>
+    -- in the /Amazon Simple Storage Service Console Developer Guide/.
+    encryptionType :: EncryptionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EncryptionConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKey', 'encryptionConfiguration_kmsKey' - If you use the @KMS@ encryption type, specify the KMS key to use for
+-- encryption. The alias, key ID, or full ARN of the KMS key can be
+-- specified. The key must exist in the same Region as the repository. If
+-- no key is specified, the default Amazon Web Services managed KMS key for
+-- Amazon ECR will be used.
+--
+-- 'encryptionType', 'encryptionConfiguration_encryptionType' - The encryption type to use.
+--
+-- If you use the @KMS@ encryption type, the contents of the repository
+-- will be encrypted using server-side encryption with Key Management
+-- Service key stored in KMS. When you use KMS to encrypt your data, you
+-- can either use the default Amazon Web Services managed KMS key for
+-- Amazon ECR, or specify your own KMS key, which you already created. For
+-- more information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)>
+-- in the /Amazon Simple Storage Service Console Developer Guide/.
+--
+-- If you use the @AES256@ encryption type, Amazon ECR uses server-side
+-- encryption with Amazon S3-managed encryption keys which encrypts the
+-- images in the repository using an AES-256 encryption algorithm. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)>
+-- in the /Amazon Simple Storage Service Console Developer Guide/.
+newEncryptionConfiguration ::
+  -- | 'encryptionType'
+  EncryptionType ->
+  EncryptionConfiguration
+newEncryptionConfiguration pEncryptionType_ =
+  EncryptionConfiguration'
+    { kmsKey = Prelude.Nothing,
+      encryptionType = pEncryptionType_
+    }
+
+-- | If you use the @KMS@ encryption type, specify the KMS key to use for
+-- encryption. The alias, key ID, or full ARN of the KMS key can be
+-- specified. The key must exist in the same Region as the repository. If
+-- no key is specified, the default Amazon Web Services managed KMS key for
+-- Amazon ECR will be used.
+encryptionConfiguration_kmsKey :: Lens.Lens' EncryptionConfiguration (Prelude.Maybe Prelude.Text)
+encryptionConfiguration_kmsKey = Lens.lens (\EncryptionConfiguration' {kmsKey} -> kmsKey) (\s@EncryptionConfiguration' {} a -> s {kmsKey = a} :: EncryptionConfiguration)
+
+-- | The encryption type to use.
+--
+-- If you use the @KMS@ encryption type, the contents of the repository
+-- will be encrypted using server-side encryption with Key Management
+-- Service key stored in KMS. When you use KMS to encrypt your data, you
+-- can either use the default Amazon Web Services managed KMS key for
+-- Amazon ECR, or specify your own KMS key, which you already created. For
+-- more information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)>
+-- in the /Amazon Simple Storage Service Console Developer Guide/.
+--
+-- If you use the @AES256@ encryption type, Amazon ECR uses server-side
+-- encryption with Amazon S3-managed encryption keys which encrypts the
+-- images in the repository using an AES-256 encryption algorithm. For more
+-- information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)>
+-- in the /Amazon Simple Storage Service Console Developer Guide/.
+encryptionConfiguration_encryptionType :: Lens.Lens' EncryptionConfiguration EncryptionType
+encryptionConfiguration_encryptionType = Lens.lens (\EncryptionConfiguration' {encryptionType} -> encryptionType) (\s@EncryptionConfiguration' {} a -> s {encryptionType = a} :: EncryptionConfiguration)
+
+instance Data.FromJSON EncryptionConfiguration where
+  parseJSON =
+    Data.withObject
+      "EncryptionConfiguration"
+      ( \x ->
+          EncryptionConfiguration'
+            Prelude.<$> (x Data..:? "kmsKey")
+            Prelude.<*> (x Data..: "encryptionType")
+      )
+
+instance Prelude.Hashable EncryptionConfiguration where
+  hashWithSalt _salt EncryptionConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKey
+      `Prelude.hashWithSalt` encryptionType
+
+instance Prelude.NFData EncryptionConfiguration where
+  rnf EncryptionConfiguration' {..} =
+    Prelude.rnf kmsKey
+      `Prelude.seq` Prelude.rnf encryptionType
+
+instance Data.ToJSON EncryptionConfiguration where
+  toJSON EncryptionConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("kmsKey" Data..=) Prelude.<$> kmsKey,
+            Prelude.Just
+              ("encryptionType" Data..= encryptionType)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/EncryptionType.hs b/gen/Amazonka/ECR/Types/EncryptionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/EncryptionType.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.ECR.Types.EncryptionType
+-- 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.ECR.Types.EncryptionType
+  ( EncryptionType
+      ( ..,
+        EncryptionType_AES256,
+        EncryptionType_KMS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EncryptionType = EncryptionType'
+  { fromEncryptionType ::
+      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 EncryptionType_AES256 :: EncryptionType
+pattern EncryptionType_AES256 = EncryptionType' "AES256"
+
+pattern EncryptionType_KMS :: EncryptionType
+pattern EncryptionType_KMS = EncryptionType' "KMS"
+
+{-# COMPLETE
+  EncryptionType_AES256,
+  EncryptionType_KMS,
+  EncryptionType'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/EnhancedImageScanFinding.hs b/gen/Amazonka/ECR/Types/EnhancedImageScanFinding.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/EnhancedImageScanFinding.hs
@@ -0,0 +1,246 @@
+{-# 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.ECR.Types.EnhancedImageScanFinding
+-- 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.ECR.Types.EnhancedImageScanFinding where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.PackageVulnerabilityDetails
+import Amazonka.ECR.Types.Remediation
+import Amazonka.ECR.Types.Resource
+import Amazonka.ECR.Types.ScoreDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of an enhanced image scan. This is returned when enhanced
+-- scanning is enabled for your private registry.
+--
+-- /See:/ 'newEnhancedImageScanFinding' smart constructor.
+data EnhancedImageScanFinding = EnhancedImageScanFinding'
+  { -- | The Amazon Web Services account ID associated with the image.
+    awsAccountId :: Prelude.Maybe Prelude.Text,
+    -- | The description of the finding.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Number (ARN) of the finding.
+    findingArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time that the finding was first observed.
+    firstObservedAt :: Prelude.Maybe Data.POSIX,
+    -- | The date and time that the finding was last observed.
+    lastObservedAt :: Prelude.Maybe Data.POSIX,
+    -- | An object that contains the details of a package vulnerability finding.
+    packageVulnerabilityDetails :: Prelude.Maybe PackageVulnerabilityDetails,
+    -- | An object that contains the details about how to remediate a finding.
+    remediation :: Prelude.Maybe Remediation,
+    -- | Contains information on the resources involved in a finding.
+    resources :: Prelude.Maybe [Resource],
+    -- | The Amazon Inspector score given to the finding.
+    score :: Prelude.Maybe Prelude.Double,
+    -- | An object that contains details of the Amazon Inspector score.
+    scoreDetails :: Prelude.Maybe ScoreDetails,
+    -- | The severity of the finding.
+    severity :: Prelude.Maybe Prelude.Text,
+    -- | The status of the finding.
+    status :: Prelude.Maybe Prelude.Text,
+    -- | The title of the finding.
+    title :: Prelude.Maybe Prelude.Text,
+    -- | The type of the finding.
+    type' :: Prelude.Maybe Prelude.Text,
+    -- | The date and time the finding was last updated at.
+    updatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EnhancedImageScanFinding' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'awsAccountId', 'enhancedImageScanFinding_awsAccountId' - The Amazon Web Services account ID associated with the image.
+--
+-- 'description', 'enhancedImageScanFinding_description' - The description of the finding.
+--
+-- 'findingArn', 'enhancedImageScanFinding_findingArn' - The Amazon Resource Number (ARN) of the finding.
+--
+-- 'firstObservedAt', 'enhancedImageScanFinding_firstObservedAt' - The date and time that the finding was first observed.
+--
+-- 'lastObservedAt', 'enhancedImageScanFinding_lastObservedAt' - The date and time that the finding was last observed.
+--
+-- 'packageVulnerabilityDetails', 'enhancedImageScanFinding_packageVulnerabilityDetails' - An object that contains the details of a package vulnerability finding.
+--
+-- 'remediation', 'enhancedImageScanFinding_remediation' - An object that contains the details about how to remediate a finding.
+--
+-- 'resources', 'enhancedImageScanFinding_resources' - Contains information on the resources involved in a finding.
+--
+-- 'score', 'enhancedImageScanFinding_score' - The Amazon Inspector score given to the finding.
+--
+-- 'scoreDetails', 'enhancedImageScanFinding_scoreDetails' - An object that contains details of the Amazon Inspector score.
+--
+-- 'severity', 'enhancedImageScanFinding_severity' - The severity of the finding.
+--
+-- 'status', 'enhancedImageScanFinding_status' - The status of the finding.
+--
+-- 'title', 'enhancedImageScanFinding_title' - The title of the finding.
+--
+-- 'type'', 'enhancedImageScanFinding_type' - The type of the finding.
+--
+-- 'updatedAt', 'enhancedImageScanFinding_updatedAt' - The date and time the finding was last updated at.
+newEnhancedImageScanFinding ::
+  EnhancedImageScanFinding
+newEnhancedImageScanFinding =
+  EnhancedImageScanFinding'
+    { awsAccountId =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      findingArn = Prelude.Nothing,
+      firstObservedAt = Prelude.Nothing,
+      lastObservedAt = Prelude.Nothing,
+      packageVulnerabilityDetails = Prelude.Nothing,
+      remediation = Prelude.Nothing,
+      resources = Prelude.Nothing,
+      score = Prelude.Nothing,
+      scoreDetails = Prelude.Nothing,
+      severity = Prelude.Nothing,
+      status = Prelude.Nothing,
+      title = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | The Amazon Web Services account ID associated with the image.
+enhancedImageScanFinding_awsAccountId :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_awsAccountId = Lens.lens (\EnhancedImageScanFinding' {awsAccountId} -> awsAccountId) (\s@EnhancedImageScanFinding' {} a -> s {awsAccountId = a} :: EnhancedImageScanFinding)
+
+-- | The description of the finding.
+enhancedImageScanFinding_description :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_description = Lens.lens (\EnhancedImageScanFinding' {description} -> description) (\s@EnhancedImageScanFinding' {} a -> s {description = a} :: EnhancedImageScanFinding)
+
+-- | The Amazon Resource Number (ARN) of the finding.
+enhancedImageScanFinding_findingArn :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_findingArn = Lens.lens (\EnhancedImageScanFinding' {findingArn} -> findingArn) (\s@EnhancedImageScanFinding' {} a -> s {findingArn = a} :: EnhancedImageScanFinding)
+
+-- | The date and time that the finding was first observed.
+enhancedImageScanFinding_firstObservedAt :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.UTCTime)
+enhancedImageScanFinding_firstObservedAt = Lens.lens (\EnhancedImageScanFinding' {firstObservedAt} -> firstObservedAt) (\s@EnhancedImageScanFinding' {} a -> s {firstObservedAt = a} :: EnhancedImageScanFinding) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time that the finding was last observed.
+enhancedImageScanFinding_lastObservedAt :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.UTCTime)
+enhancedImageScanFinding_lastObservedAt = Lens.lens (\EnhancedImageScanFinding' {lastObservedAt} -> lastObservedAt) (\s@EnhancedImageScanFinding' {} a -> s {lastObservedAt = a} :: EnhancedImageScanFinding) Prelude.. Lens.mapping Data._Time
+
+-- | An object that contains the details of a package vulnerability finding.
+enhancedImageScanFinding_packageVulnerabilityDetails :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe PackageVulnerabilityDetails)
+enhancedImageScanFinding_packageVulnerabilityDetails = Lens.lens (\EnhancedImageScanFinding' {packageVulnerabilityDetails} -> packageVulnerabilityDetails) (\s@EnhancedImageScanFinding' {} a -> s {packageVulnerabilityDetails = a} :: EnhancedImageScanFinding)
+
+-- | An object that contains the details about how to remediate a finding.
+enhancedImageScanFinding_remediation :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Remediation)
+enhancedImageScanFinding_remediation = Lens.lens (\EnhancedImageScanFinding' {remediation} -> remediation) (\s@EnhancedImageScanFinding' {} a -> s {remediation = a} :: EnhancedImageScanFinding)
+
+-- | Contains information on the resources involved in a finding.
+enhancedImageScanFinding_resources :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe [Resource])
+enhancedImageScanFinding_resources = Lens.lens (\EnhancedImageScanFinding' {resources} -> resources) (\s@EnhancedImageScanFinding' {} a -> s {resources = a} :: EnhancedImageScanFinding) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Inspector score given to the finding.
+enhancedImageScanFinding_score :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Double)
+enhancedImageScanFinding_score = Lens.lens (\EnhancedImageScanFinding' {score} -> score) (\s@EnhancedImageScanFinding' {} a -> s {score = a} :: EnhancedImageScanFinding)
+
+-- | An object that contains details of the Amazon Inspector score.
+enhancedImageScanFinding_scoreDetails :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe ScoreDetails)
+enhancedImageScanFinding_scoreDetails = Lens.lens (\EnhancedImageScanFinding' {scoreDetails} -> scoreDetails) (\s@EnhancedImageScanFinding' {} a -> s {scoreDetails = a} :: EnhancedImageScanFinding)
+
+-- | The severity of the finding.
+enhancedImageScanFinding_severity :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_severity = Lens.lens (\EnhancedImageScanFinding' {severity} -> severity) (\s@EnhancedImageScanFinding' {} a -> s {severity = a} :: EnhancedImageScanFinding)
+
+-- | The status of the finding.
+enhancedImageScanFinding_status :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_status = Lens.lens (\EnhancedImageScanFinding' {status} -> status) (\s@EnhancedImageScanFinding' {} a -> s {status = a} :: EnhancedImageScanFinding)
+
+-- | The title of the finding.
+enhancedImageScanFinding_title :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_title = Lens.lens (\EnhancedImageScanFinding' {title} -> title) (\s@EnhancedImageScanFinding' {} a -> s {title = a} :: EnhancedImageScanFinding)
+
+-- | The type of the finding.
+enhancedImageScanFinding_type :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.Text)
+enhancedImageScanFinding_type = Lens.lens (\EnhancedImageScanFinding' {type'} -> type') (\s@EnhancedImageScanFinding' {} a -> s {type' = a} :: EnhancedImageScanFinding)
+
+-- | The date and time the finding was last updated at.
+enhancedImageScanFinding_updatedAt :: Lens.Lens' EnhancedImageScanFinding (Prelude.Maybe Prelude.UTCTime)
+enhancedImageScanFinding_updatedAt = Lens.lens (\EnhancedImageScanFinding' {updatedAt} -> updatedAt) (\s@EnhancedImageScanFinding' {} a -> s {updatedAt = a} :: EnhancedImageScanFinding) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON EnhancedImageScanFinding where
+  parseJSON =
+    Data.withObject
+      "EnhancedImageScanFinding"
+      ( \x ->
+          EnhancedImageScanFinding'
+            Prelude.<$> (x Data..:? "awsAccountId")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "findingArn")
+            Prelude.<*> (x Data..:? "firstObservedAt")
+            Prelude.<*> (x Data..:? "lastObservedAt")
+            Prelude.<*> (x Data..:? "packageVulnerabilityDetails")
+            Prelude.<*> (x Data..:? "remediation")
+            Prelude.<*> (x Data..:? "resources" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "score")
+            Prelude.<*> (x Data..:? "scoreDetails")
+            Prelude.<*> (x Data..:? "severity")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "title")
+            Prelude.<*> (x Data..:? "type")
+            Prelude.<*> (x Data..:? "updatedAt")
+      )
+
+instance Prelude.Hashable EnhancedImageScanFinding where
+  hashWithSalt _salt EnhancedImageScanFinding' {..} =
+    _salt
+      `Prelude.hashWithSalt` awsAccountId
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` findingArn
+      `Prelude.hashWithSalt` firstObservedAt
+      `Prelude.hashWithSalt` lastObservedAt
+      `Prelude.hashWithSalt` packageVulnerabilityDetails
+      `Prelude.hashWithSalt` remediation
+      `Prelude.hashWithSalt` resources
+      `Prelude.hashWithSalt` score
+      `Prelude.hashWithSalt` scoreDetails
+      `Prelude.hashWithSalt` severity
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` title
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData EnhancedImageScanFinding where
+  rnf EnhancedImageScanFinding' {..} =
+    Prelude.rnf awsAccountId
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf findingArn
+      `Prelude.seq` Prelude.rnf firstObservedAt
+      `Prelude.seq` Prelude.rnf lastObservedAt
+      `Prelude.seq` Prelude.rnf packageVulnerabilityDetails
+      `Prelude.seq` Prelude.rnf remediation
+      `Prelude.seq` Prelude.rnf resources
+      `Prelude.seq` Prelude.rnf score
+      `Prelude.seq` Prelude.rnf scoreDetails
+      `Prelude.seq` Prelude.rnf severity
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf title
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/ECR/Types/FindingSeverity.hs b/gen/Amazonka/ECR/Types/FindingSeverity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/FindingSeverity.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.ECR.Types.FindingSeverity
+-- 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.ECR.Types.FindingSeverity
+  ( FindingSeverity
+      ( ..,
+        FindingSeverity_CRITICAL,
+        FindingSeverity_HIGH,
+        FindingSeverity_INFORMATIONAL,
+        FindingSeverity_LOW,
+        FindingSeverity_MEDIUM,
+        FindingSeverity_UNDEFINED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FindingSeverity = FindingSeverity'
+  { fromFindingSeverity ::
+      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 FindingSeverity_CRITICAL :: FindingSeverity
+pattern FindingSeverity_CRITICAL = FindingSeverity' "CRITICAL"
+
+pattern FindingSeverity_HIGH :: FindingSeverity
+pattern FindingSeverity_HIGH = FindingSeverity' "HIGH"
+
+pattern FindingSeverity_INFORMATIONAL :: FindingSeverity
+pattern FindingSeverity_INFORMATIONAL = FindingSeverity' "INFORMATIONAL"
+
+pattern FindingSeverity_LOW :: FindingSeverity
+pattern FindingSeverity_LOW = FindingSeverity' "LOW"
+
+pattern FindingSeverity_MEDIUM :: FindingSeverity
+pattern FindingSeverity_MEDIUM = FindingSeverity' "MEDIUM"
+
+pattern FindingSeverity_UNDEFINED :: FindingSeverity
+pattern FindingSeverity_UNDEFINED = FindingSeverity' "UNDEFINED"
+
+{-# COMPLETE
+  FindingSeverity_CRITICAL,
+  FindingSeverity_HIGH,
+  FindingSeverity_INFORMATIONAL,
+  FindingSeverity_LOW,
+  FindingSeverity_MEDIUM,
+  FindingSeverity_UNDEFINED,
+  FindingSeverity'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/Image.hs b/gen/Amazonka/ECR/Types/Image.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Image.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.ECR.Types.Image
+-- 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.ECR.Types.Image where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ImageIdentifier
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image.
+--
+-- /See:/ 'newImage' smart constructor.
+data Image = Image'
+  { -- | An object containing the image tag and image digest associated with an
+    -- image.
+    imageId :: Prelude.Maybe ImageIdentifier,
+    -- | The image manifest associated with the image.
+    imageManifest :: Prelude.Maybe Prelude.Text,
+    -- | The manifest media type of the image.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry
+    -- containing the image.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository associated with the image.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Image' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageId', 'image_imageId' - An object containing the image tag and image digest associated with an
+-- image.
+--
+-- 'imageManifest', 'image_imageManifest' - The image manifest associated with the image.
+--
+-- 'imageManifestMediaType', 'image_imageManifestMediaType' - The manifest media type of the image.
+--
+-- 'registryId', 'image_registryId' - The Amazon Web Services account ID associated with the registry
+-- containing the image.
+--
+-- 'repositoryName', 'image_repositoryName' - The name of the repository associated with the image.
+newImage ::
+  Image
+newImage =
+  Image'
+    { imageId = Prelude.Nothing,
+      imageManifest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | An object containing the image tag and image digest associated with an
+-- image.
+image_imageId :: Lens.Lens' Image (Prelude.Maybe ImageIdentifier)
+image_imageId = Lens.lens (\Image' {imageId} -> imageId) (\s@Image' {} a -> s {imageId = a} :: Image)
+
+-- | The image manifest associated with the image.
+image_imageManifest :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_imageManifest = Lens.lens (\Image' {imageManifest} -> imageManifest) (\s@Image' {} a -> s {imageManifest = a} :: Image)
+
+-- | The manifest media type of the image.
+image_imageManifestMediaType :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_imageManifestMediaType = Lens.lens (\Image' {imageManifestMediaType} -> imageManifestMediaType) (\s@Image' {} a -> s {imageManifestMediaType = a} :: Image)
+
+-- | The Amazon Web Services account ID associated with the registry
+-- containing the image.
+image_registryId :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_registryId = Lens.lens (\Image' {registryId} -> registryId) (\s@Image' {} a -> s {registryId = a} :: Image)
+
+-- | The name of the repository associated with the image.
+image_repositoryName :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_repositoryName = Lens.lens (\Image' {repositoryName} -> repositoryName) (\s@Image' {} a -> s {repositoryName = a} :: Image)
+
+instance Data.FromJSON Image where
+  parseJSON =
+    Data.withObject
+      "Image"
+      ( \x ->
+          Image'
+            Prelude.<$> (x Data..:? "imageId")
+            Prelude.<*> (x Data..:? "imageManifest")
+            Prelude.<*> (x Data..:? "imageManifestMediaType")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance Prelude.Hashable Image where
+  hashWithSalt _salt Image' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageId
+      `Prelude.hashWithSalt` imageManifest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData Image where
+  rnf Image' {..} =
+    Prelude.rnf imageId
+      `Prelude.seq` Prelude.rnf imageManifest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECR/Types/ImageActionType.hs b/gen/Amazonka/ECR/Types/ImageActionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageActionType.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.ECR.Types.ImageActionType
+-- 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.ECR.Types.ImageActionType
+  ( ImageActionType
+      ( ..,
+        ImageActionType_EXPIRE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImageActionType = ImageActionType'
+  { fromImageActionType ::
+      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 ImageActionType_EXPIRE :: ImageActionType
+pattern ImageActionType_EXPIRE = ImageActionType' "EXPIRE"
+
+{-# COMPLETE
+  ImageActionType_EXPIRE,
+  ImageActionType'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ImageDetail.hs b/gen/Amazonka/ECR/Types/ImageDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageDetail.hs
@@ -0,0 +1,255 @@
+{-# 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.ECR.Types.ImageDetail
+-- 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.ECR.Types.ImageDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ImageScanFindingsSummary
+import Amazonka.ECR.Types.ImageScanStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that describes an image returned by a DescribeImages
+-- operation.
+--
+-- /See:/ 'newImageDetail' smart constructor.
+data ImageDetail = ImageDetail'
+  { -- | The artifact media type of the image.
+    artifactMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The media type of the image manifest.
+    imageManifestMediaType :: Prelude.Maybe Prelude.Text,
+    -- | The date and time, expressed in standard JavaScript date format, at
+    -- which the current image was pushed to the repository.
+    imagePushedAt :: Prelude.Maybe Data.POSIX,
+    -- | A summary of the last completed image scan.
+    imageScanFindingsSummary :: Prelude.Maybe ImageScanFindingsSummary,
+    -- | The current state of the scan.
+    imageScanStatus :: Prelude.Maybe ImageScanStatus,
+    -- | The size, in bytes, of the image in the repository.
+    --
+    -- If the image is a manifest list, this will be the max size of all
+    -- manifests in the list.
+    --
+    -- Beginning with Docker version 1.9, the Docker client compresses image
+    -- layers before pushing them to a V2 Docker registry. The output of the
+    -- @docker images@ command shows the uncompressed image size, so it may
+    -- return a larger image size than the image sizes returned by
+    -- DescribeImages.
+    imageSizeInBytes :: Prelude.Maybe Prelude.Integer,
+    -- | The list of tags associated with this image.
+    imageTags :: Prelude.Maybe [Prelude.Text],
+    -- | The date and time, expressed in standard JavaScript date format, when
+    -- Amazon ECR recorded the last image pull.
+    --
+    -- Amazon ECR refreshes the last image pull timestamp at least once every
+    -- 24 hours. For example, if you pull an image once a day then the
+    -- @lastRecordedPullTime@ timestamp will indicate the exact time that the
+    -- image was last pulled. However, if you pull an image once an hour,
+    -- because Amazon ECR refreshes the @lastRecordedPullTime@ timestamp at
+    -- least once every 24 hours, the result may not be the exact time that the
+    -- image was last pulled.
+    lastRecordedPullTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Web Services account ID associated with the registry to which
+    -- this image belongs.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which this image belongs.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'artifactMediaType', 'imageDetail_artifactMediaType' - The artifact media type of the image.
+--
+-- 'imageDigest', 'imageDetail_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imageManifestMediaType', 'imageDetail_imageManifestMediaType' - The media type of the image manifest.
+--
+-- 'imagePushedAt', 'imageDetail_imagePushedAt' - The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+--
+-- 'imageScanFindingsSummary', 'imageDetail_imageScanFindingsSummary' - A summary of the last completed image scan.
+--
+-- 'imageScanStatus', 'imageDetail_imageScanStatus' - The current state of the scan.
+--
+-- 'imageSizeInBytes', 'imageDetail_imageSizeInBytes' - The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+--
+-- 'imageTags', 'imageDetail_imageTags' - The list of tags associated with this image.
+--
+-- 'lastRecordedPullTime', 'imageDetail_lastRecordedPullTime' - The date and time, expressed in standard JavaScript date format, when
+-- Amazon ECR recorded the last image pull.
+--
+-- Amazon ECR refreshes the last image pull timestamp at least once every
+-- 24 hours. For example, if you pull an image once a day then the
+-- @lastRecordedPullTime@ timestamp will indicate the exact time that the
+-- image was last pulled. However, if you pull an image once an hour,
+-- because Amazon ECR refreshes the @lastRecordedPullTime@ timestamp at
+-- least once every 24 hours, the result may not be the exact time that the
+-- image was last pulled.
+--
+-- 'registryId', 'imageDetail_registryId' - The Amazon Web Services account ID associated with the registry to which
+-- this image belongs.
+--
+-- 'repositoryName', 'imageDetail_repositoryName' - The name of the repository to which this image belongs.
+newImageDetail ::
+  ImageDetail
+newImageDetail =
+  ImageDetail'
+    { artifactMediaType = Prelude.Nothing,
+      imageDigest = Prelude.Nothing,
+      imageManifestMediaType = Prelude.Nothing,
+      imagePushedAt = Prelude.Nothing,
+      imageScanFindingsSummary = Prelude.Nothing,
+      imageScanStatus = Prelude.Nothing,
+      imageSizeInBytes = Prelude.Nothing,
+      imageTags = Prelude.Nothing,
+      lastRecordedPullTime = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | The artifact media type of the image.
+imageDetail_artifactMediaType :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_artifactMediaType = Lens.lens (\ImageDetail' {artifactMediaType} -> artifactMediaType) (\s@ImageDetail' {} a -> s {artifactMediaType = a} :: ImageDetail)
+
+-- | The @sha256@ digest of the image manifest.
+imageDetail_imageDigest :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_imageDigest = Lens.lens (\ImageDetail' {imageDigest} -> imageDigest) (\s@ImageDetail' {} a -> s {imageDigest = a} :: ImageDetail)
+
+-- | The media type of the image manifest.
+imageDetail_imageManifestMediaType :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_imageManifestMediaType = Lens.lens (\ImageDetail' {imageManifestMediaType} -> imageManifestMediaType) (\s@ImageDetail' {} a -> s {imageManifestMediaType = a} :: ImageDetail)
+
+-- | The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+imageDetail_imagePushedAt :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.UTCTime)
+imageDetail_imagePushedAt = Lens.lens (\ImageDetail' {imagePushedAt} -> imagePushedAt) (\s@ImageDetail' {} a -> s {imagePushedAt = a} :: ImageDetail) Prelude.. Lens.mapping Data._Time
+
+-- | A summary of the last completed image scan.
+imageDetail_imageScanFindingsSummary :: Lens.Lens' ImageDetail (Prelude.Maybe ImageScanFindingsSummary)
+imageDetail_imageScanFindingsSummary = Lens.lens (\ImageDetail' {imageScanFindingsSummary} -> imageScanFindingsSummary) (\s@ImageDetail' {} a -> s {imageScanFindingsSummary = a} :: ImageDetail)
+
+-- | The current state of the scan.
+imageDetail_imageScanStatus :: Lens.Lens' ImageDetail (Prelude.Maybe ImageScanStatus)
+imageDetail_imageScanStatus = Lens.lens (\ImageDetail' {imageScanStatus} -> imageScanStatus) (\s@ImageDetail' {} a -> s {imageScanStatus = a} :: ImageDetail)
+
+-- | The size, in bytes, of the image in the repository.
+--
+-- If the image is a manifest list, this will be the max size of all
+-- manifests in the list.
+--
+-- Beginning with Docker version 1.9, the Docker client compresses image
+-- layers before pushing them to a V2 Docker registry. The output of the
+-- @docker images@ command shows the uncompressed image size, so it may
+-- return a larger image size than the image sizes returned by
+-- DescribeImages.
+imageDetail_imageSizeInBytes :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Integer)
+imageDetail_imageSizeInBytes = Lens.lens (\ImageDetail' {imageSizeInBytes} -> imageSizeInBytes) (\s@ImageDetail' {} a -> s {imageSizeInBytes = a} :: ImageDetail)
+
+-- | The list of tags associated with this image.
+imageDetail_imageTags :: Lens.Lens' ImageDetail (Prelude.Maybe [Prelude.Text])
+imageDetail_imageTags = Lens.lens (\ImageDetail' {imageTags} -> imageTags) (\s@ImageDetail' {} a -> s {imageTags = a} :: ImageDetail) Prelude.. Lens.mapping Lens.coerced
+
+-- | The date and time, expressed in standard JavaScript date format, when
+-- Amazon ECR recorded the last image pull.
+--
+-- Amazon ECR refreshes the last image pull timestamp at least once every
+-- 24 hours. For example, if you pull an image once a day then the
+-- @lastRecordedPullTime@ timestamp will indicate the exact time that the
+-- image was last pulled. However, if you pull an image once an hour,
+-- because Amazon ECR refreshes the @lastRecordedPullTime@ timestamp at
+-- least once every 24 hours, the result may not be the exact time that the
+-- image was last pulled.
+imageDetail_lastRecordedPullTime :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.UTCTime)
+imageDetail_lastRecordedPullTime = Lens.lens (\ImageDetail' {lastRecordedPullTime} -> lastRecordedPullTime) (\s@ImageDetail' {} a -> s {lastRecordedPullTime = a} :: ImageDetail) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Web Services account ID associated with the registry to which
+-- this image belongs.
+imageDetail_registryId :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_registryId = Lens.lens (\ImageDetail' {registryId} -> registryId) (\s@ImageDetail' {} a -> s {registryId = a} :: ImageDetail)
+
+-- | The name of the repository to which this image belongs.
+imageDetail_repositoryName :: Lens.Lens' ImageDetail (Prelude.Maybe Prelude.Text)
+imageDetail_repositoryName = Lens.lens (\ImageDetail' {repositoryName} -> repositoryName) (\s@ImageDetail' {} a -> s {repositoryName = a} :: ImageDetail)
+
+instance Data.FromJSON ImageDetail where
+  parseJSON =
+    Data.withObject
+      "ImageDetail"
+      ( \x ->
+          ImageDetail'
+            Prelude.<$> (x Data..:? "artifactMediaType")
+            Prelude.<*> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imageManifestMediaType")
+            Prelude.<*> (x Data..:? "imagePushedAt")
+            Prelude.<*> (x Data..:? "imageScanFindingsSummary")
+            Prelude.<*> (x Data..:? "imageScanStatus")
+            Prelude.<*> (x Data..:? "imageSizeInBytes")
+            Prelude.<*> (x Data..:? "imageTags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "lastRecordedPullTime")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance Prelude.Hashable ImageDetail where
+  hashWithSalt _salt ImageDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` artifactMediaType
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageManifestMediaType
+      `Prelude.hashWithSalt` imagePushedAt
+      `Prelude.hashWithSalt` imageScanFindingsSummary
+      `Prelude.hashWithSalt` imageScanStatus
+      `Prelude.hashWithSalt` imageSizeInBytes
+      `Prelude.hashWithSalt` imageTags
+      `Prelude.hashWithSalt` lastRecordedPullTime
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+
+instance Prelude.NFData ImageDetail where
+  rnf ImageDetail' {..} =
+    Prelude.rnf artifactMediaType
+      `Prelude.seq` Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageManifestMediaType
+      `Prelude.seq` Prelude.rnf imagePushedAt
+      `Prelude.seq` Prelude.rnf imageScanFindingsSummary
+      `Prelude.seq` Prelude.rnf imageScanStatus
+      `Prelude.seq` Prelude.rnf imageSizeInBytes
+      `Prelude.seq` Prelude.rnf imageTags
+      `Prelude.seq` Prelude.rnf lastRecordedPullTime
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECR/Types/ImageFailure.hs b/gen/Amazonka/ECR/Types/ImageFailure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageFailure.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ImageFailure
+-- 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.ECR.Types.ImageFailure where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ImageFailureCode
+import Amazonka.ECR.Types.ImageIdentifier
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image failure.
+--
+-- /See:/ 'newImageFailure' smart constructor.
+data ImageFailure = ImageFailure'
+  { -- | The code associated with the failure.
+    failureCode :: Prelude.Maybe ImageFailureCode,
+    -- | The reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The image ID associated with the failure.
+    imageId :: Prelude.Maybe ImageIdentifier
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageFailure' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'imageFailure_failureCode' - The code associated with the failure.
+--
+-- 'failureReason', 'imageFailure_failureReason' - The reason for the failure.
+--
+-- 'imageId', 'imageFailure_imageId' - The image ID associated with the failure.
+newImageFailure ::
+  ImageFailure
+newImageFailure =
+  ImageFailure'
+    { failureCode = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      imageId = Prelude.Nothing
+    }
+
+-- | The code associated with the failure.
+imageFailure_failureCode :: Lens.Lens' ImageFailure (Prelude.Maybe ImageFailureCode)
+imageFailure_failureCode = Lens.lens (\ImageFailure' {failureCode} -> failureCode) (\s@ImageFailure' {} a -> s {failureCode = a} :: ImageFailure)
+
+-- | The reason for the failure.
+imageFailure_failureReason :: Lens.Lens' ImageFailure (Prelude.Maybe Prelude.Text)
+imageFailure_failureReason = Lens.lens (\ImageFailure' {failureReason} -> failureReason) (\s@ImageFailure' {} a -> s {failureReason = a} :: ImageFailure)
+
+-- | The image ID associated with the failure.
+imageFailure_imageId :: Lens.Lens' ImageFailure (Prelude.Maybe ImageIdentifier)
+imageFailure_imageId = Lens.lens (\ImageFailure' {imageId} -> imageId) (\s@ImageFailure' {} a -> s {imageId = a} :: ImageFailure)
+
+instance Data.FromJSON ImageFailure where
+  parseJSON =
+    Data.withObject
+      "ImageFailure"
+      ( \x ->
+          ImageFailure'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "imageId")
+      )
+
+instance Prelude.Hashable ImageFailure where
+  hashWithSalt _salt ImageFailure' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureCode
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` imageId
+
+instance Prelude.NFData ImageFailure where
+  rnf ImageFailure' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf imageId
diff --git a/gen/Amazonka/ECR/Types/ImageFailureCode.hs b/gen/Amazonka/ECR/Types/ImageFailureCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageFailureCode.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.ECR.Types.ImageFailureCode
+-- 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.ECR.Types.ImageFailureCode
+  ( ImageFailureCode
+      ( ..,
+        ImageFailureCode_ImageNotFound,
+        ImageFailureCode_ImageReferencedByManifestList,
+        ImageFailureCode_ImageTagDoesNotMatchDigest,
+        ImageFailureCode_InvalidImageDigest,
+        ImageFailureCode_InvalidImageTag,
+        ImageFailureCode_KmsError,
+        ImageFailureCode_MissingDigestAndTag
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImageFailureCode = ImageFailureCode'
+  { fromImageFailureCode ::
+      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 ImageFailureCode_ImageNotFound :: ImageFailureCode
+pattern ImageFailureCode_ImageNotFound = ImageFailureCode' "ImageNotFound"
+
+pattern ImageFailureCode_ImageReferencedByManifestList :: ImageFailureCode
+pattern ImageFailureCode_ImageReferencedByManifestList = ImageFailureCode' "ImageReferencedByManifestList"
+
+pattern ImageFailureCode_ImageTagDoesNotMatchDigest :: ImageFailureCode
+pattern ImageFailureCode_ImageTagDoesNotMatchDigest = ImageFailureCode' "ImageTagDoesNotMatchDigest"
+
+pattern ImageFailureCode_InvalidImageDigest :: ImageFailureCode
+pattern ImageFailureCode_InvalidImageDigest = ImageFailureCode' "InvalidImageDigest"
+
+pattern ImageFailureCode_InvalidImageTag :: ImageFailureCode
+pattern ImageFailureCode_InvalidImageTag = ImageFailureCode' "InvalidImageTag"
+
+pattern ImageFailureCode_KmsError :: ImageFailureCode
+pattern ImageFailureCode_KmsError = ImageFailureCode' "KmsError"
+
+pattern ImageFailureCode_MissingDigestAndTag :: ImageFailureCode
+pattern ImageFailureCode_MissingDigestAndTag = ImageFailureCode' "MissingDigestAndTag"
+
+{-# COMPLETE
+  ImageFailureCode_ImageNotFound,
+  ImageFailureCode_ImageReferencedByManifestList,
+  ImageFailureCode_ImageTagDoesNotMatchDigest,
+  ImageFailureCode_InvalidImageDigest,
+  ImageFailureCode_InvalidImageTag,
+  ImageFailureCode_KmsError,
+  ImageFailureCode_MissingDigestAndTag,
+  ImageFailureCode'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ImageIdentifier.hs b/gen/Amazonka/ECR/Types/ImageIdentifier.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageIdentifier.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.ECR.Types.ImageIdentifier
+-- 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.ECR.Types.ImageIdentifier where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object with identifying information for an image in an Amazon ECR
+-- repository.
+--
+-- /See:/ 'newImageIdentifier' smart constructor.
+data ImageIdentifier = ImageIdentifier'
+  { -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The tag used for the image.
+    imageTag :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageIdentifier' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'imageDigest', 'imageIdentifier_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imageTag', 'imageIdentifier_imageTag' - The tag used for the image.
+newImageIdentifier ::
+  ImageIdentifier
+newImageIdentifier =
+  ImageIdentifier'
+    { imageDigest = Prelude.Nothing,
+      imageTag = Prelude.Nothing
+    }
+
+-- | The @sha256@ digest of the image manifest.
+imageIdentifier_imageDigest :: Lens.Lens' ImageIdentifier (Prelude.Maybe Prelude.Text)
+imageIdentifier_imageDigest = Lens.lens (\ImageIdentifier' {imageDigest} -> imageDigest) (\s@ImageIdentifier' {} a -> s {imageDigest = a} :: ImageIdentifier)
+
+-- | The tag used for the image.
+imageIdentifier_imageTag :: Lens.Lens' ImageIdentifier (Prelude.Maybe Prelude.Text)
+imageIdentifier_imageTag = Lens.lens (\ImageIdentifier' {imageTag} -> imageTag) (\s@ImageIdentifier' {} a -> s {imageTag = a} :: ImageIdentifier)
+
+instance Data.FromJSON ImageIdentifier where
+  parseJSON =
+    Data.withObject
+      "ImageIdentifier"
+      ( \x ->
+          ImageIdentifier'
+            Prelude.<$> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imageTag")
+      )
+
+instance Prelude.Hashable ImageIdentifier where
+  hashWithSalt _salt ImageIdentifier' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imageTag
+
+instance Prelude.NFData ImageIdentifier where
+  rnf ImageIdentifier' {..} =
+    Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imageTag
+
+instance Data.ToJSON ImageIdentifier where
+  toJSON ImageIdentifier' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("imageDigest" Data..=) Prelude.<$> imageDigest,
+            ("imageTag" Data..=) Prelude.<$> imageTag
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/ImageReplicationStatus.hs b/gen/Amazonka/ECR/Types/ImageReplicationStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageReplicationStatus.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.ECR.Types.ImageReplicationStatus
+-- 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.ECR.Types.ImageReplicationStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ReplicationStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The status of the replication process for an image.
+--
+-- /See:/ 'newImageReplicationStatus' smart constructor.
+data ImageReplicationStatus = ImageReplicationStatus'
+  { -- | The failure code for a replication that has failed.
+    failureCode :: Prelude.Maybe Prelude.Text,
+    -- | The destination Region for the image replication.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry to which
+    -- the image belongs.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The image replication status.
+    status :: Prelude.Maybe ReplicationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageReplicationStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'imageReplicationStatus_failureCode' - The failure code for a replication that has failed.
+--
+-- 'region', 'imageReplicationStatus_region' - The destination Region for the image replication.
+--
+-- 'registryId', 'imageReplicationStatus_registryId' - The Amazon Web Services account ID associated with the registry to which
+-- the image belongs.
+--
+-- 'status', 'imageReplicationStatus_status' - The image replication status.
+newImageReplicationStatus ::
+  ImageReplicationStatus
+newImageReplicationStatus =
+  ImageReplicationStatus'
+    { failureCode =
+        Prelude.Nothing,
+      region = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The failure code for a replication that has failed.
+imageReplicationStatus_failureCode :: Lens.Lens' ImageReplicationStatus (Prelude.Maybe Prelude.Text)
+imageReplicationStatus_failureCode = Lens.lens (\ImageReplicationStatus' {failureCode} -> failureCode) (\s@ImageReplicationStatus' {} a -> s {failureCode = a} :: ImageReplicationStatus)
+
+-- | The destination Region for the image replication.
+imageReplicationStatus_region :: Lens.Lens' ImageReplicationStatus (Prelude.Maybe Prelude.Text)
+imageReplicationStatus_region = Lens.lens (\ImageReplicationStatus' {region} -> region) (\s@ImageReplicationStatus' {} a -> s {region = a} :: ImageReplicationStatus)
+
+-- | The Amazon Web Services account ID associated with the registry to which
+-- the image belongs.
+imageReplicationStatus_registryId :: Lens.Lens' ImageReplicationStatus (Prelude.Maybe Prelude.Text)
+imageReplicationStatus_registryId = Lens.lens (\ImageReplicationStatus' {registryId} -> registryId) (\s@ImageReplicationStatus' {} a -> s {registryId = a} :: ImageReplicationStatus)
+
+-- | The image replication status.
+imageReplicationStatus_status :: Lens.Lens' ImageReplicationStatus (Prelude.Maybe ReplicationStatus)
+imageReplicationStatus_status = Lens.lens (\ImageReplicationStatus' {status} -> status) (\s@ImageReplicationStatus' {} a -> s {status = a} :: ImageReplicationStatus)
+
+instance Data.FromJSON ImageReplicationStatus where
+  parseJSON =
+    Data.withObject
+      "ImageReplicationStatus"
+      ( \x ->
+          ImageReplicationStatus'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "region")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable ImageReplicationStatus where
+  hashWithSalt _salt ImageReplicationStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureCode
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ImageReplicationStatus where
+  rnf ImageReplicationStatus' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf region
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/ECR/Types/ImageScanFinding.hs b/gen/Amazonka/ECR/Types/ImageScanFinding.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageScanFinding.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.ECR.Types.ImageScanFinding
+-- 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.ECR.Types.ImageScanFinding where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.Attribute
+import Amazonka.ECR.Types.FindingSeverity
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an image scan finding.
+--
+-- /See:/ 'newImageScanFinding' smart constructor.
+data ImageScanFinding = ImageScanFinding'
+  { -- | A collection of attributes of the host from which the finding is
+    -- generated.
+    attributes :: Prelude.Maybe [Attribute],
+    -- | The description of the finding.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The name associated with the finding, usually a CVE number.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The finding severity.
+    severity :: Prelude.Maybe FindingSeverity,
+    -- | A link containing additional details about the security vulnerability.
+    uri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageScanFinding' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attributes', 'imageScanFinding_attributes' - A collection of attributes of the host from which the finding is
+-- generated.
+--
+-- 'description', 'imageScanFinding_description' - The description of the finding.
+--
+-- 'name', 'imageScanFinding_name' - The name associated with the finding, usually a CVE number.
+--
+-- 'severity', 'imageScanFinding_severity' - The finding severity.
+--
+-- 'uri', 'imageScanFinding_uri' - A link containing additional details about the security vulnerability.
+newImageScanFinding ::
+  ImageScanFinding
+newImageScanFinding =
+  ImageScanFinding'
+    { attributes = Prelude.Nothing,
+      description = Prelude.Nothing,
+      name = Prelude.Nothing,
+      severity = Prelude.Nothing,
+      uri = Prelude.Nothing
+    }
+
+-- | A collection of attributes of the host from which the finding is
+-- generated.
+imageScanFinding_attributes :: Lens.Lens' ImageScanFinding (Prelude.Maybe [Attribute])
+imageScanFinding_attributes = Lens.lens (\ImageScanFinding' {attributes} -> attributes) (\s@ImageScanFinding' {} a -> s {attributes = a} :: ImageScanFinding) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the finding.
+imageScanFinding_description :: Lens.Lens' ImageScanFinding (Prelude.Maybe Prelude.Text)
+imageScanFinding_description = Lens.lens (\ImageScanFinding' {description} -> description) (\s@ImageScanFinding' {} a -> s {description = a} :: ImageScanFinding)
+
+-- | The name associated with the finding, usually a CVE number.
+imageScanFinding_name :: Lens.Lens' ImageScanFinding (Prelude.Maybe Prelude.Text)
+imageScanFinding_name = Lens.lens (\ImageScanFinding' {name} -> name) (\s@ImageScanFinding' {} a -> s {name = a} :: ImageScanFinding)
+
+-- | The finding severity.
+imageScanFinding_severity :: Lens.Lens' ImageScanFinding (Prelude.Maybe FindingSeverity)
+imageScanFinding_severity = Lens.lens (\ImageScanFinding' {severity} -> severity) (\s@ImageScanFinding' {} a -> s {severity = a} :: ImageScanFinding)
+
+-- | A link containing additional details about the security vulnerability.
+imageScanFinding_uri :: Lens.Lens' ImageScanFinding (Prelude.Maybe Prelude.Text)
+imageScanFinding_uri = Lens.lens (\ImageScanFinding' {uri} -> uri) (\s@ImageScanFinding' {} a -> s {uri = a} :: ImageScanFinding)
+
+instance Data.FromJSON ImageScanFinding where
+  parseJSON =
+    Data.withObject
+      "ImageScanFinding"
+      ( \x ->
+          ImageScanFinding'
+            Prelude.<$> (x Data..:? "attributes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "severity")
+            Prelude.<*> (x Data..:? "uri")
+      )
+
+instance Prelude.Hashable ImageScanFinding where
+  hashWithSalt _salt ImageScanFinding' {..} =
+    _salt
+      `Prelude.hashWithSalt` attributes
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` severity
+      `Prelude.hashWithSalt` uri
+
+instance Prelude.NFData ImageScanFinding where
+  rnf ImageScanFinding' {..} =
+    Prelude.rnf attributes
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf severity
+      `Prelude.seq` Prelude.rnf uri
diff --git a/gen/Amazonka/ECR/Types/ImageScanFindings.hs b/gen/Amazonka/ECR/Types/ImageScanFindings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageScanFindings.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ImageScanFindings
+-- 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.ECR.Types.ImageScanFindings where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.EnhancedImageScanFinding
+import Amazonka.ECR.Types.FindingSeverity
+import Amazonka.ECR.Types.ImageScanFinding
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of an image scan.
+--
+-- /See:/ 'newImageScanFindings' smart constructor.
+data ImageScanFindings = ImageScanFindings'
+  { -- | Details about the enhanced scan findings from Amazon Inspector.
+    enhancedFindings :: Prelude.Maybe [EnhancedImageScanFinding],
+    -- | The image vulnerability counts, sorted by severity.
+    findingSeverityCounts :: Prelude.Maybe (Prelude.HashMap FindingSeverity Prelude.Natural),
+    -- | The findings from the image scan.
+    findings :: Prelude.Maybe [ImageScanFinding],
+    -- | The time of the last completed image scan.
+    imageScanCompletedAt :: Prelude.Maybe Data.POSIX,
+    -- | The time when the vulnerability data was last scanned.
+    vulnerabilitySourceUpdatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageScanFindings' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'enhancedFindings', 'imageScanFindings_enhancedFindings' - Details about the enhanced scan findings from Amazon Inspector.
+--
+-- 'findingSeverityCounts', 'imageScanFindings_findingSeverityCounts' - The image vulnerability counts, sorted by severity.
+--
+-- 'findings', 'imageScanFindings_findings' - The findings from the image scan.
+--
+-- 'imageScanCompletedAt', 'imageScanFindings_imageScanCompletedAt' - The time of the last completed image scan.
+--
+-- 'vulnerabilitySourceUpdatedAt', 'imageScanFindings_vulnerabilitySourceUpdatedAt' - The time when the vulnerability data was last scanned.
+newImageScanFindings ::
+  ImageScanFindings
+newImageScanFindings =
+  ImageScanFindings'
+    { enhancedFindings =
+        Prelude.Nothing,
+      findingSeverityCounts = Prelude.Nothing,
+      findings = Prelude.Nothing,
+      imageScanCompletedAt = Prelude.Nothing,
+      vulnerabilitySourceUpdatedAt = Prelude.Nothing
+    }
+
+-- | Details about the enhanced scan findings from Amazon Inspector.
+imageScanFindings_enhancedFindings :: Lens.Lens' ImageScanFindings (Prelude.Maybe [EnhancedImageScanFinding])
+imageScanFindings_enhancedFindings = Lens.lens (\ImageScanFindings' {enhancedFindings} -> enhancedFindings) (\s@ImageScanFindings' {} a -> s {enhancedFindings = a} :: ImageScanFindings) Prelude.. Lens.mapping Lens.coerced
+
+-- | The image vulnerability counts, sorted by severity.
+imageScanFindings_findingSeverityCounts :: Lens.Lens' ImageScanFindings (Prelude.Maybe (Prelude.HashMap FindingSeverity Prelude.Natural))
+imageScanFindings_findingSeverityCounts = Lens.lens (\ImageScanFindings' {findingSeverityCounts} -> findingSeverityCounts) (\s@ImageScanFindings' {} a -> s {findingSeverityCounts = a} :: ImageScanFindings) Prelude.. Lens.mapping Lens.coerced
+
+-- | The findings from the image scan.
+imageScanFindings_findings :: Lens.Lens' ImageScanFindings (Prelude.Maybe [ImageScanFinding])
+imageScanFindings_findings = Lens.lens (\ImageScanFindings' {findings} -> findings) (\s@ImageScanFindings' {} a -> s {findings = a} :: ImageScanFindings) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time of the last completed image scan.
+imageScanFindings_imageScanCompletedAt :: Lens.Lens' ImageScanFindings (Prelude.Maybe Prelude.UTCTime)
+imageScanFindings_imageScanCompletedAt = Lens.lens (\ImageScanFindings' {imageScanCompletedAt} -> imageScanCompletedAt) (\s@ImageScanFindings' {} a -> s {imageScanCompletedAt = a} :: ImageScanFindings) Prelude.. Lens.mapping Data._Time
+
+-- | The time when the vulnerability data was last scanned.
+imageScanFindings_vulnerabilitySourceUpdatedAt :: Lens.Lens' ImageScanFindings (Prelude.Maybe Prelude.UTCTime)
+imageScanFindings_vulnerabilitySourceUpdatedAt = Lens.lens (\ImageScanFindings' {vulnerabilitySourceUpdatedAt} -> vulnerabilitySourceUpdatedAt) (\s@ImageScanFindings' {} a -> s {vulnerabilitySourceUpdatedAt = a} :: ImageScanFindings) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON ImageScanFindings where
+  parseJSON =
+    Data.withObject
+      "ImageScanFindings"
+      ( \x ->
+          ImageScanFindings'
+            Prelude.<$> ( x
+                            Data..:? "enhancedFindings"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "findingSeverityCounts"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "findings" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "imageScanCompletedAt")
+            Prelude.<*> (x Data..:? "vulnerabilitySourceUpdatedAt")
+      )
+
+instance Prelude.Hashable ImageScanFindings where
+  hashWithSalt _salt ImageScanFindings' {..} =
+    _salt
+      `Prelude.hashWithSalt` enhancedFindings
+      `Prelude.hashWithSalt` findingSeverityCounts
+      `Prelude.hashWithSalt` findings
+      `Prelude.hashWithSalt` imageScanCompletedAt
+      `Prelude.hashWithSalt` vulnerabilitySourceUpdatedAt
+
+instance Prelude.NFData ImageScanFindings where
+  rnf ImageScanFindings' {..} =
+    Prelude.rnf enhancedFindings
+      `Prelude.seq` Prelude.rnf findingSeverityCounts
+      `Prelude.seq` Prelude.rnf findings
+      `Prelude.seq` Prelude.rnf imageScanCompletedAt
+      `Prelude.seq` Prelude.rnf vulnerabilitySourceUpdatedAt
diff --git a/gen/Amazonka/ECR/Types/ImageScanFindingsSummary.hs b/gen/Amazonka/ECR/Types/ImageScanFindingsSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageScanFindingsSummary.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ImageScanFindingsSummary
+-- 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.ECR.Types.ImageScanFindingsSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.FindingSeverity
+import qualified Amazonka.Prelude as Prelude
+
+-- | A summary of the last completed image scan.
+--
+-- /See:/ 'newImageScanFindingsSummary' smart constructor.
+data ImageScanFindingsSummary = ImageScanFindingsSummary'
+  { -- | The image vulnerability counts, sorted by severity.
+    findingSeverityCounts :: Prelude.Maybe (Prelude.HashMap FindingSeverity Prelude.Natural),
+    -- | The time of the last completed image scan.
+    imageScanCompletedAt :: Prelude.Maybe Data.POSIX,
+    -- | The time when the vulnerability data was last scanned.
+    vulnerabilitySourceUpdatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageScanFindingsSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'findingSeverityCounts', 'imageScanFindingsSummary_findingSeverityCounts' - The image vulnerability counts, sorted by severity.
+--
+-- 'imageScanCompletedAt', 'imageScanFindingsSummary_imageScanCompletedAt' - The time of the last completed image scan.
+--
+-- 'vulnerabilitySourceUpdatedAt', 'imageScanFindingsSummary_vulnerabilitySourceUpdatedAt' - The time when the vulnerability data was last scanned.
+newImageScanFindingsSummary ::
+  ImageScanFindingsSummary
+newImageScanFindingsSummary =
+  ImageScanFindingsSummary'
+    { findingSeverityCounts =
+        Prelude.Nothing,
+      imageScanCompletedAt = Prelude.Nothing,
+      vulnerabilitySourceUpdatedAt = Prelude.Nothing
+    }
+
+-- | The image vulnerability counts, sorted by severity.
+imageScanFindingsSummary_findingSeverityCounts :: Lens.Lens' ImageScanFindingsSummary (Prelude.Maybe (Prelude.HashMap FindingSeverity Prelude.Natural))
+imageScanFindingsSummary_findingSeverityCounts = Lens.lens (\ImageScanFindingsSummary' {findingSeverityCounts} -> findingSeverityCounts) (\s@ImageScanFindingsSummary' {} a -> s {findingSeverityCounts = a} :: ImageScanFindingsSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | The time of the last completed image scan.
+imageScanFindingsSummary_imageScanCompletedAt :: Lens.Lens' ImageScanFindingsSummary (Prelude.Maybe Prelude.UTCTime)
+imageScanFindingsSummary_imageScanCompletedAt = Lens.lens (\ImageScanFindingsSummary' {imageScanCompletedAt} -> imageScanCompletedAt) (\s@ImageScanFindingsSummary' {} a -> s {imageScanCompletedAt = a} :: ImageScanFindingsSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The time when the vulnerability data was last scanned.
+imageScanFindingsSummary_vulnerabilitySourceUpdatedAt :: Lens.Lens' ImageScanFindingsSummary (Prelude.Maybe Prelude.UTCTime)
+imageScanFindingsSummary_vulnerabilitySourceUpdatedAt = Lens.lens (\ImageScanFindingsSummary' {vulnerabilitySourceUpdatedAt} -> vulnerabilitySourceUpdatedAt) (\s@ImageScanFindingsSummary' {} a -> s {vulnerabilitySourceUpdatedAt = a} :: ImageScanFindingsSummary) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON ImageScanFindingsSummary where
+  parseJSON =
+    Data.withObject
+      "ImageScanFindingsSummary"
+      ( \x ->
+          ImageScanFindingsSummary'
+            Prelude.<$> ( x
+                            Data..:? "findingSeverityCounts"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "imageScanCompletedAt")
+            Prelude.<*> (x Data..:? "vulnerabilitySourceUpdatedAt")
+      )
+
+instance Prelude.Hashable ImageScanFindingsSummary where
+  hashWithSalt _salt ImageScanFindingsSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` findingSeverityCounts
+      `Prelude.hashWithSalt` imageScanCompletedAt
+      `Prelude.hashWithSalt` vulnerabilitySourceUpdatedAt
+
+instance Prelude.NFData ImageScanFindingsSummary where
+  rnf ImageScanFindingsSummary' {..} =
+    Prelude.rnf findingSeverityCounts
+      `Prelude.seq` Prelude.rnf imageScanCompletedAt
+      `Prelude.seq` Prelude.rnf vulnerabilitySourceUpdatedAt
diff --git a/gen/Amazonka/ECR/Types/ImageScanStatus.hs b/gen/Amazonka/ECR/Types/ImageScanStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageScanStatus.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.ECR.Types.ImageScanStatus
+-- 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.ECR.Types.ImageScanStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ScanStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The current status of an image scan.
+--
+-- /See:/ 'newImageScanStatus' smart constructor.
+data ImageScanStatus = ImageScanStatus'
+  { -- | The description of the image scan status.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The current state of an image scan.
+    status :: Prelude.Maybe ScanStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageScanStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'imageScanStatus_description' - The description of the image scan status.
+--
+-- 'status', 'imageScanStatus_status' - The current state of an image scan.
+newImageScanStatus ::
+  ImageScanStatus
+newImageScanStatus =
+  ImageScanStatus'
+    { description = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The description of the image scan status.
+imageScanStatus_description :: Lens.Lens' ImageScanStatus (Prelude.Maybe Prelude.Text)
+imageScanStatus_description = Lens.lens (\ImageScanStatus' {description} -> description) (\s@ImageScanStatus' {} a -> s {description = a} :: ImageScanStatus)
+
+-- | The current state of an image scan.
+imageScanStatus_status :: Lens.Lens' ImageScanStatus (Prelude.Maybe ScanStatus)
+imageScanStatus_status = Lens.lens (\ImageScanStatus' {status} -> status) (\s@ImageScanStatus' {} a -> s {status = a} :: ImageScanStatus)
+
+instance Data.FromJSON ImageScanStatus where
+  parseJSON =
+    Data.withObject
+      "ImageScanStatus"
+      ( \x ->
+          ImageScanStatus'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable ImageScanStatus where
+  hashWithSalt _salt ImageScanStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ImageScanStatus where
+  rnf ImageScanStatus' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/ECR/Types/ImageScanningConfiguration.hs b/gen/Amazonka/ECR/Types/ImageScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageScanningConfiguration.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.ECR.Types.ImageScanningConfiguration
+-- 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.ECR.Types.ImageScanningConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The image scanning configuration for a repository.
+--
+-- /See:/ 'newImageScanningConfiguration' smart constructor.
+data ImageScanningConfiguration = ImageScanningConfiguration'
+  { -- | The setting that determines whether images are scanned after being
+    -- pushed to a repository. If set to @true@, images will be scanned after
+    -- being pushed. If this parameter is not specified, it will default to
+    -- @false@ and images will not be scanned unless a scan is manually started
+    -- with the
+    -- <https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html API_StartImageScan>
+    -- API.
+    scanOnPush :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'scanOnPush', 'imageScanningConfiguration_scanOnPush' - The setting that determines whether images are scanned after being
+-- pushed to a repository. If set to @true@, images will be scanned after
+-- being pushed. If this parameter is not specified, it will default to
+-- @false@ and images will not be scanned unless a scan is manually started
+-- with the
+-- <https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html API_StartImageScan>
+-- API.
+newImageScanningConfiguration ::
+  ImageScanningConfiguration
+newImageScanningConfiguration =
+  ImageScanningConfiguration'
+    { scanOnPush =
+        Prelude.Nothing
+    }
+
+-- | The setting that determines whether images are scanned after being
+-- pushed to a repository. If set to @true@, images will be scanned after
+-- being pushed. If this parameter is not specified, it will default to
+-- @false@ and images will not be scanned unless a scan is manually started
+-- with the
+-- <https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html API_StartImageScan>
+-- API.
+imageScanningConfiguration_scanOnPush :: Lens.Lens' ImageScanningConfiguration (Prelude.Maybe Prelude.Bool)
+imageScanningConfiguration_scanOnPush = Lens.lens (\ImageScanningConfiguration' {scanOnPush} -> scanOnPush) (\s@ImageScanningConfiguration' {} a -> s {scanOnPush = a} :: ImageScanningConfiguration)
+
+instance Data.FromJSON ImageScanningConfiguration where
+  parseJSON =
+    Data.withObject
+      "ImageScanningConfiguration"
+      ( \x ->
+          ImageScanningConfiguration'
+            Prelude.<$> (x Data..:? "scanOnPush")
+      )
+
+instance Prelude.Hashable ImageScanningConfiguration where
+  hashWithSalt _salt ImageScanningConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` scanOnPush
+
+instance Prelude.NFData ImageScanningConfiguration where
+  rnf ImageScanningConfiguration' {..} =
+    Prelude.rnf scanOnPush
+
+instance Data.ToJSON ImageScanningConfiguration where
+  toJSON ImageScanningConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("scanOnPush" Data..=) Prelude.<$> scanOnPush]
+      )
diff --git a/gen/Amazonka/ECR/Types/ImageTagMutability.hs b/gen/Amazonka/ECR/Types/ImageTagMutability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ImageTagMutability.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.ECR.Types.ImageTagMutability
+-- 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.ECR.Types.ImageTagMutability
+  ( ImageTagMutability
+      ( ..,
+        ImageTagMutability_IMMUTABLE,
+        ImageTagMutability_MUTABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImageTagMutability = ImageTagMutability'
+  { fromImageTagMutability ::
+      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 ImageTagMutability_IMMUTABLE :: ImageTagMutability
+pattern ImageTagMutability_IMMUTABLE = ImageTagMutability' "IMMUTABLE"
+
+pattern ImageTagMutability_MUTABLE :: ImageTagMutability
+pattern ImageTagMutability_MUTABLE = ImageTagMutability' "MUTABLE"
+
+{-# COMPLETE
+  ImageTagMutability_IMMUTABLE,
+  ImageTagMutability_MUTABLE,
+  ImageTagMutability'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/Layer.hs b/gen/Amazonka/ECR/Types/Layer.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Layer.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.ECR.Types.Layer
+-- 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.ECR.Types.Layer where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.LayerAvailability
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image layer.
+--
+-- /See:/ 'newLayer' smart constructor.
+data Layer = Layer'
+  { -- | The availability status of the image layer.
+    layerAvailability :: Prelude.Maybe LayerAvailability,
+    -- | The @sha256@ digest of the image layer.
+    layerDigest :: Prelude.Maybe Prelude.Text,
+    -- | The size, in bytes, of the image layer.
+    layerSize :: Prelude.Maybe Prelude.Integer,
+    -- | The media type of the layer, such as
+    -- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+    -- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+    mediaType :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Layer' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'layerAvailability', 'layer_layerAvailability' - The availability status of the image layer.
+--
+-- 'layerDigest', 'layer_layerDigest' - The @sha256@ digest of the image layer.
+--
+-- 'layerSize', 'layer_layerSize' - The size, in bytes, of the image layer.
+--
+-- 'mediaType', 'layer_mediaType' - The media type of the layer, such as
+-- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+-- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+newLayer ::
+  Layer
+newLayer =
+  Layer'
+    { layerAvailability = Prelude.Nothing,
+      layerDigest = Prelude.Nothing,
+      layerSize = Prelude.Nothing,
+      mediaType = Prelude.Nothing
+    }
+
+-- | The availability status of the image layer.
+layer_layerAvailability :: Lens.Lens' Layer (Prelude.Maybe LayerAvailability)
+layer_layerAvailability = Lens.lens (\Layer' {layerAvailability} -> layerAvailability) (\s@Layer' {} a -> s {layerAvailability = a} :: Layer)
+
+-- | The @sha256@ digest of the image layer.
+layer_layerDigest :: Lens.Lens' Layer (Prelude.Maybe Prelude.Text)
+layer_layerDigest = Lens.lens (\Layer' {layerDigest} -> layerDigest) (\s@Layer' {} a -> s {layerDigest = a} :: Layer)
+
+-- | The size, in bytes, of the image layer.
+layer_layerSize :: Lens.Lens' Layer (Prelude.Maybe Prelude.Integer)
+layer_layerSize = Lens.lens (\Layer' {layerSize} -> layerSize) (\s@Layer' {} a -> s {layerSize = a} :: Layer)
+
+-- | The media type of the layer, such as
+-- @application\/vnd.docker.image.rootfs.diff.tar.gzip@ or
+-- @application\/vnd.oci.image.layer.v1.tar+gzip@.
+layer_mediaType :: Lens.Lens' Layer (Prelude.Maybe Prelude.Text)
+layer_mediaType = Lens.lens (\Layer' {mediaType} -> mediaType) (\s@Layer' {} a -> s {mediaType = a} :: Layer)
+
+instance Data.FromJSON Layer where
+  parseJSON =
+    Data.withObject
+      "Layer"
+      ( \x ->
+          Layer'
+            Prelude.<$> (x Data..:? "layerAvailability")
+            Prelude.<*> (x Data..:? "layerDigest")
+            Prelude.<*> (x Data..:? "layerSize")
+            Prelude.<*> (x Data..:? "mediaType")
+      )
+
+instance Prelude.Hashable Layer where
+  hashWithSalt _salt Layer' {..} =
+    _salt
+      `Prelude.hashWithSalt` layerAvailability
+      `Prelude.hashWithSalt` layerDigest
+      `Prelude.hashWithSalt` layerSize
+      `Prelude.hashWithSalt` mediaType
+
+instance Prelude.NFData Layer where
+  rnf Layer' {..} =
+    Prelude.rnf layerAvailability
+      `Prelude.seq` Prelude.rnf layerDigest
+      `Prelude.seq` Prelude.rnf layerSize
+      `Prelude.seq` Prelude.rnf mediaType
diff --git a/gen/Amazonka/ECR/Types/LayerAvailability.hs b/gen/Amazonka/ECR/Types/LayerAvailability.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LayerAvailability.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.ECR.Types.LayerAvailability
+-- 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.ECR.Types.LayerAvailability
+  ( LayerAvailability
+      ( ..,
+        LayerAvailability_AVAILABLE,
+        LayerAvailability_UNAVAILABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LayerAvailability = LayerAvailability'
+  { fromLayerAvailability ::
+      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 LayerAvailability_AVAILABLE :: LayerAvailability
+pattern LayerAvailability_AVAILABLE = LayerAvailability' "AVAILABLE"
+
+pattern LayerAvailability_UNAVAILABLE :: LayerAvailability
+pattern LayerAvailability_UNAVAILABLE = LayerAvailability' "UNAVAILABLE"
+
+{-# COMPLETE
+  LayerAvailability_AVAILABLE,
+  LayerAvailability_UNAVAILABLE,
+  LayerAvailability'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/LayerFailure.hs b/gen/Amazonka/ECR/Types/LayerFailure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LayerFailure.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.ECR.Types.LayerFailure
+-- 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.ECR.Types.LayerFailure where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.LayerFailureCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing an Amazon ECR image layer failure.
+--
+-- /See:/ 'newLayerFailure' smart constructor.
+data LayerFailure = LayerFailure'
+  { -- | The failure code associated with the failure.
+    failureCode :: Prelude.Maybe LayerFailureCode,
+    -- | The reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The layer digest associated with the failure.
+    layerDigest :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LayerFailure' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'layerFailure_failureCode' - The failure code associated with the failure.
+--
+-- 'failureReason', 'layerFailure_failureReason' - The reason for the failure.
+--
+-- 'layerDigest', 'layerFailure_layerDigest' - The layer digest associated with the failure.
+newLayerFailure ::
+  LayerFailure
+newLayerFailure =
+  LayerFailure'
+    { failureCode = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      layerDigest = Prelude.Nothing
+    }
+
+-- | The failure code associated with the failure.
+layerFailure_failureCode :: Lens.Lens' LayerFailure (Prelude.Maybe LayerFailureCode)
+layerFailure_failureCode = Lens.lens (\LayerFailure' {failureCode} -> failureCode) (\s@LayerFailure' {} a -> s {failureCode = a} :: LayerFailure)
+
+-- | The reason for the failure.
+layerFailure_failureReason :: Lens.Lens' LayerFailure (Prelude.Maybe Prelude.Text)
+layerFailure_failureReason = Lens.lens (\LayerFailure' {failureReason} -> failureReason) (\s@LayerFailure' {} a -> s {failureReason = a} :: LayerFailure)
+
+-- | The layer digest associated with the failure.
+layerFailure_layerDigest :: Lens.Lens' LayerFailure (Prelude.Maybe Prelude.Text)
+layerFailure_layerDigest = Lens.lens (\LayerFailure' {layerDigest} -> layerDigest) (\s@LayerFailure' {} a -> s {layerDigest = a} :: LayerFailure)
+
+instance Data.FromJSON LayerFailure where
+  parseJSON =
+    Data.withObject
+      "LayerFailure"
+      ( \x ->
+          LayerFailure'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "layerDigest")
+      )
+
+instance Prelude.Hashable LayerFailure where
+  hashWithSalt _salt LayerFailure' {..} =
+    _salt
+      `Prelude.hashWithSalt` failureCode
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` layerDigest
+
+instance Prelude.NFData LayerFailure where
+  rnf LayerFailure' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf layerDigest
diff --git a/gen/Amazonka/ECR/Types/LayerFailureCode.hs b/gen/Amazonka/ECR/Types/LayerFailureCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LayerFailureCode.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.ECR.Types.LayerFailureCode
+-- 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.ECR.Types.LayerFailureCode
+  ( LayerFailureCode
+      ( ..,
+        LayerFailureCode_InvalidLayerDigest,
+        LayerFailureCode_MissingLayerDigest
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LayerFailureCode = LayerFailureCode'
+  { fromLayerFailureCode ::
+      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 LayerFailureCode_InvalidLayerDigest :: LayerFailureCode
+pattern LayerFailureCode_InvalidLayerDigest = LayerFailureCode' "InvalidLayerDigest"
+
+pattern LayerFailureCode_MissingLayerDigest :: LayerFailureCode
+pattern LayerFailureCode_MissingLayerDigest = LayerFailureCode' "MissingLayerDigest"
+
+{-# COMPLETE
+  LayerFailureCode_InvalidLayerDigest,
+  LayerFailureCode_MissingLayerDigest,
+  LayerFailureCode'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewFilter.hs b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewFilter.hs
@@ -0,0 +1,74 @@
+{-# 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.ECR.Types.LifecyclePolicyPreviewFilter
+-- 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.ECR.Types.LifecyclePolicyPreviewFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.TagStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The filter for the lifecycle policy preview.
+--
+-- /See:/ 'newLifecyclePolicyPreviewFilter' smart constructor.
+data LifecyclePolicyPreviewFilter = LifecyclePolicyPreviewFilter'
+  { -- | The tag status of the image.
+    tagStatus :: Prelude.Maybe TagStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LifecyclePolicyPreviewFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagStatus', 'lifecyclePolicyPreviewFilter_tagStatus' - The tag status of the image.
+newLifecyclePolicyPreviewFilter ::
+  LifecyclePolicyPreviewFilter
+newLifecyclePolicyPreviewFilter =
+  LifecyclePolicyPreviewFilter'
+    { tagStatus =
+        Prelude.Nothing
+    }
+
+-- | The tag status of the image.
+lifecyclePolicyPreviewFilter_tagStatus :: Lens.Lens' LifecyclePolicyPreviewFilter (Prelude.Maybe TagStatus)
+lifecyclePolicyPreviewFilter_tagStatus = Lens.lens (\LifecyclePolicyPreviewFilter' {tagStatus} -> tagStatus) (\s@LifecyclePolicyPreviewFilter' {} a -> s {tagStatus = a} :: LifecyclePolicyPreviewFilter)
+
+instance
+  Prelude.Hashable
+    LifecyclePolicyPreviewFilter
+  where
+  hashWithSalt _salt LifecyclePolicyPreviewFilter' {..} =
+    _salt `Prelude.hashWithSalt` tagStatus
+
+instance Prelude.NFData LifecyclePolicyPreviewFilter where
+  rnf LifecyclePolicyPreviewFilter' {..} =
+    Prelude.rnf tagStatus
+
+instance Data.ToJSON LifecyclePolicyPreviewFilter where
+  toJSON LifecyclePolicyPreviewFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("tagStatus" Data..=) Prelude.<$> tagStatus]
+      )
diff --git a/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewResult.hs b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewResult.hs
@@ -0,0 +1,128 @@
+{-# 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.ECR.Types.LifecyclePolicyPreviewResult
+-- 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.ECR.Types.LifecyclePolicyPreviewResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.LifecyclePolicyRuleAction
+import qualified Amazonka.Prelude as Prelude
+
+-- | The result of the lifecycle policy preview.
+--
+-- /See:/ 'newLifecyclePolicyPreviewResult' smart constructor.
+data LifecyclePolicyPreviewResult = LifecyclePolicyPreviewResult'
+  { -- | The type of action to be taken.
+    action :: Prelude.Maybe LifecyclePolicyRuleAction,
+    -- | The priority of the applied rule.
+    appliedRulePriority :: Prelude.Maybe Prelude.Natural,
+    -- | The @sha256@ digest of the image manifest.
+    imageDigest :: Prelude.Maybe Prelude.Text,
+    -- | The date and time, expressed in standard JavaScript date format, at
+    -- which the current image was pushed to the repository.
+    imagePushedAt :: Prelude.Maybe Data.POSIX,
+    -- | The list of tags associated with this image.
+    imageTags :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LifecyclePolicyPreviewResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'action', 'lifecyclePolicyPreviewResult_action' - The type of action to be taken.
+--
+-- 'appliedRulePriority', 'lifecyclePolicyPreviewResult_appliedRulePriority' - The priority of the applied rule.
+--
+-- 'imageDigest', 'lifecyclePolicyPreviewResult_imageDigest' - The @sha256@ digest of the image manifest.
+--
+-- 'imagePushedAt', 'lifecyclePolicyPreviewResult_imagePushedAt' - The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+--
+-- 'imageTags', 'lifecyclePolicyPreviewResult_imageTags' - The list of tags associated with this image.
+newLifecyclePolicyPreviewResult ::
+  LifecyclePolicyPreviewResult
+newLifecyclePolicyPreviewResult =
+  LifecyclePolicyPreviewResult'
+    { action =
+        Prelude.Nothing,
+      appliedRulePriority = Prelude.Nothing,
+      imageDigest = Prelude.Nothing,
+      imagePushedAt = Prelude.Nothing,
+      imageTags = Prelude.Nothing
+    }
+
+-- | The type of action to be taken.
+lifecyclePolicyPreviewResult_action :: Lens.Lens' LifecyclePolicyPreviewResult (Prelude.Maybe LifecyclePolicyRuleAction)
+lifecyclePolicyPreviewResult_action = Lens.lens (\LifecyclePolicyPreviewResult' {action} -> action) (\s@LifecyclePolicyPreviewResult' {} a -> s {action = a} :: LifecyclePolicyPreviewResult)
+
+-- | The priority of the applied rule.
+lifecyclePolicyPreviewResult_appliedRulePriority :: Lens.Lens' LifecyclePolicyPreviewResult (Prelude.Maybe Prelude.Natural)
+lifecyclePolicyPreviewResult_appliedRulePriority = Lens.lens (\LifecyclePolicyPreviewResult' {appliedRulePriority} -> appliedRulePriority) (\s@LifecyclePolicyPreviewResult' {} a -> s {appliedRulePriority = a} :: LifecyclePolicyPreviewResult)
+
+-- | The @sha256@ digest of the image manifest.
+lifecyclePolicyPreviewResult_imageDigest :: Lens.Lens' LifecyclePolicyPreviewResult (Prelude.Maybe Prelude.Text)
+lifecyclePolicyPreviewResult_imageDigest = Lens.lens (\LifecyclePolicyPreviewResult' {imageDigest} -> imageDigest) (\s@LifecyclePolicyPreviewResult' {} a -> s {imageDigest = a} :: LifecyclePolicyPreviewResult)
+
+-- | The date and time, expressed in standard JavaScript date format, at
+-- which the current image was pushed to the repository.
+lifecyclePolicyPreviewResult_imagePushedAt :: Lens.Lens' LifecyclePolicyPreviewResult (Prelude.Maybe Prelude.UTCTime)
+lifecyclePolicyPreviewResult_imagePushedAt = Lens.lens (\LifecyclePolicyPreviewResult' {imagePushedAt} -> imagePushedAt) (\s@LifecyclePolicyPreviewResult' {} a -> s {imagePushedAt = a} :: LifecyclePolicyPreviewResult) Prelude.. Lens.mapping Data._Time
+
+-- | The list of tags associated with this image.
+lifecyclePolicyPreviewResult_imageTags :: Lens.Lens' LifecyclePolicyPreviewResult (Prelude.Maybe [Prelude.Text])
+lifecyclePolicyPreviewResult_imageTags = Lens.lens (\LifecyclePolicyPreviewResult' {imageTags} -> imageTags) (\s@LifecyclePolicyPreviewResult' {} a -> s {imageTags = a} :: LifecyclePolicyPreviewResult) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON LifecyclePolicyPreviewResult where
+  parseJSON =
+    Data.withObject
+      "LifecyclePolicyPreviewResult"
+      ( \x ->
+          LifecyclePolicyPreviewResult'
+            Prelude.<$> (x Data..:? "action")
+            Prelude.<*> (x Data..:? "appliedRulePriority")
+            Prelude.<*> (x Data..:? "imageDigest")
+            Prelude.<*> (x Data..:? "imagePushedAt")
+            Prelude.<*> (x Data..:? "imageTags" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    LifecyclePolicyPreviewResult
+  where
+  hashWithSalt _salt LifecyclePolicyPreviewResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` action
+      `Prelude.hashWithSalt` appliedRulePriority
+      `Prelude.hashWithSalt` imageDigest
+      `Prelude.hashWithSalt` imagePushedAt
+      `Prelude.hashWithSalt` imageTags
+
+instance Prelude.NFData LifecyclePolicyPreviewResult where
+  rnf LifecyclePolicyPreviewResult' {..} =
+    Prelude.rnf action
+      `Prelude.seq` Prelude.rnf appliedRulePriority
+      `Prelude.seq` Prelude.rnf imageDigest
+      `Prelude.seq` Prelude.rnf imagePushedAt
+      `Prelude.seq` Prelude.rnf imageTags
diff --git a/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewStatus.hs b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.LifecyclePolicyPreviewStatus
+-- 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.ECR.Types.LifecyclePolicyPreviewStatus
+  ( LifecyclePolicyPreviewStatus
+      ( ..,
+        LifecyclePolicyPreviewStatus_COMPLETE,
+        LifecyclePolicyPreviewStatus_EXPIRED,
+        LifecyclePolicyPreviewStatus_FAILED,
+        LifecyclePolicyPreviewStatus_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LifecyclePolicyPreviewStatus = LifecyclePolicyPreviewStatus'
+  { fromLifecyclePolicyPreviewStatus ::
+      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 LifecyclePolicyPreviewStatus_COMPLETE :: LifecyclePolicyPreviewStatus
+pattern LifecyclePolicyPreviewStatus_COMPLETE = LifecyclePolicyPreviewStatus' "COMPLETE"
+
+pattern LifecyclePolicyPreviewStatus_EXPIRED :: LifecyclePolicyPreviewStatus
+pattern LifecyclePolicyPreviewStatus_EXPIRED = LifecyclePolicyPreviewStatus' "EXPIRED"
+
+pattern LifecyclePolicyPreviewStatus_FAILED :: LifecyclePolicyPreviewStatus
+pattern LifecyclePolicyPreviewStatus_FAILED = LifecyclePolicyPreviewStatus' "FAILED"
+
+pattern LifecyclePolicyPreviewStatus_IN_PROGRESS :: LifecyclePolicyPreviewStatus
+pattern LifecyclePolicyPreviewStatus_IN_PROGRESS = LifecyclePolicyPreviewStatus' "IN_PROGRESS"
+
+{-# COMPLETE
+  LifecyclePolicyPreviewStatus_COMPLETE,
+  LifecyclePolicyPreviewStatus_EXPIRED,
+  LifecyclePolicyPreviewStatus_FAILED,
+  LifecyclePolicyPreviewStatus_IN_PROGRESS,
+  LifecyclePolicyPreviewStatus'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewSummary.hs b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LifecyclePolicyPreviewSummary.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.LifecyclePolicyPreviewSummary
+-- 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.ECR.Types.LifecyclePolicyPreviewSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The summary of the lifecycle policy preview request.
+--
+-- /See:/ 'newLifecyclePolicyPreviewSummary' smart constructor.
+data LifecyclePolicyPreviewSummary = LifecyclePolicyPreviewSummary'
+  { -- | The number of expiring images.
+    expiringImageTotalCount :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LifecyclePolicyPreviewSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'expiringImageTotalCount', 'lifecyclePolicyPreviewSummary_expiringImageTotalCount' - The number of expiring images.
+newLifecyclePolicyPreviewSummary ::
+  LifecyclePolicyPreviewSummary
+newLifecyclePolicyPreviewSummary =
+  LifecyclePolicyPreviewSummary'
+    { expiringImageTotalCount =
+        Prelude.Nothing
+    }
+
+-- | The number of expiring images.
+lifecyclePolicyPreviewSummary_expiringImageTotalCount :: Lens.Lens' LifecyclePolicyPreviewSummary (Prelude.Maybe Prelude.Natural)
+lifecyclePolicyPreviewSummary_expiringImageTotalCount = Lens.lens (\LifecyclePolicyPreviewSummary' {expiringImageTotalCount} -> expiringImageTotalCount) (\s@LifecyclePolicyPreviewSummary' {} a -> s {expiringImageTotalCount = a} :: LifecyclePolicyPreviewSummary)
+
+instance Data.FromJSON LifecyclePolicyPreviewSummary where
+  parseJSON =
+    Data.withObject
+      "LifecyclePolicyPreviewSummary"
+      ( \x ->
+          LifecyclePolicyPreviewSummary'
+            Prelude.<$> (x Data..:? "expiringImageTotalCount")
+      )
+
+instance
+  Prelude.Hashable
+    LifecyclePolicyPreviewSummary
+  where
+  hashWithSalt _salt LifecyclePolicyPreviewSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` expiringImageTotalCount
+
+instance Prelude.NFData LifecyclePolicyPreviewSummary where
+  rnf LifecyclePolicyPreviewSummary' {..} =
+    Prelude.rnf expiringImageTotalCount
diff --git a/gen/Amazonka/ECR/Types/LifecyclePolicyRuleAction.hs b/gen/Amazonka/ECR/Types/LifecyclePolicyRuleAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/LifecyclePolicyRuleAction.hs
@@ -0,0 +1,70 @@
+{-# 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.ECR.Types.LifecyclePolicyRuleAction
+-- 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.ECR.Types.LifecyclePolicyRuleAction where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ImageActionType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The type of action to be taken.
+--
+-- /See:/ 'newLifecyclePolicyRuleAction' smart constructor.
+data LifecyclePolicyRuleAction = LifecyclePolicyRuleAction'
+  { -- | The type of action to be taken.
+    type' :: Prelude.Maybe ImageActionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LifecyclePolicyRuleAction' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'type'', 'lifecyclePolicyRuleAction_type' - The type of action to be taken.
+newLifecyclePolicyRuleAction ::
+  LifecyclePolicyRuleAction
+newLifecyclePolicyRuleAction =
+  LifecyclePolicyRuleAction' {type' = Prelude.Nothing}
+
+-- | The type of action to be taken.
+lifecyclePolicyRuleAction_type :: Lens.Lens' LifecyclePolicyRuleAction (Prelude.Maybe ImageActionType)
+lifecyclePolicyRuleAction_type = Lens.lens (\LifecyclePolicyRuleAction' {type'} -> type') (\s@LifecyclePolicyRuleAction' {} a -> s {type' = a} :: LifecyclePolicyRuleAction)
+
+instance Data.FromJSON LifecyclePolicyRuleAction where
+  parseJSON =
+    Data.withObject
+      "LifecyclePolicyRuleAction"
+      ( \x ->
+          LifecyclePolicyRuleAction'
+            Prelude.<$> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable LifecyclePolicyRuleAction where
+  hashWithSalt _salt LifecyclePolicyRuleAction' {..} =
+    _salt `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData LifecyclePolicyRuleAction where
+  rnf LifecyclePolicyRuleAction' {..} =
+    Prelude.rnf type'
diff --git a/gen/Amazonka/ECR/Types/ListImagesFilter.hs b/gen/Amazonka/ECR/Types/ListImagesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ListImagesFilter.hs
@@ -0,0 +1,70 @@
+{-# 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.ECR.Types.ListImagesFilter
+-- 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.ECR.Types.ListImagesFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.TagStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a filter on a ListImages operation.
+--
+-- /See:/ 'newListImagesFilter' smart constructor.
+data ListImagesFilter = ListImagesFilter'
+  { -- | The tag status with which to filter your ListImages results. You can
+    -- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+    tagStatus :: Prelude.Maybe TagStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListImagesFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagStatus', 'listImagesFilter_tagStatus' - The tag status with which to filter your ListImages results. You can
+-- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+newListImagesFilter ::
+  ListImagesFilter
+newListImagesFilter =
+  ListImagesFilter' {tagStatus = Prelude.Nothing}
+
+-- | The tag status with which to filter your ListImages results. You can
+-- filter results based on whether they are @TAGGED@ or @UNTAGGED@.
+listImagesFilter_tagStatus :: Lens.Lens' ListImagesFilter (Prelude.Maybe TagStatus)
+listImagesFilter_tagStatus = Lens.lens (\ListImagesFilter' {tagStatus} -> tagStatus) (\s@ListImagesFilter' {} a -> s {tagStatus = a} :: ListImagesFilter)
+
+instance Prelude.Hashable ListImagesFilter where
+  hashWithSalt _salt ListImagesFilter' {..} =
+    _salt `Prelude.hashWithSalt` tagStatus
+
+instance Prelude.NFData ListImagesFilter where
+  rnf ListImagesFilter' {..} = Prelude.rnf tagStatus
+
+instance Data.ToJSON ListImagesFilter where
+  toJSON ListImagesFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("tagStatus" Data..=) Prelude.<$> tagStatus]
+      )
diff --git a/gen/Amazonka/ECR/Types/PackageVulnerabilityDetails.hs b/gen/Amazonka/ECR/Types/PackageVulnerabilityDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/PackageVulnerabilityDetails.hs
@@ -0,0 +1,198 @@
+{-# 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.ECR.Types.PackageVulnerabilityDetails
+-- 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.ECR.Types.PackageVulnerabilityDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.CvssScore
+import Amazonka.ECR.Types.VulnerablePackage
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a package vulnerability finding.
+--
+-- /See:/ 'newPackageVulnerabilityDetails' smart constructor.
+data PackageVulnerabilityDetails = PackageVulnerabilityDetails'
+  { -- | An object that contains details about the CVSS score of a finding.
+    cvss :: Prelude.Maybe [CvssScore],
+    -- | One or more URLs that contain details about this vulnerability type.
+    referenceUrls :: Prelude.Maybe [Prelude.Text],
+    -- | One or more vulnerabilities related to the one identified in this
+    -- finding.
+    relatedVulnerabilities :: Prelude.Maybe [Prelude.Text],
+    -- | The source of the vulnerability information.
+    source :: Prelude.Maybe Prelude.Text,
+    -- | A URL to the source of the vulnerability information.
+    sourceUrl :: Prelude.Maybe Prelude.Text,
+    -- | The date and time that this vulnerability was first added to the
+    -- vendor\'s database.
+    vendorCreatedAt :: Prelude.Maybe Data.POSIX,
+    -- | The severity the vendor has given to this vulnerability type.
+    vendorSeverity :: Prelude.Maybe Prelude.Text,
+    -- | The date and time the vendor last updated this vulnerability in their
+    -- database.
+    vendorUpdatedAt :: Prelude.Maybe Data.POSIX,
+    -- | The ID given to this vulnerability.
+    vulnerabilityId :: Prelude.Maybe Prelude.Text,
+    -- | The packages impacted by this vulnerability.
+    vulnerablePackages :: Prelude.Maybe [VulnerablePackage]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageVulnerabilityDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cvss', 'packageVulnerabilityDetails_cvss' - An object that contains details about the CVSS score of a finding.
+--
+-- 'referenceUrls', 'packageVulnerabilityDetails_referenceUrls' - One or more URLs that contain details about this vulnerability type.
+--
+-- 'relatedVulnerabilities', 'packageVulnerabilityDetails_relatedVulnerabilities' - One or more vulnerabilities related to the one identified in this
+-- finding.
+--
+-- 'source', 'packageVulnerabilityDetails_source' - The source of the vulnerability information.
+--
+-- 'sourceUrl', 'packageVulnerabilityDetails_sourceUrl' - A URL to the source of the vulnerability information.
+--
+-- 'vendorCreatedAt', 'packageVulnerabilityDetails_vendorCreatedAt' - The date and time that this vulnerability was first added to the
+-- vendor\'s database.
+--
+-- 'vendorSeverity', 'packageVulnerabilityDetails_vendorSeverity' - The severity the vendor has given to this vulnerability type.
+--
+-- 'vendorUpdatedAt', 'packageVulnerabilityDetails_vendorUpdatedAt' - The date and time the vendor last updated this vulnerability in their
+-- database.
+--
+-- 'vulnerabilityId', 'packageVulnerabilityDetails_vulnerabilityId' - The ID given to this vulnerability.
+--
+-- 'vulnerablePackages', 'packageVulnerabilityDetails_vulnerablePackages' - The packages impacted by this vulnerability.
+newPackageVulnerabilityDetails ::
+  PackageVulnerabilityDetails
+newPackageVulnerabilityDetails =
+  PackageVulnerabilityDetails'
+    { cvss =
+        Prelude.Nothing,
+      referenceUrls = Prelude.Nothing,
+      relatedVulnerabilities = Prelude.Nothing,
+      source = Prelude.Nothing,
+      sourceUrl = Prelude.Nothing,
+      vendorCreatedAt = Prelude.Nothing,
+      vendorSeverity = Prelude.Nothing,
+      vendorUpdatedAt = Prelude.Nothing,
+      vulnerabilityId = Prelude.Nothing,
+      vulnerablePackages = Prelude.Nothing
+    }
+
+-- | An object that contains details about the CVSS score of a finding.
+packageVulnerabilityDetails_cvss :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe [CvssScore])
+packageVulnerabilityDetails_cvss = Lens.lens (\PackageVulnerabilityDetails' {cvss} -> cvss) (\s@PackageVulnerabilityDetails' {} a -> s {cvss = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | One or more URLs that contain details about this vulnerability type.
+packageVulnerabilityDetails_referenceUrls :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe [Prelude.Text])
+packageVulnerabilityDetails_referenceUrls = Lens.lens (\PackageVulnerabilityDetails' {referenceUrls} -> referenceUrls) (\s@PackageVulnerabilityDetails' {} a -> s {referenceUrls = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | One or more vulnerabilities related to the one identified in this
+-- finding.
+packageVulnerabilityDetails_relatedVulnerabilities :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe [Prelude.Text])
+packageVulnerabilityDetails_relatedVulnerabilities = Lens.lens (\PackageVulnerabilityDetails' {relatedVulnerabilities} -> relatedVulnerabilities) (\s@PackageVulnerabilityDetails' {} a -> s {relatedVulnerabilities = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The source of the vulnerability information.
+packageVulnerabilityDetails_source :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.Text)
+packageVulnerabilityDetails_source = Lens.lens (\PackageVulnerabilityDetails' {source} -> source) (\s@PackageVulnerabilityDetails' {} a -> s {source = a} :: PackageVulnerabilityDetails)
+
+-- | A URL to the source of the vulnerability information.
+packageVulnerabilityDetails_sourceUrl :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.Text)
+packageVulnerabilityDetails_sourceUrl = Lens.lens (\PackageVulnerabilityDetails' {sourceUrl} -> sourceUrl) (\s@PackageVulnerabilityDetails' {} a -> s {sourceUrl = a} :: PackageVulnerabilityDetails)
+
+-- | The date and time that this vulnerability was first added to the
+-- vendor\'s database.
+packageVulnerabilityDetails_vendorCreatedAt :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.UTCTime)
+packageVulnerabilityDetails_vendorCreatedAt = Lens.lens (\PackageVulnerabilityDetails' {vendorCreatedAt} -> vendorCreatedAt) (\s@PackageVulnerabilityDetails' {} a -> s {vendorCreatedAt = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Data._Time
+
+-- | The severity the vendor has given to this vulnerability type.
+packageVulnerabilityDetails_vendorSeverity :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.Text)
+packageVulnerabilityDetails_vendorSeverity = Lens.lens (\PackageVulnerabilityDetails' {vendorSeverity} -> vendorSeverity) (\s@PackageVulnerabilityDetails' {} a -> s {vendorSeverity = a} :: PackageVulnerabilityDetails)
+
+-- | The date and time the vendor last updated this vulnerability in their
+-- database.
+packageVulnerabilityDetails_vendorUpdatedAt :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.UTCTime)
+packageVulnerabilityDetails_vendorUpdatedAt = Lens.lens (\PackageVulnerabilityDetails' {vendorUpdatedAt} -> vendorUpdatedAt) (\s@PackageVulnerabilityDetails' {} a -> s {vendorUpdatedAt = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Data._Time
+
+-- | The ID given to this vulnerability.
+packageVulnerabilityDetails_vulnerabilityId :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe Prelude.Text)
+packageVulnerabilityDetails_vulnerabilityId = Lens.lens (\PackageVulnerabilityDetails' {vulnerabilityId} -> vulnerabilityId) (\s@PackageVulnerabilityDetails' {} a -> s {vulnerabilityId = a} :: PackageVulnerabilityDetails)
+
+-- | The packages impacted by this vulnerability.
+packageVulnerabilityDetails_vulnerablePackages :: Lens.Lens' PackageVulnerabilityDetails (Prelude.Maybe [VulnerablePackage])
+packageVulnerabilityDetails_vulnerablePackages = Lens.lens (\PackageVulnerabilityDetails' {vulnerablePackages} -> vulnerablePackages) (\s@PackageVulnerabilityDetails' {} a -> s {vulnerablePackages = a} :: PackageVulnerabilityDetails) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON PackageVulnerabilityDetails where
+  parseJSON =
+    Data.withObject
+      "PackageVulnerabilityDetails"
+      ( \x ->
+          PackageVulnerabilityDetails'
+            Prelude.<$> (x Data..:? "cvss" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "referenceUrls" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "relatedVulnerabilities"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "source")
+            Prelude.<*> (x Data..:? "sourceUrl")
+            Prelude.<*> (x Data..:? "vendorCreatedAt")
+            Prelude.<*> (x Data..:? "vendorSeverity")
+            Prelude.<*> (x Data..:? "vendorUpdatedAt")
+            Prelude.<*> (x Data..:? "vulnerabilityId")
+            Prelude.<*> ( x
+                            Data..:? "vulnerablePackages"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable PackageVulnerabilityDetails where
+  hashWithSalt _salt PackageVulnerabilityDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` cvss
+      `Prelude.hashWithSalt` referenceUrls
+      `Prelude.hashWithSalt` relatedVulnerabilities
+      `Prelude.hashWithSalt` source
+      `Prelude.hashWithSalt` sourceUrl
+      `Prelude.hashWithSalt` vendorCreatedAt
+      `Prelude.hashWithSalt` vendorSeverity
+      `Prelude.hashWithSalt` vendorUpdatedAt
+      `Prelude.hashWithSalt` vulnerabilityId
+      `Prelude.hashWithSalt` vulnerablePackages
+
+instance Prelude.NFData PackageVulnerabilityDetails where
+  rnf PackageVulnerabilityDetails' {..} =
+    Prelude.rnf cvss
+      `Prelude.seq` Prelude.rnf referenceUrls
+      `Prelude.seq` Prelude.rnf relatedVulnerabilities
+      `Prelude.seq` Prelude.rnf source
+      `Prelude.seq` Prelude.rnf sourceUrl
+      `Prelude.seq` Prelude.rnf vendorCreatedAt
+      `Prelude.seq` Prelude.rnf vendorSeverity
+      `Prelude.seq` Prelude.rnf vendorUpdatedAt
+      `Prelude.seq` Prelude.rnf vulnerabilityId
+      `Prelude.seq` Prelude.rnf vulnerablePackages
diff --git a/gen/Amazonka/ECR/Types/PullThroughCacheRule.hs b/gen/Amazonka/ECR/Types/PullThroughCacheRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/PullThroughCacheRule.hs
@@ -0,0 +1,114 @@
+{-# 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.ECR.Types.PullThroughCacheRule
+-- 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.ECR.Types.PullThroughCacheRule where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of a pull through cache rule.
+--
+-- /See:/ 'newPullThroughCacheRule' smart constructor.
+data PullThroughCacheRule = PullThroughCacheRule'
+  { -- | The date and time the pull through cache was created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon ECR repository prefix associated with the pull through cache
+    -- rule.
+    ecrRepositoryPrefix :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services account ID associated with the registry the pull
+    -- through cache rule is associated with.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The upstream registry URL associated with the pull through cache rule.
+    upstreamRegistryUrl :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PullThroughCacheRule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'pullThroughCacheRule_createdAt' - The date and time the pull through cache was created.
+--
+-- 'ecrRepositoryPrefix', 'pullThroughCacheRule_ecrRepositoryPrefix' - The Amazon ECR repository prefix associated with the pull through cache
+-- rule.
+--
+-- 'registryId', 'pullThroughCacheRule_registryId' - The Amazon Web Services account ID associated with the registry the pull
+-- through cache rule is associated with.
+--
+-- 'upstreamRegistryUrl', 'pullThroughCacheRule_upstreamRegistryUrl' - The upstream registry URL associated with the pull through cache rule.
+newPullThroughCacheRule ::
+  PullThroughCacheRule
+newPullThroughCacheRule =
+  PullThroughCacheRule'
+    { createdAt = Prelude.Nothing,
+      ecrRepositoryPrefix = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      upstreamRegistryUrl = Prelude.Nothing
+    }
+
+-- | The date and time the pull through cache was created.
+pullThroughCacheRule_createdAt :: Lens.Lens' PullThroughCacheRule (Prelude.Maybe Prelude.UTCTime)
+pullThroughCacheRule_createdAt = Lens.lens (\PullThroughCacheRule' {createdAt} -> createdAt) (\s@PullThroughCacheRule' {} a -> s {createdAt = a} :: PullThroughCacheRule) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon ECR repository prefix associated with the pull through cache
+-- rule.
+pullThroughCacheRule_ecrRepositoryPrefix :: Lens.Lens' PullThroughCacheRule (Prelude.Maybe Prelude.Text)
+pullThroughCacheRule_ecrRepositoryPrefix = Lens.lens (\PullThroughCacheRule' {ecrRepositoryPrefix} -> ecrRepositoryPrefix) (\s@PullThroughCacheRule' {} a -> s {ecrRepositoryPrefix = a} :: PullThroughCacheRule)
+
+-- | The Amazon Web Services account ID associated with the registry the pull
+-- through cache rule is associated with.
+pullThroughCacheRule_registryId :: Lens.Lens' PullThroughCacheRule (Prelude.Maybe Prelude.Text)
+pullThroughCacheRule_registryId = Lens.lens (\PullThroughCacheRule' {registryId} -> registryId) (\s@PullThroughCacheRule' {} a -> s {registryId = a} :: PullThroughCacheRule)
+
+-- | The upstream registry URL associated with the pull through cache rule.
+pullThroughCacheRule_upstreamRegistryUrl :: Lens.Lens' PullThroughCacheRule (Prelude.Maybe Prelude.Text)
+pullThroughCacheRule_upstreamRegistryUrl = Lens.lens (\PullThroughCacheRule' {upstreamRegistryUrl} -> upstreamRegistryUrl) (\s@PullThroughCacheRule' {} a -> s {upstreamRegistryUrl = a} :: PullThroughCacheRule)
+
+instance Data.FromJSON PullThroughCacheRule where
+  parseJSON =
+    Data.withObject
+      "PullThroughCacheRule"
+      ( \x ->
+          PullThroughCacheRule'
+            Prelude.<$> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "ecrRepositoryPrefix")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "upstreamRegistryUrl")
+      )
+
+instance Prelude.Hashable PullThroughCacheRule where
+  hashWithSalt _salt PullThroughCacheRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` ecrRepositoryPrefix
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` upstreamRegistryUrl
+
+instance Prelude.NFData PullThroughCacheRule where
+  rnf PullThroughCacheRule' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf ecrRepositoryPrefix
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf upstreamRegistryUrl
diff --git a/gen/Amazonka/ECR/Types/Recommendation.hs b/gen/Amazonka/ECR/Types/Recommendation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Recommendation.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.ECR.Types.Recommendation
+-- 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.ECR.Types.Recommendation 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 the recommended course of action to remediate the finding.
+--
+-- /See:/ 'newRecommendation' smart constructor.
+data Recommendation = Recommendation'
+  { -- | The recommended course of action to remediate the finding.
+    text :: Prelude.Maybe Prelude.Text,
+    -- | The URL address to the CVE remediation recommendations.
+    url :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Recommendation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'text', 'recommendation_text' - The recommended course of action to remediate the finding.
+--
+-- 'url', 'recommendation_url' - The URL address to the CVE remediation recommendations.
+newRecommendation ::
+  Recommendation
+newRecommendation =
+  Recommendation'
+    { text = Prelude.Nothing,
+      url = Prelude.Nothing
+    }
+
+-- | The recommended course of action to remediate the finding.
+recommendation_text :: Lens.Lens' Recommendation (Prelude.Maybe Prelude.Text)
+recommendation_text = Lens.lens (\Recommendation' {text} -> text) (\s@Recommendation' {} a -> s {text = a} :: Recommendation)
+
+-- | The URL address to the CVE remediation recommendations.
+recommendation_url :: Lens.Lens' Recommendation (Prelude.Maybe Prelude.Text)
+recommendation_url = Lens.lens (\Recommendation' {url} -> url) (\s@Recommendation' {} a -> s {url = a} :: Recommendation)
+
+instance Data.FromJSON Recommendation where
+  parseJSON =
+    Data.withObject
+      "Recommendation"
+      ( \x ->
+          Recommendation'
+            Prelude.<$> (x Data..:? "text")
+            Prelude.<*> (x Data..:? "url")
+      )
+
+instance Prelude.Hashable Recommendation where
+  hashWithSalt _salt Recommendation' {..} =
+    _salt
+      `Prelude.hashWithSalt` text
+      `Prelude.hashWithSalt` url
+
+instance Prelude.NFData Recommendation where
+  rnf Recommendation' {..} =
+    Prelude.rnf text `Prelude.seq` Prelude.rnf url
diff --git a/gen/Amazonka/ECR/Types/RegistryScanningConfiguration.hs b/gen/Amazonka/ECR/Types/RegistryScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RegistryScanningConfiguration.hs
@@ -0,0 +1,90 @@
+{-# 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.ECR.Types.RegistryScanningConfiguration
+-- 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.ECR.Types.RegistryScanningConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.RegistryScanningRule
+import Amazonka.ECR.Types.ScanType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The scanning configuration for a private registry.
+--
+-- /See:/ 'newRegistryScanningConfiguration' smart constructor.
+data RegistryScanningConfiguration = RegistryScanningConfiguration'
+  { -- | The scanning rules associated with the registry.
+    rules :: Prelude.Maybe [RegistryScanningRule],
+    -- | The type of scanning configured for the registry.
+    scanType :: Prelude.Maybe ScanType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegistryScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rules', 'registryScanningConfiguration_rules' - The scanning rules associated with the registry.
+--
+-- 'scanType', 'registryScanningConfiguration_scanType' - The type of scanning configured for the registry.
+newRegistryScanningConfiguration ::
+  RegistryScanningConfiguration
+newRegistryScanningConfiguration =
+  RegistryScanningConfiguration'
+    { rules =
+        Prelude.Nothing,
+      scanType = Prelude.Nothing
+    }
+
+-- | The scanning rules associated with the registry.
+registryScanningConfiguration_rules :: Lens.Lens' RegistryScanningConfiguration (Prelude.Maybe [RegistryScanningRule])
+registryScanningConfiguration_rules = Lens.lens (\RegistryScanningConfiguration' {rules} -> rules) (\s@RegistryScanningConfiguration' {} a -> s {rules = a} :: RegistryScanningConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of scanning configured for the registry.
+registryScanningConfiguration_scanType :: Lens.Lens' RegistryScanningConfiguration (Prelude.Maybe ScanType)
+registryScanningConfiguration_scanType = Lens.lens (\RegistryScanningConfiguration' {scanType} -> scanType) (\s@RegistryScanningConfiguration' {} a -> s {scanType = a} :: RegistryScanningConfiguration)
+
+instance Data.FromJSON RegistryScanningConfiguration where
+  parseJSON =
+    Data.withObject
+      "RegistryScanningConfiguration"
+      ( \x ->
+          RegistryScanningConfiguration'
+            Prelude.<$> (x Data..:? "rules" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "scanType")
+      )
+
+instance
+  Prelude.Hashable
+    RegistryScanningConfiguration
+  where
+  hashWithSalt _salt RegistryScanningConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` rules
+      `Prelude.hashWithSalt` scanType
+
+instance Prelude.NFData RegistryScanningConfiguration where
+  rnf RegistryScanningConfiguration' {..} =
+    Prelude.rnf rules
+      `Prelude.seq` Prelude.rnf scanType
diff --git a/gen/Amazonka/ECR/Types/RegistryScanningRule.hs b/gen/Amazonka/ECR/Types/RegistryScanningRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RegistryScanningRule.hs
@@ -0,0 +1,118 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.RegistryScanningRule
+-- 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.ECR.Types.RegistryScanningRule where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ScanFrequency
+import Amazonka.ECR.Types.ScanningRepositoryFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of a scanning rule for a private registry.
+--
+-- /See:/ 'newRegistryScanningRule' smart constructor.
+data RegistryScanningRule = RegistryScanningRule'
+  { -- | The frequency that scans are performed at for a private registry. When
+    -- the @ENHANCED@ scan type is specified, the supported scan frequencies
+    -- are @CONTINUOUS_SCAN@ and @SCAN_ON_PUSH@. When the @BASIC@ scan type is
+    -- specified, the @SCAN_ON_PUSH@ and @MANUAL@ scan frequencies are
+    -- supported.
+    scanFrequency :: ScanFrequency,
+    -- | The repository filters associated with the scanning configuration for a
+    -- private registry.
+    repositoryFilters :: [ScanningRepositoryFilter]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegistryScanningRule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'scanFrequency', 'registryScanningRule_scanFrequency' - The frequency that scans are performed at for a private registry. When
+-- the @ENHANCED@ scan type is specified, the supported scan frequencies
+-- are @CONTINUOUS_SCAN@ and @SCAN_ON_PUSH@. When the @BASIC@ scan type is
+-- specified, the @SCAN_ON_PUSH@ and @MANUAL@ scan frequencies are
+-- supported.
+--
+-- 'repositoryFilters', 'registryScanningRule_repositoryFilters' - The repository filters associated with the scanning configuration for a
+-- private registry.
+newRegistryScanningRule ::
+  -- | 'scanFrequency'
+  ScanFrequency ->
+  RegistryScanningRule
+newRegistryScanningRule pScanFrequency_ =
+  RegistryScanningRule'
+    { scanFrequency =
+        pScanFrequency_,
+      repositoryFilters = Prelude.mempty
+    }
+
+-- | The frequency that scans are performed at for a private registry. When
+-- the @ENHANCED@ scan type is specified, the supported scan frequencies
+-- are @CONTINUOUS_SCAN@ and @SCAN_ON_PUSH@. When the @BASIC@ scan type is
+-- specified, the @SCAN_ON_PUSH@ and @MANUAL@ scan frequencies are
+-- supported.
+registryScanningRule_scanFrequency :: Lens.Lens' RegistryScanningRule ScanFrequency
+registryScanningRule_scanFrequency = Lens.lens (\RegistryScanningRule' {scanFrequency} -> scanFrequency) (\s@RegistryScanningRule' {} a -> s {scanFrequency = a} :: RegistryScanningRule)
+
+-- | The repository filters associated with the scanning configuration for a
+-- private registry.
+registryScanningRule_repositoryFilters :: Lens.Lens' RegistryScanningRule [ScanningRepositoryFilter]
+registryScanningRule_repositoryFilters = Lens.lens (\RegistryScanningRule' {repositoryFilters} -> repositoryFilters) (\s@RegistryScanningRule' {} a -> s {repositoryFilters = a} :: RegistryScanningRule) Prelude.. Lens.coerced
+
+instance Data.FromJSON RegistryScanningRule where
+  parseJSON =
+    Data.withObject
+      "RegistryScanningRule"
+      ( \x ->
+          RegistryScanningRule'
+            Prelude.<$> (x Data..: "scanFrequency")
+            Prelude.<*> ( x
+                            Data..:? "repositoryFilters"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable RegistryScanningRule where
+  hashWithSalt _salt RegistryScanningRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` scanFrequency
+      `Prelude.hashWithSalt` repositoryFilters
+
+instance Prelude.NFData RegistryScanningRule where
+  rnf RegistryScanningRule' {..} =
+    Prelude.rnf scanFrequency
+      `Prelude.seq` Prelude.rnf repositoryFilters
+
+instance Data.ToJSON RegistryScanningRule where
+  toJSON RegistryScanningRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("scanFrequency" Data..= scanFrequency),
+            Prelude.Just
+              ("repositoryFilters" Data..= repositoryFilters)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/Remediation.hs b/gen/Amazonka/ECR/Types/Remediation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Remediation.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.ECR.Types.Remediation
+-- 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.ECR.Types.Remediation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.Recommendation
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information on how to remediate a finding.
+--
+-- /See:/ 'newRemediation' smart constructor.
+data Remediation = Remediation'
+  { -- | An object that contains information about the recommended course of
+    -- action to remediate the finding.
+    recommendation :: Prelude.Maybe Recommendation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Remediation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommendation', 'remediation_recommendation' - An object that contains information about the recommended course of
+-- action to remediate the finding.
+newRemediation ::
+  Remediation
+newRemediation =
+  Remediation' {recommendation = Prelude.Nothing}
+
+-- | An object that contains information about the recommended course of
+-- action to remediate the finding.
+remediation_recommendation :: Lens.Lens' Remediation (Prelude.Maybe Recommendation)
+remediation_recommendation = Lens.lens (\Remediation' {recommendation} -> recommendation) (\s@Remediation' {} a -> s {recommendation = a} :: Remediation)
+
+instance Data.FromJSON Remediation where
+  parseJSON =
+    Data.withObject
+      "Remediation"
+      ( \x ->
+          Remediation'
+            Prelude.<$> (x Data..:? "recommendation")
+      )
+
+instance Prelude.Hashable Remediation where
+  hashWithSalt _salt Remediation' {..} =
+    _salt `Prelude.hashWithSalt` recommendation
+
+instance Prelude.NFData Remediation where
+  rnf Remediation' {..} = Prelude.rnf recommendation
diff --git a/gen/Amazonka/ECR/Types/ReplicationConfiguration.hs b/gen/Amazonka/ECR/Types/ReplicationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ReplicationConfiguration.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.ECR.Types.ReplicationConfiguration
+-- 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.ECR.Types.ReplicationConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ReplicationRule
+import qualified Amazonka.Prelude as Prelude
+
+-- | The replication configuration for a registry.
+--
+-- /See:/ 'newReplicationConfiguration' smart constructor.
+data ReplicationConfiguration = ReplicationConfiguration'
+  { -- | An array of objects representing the replication destinations and
+    -- repository filters for a replication configuration.
+    rules :: [ReplicationRule]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReplicationConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'rules', 'replicationConfiguration_rules' - An array of objects representing the replication destinations and
+-- repository filters for a replication configuration.
+newReplicationConfiguration ::
+  ReplicationConfiguration
+newReplicationConfiguration =
+  ReplicationConfiguration' {rules = Prelude.mempty}
+
+-- | An array of objects representing the replication destinations and
+-- repository filters for a replication configuration.
+replicationConfiguration_rules :: Lens.Lens' ReplicationConfiguration [ReplicationRule]
+replicationConfiguration_rules = Lens.lens (\ReplicationConfiguration' {rules} -> rules) (\s@ReplicationConfiguration' {} a -> s {rules = a} :: ReplicationConfiguration) Prelude.. Lens.coerced
+
+instance Data.FromJSON ReplicationConfiguration where
+  parseJSON =
+    Data.withObject
+      "ReplicationConfiguration"
+      ( \x ->
+          ReplicationConfiguration'
+            Prelude.<$> (x Data..:? "rules" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ReplicationConfiguration where
+  hashWithSalt _salt ReplicationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` rules
+
+instance Prelude.NFData ReplicationConfiguration where
+  rnf ReplicationConfiguration' {..} = Prelude.rnf rules
+
+instance Data.ToJSON ReplicationConfiguration where
+  toJSON ReplicationConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("rules" Data..= rules)]
+      )
diff --git a/gen/Amazonka/ECR/Types/ReplicationDestination.hs b/gen/Amazonka/ECR/Types/ReplicationDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ReplicationDestination.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.ECR.Types.ReplicationDestination
+-- 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.ECR.Types.ReplicationDestination where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An array of objects representing the destination for a replication rule.
+--
+-- /See:/ 'newReplicationDestination' smart constructor.
+data ReplicationDestination = ReplicationDestination'
+  { -- | The Region to replicate to.
+    region :: Prelude.Text,
+    -- | The Amazon Web Services account ID of the Amazon ECR private registry to
+    -- replicate to. When configuring cross-Region replication within your own
+    -- registry, specify your own account ID.
+    registryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReplicationDestination' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'region', 'replicationDestination_region' - The Region to replicate to.
+--
+-- 'registryId', 'replicationDestination_registryId' - The Amazon Web Services account ID of the Amazon ECR private registry to
+-- replicate to. When configuring cross-Region replication within your own
+-- registry, specify your own account ID.
+newReplicationDestination ::
+  -- | 'region'
+  Prelude.Text ->
+  -- | 'registryId'
+  Prelude.Text ->
+  ReplicationDestination
+newReplicationDestination pRegion_ pRegistryId_ =
+  ReplicationDestination'
+    { region = pRegion_,
+      registryId = pRegistryId_
+    }
+
+-- | The Region to replicate to.
+replicationDestination_region :: Lens.Lens' ReplicationDestination Prelude.Text
+replicationDestination_region = Lens.lens (\ReplicationDestination' {region} -> region) (\s@ReplicationDestination' {} a -> s {region = a} :: ReplicationDestination)
+
+-- | The Amazon Web Services account ID of the Amazon ECR private registry to
+-- replicate to. When configuring cross-Region replication within your own
+-- registry, specify your own account ID.
+replicationDestination_registryId :: Lens.Lens' ReplicationDestination Prelude.Text
+replicationDestination_registryId = Lens.lens (\ReplicationDestination' {registryId} -> registryId) (\s@ReplicationDestination' {} a -> s {registryId = a} :: ReplicationDestination)
+
+instance Data.FromJSON ReplicationDestination where
+  parseJSON =
+    Data.withObject
+      "ReplicationDestination"
+      ( \x ->
+          ReplicationDestination'
+            Prelude.<$> (x Data..: "region")
+            Prelude.<*> (x Data..: "registryId")
+      )
+
+instance Prelude.Hashable ReplicationDestination where
+  hashWithSalt _salt ReplicationDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` registryId
+
+instance Prelude.NFData ReplicationDestination where
+  rnf ReplicationDestination' {..} =
+    Prelude.rnf region
+      `Prelude.seq` Prelude.rnf registryId
+
+instance Data.ToJSON ReplicationDestination where
+  toJSON ReplicationDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("region" Data..= region),
+            Prelude.Just ("registryId" Data..= registryId)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/ReplicationRule.hs b/gen/Amazonka/ECR/Types/ReplicationRule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ReplicationRule.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ReplicationRule
+-- 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.ECR.Types.ReplicationRule where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ReplicationDestination
+import Amazonka.ECR.Types.RepositoryFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | An array of objects representing the replication destinations and
+-- repository filters for a replication configuration.
+--
+-- /See:/ 'newReplicationRule' smart constructor.
+data ReplicationRule = ReplicationRule'
+  { -- | An array of objects representing the filters for a replication rule.
+    -- Specifying a repository filter for a replication rule provides a method
+    -- for controlling which repositories in a private registry are replicated.
+    repositoryFilters :: Prelude.Maybe (Prelude.NonEmpty RepositoryFilter),
+    -- | An array of objects representing the destination for a replication rule.
+    destinations :: [ReplicationDestination]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReplicationRule' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'repositoryFilters', 'replicationRule_repositoryFilters' - An array of objects representing the filters for a replication rule.
+-- Specifying a repository filter for a replication rule provides a method
+-- for controlling which repositories in a private registry are replicated.
+--
+-- 'destinations', 'replicationRule_destinations' - An array of objects representing the destination for a replication rule.
+newReplicationRule ::
+  ReplicationRule
+newReplicationRule =
+  ReplicationRule'
+    { repositoryFilters =
+        Prelude.Nothing,
+      destinations = Prelude.mempty
+    }
+
+-- | An array of objects representing the filters for a replication rule.
+-- Specifying a repository filter for a replication rule provides a method
+-- for controlling which repositories in a private registry are replicated.
+replicationRule_repositoryFilters :: Lens.Lens' ReplicationRule (Prelude.Maybe (Prelude.NonEmpty RepositoryFilter))
+replicationRule_repositoryFilters = Lens.lens (\ReplicationRule' {repositoryFilters} -> repositoryFilters) (\s@ReplicationRule' {} a -> s {repositoryFilters = a} :: ReplicationRule) Prelude.. Lens.mapping Lens.coerced
+
+-- | An array of objects representing the destination for a replication rule.
+replicationRule_destinations :: Lens.Lens' ReplicationRule [ReplicationDestination]
+replicationRule_destinations = Lens.lens (\ReplicationRule' {destinations} -> destinations) (\s@ReplicationRule' {} a -> s {destinations = a} :: ReplicationRule) Prelude.. Lens.coerced
+
+instance Data.FromJSON ReplicationRule where
+  parseJSON =
+    Data.withObject
+      "ReplicationRule"
+      ( \x ->
+          ReplicationRule'
+            Prelude.<$> (x Data..:? "repositoryFilters")
+            Prelude.<*> (x Data..:? "destinations" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ReplicationRule where
+  hashWithSalt _salt ReplicationRule' {..} =
+    _salt
+      `Prelude.hashWithSalt` repositoryFilters
+      `Prelude.hashWithSalt` destinations
+
+instance Prelude.NFData ReplicationRule where
+  rnf ReplicationRule' {..} =
+    Prelude.rnf repositoryFilters
+      `Prelude.seq` Prelude.rnf destinations
+
+instance Data.ToJSON ReplicationRule where
+  toJSON ReplicationRule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("repositoryFilters" Data..=)
+              Prelude.<$> repositoryFilters,
+            Prelude.Just ("destinations" Data..= destinations)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/ReplicationStatus.hs b/gen/Amazonka/ECR/Types/ReplicationStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ReplicationStatus.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.ECR.Types.ReplicationStatus
+-- 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.ECR.Types.ReplicationStatus
+  ( ReplicationStatus
+      ( ..,
+        ReplicationStatus_COMPLETE,
+        ReplicationStatus_FAILED,
+        ReplicationStatus_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ReplicationStatus = ReplicationStatus'
+  { fromReplicationStatus ::
+      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 ReplicationStatus_COMPLETE :: ReplicationStatus
+pattern ReplicationStatus_COMPLETE = ReplicationStatus' "COMPLETE"
+
+pattern ReplicationStatus_FAILED :: ReplicationStatus
+pattern ReplicationStatus_FAILED = ReplicationStatus' "FAILED"
+
+pattern ReplicationStatus_IN_PROGRESS :: ReplicationStatus
+pattern ReplicationStatus_IN_PROGRESS = ReplicationStatus' "IN_PROGRESS"
+
+{-# COMPLETE
+  ReplicationStatus_COMPLETE,
+  ReplicationStatus_FAILED,
+  ReplicationStatus_IN_PROGRESS,
+  ReplicationStatus'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/Repository.hs b/gen/Amazonka/ECR/Types/Repository.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Repository.hs
@@ -0,0 +1,182 @@
+{-# 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.ECR.Types.Repository
+-- 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.ECR.Types.Repository where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.EncryptionConfiguration
+import Amazonka.ECR.Types.ImageScanningConfiguration
+import Amazonka.ECR.Types.ImageTagMutability
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object representing a repository.
+--
+-- /See:/ 'newRepository' smart constructor.
+data Repository = Repository'
+  { -- | The date and time, in JavaScript date format, when the repository was
+    -- created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The encryption configuration for the repository. This determines how the
+    -- contents of your repository are encrypted at rest.
+    encryptionConfiguration :: Prelude.Maybe EncryptionConfiguration,
+    imageScanningConfiguration :: Prelude.Maybe ImageScanningConfiguration,
+    -- | The tag mutability setting for the repository.
+    imageTagMutability :: Prelude.Maybe ImageTagMutability,
+    -- | The Amazon Web Services account ID associated with the registry that
+    -- contains the repository.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) that identifies the repository. The ARN
+    -- contains the @arn:aws:ecr@ namespace, followed by the region of the
+    -- repository, Amazon Web Services account ID of the repository owner,
+    -- repository namespace, and repository name. For example,
+    -- @arn:aws:ecr:region:012345678910:repository\/test@.
+    repositoryArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The URI for the repository. You can use this URI for container image
+    -- @push@ and @pull@ operations.
+    repositoryUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Repository' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'repository_createdAt' - The date and time, in JavaScript date format, when the repository was
+-- created.
+--
+-- 'encryptionConfiguration', 'repository_encryptionConfiguration' - The encryption configuration for the repository. This determines how the
+-- contents of your repository are encrypted at rest.
+--
+-- 'imageScanningConfiguration', 'repository_imageScanningConfiguration' - Undocumented member.
+--
+-- 'imageTagMutability', 'repository_imageTagMutability' - The tag mutability setting for the repository.
+--
+-- 'registryId', 'repository_registryId' - The Amazon Web Services account ID associated with the registry that
+-- contains the repository.
+--
+-- 'repositoryArn', 'repository_repositoryArn' - The Amazon Resource Name (ARN) that identifies the repository. The ARN
+-- contains the @arn:aws:ecr@ namespace, followed by the region of the
+-- repository, Amazon Web Services account ID of the repository owner,
+-- repository namespace, and repository name. For example,
+-- @arn:aws:ecr:region:012345678910:repository\/test@.
+--
+-- 'repositoryName', 'repository_repositoryName' - The name of the repository.
+--
+-- 'repositoryUri', 'repository_repositoryUri' - The URI for the repository. You can use this URI for container image
+-- @push@ and @pull@ operations.
+newRepository ::
+  Repository
+newRepository =
+  Repository'
+    { createdAt = Prelude.Nothing,
+      encryptionConfiguration = Prelude.Nothing,
+      imageScanningConfiguration = Prelude.Nothing,
+      imageTagMutability = Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryArn = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      repositoryUri = Prelude.Nothing
+    }
+
+-- | The date and time, in JavaScript date format, when the repository was
+-- created.
+repository_createdAt :: Lens.Lens' Repository (Prelude.Maybe Prelude.UTCTime)
+repository_createdAt = Lens.lens (\Repository' {createdAt} -> createdAt) (\s@Repository' {} a -> s {createdAt = a} :: Repository) Prelude.. Lens.mapping Data._Time
+
+-- | The encryption configuration for the repository. This determines how the
+-- contents of your repository are encrypted at rest.
+repository_encryptionConfiguration :: Lens.Lens' Repository (Prelude.Maybe EncryptionConfiguration)
+repository_encryptionConfiguration = Lens.lens (\Repository' {encryptionConfiguration} -> encryptionConfiguration) (\s@Repository' {} a -> s {encryptionConfiguration = a} :: Repository)
+
+-- | Undocumented member.
+repository_imageScanningConfiguration :: Lens.Lens' Repository (Prelude.Maybe ImageScanningConfiguration)
+repository_imageScanningConfiguration = Lens.lens (\Repository' {imageScanningConfiguration} -> imageScanningConfiguration) (\s@Repository' {} a -> s {imageScanningConfiguration = a} :: Repository)
+
+-- | The tag mutability setting for the repository.
+repository_imageTagMutability :: Lens.Lens' Repository (Prelude.Maybe ImageTagMutability)
+repository_imageTagMutability = Lens.lens (\Repository' {imageTagMutability} -> imageTagMutability) (\s@Repository' {} a -> s {imageTagMutability = a} :: Repository)
+
+-- | The Amazon Web Services account ID associated with the registry that
+-- contains the repository.
+repository_registryId :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_registryId = Lens.lens (\Repository' {registryId} -> registryId) (\s@Repository' {} a -> s {registryId = a} :: Repository)
+
+-- | The Amazon Resource Name (ARN) that identifies the repository. The ARN
+-- contains the @arn:aws:ecr@ namespace, followed by the region of the
+-- repository, Amazon Web Services account ID of the repository owner,
+-- repository namespace, and repository name. For example,
+-- @arn:aws:ecr:region:012345678910:repository\/test@.
+repository_repositoryArn :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryArn = Lens.lens (\Repository' {repositoryArn} -> repositoryArn) (\s@Repository' {} a -> s {repositoryArn = a} :: Repository)
+
+-- | The name of the repository.
+repository_repositoryName :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryName = Lens.lens (\Repository' {repositoryName} -> repositoryName) (\s@Repository' {} a -> s {repositoryName = a} :: Repository)
+
+-- | The URI for the repository. You can use this URI for container image
+-- @push@ and @pull@ operations.
+repository_repositoryUri :: Lens.Lens' Repository (Prelude.Maybe Prelude.Text)
+repository_repositoryUri = Lens.lens (\Repository' {repositoryUri} -> repositoryUri) (\s@Repository' {} a -> s {repositoryUri = a} :: Repository)
+
+instance Data.FromJSON Repository where
+  parseJSON =
+    Data.withObject
+      "Repository"
+      ( \x ->
+          Repository'
+            Prelude.<$> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "encryptionConfiguration")
+            Prelude.<*> (x Data..:? "imageScanningConfiguration")
+            Prelude.<*> (x Data..:? "imageTagMutability")
+            Prelude.<*> (x Data..:? "registryId")
+            Prelude.<*> (x Data..:? "repositoryArn")
+            Prelude.<*> (x Data..:? "repositoryName")
+            Prelude.<*> (x Data..:? "repositoryUri")
+      )
+
+instance Prelude.Hashable Repository where
+  hashWithSalt _salt Repository' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` encryptionConfiguration
+      `Prelude.hashWithSalt` imageScanningConfiguration
+      `Prelude.hashWithSalt` imageTagMutability
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryArn
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` repositoryUri
+
+instance Prelude.NFData Repository where
+  rnf Repository' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf encryptionConfiguration
+      `Prelude.seq` Prelude.rnf imageScanningConfiguration
+      `Prelude.seq` Prelude.rnf imageTagMutability
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryArn
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf repositoryUri
diff --git a/gen/Amazonka/ECR/Types/RepositoryFilter.hs b/gen/Amazonka/ECR/Types/RepositoryFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RepositoryFilter.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.ECR.Types.RepositoryFilter
+-- 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.ECR.Types.RepositoryFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.RepositoryFilterType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The filter settings used with image replication. Specifying a repository
+-- filter to a replication rule provides a method for controlling which
+-- repositories in a private registry are replicated. If no repository
+-- filter is specified, all images in the repository are replicated.
+--
+-- /See:/ 'newRepositoryFilter' smart constructor.
+data RepositoryFilter = RepositoryFilter'
+  { -- | The repository filter details. When the @PREFIX_MATCH@ filter type is
+    -- specified, this value is required and should be the repository name
+    -- prefix to configure replication for.
+    filter' :: Prelude.Text,
+    -- | The repository filter type. The only supported value is @PREFIX_MATCH@,
+    -- which is a repository name prefix specified with the @filter@ parameter.
+    filterType :: RepositoryFilterType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RepositoryFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'repositoryFilter_filter' - The repository filter details. When the @PREFIX_MATCH@ filter type is
+-- specified, this value is required and should be the repository name
+-- prefix to configure replication for.
+--
+-- 'filterType', 'repositoryFilter_filterType' - The repository filter type. The only supported value is @PREFIX_MATCH@,
+-- which is a repository name prefix specified with the @filter@ parameter.
+newRepositoryFilter ::
+  -- | 'filter''
+  Prelude.Text ->
+  -- | 'filterType'
+  RepositoryFilterType ->
+  RepositoryFilter
+newRepositoryFilter pFilter_ pFilterType_ =
+  RepositoryFilter'
+    { filter' = pFilter_,
+      filterType = pFilterType_
+    }
+
+-- | The repository filter details. When the @PREFIX_MATCH@ filter type is
+-- specified, this value is required and should be the repository name
+-- prefix to configure replication for.
+repositoryFilter_filter :: Lens.Lens' RepositoryFilter Prelude.Text
+repositoryFilter_filter = Lens.lens (\RepositoryFilter' {filter'} -> filter') (\s@RepositoryFilter' {} a -> s {filter' = a} :: RepositoryFilter)
+
+-- | The repository filter type. The only supported value is @PREFIX_MATCH@,
+-- which is a repository name prefix specified with the @filter@ parameter.
+repositoryFilter_filterType :: Lens.Lens' RepositoryFilter RepositoryFilterType
+repositoryFilter_filterType = Lens.lens (\RepositoryFilter' {filterType} -> filterType) (\s@RepositoryFilter' {} a -> s {filterType = a} :: RepositoryFilter)
+
+instance Data.FromJSON RepositoryFilter where
+  parseJSON =
+    Data.withObject
+      "RepositoryFilter"
+      ( \x ->
+          RepositoryFilter'
+            Prelude.<$> (x Data..: "filter")
+            Prelude.<*> (x Data..: "filterType")
+      )
+
+instance Prelude.Hashable RepositoryFilter where
+  hashWithSalt _salt RepositoryFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` filterType
+
+instance Prelude.NFData RepositoryFilter where
+  rnf RepositoryFilter' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf filterType
+
+instance Data.ToJSON RepositoryFilter where
+  toJSON RepositoryFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("filter" Data..= filter'),
+            Prelude.Just ("filterType" Data..= filterType)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/RepositoryFilterType.hs b/gen/Amazonka/ECR/Types/RepositoryFilterType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RepositoryFilterType.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.ECR.Types.RepositoryFilterType
+-- 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.ECR.Types.RepositoryFilterType
+  ( RepositoryFilterType
+      ( ..,
+        RepositoryFilterType_PREFIX_MATCH
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RepositoryFilterType = RepositoryFilterType'
+  { fromRepositoryFilterType ::
+      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 RepositoryFilterType_PREFIX_MATCH :: RepositoryFilterType
+pattern RepositoryFilterType_PREFIX_MATCH = RepositoryFilterType' "PREFIX_MATCH"
+
+{-# COMPLETE
+  RepositoryFilterType_PREFIX_MATCH,
+  RepositoryFilterType'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/RepositoryScanningConfiguration.hs b/gen/Amazonka/ECR/Types/RepositoryScanningConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RepositoryScanningConfiguration.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.RepositoryScanningConfiguration
+-- 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.ECR.Types.RepositoryScanningConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ScanFrequency
+import Amazonka.ECR.Types.ScanningRepositoryFilter
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of the scanning configuration for a repository.
+--
+-- /See:/ 'newRepositoryScanningConfiguration' smart constructor.
+data RepositoryScanningConfiguration = RepositoryScanningConfiguration'
+  { -- | The scan filters applied to the repository.
+    appliedScanFilters :: Prelude.Maybe [ScanningRepositoryFilter],
+    -- | The ARN of the repository.
+    repositoryArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The scan frequency for the repository.
+    scanFrequency :: Prelude.Maybe ScanFrequency,
+    -- | Whether or not scan on push is configured for the repository.
+    scanOnPush :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RepositoryScanningConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'appliedScanFilters', 'repositoryScanningConfiguration_appliedScanFilters' - The scan filters applied to the repository.
+--
+-- 'repositoryArn', 'repositoryScanningConfiguration_repositoryArn' - The ARN of the repository.
+--
+-- 'repositoryName', 'repositoryScanningConfiguration_repositoryName' - The name of the repository.
+--
+-- 'scanFrequency', 'repositoryScanningConfiguration_scanFrequency' - The scan frequency for the repository.
+--
+-- 'scanOnPush', 'repositoryScanningConfiguration_scanOnPush' - Whether or not scan on push is configured for the repository.
+newRepositoryScanningConfiguration ::
+  RepositoryScanningConfiguration
+newRepositoryScanningConfiguration =
+  RepositoryScanningConfiguration'
+    { appliedScanFilters =
+        Prelude.Nothing,
+      repositoryArn = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      scanFrequency = Prelude.Nothing,
+      scanOnPush = Prelude.Nothing
+    }
+
+-- | The scan filters applied to the repository.
+repositoryScanningConfiguration_appliedScanFilters :: Lens.Lens' RepositoryScanningConfiguration (Prelude.Maybe [ScanningRepositoryFilter])
+repositoryScanningConfiguration_appliedScanFilters = Lens.lens (\RepositoryScanningConfiguration' {appliedScanFilters} -> appliedScanFilters) (\s@RepositoryScanningConfiguration' {} a -> s {appliedScanFilters = a} :: RepositoryScanningConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ARN of the repository.
+repositoryScanningConfiguration_repositoryArn :: Lens.Lens' RepositoryScanningConfiguration (Prelude.Maybe Prelude.Text)
+repositoryScanningConfiguration_repositoryArn = Lens.lens (\RepositoryScanningConfiguration' {repositoryArn} -> repositoryArn) (\s@RepositoryScanningConfiguration' {} a -> s {repositoryArn = a} :: RepositoryScanningConfiguration)
+
+-- | The name of the repository.
+repositoryScanningConfiguration_repositoryName :: Lens.Lens' RepositoryScanningConfiguration (Prelude.Maybe Prelude.Text)
+repositoryScanningConfiguration_repositoryName = Lens.lens (\RepositoryScanningConfiguration' {repositoryName} -> repositoryName) (\s@RepositoryScanningConfiguration' {} a -> s {repositoryName = a} :: RepositoryScanningConfiguration)
+
+-- | The scan frequency for the repository.
+repositoryScanningConfiguration_scanFrequency :: Lens.Lens' RepositoryScanningConfiguration (Prelude.Maybe ScanFrequency)
+repositoryScanningConfiguration_scanFrequency = Lens.lens (\RepositoryScanningConfiguration' {scanFrequency} -> scanFrequency) (\s@RepositoryScanningConfiguration' {} a -> s {scanFrequency = a} :: RepositoryScanningConfiguration)
+
+-- | Whether or not scan on push is configured for the repository.
+repositoryScanningConfiguration_scanOnPush :: Lens.Lens' RepositoryScanningConfiguration (Prelude.Maybe Prelude.Bool)
+repositoryScanningConfiguration_scanOnPush = Lens.lens (\RepositoryScanningConfiguration' {scanOnPush} -> scanOnPush) (\s@RepositoryScanningConfiguration' {} a -> s {scanOnPush = a} :: RepositoryScanningConfiguration)
+
+instance
+  Data.FromJSON
+    RepositoryScanningConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "RepositoryScanningConfiguration"
+      ( \x ->
+          RepositoryScanningConfiguration'
+            Prelude.<$> ( x
+                            Data..:? "appliedScanFilters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "repositoryArn")
+            Prelude.<*> (x Data..:? "repositoryName")
+            Prelude.<*> (x Data..:? "scanFrequency")
+            Prelude.<*> (x Data..:? "scanOnPush")
+      )
+
+instance
+  Prelude.Hashable
+    RepositoryScanningConfiguration
+  where
+  hashWithSalt
+    _salt
+    RepositoryScanningConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` appliedScanFilters
+        `Prelude.hashWithSalt` repositoryArn
+        `Prelude.hashWithSalt` repositoryName
+        `Prelude.hashWithSalt` scanFrequency
+        `Prelude.hashWithSalt` scanOnPush
+
+instance
+  Prelude.NFData
+    RepositoryScanningConfiguration
+  where
+  rnf RepositoryScanningConfiguration' {..} =
+    Prelude.rnf appliedScanFilters
+      `Prelude.seq` Prelude.rnf repositoryArn
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf scanFrequency
+      `Prelude.seq` Prelude.rnf scanOnPush
diff --git a/gen/Amazonka/ECR/Types/RepositoryScanningConfigurationFailure.hs b/gen/Amazonka/ECR/Types/RepositoryScanningConfigurationFailure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/RepositoryScanningConfigurationFailure.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.ECR.Types.RepositoryScanningConfigurationFailure
+-- 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.ECR.Types.RepositoryScanningConfigurationFailure where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ScanningConfigurationFailureCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details about any failures associated with the scanning
+-- configuration of a repository.
+--
+-- /See:/ 'newRepositoryScanningConfigurationFailure' smart constructor.
+data RepositoryScanningConfigurationFailure = RepositoryScanningConfigurationFailure'
+  { -- | The failure code.
+    failureCode :: Prelude.Maybe ScanningConfigurationFailureCode,
+    -- | The reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository.
+    repositoryName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RepositoryScanningConfigurationFailure' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'failureCode', 'repositoryScanningConfigurationFailure_failureCode' - The failure code.
+--
+-- 'failureReason', 'repositoryScanningConfigurationFailure_failureReason' - The reason for the failure.
+--
+-- 'repositoryName', 'repositoryScanningConfigurationFailure_repositoryName' - The name of the repository.
+newRepositoryScanningConfigurationFailure ::
+  RepositoryScanningConfigurationFailure
+newRepositoryScanningConfigurationFailure =
+  RepositoryScanningConfigurationFailure'
+    { failureCode =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      repositoryName = Prelude.Nothing
+    }
+
+-- | The failure code.
+repositoryScanningConfigurationFailure_failureCode :: Lens.Lens' RepositoryScanningConfigurationFailure (Prelude.Maybe ScanningConfigurationFailureCode)
+repositoryScanningConfigurationFailure_failureCode = Lens.lens (\RepositoryScanningConfigurationFailure' {failureCode} -> failureCode) (\s@RepositoryScanningConfigurationFailure' {} a -> s {failureCode = a} :: RepositoryScanningConfigurationFailure)
+
+-- | The reason for the failure.
+repositoryScanningConfigurationFailure_failureReason :: Lens.Lens' RepositoryScanningConfigurationFailure (Prelude.Maybe Prelude.Text)
+repositoryScanningConfigurationFailure_failureReason = Lens.lens (\RepositoryScanningConfigurationFailure' {failureReason} -> failureReason) (\s@RepositoryScanningConfigurationFailure' {} a -> s {failureReason = a} :: RepositoryScanningConfigurationFailure)
+
+-- | The name of the repository.
+repositoryScanningConfigurationFailure_repositoryName :: Lens.Lens' RepositoryScanningConfigurationFailure (Prelude.Maybe Prelude.Text)
+repositoryScanningConfigurationFailure_repositoryName = Lens.lens (\RepositoryScanningConfigurationFailure' {repositoryName} -> repositoryName) (\s@RepositoryScanningConfigurationFailure' {} a -> s {repositoryName = a} :: RepositoryScanningConfigurationFailure)
+
+instance
+  Data.FromJSON
+    RepositoryScanningConfigurationFailure
+  where
+  parseJSON =
+    Data.withObject
+      "RepositoryScanningConfigurationFailure"
+      ( \x ->
+          RepositoryScanningConfigurationFailure'
+            Prelude.<$> (x Data..:? "failureCode")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "repositoryName")
+      )
+
+instance
+  Prelude.Hashable
+    RepositoryScanningConfigurationFailure
+  where
+  hashWithSalt
+    _salt
+    RepositoryScanningConfigurationFailure' {..} =
+      _salt
+        `Prelude.hashWithSalt` failureCode
+        `Prelude.hashWithSalt` failureReason
+        `Prelude.hashWithSalt` repositoryName
+
+instance
+  Prelude.NFData
+    RepositoryScanningConfigurationFailure
+  where
+  rnf RepositoryScanningConfigurationFailure' {..} =
+    Prelude.rnf failureCode
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf repositoryName
diff --git a/gen/Amazonka/ECR/Types/Resource.hs b/gen/Amazonka/ECR/Types/Resource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Resource.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.Resource
+-- 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.ECR.Types.Resource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ResourceDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details about the resource involved in a finding.
+--
+-- /See:/ 'newResource' smart constructor.
+data Resource = Resource'
+  { -- | An object that contains details about the resource involved in a
+    -- finding.
+    details :: Prelude.Maybe ResourceDetails,
+    -- | The ID of the resource.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The tags attached to the resource.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The type of resource.
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Resource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'details', 'resource_details' - An object that contains details about the resource involved in a
+-- finding.
+--
+-- 'id', 'resource_id' - The ID of the resource.
+--
+-- 'tags', 'resource_tags' - The tags attached to the resource.
+--
+-- 'type'', 'resource_type' - The type of resource.
+newResource ::
+  Resource
+newResource =
+  Resource'
+    { details = Prelude.Nothing,
+      id = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | An object that contains details about the resource involved in a
+-- finding.
+resource_details :: Lens.Lens' Resource (Prelude.Maybe ResourceDetails)
+resource_details = Lens.lens (\Resource' {details} -> details) (\s@Resource' {} a -> s {details = a} :: Resource)
+
+-- | The ID of the resource.
+resource_id :: Lens.Lens' Resource (Prelude.Maybe Prelude.Text)
+resource_id = Lens.lens (\Resource' {id} -> id) (\s@Resource' {} a -> s {id = a} :: Resource)
+
+-- | The tags attached to the resource.
+resource_tags :: Lens.Lens' Resource (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+resource_tags = Lens.lens (\Resource' {tags} -> tags) (\s@Resource' {} a -> s {tags = a} :: Resource) Prelude.. Lens.mapping Lens.coerced
+
+-- | The type of resource.
+resource_type :: Lens.Lens' Resource (Prelude.Maybe Prelude.Text)
+resource_type = Lens.lens (\Resource' {type'} -> type') (\s@Resource' {} a -> s {type' = a} :: Resource)
+
+instance Data.FromJSON Resource where
+  parseJSON =
+    Data.withObject
+      "Resource"
+      ( \x ->
+          Resource'
+            Prelude.<$> (x Data..:? "details")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable Resource where
+  hashWithSalt _salt Resource' {..} =
+    _salt
+      `Prelude.hashWithSalt` details
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Resource where
+  rnf Resource' {..} =
+    Prelude.rnf details
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/ECR/Types/ResourceDetails.hs b/gen/Amazonka/ECR/Types/ResourceDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ResourceDetails.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ResourceDetails
+-- 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.ECR.Types.ResourceDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.AwsEcrContainerImageDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains details about the resource involved in the finding.
+--
+-- /See:/ 'newResourceDetails' smart constructor.
+data ResourceDetails = ResourceDetails'
+  { -- | An object that contains details about the Amazon ECR container image
+    -- involved in the finding.
+    awsEcrContainerImage :: Prelude.Maybe AwsEcrContainerImageDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResourceDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'awsEcrContainerImage', 'resourceDetails_awsEcrContainerImage' - An object that contains details about the Amazon ECR container image
+-- involved in the finding.
+newResourceDetails ::
+  ResourceDetails
+newResourceDetails =
+  ResourceDetails'
+    { awsEcrContainerImage =
+        Prelude.Nothing
+    }
+
+-- | An object that contains details about the Amazon ECR container image
+-- involved in the finding.
+resourceDetails_awsEcrContainerImage :: Lens.Lens' ResourceDetails (Prelude.Maybe AwsEcrContainerImageDetails)
+resourceDetails_awsEcrContainerImage = Lens.lens (\ResourceDetails' {awsEcrContainerImage} -> awsEcrContainerImage) (\s@ResourceDetails' {} a -> s {awsEcrContainerImage = a} :: ResourceDetails)
+
+instance Data.FromJSON ResourceDetails where
+  parseJSON =
+    Data.withObject
+      "ResourceDetails"
+      ( \x ->
+          ResourceDetails'
+            Prelude.<$> (x Data..:? "awsEcrContainerImage")
+      )
+
+instance Prelude.Hashable ResourceDetails where
+  hashWithSalt _salt ResourceDetails' {..} =
+    _salt `Prelude.hashWithSalt` awsEcrContainerImage
+
+instance Prelude.NFData ResourceDetails where
+  rnf ResourceDetails' {..} =
+    Prelude.rnf awsEcrContainerImage
diff --git a/gen/Amazonka/ECR/Types/ScanFrequency.hs b/gen/Amazonka/ECR/Types/ScanFrequency.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanFrequency.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.ECR.Types.ScanFrequency
+-- 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.ECR.Types.ScanFrequency
+  ( ScanFrequency
+      ( ..,
+        ScanFrequency_CONTINUOUS_SCAN,
+        ScanFrequency_MANUAL,
+        ScanFrequency_SCAN_ON_PUSH
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ScanFrequency = ScanFrequency'
+  { fromScanFrequency ::
+      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 ScanFrequency_CONTINUOUS_SCAN :: ScanFrequency
+pattern ScanFrequency_CONTINUOUS_SCAN = ScanFrequency' "CONTINUOUS_SCAN"
+
+pattern ScanFrequency_MANUAL :: ScanFrequency
+pattern ScanFrequency_MANUAL = ScanFrequency' "MANUAL"
+
+pattern ScanFrequency_SCAN_ON_PUSH :: ScanFrequency
+pattern ScanFrequency_SCAN_ON_PUSH = ScanFrequency' "SCAN_ON_PUSH"
+
+{-# COMPLETE
+  ScanFrequency_CONTINUOUS_SCAN,
+  ScanFrequency_MANUAL,
+  ScanFrequency_SCAN_ON_PUSH,
+  ScanFrequency'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ScanStatus.hs b/gen/Amazonka/ECR/Types/ScanStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanStatus.hs
@@ -0,0 +1,101 @@
+{-# 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.ECR.Types.ScanStatus
+-- 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.ECR.Types.ScanStatus
+  ( ScanStatus
+      ( ..,
+        ScanStatus_ACTIVE,
+        ScanStatus_COMPLETE,
+        ScanStatus_FAILED,
+        ScanStatus_FINDINGS_UNAVAILABLE,
+        ScanStatus_IN_PROGRESS,
+        ScanStatus_PENDING,
+        ScanStatus_SCAN_ELIGIBILITY_EXPIRED,
+        ScanStatus_UNSUPPORTED_IMAGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ScanStatus = ScanStatus'
+  { fromScanStatus ::
+      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 ScanStatus_ACTIVE :: ScanStatus
+pattern ScanStatus_ACTIVE = ScanStatus' "ACTIVE"
+
+pattern ScanStatus_COMPLETE :: ScanStatus
+pattern ScanStatus_COMPLETE = ScanStatus' "COMPLETE"
+
+pattern ScanStatus_FAILED :: ScanStatus
+pattern ScanStatus_FAILED = ScanStatus' "FAILED"
+
+pattern ScanStatus_FINDINGS_UNAVAILABLE :: ScanStatus
+pattern ScanStatus_FINDINGS_UNAVAILABLE = ScanStatus' "FINDINGS_UNAVAILABLE"
+
+pattern ScanStatus_IN_PROGRESS :: ScanStatus
+pattern ScanStatus_IN_PROGRESS = ScanStatus' "IN_PROGRESS"
+
+pattern ScanStatus_PENDING :: ScanStatus
+pattern ScanStatus_PENDING = ScanStatus' "PENDING"
+
+pattern ScanStatus_SCAN_ELIGIBILITY_EXPIRED :: ScanStatus
+pattern ScanStatus_SCAN_ELIGIBILITY_EXPIRED = ScanStatus' "SCAN_ELIGIBILITY_EXPIRED"
+
+pattern ScanStatus_UNSUPPORTED_IMAGE :: ScanStatus
+pattern ScanStatus_UNSUPPORTED_IMAGE = ScanStatus' "UNSUPPORTED_IMAGE"
+
+{-# COMPLETE
+  ScanStatus_ACTIVE,
+  ScanStatus_COMPLETE,
+  ScanStatus_FAILED,
+  ScanStatus_FINDINGS_UNAVAILABLE,
+  ScanStatus_IN_PROGRESS,
+  ScanStatus_PENDING,
+  ScanStatus_SCAN_ELIGIBILITY_EXPIRED,
+  ScanStatus_UNSUPPORTED_IMAGE,
+  ScanStatus'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ScanType.hs b/gen/Amazonka/ECR/Types/ScanType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanType.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.ECR.Types.ScanType
+-- 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.ECR.Types.ScanType
+  ( ScanType
+      ( ..,
+        ScanType_BASIC,
+        ScanType_ENHANCED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ScanType = ScanType'
+  { fromScanType ::
+      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 ScanType_BASIC :: ScanType
+pattern ScanType_BASIC = ScanType' "BASIC"
+
+pattern ScanType_ENHANCED :: ScanType
+pattern ScanType_ENHANCED = ScanType' "ENHANCED"
+
+{-# COMPLETE
+  ScanType_BASIC,
+  ScanType_ENHANCED,
+  ScanType'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ScanningConfigurationFailureCode.hs b/gen/Amazonka/ECR/Types/ScanningConfigurationFailureCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanningConfigurationFailureCode.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.ECR.Types.ScanningConfigurationFailureCode
+-- 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.ECR.Types.ScanningConfigurationFailureCode
+  ( ScanningConfigurationFailureCode
+      ( ..,
+        ScanningConfigurationFailureCode_REPOSITORY_NOT_FOUND
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ScanningConfigurationFailureCode = ScanningConfigurationFailureCode'
+  { fromScanningConfigurationFailureCode ::
+      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 ScanningConfigurationFailureCode_REPOSITORY_NOT_FOUND :: ScanningConfigurationFailureCode
+pattern ScanningConfigurationFailureCode_REPOSITORY_NOT_FOUND = ScanningConfigurationFailureCode' "REPOSITORY_NOT_FOUND"
+
+{-# COMPLETE
+  ScanningConfigurationFailureCode_REPOSITORY_NOT_FOUND,
+  ScanningConfigurationFailureCode'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ScanningRepositoryFilter.hs b/gen/Amazonka/ECR/Types/ScanningRepositoryFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanningRepositoryFilter.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.ScanningRepositoryFilter
+-- 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.ECR.Types.ScanningRepositoryFilter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.ScanningRepositoryFilterType
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details of a scanning repository filter. For more information on how
+-- to use filters, see
+-- <https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html#image-scanning-filters Using filters>
+-- in the /Amazon Elastic Container Registry User Guide/.
+--
+-- /See:/ 'newScanningRepositoryFilter' smart constructor.
+data ScanningRepositoryFilter = ScanningRepositoryFilter'
+  { -- | The filter to use when scanning.
+    filter' :: Prelude.Text,
+    -- | The type associated with the filter.
+    filterType :: ScanningRepositoryFilterType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ScanningRepositoryFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'scanningRepositoryFilter_filter' - The filter to use when scanning.
+--
+-- 'filterType', 'scanningRepositoryFilter_filterType' - The type associated with the filter.
+newScanningRepositoryFilter ::
+  -- | 'filter''
+  Prelude.Text ->
+  -- | 'filterType'
+  ScanningRepositoryFilterType ->
+  ScanningRepositoryFilter
+newScanningRepositoryFilter pFilter_ pFilterType_ =
+  ScanningRepositoryFilter'
+    { filter' = pFilter_,
+      filterType = pFilterType_
+    }
+
+-- | The filter to use when scanning.
+scanningRepositoryFilter_filter :: Lens.Lens' ScanningRepositoryFilter Prelude.Text
+scanningRepositoryFilter_filter = Lens.lens (\ScanningRepositoryFilter' {filter'} -> filter') (\s@ScanningRepositoryFilter' {} a -> s {filter' = a} :: ScanningRepositoryFilter)
+
+-- | The type associated with the filter.
+scanningRepositoryFilter_filterType :: Lens.Lens' ScanningRepositoryFilter ScanningRepositoryFilterType
+scanningRepositoryFilter_filterType = Lens.lens (\ScanningRepositoryFilter' {filterType} -> filterType) (\s@ScanningRepositoryFilter' {} a -> s {filterType = a} :: ScanningRepositoryFilter)
+
+instance Data.FromJSON ScanningRepositoryFilter where
+  parseJSON =
+    Data.withObject
+      "ScanningRepositoryFilter"
+      ( \x ->
+          ScanningRepositoryFilter'
+            Prelude.<$> (x Data..: "filter")
+            Prelude.<*> (x Data..: "filterType")
+      )
+
+instance Prelude.Hashable ScanningRepositoryFilter where
+  hashWithSalt _salt ScanningRepositoryFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` filterType
+
+instance Prelude.NFData ScanningRepositoryFilter where
+  rnf ScanningRepositoryFilter' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf filterType
+
+instance Data.ToJSON ScanningRepositoryFilter where
+  toJSON ScanningRepositoryFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("filter" Data..= filter'),
+            Prelude.Just ("filterType" Data..= filterType)
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/ScanningRepositoryFilterType.hs b/gen/Amazonka/ECR/Types/ScanningRepositoryFilterType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScanningRepositoryFilterType.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.ECR.Types.ScanningRepositoryFilterType
+-- 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.ECR.Types.ScanningRepositoryFilterType
+  ( ScanningRepositoryFilterType
+      ( ..,
+        ScanningRepositoryFilterType_WILDCARD
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ScanningRepositoryFilterType = ScanningRepositoryFilterType'
+  { fromScanningRepositoryFilterType ::
+      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 ScanningRepositoryFilterType_WILDCARD :: ScanningRepositoryFilterType
+pattern ScanningRepositoryFilterType_WILDCARD = ScanningRepositoryFilterType' "WILDCARD"
+
+{-# COMPLETE
+  ScanningRepositoryFilterType_WILDCARD,
+  ScanningRepositoryFilterType'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/ScoreDetails.hs b/gen/Amazonka/ECR/Types/ScoreDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/ScoreDetails.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.ECR.Types.ScoreDetails
+-- 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.ECR.Types.ScoreDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types.CvssScoreDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the Amazon Inspector score given to a finding.
+--
+-- /See:/ 'newScoreDetails' smart constructor.
+data ScoreDetails = ScoreDetails'
+  { -- | An object that contains details about the CVSS score given to a finding.
+    cvss :: Prelude.Maybe CvssScoreDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ScoreDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'cvss', 'scoreDetails_cvss' - An object that contains details about the CVSS score given to a finding.
+newScoreDetails ::
+  ScoreDetails
+newScoreDetails =
+  ScoreDetails' {cvss = Prelude.Nothing}
+
+-- | An object that contains details about the CVSS score given to a finding.
+scoreDetails_cvss :: Lens.Lens' ScoreDetails (Prelude.Maybe CvssScoreDetails)
+scoreDetails_cvss = Lens.lens (\ScoreDetails' {cvss} -> cvss) (\s@ScoreDetails' {} a -> s {cvss = a} :: ScoreDetails)
+
+instance Data.FromJSON ScoreDetails where
+  parseJSON =
+    Data.withObject
+      "ScoreDetails"
+      ( \x ->
+          ScoreDetails' Prelude.<$> (x Data..:? "cvss")
+      )
+
+instance Prelude.Hashable ScoreDetails where
+  hashWithSalt _salt ScoreDetails' {..} =
+    _salt `Prelude.hashWithSalt` cvss
+
+instance Prelude.NFData ScoreDetails where
+  rnf ScoreDetails' {..} = Prelude.rnf cvss
diff --git a/gen/Amazonka/ECR/Types/Tag.hs b/gen/Amazonka/ECR/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/Tag.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.ECR.Types.Tag
+-- 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.ECR.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata to apply to a resource to help you categorize and organize
+-- them. Each tag consists of a key and a value, both of which you define.
+-- Tag keys can have a maximum character length of 128 characters, and tag
+-- values can have a maximum length of 256 characters.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | One part of a key-value pair that make up a tag. A @key@ is a general
+    -- label that acts like a category for more specific tag values.
+    key :: Prelude.Maybe Prelude.Text,
+    -- | A @value@ acts as a descriptor within a tag category (key).
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+--
+-- 'value', 'tag_value' - A @value@ acts as a descriptor within a tag category (key).
+newTag ::
+  Tag
+newTag =
+  Tag'
+    { key = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | One part of a key-value pair that make up a tag. A @key@ is a general
+-- label that acts like a category for more specific tag values.
+tag_key :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | A @value@ acts as a descriptor within a tag category (key).
+tag_value :: Lens.Lens' Tag (Prelude.Maybe Prelude.Text)
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..:? "Key")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Key" Data..=) Prelude.<$> key,
+            ("Value" Data..=) Prelude.<$> value
+          ]
+      )
diff --git a/gen/Amazonka/ECR/Types/TagStatus.hs b/gen/Amazonka/ECR/Types/TagStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/TagStatus.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.ECR.Types.TagStatus
+-- 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.ECR.Types.TagStatus
+  ( TagStatus
+      ( ..,
+        TagStatus_ANY,
+        TagStatus_TAGGED,
+        TagStatus_UNTAGGED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TagStatus = TagStatus'
+  { fromTagStatus ::
+      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 TagStatus_ANY :: TagStatus
+pattern TagStatus_ANY = TagStatus' "ANY"
+
+pattern TagStatus_TAGGED :: TagStatus
+pattern TagStatus_TAGGED = TagStatus' "TAGGED"
+
+pattern TagStatus_UNTAGGED :: TagStatus
+pattern TagStatus_UNTAGGED = TagStatus' "UNTAGGED"
+
+{-# COMPLETE
+  TagStatus_ANY,
+  TagStatus_TAGGED,
+  TagStatus_UNTAGGED,
+  TagStatus'
+  #-}
diff --git a/gen/Amazonka/ECR/Types/VulnerablePackage.hs b/gen/Amazonka/ECR/Types/VulnerablePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Types/VulnerablePackage.hs
@@ -0,0 +1,156 @@
+{-# 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.ECR.Types.VulnerablePackage
+-- 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.ECR.Types.VulnerablePackage 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 on the vulnerable package identified by a finding.
+--
+-- /See:/ 'newVulnerablePackage' smart constructor.
+data VulnerablePackage = VulnerablePackage'
+  { -- | The architecture of the vulnerable package.
+    arch :: Prelude.Maybe Prelude.Text,
+    -- | The epoch of the vulnerable package.
+    epoch :: Prelude.Maybe Prelude.Int,
+    -- | The file path of the vulnerable package.
+    filePath :: Prelude.Maybe Prelude.Text,
+    -- | The name of the vulnerable package.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The package manager of the vulnerable package.
+    packageManager :: Prelude.Maybe Prelude.Text,
+    -- | The release of the vulnerable package.
+    release :: Prelude.Maybe Prelude.Text,
+    -- | The source layer hash of the vulnerable package.
+    sourceLayerHash :: Prelude.Maybe Prelude.Text,
+    -- | The version of the vulnerable package.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VulnerablePackage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arch', 'vulnerablePackage_arch' - The architecture of the vulnerable package.
+--
+-- 'epoch', 'vulnerablePackage_epoch' - The epoch of the vulnerable package.
+--
+-- 'filePath', 'vulnerablePackage_filePath' - The file path of the vulnerable package.
+--
+-- 'name', 'vulnerablePackage_name' - The name of the vulnerable package.
+--
+-- 'packageManager', 'vulnerablePackage_packageManager' - The package manager of the vulnerable package.
+--
+-- 'release', 'vulnerablePackage_release' - The release of the vulnerable package.
+--
+-- 'sourceLayerHash', 'vulnerablePackage_sourceLayerHash' - The source layer hash of the vulnerable package.
+--
+-- 'version', 'vulnerablePackage_version' - The version of the vulnerable package.
+newVulnerablePackage ::
+  VulnerablePackage
+newVulnerablePackage =
+  VulnerablePackage'
+    { arch = Prelude.Nothing,
+      epoch = Prelude.Nothing,
+      filePath = Prelude.Nothing,
+      name = Prelude.Nothing,
+      packageManager = Prelude.Nothing,
+      release = Prelude.Nothing,
+      sourceLayerHash = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | The architecture of the vulnerable package.
+vulnerablePackage_arch :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_arch = Lens.lens (\VulnerablePackage' {arch} -> arch) (\s@VulnerablePackage' {} a -> s {arch = a} :: VulnerablePackage)
+
+-- | The epoch of the vulnerable package.
+vulnerablePackage_epoch :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Int)
+vulnerablePackage_epoch = Lens.lens (\VulnerablePackage' {epoch} -> epoch) (\s@VulnerablePackage' {} a -> s {epoch = a} :: VulnerablePackage)
+
+-- | The file path of the vulnerable package.
+vulnerablePackage_filePath :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_filePath = Lens.lens (\VulnerablePackage' {filePath} -> filePath) (\s@VulnerablePackage' {} a -> s {filePath = a} :: VulnerablePackage)
+
+-- | The name of the vulnerable package.
+vulnerablePackage_name :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_name = Lens.lens (\VulnerablePackage' {name} -> name) (\s@VulnerablePackage' {} a -> s {name = a} :: VulnerablePackage)
+
+-- | The package manager of the vulnerable package.
+vulnerablePackage_packageManager :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_packageManager = Lens.lens (\VulnerablePackage' {packageManager} -> packageManager) (\s@VulnerablePackage' {} a -> s {packageManager = a} :: VulnerablePackage)
+
+-- | The release of the vulnerable package.
+vulnerablePackage_release :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_release = Lens.lens (\VulnerablePackage' {release} -> release) (\s@VulnerablePackage' {} a -> s {release = a} :: VulnerablePackage)
+
+-- | The source layer hash of the vulnerable package.
+vulnerablePackage_sourceLayerHash :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_sourceLayerHash = Lens.lens (\VulnerablePackage' {sourceLayerHash} -> sourceLayerHash) (\s@VulnerablePackage' {} a -> s {sourceLayerHash = a} :: VulnerablePackage)
+
+-- | The version of the vulnerable package.
+vulnerablePackage_version :: Lens.Lens' VulnerablePackage (Prelude.Maybe Prelude.Text)
+vulnerablePackage_version = Lens.lens (\VulnerablePackage' {version} -> version) (\s@VulnerablePackage' {} a -> s {version = a} :: VulnerablePackage)
+
+instance Data.FromJSON VulnerablePackage where
+  parseJSON =
+    Data.withObject
+      "VulnerablePackage"
+      ( \x ->
+          VulnerablePackage'
+            Prelude.<$> (x Data..:? "arch")
+            Prelude.<*> (x Data..:? "epoch")
+            Prelude.<*> (x Data..:? "filePath")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "packageManager")
+            Prelude.<*> (x Data..:? "release")
+            Prelude.<*> (x Data..:? "sourceLayerHash")
+            Prelude.<*> (x Data..:? "version")
+      )
+
+instance Prelude.Hashable VulnerablePackage where
+  hashWithSalt _salt VulnerablePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` arch
+      `Prelude.hashWithSalt` epoch
+      `Prelude.hashWithSalt` filePath
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` packageManager
+      `Prelude.hashWithSalt` release
+      `Prelude.hashWithSalt` sourceLayerHash
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData VulnerablePackage where
+  rnf VulnerablePackage' {..} =
+    Prelude.rnf arch
+      `Prelude.seq` Prelude.rnf epoch
+      `Prelude.seq` Prelude.rnf filePath
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf packageManager
+      `Prelude.seq` Prelude.rnf release
+      `Prelude.seq` Prelude.rnf sourceLayerHash
+      `Prelude.seq` Prelude.rnf version
diff --git a/gen/Amazonka/ECR/UntagResource.hs b/gen/Amazonka/ECR/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/UntagResource.hs
@@ -0,0 +1,177 @@
+{-# 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.ECR.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)
+--
+-- Deletes specified tags from a resource.
+module Amazonka.ECR.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.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource from which to remove
+    -- tags. Currently, the only supported resource is an Amazon ECR
+    -- repository.
+    resourceArn :: Prelude.Text,
+    -- | The keys of the tags to be removed.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource from which to remove
+-- tags. Currently, the only supported resource is an Amazon ECR
+-- repository.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The keys of the tags to be removed.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource from which to remove
+-- tags. Currently, the only supported resource is an Amazon ECR
+-- repository.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The keys of the tags to be removed.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (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
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /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/ECR/UploadLayerPart.hs b/gen/Amazonka/ECR/UploadLayerPart.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/UploadLayerPart.hs
@@ -0,0 +1,321 @@
+{-# 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.ECR.UploadLayerPart
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Uploads an image layer part to Amazon ECR.
+--
+-- When an image is pushed, each new image layer is uploaded in parts. The
+-- maximum size of each image layer part can be 20971520 bytes (or about
+-- 20MB). The UploadLayerPart API is called once per each new image layer
+-- part.
+--
+-- This operation is used by the Amazon ECR proxy and is not generally used
+-- by customers for pulling and pushing images. In most cases, you should
+-- use the @docker@ CLI to pull, tag, and push images.
+module Amazonka.ECR.UploadLayerPart
+  ( -- * Creating a Request
+    UploadLayerPart (..),
+    newUploadLayerPart,
+
+    -- * Request Lenses
+    uploadLayerPart_registryId,
+    uploadLayerPart_repositoryName,
+    uploadLayerPart_uploadId,
+    uploadLayerPart_partFirstByte,
+    uploadLayerPart_partLastByte,
+    uploadLayerPart_layerPartBlob,
+
+    -- * Destructuring the Response
+    UploadLayerPartResponse (..),
+    newUploadLayerPartResponse,
+
+    -- * Response Lenses
+    uploadLayerPartResponse_lastByteReceived,
+    uploadLayerPartResponse_registryId,
+    uploadLayerPartResponse_repositoryName,
+    uploadLayerPartResponse_uploadId,
+    uploadLayerPartResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUploadLayerPart' smart constructor.
+data UploadLayerPart = UploadLayerPart'
+  { -- | The Amazon Web Services account ID associated with the registry to which
+    -- you are uploading layer parts. If you do not specify a registry, the
+    -- default registry is assumed.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the repository to which you are uploading layer parts.
+    repositoryName :: Prelude.Text,
+    -- | The upload ID from a previous InitiateLayerUpload operation to associate
+    -- with the layer part upload.
+    uploadId :: Prelude.Text,
+    -- | The position of the first byte of the layer part witin the overall image
+    -- layer.
+    partFirstByte :: Prelude.Natural,
+    -- | The position of the last byte of the layer part within the overall image
+    -- layer.
+    partLastByte :: Prelude.Natural,
+    -- | The base64-encoded layer part payload.
+    layerPartBlob :: Data.Base64
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UploadLayerPart' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'registryId', 'uploadLayerPart_registryId' - The Amazon Web Services account ID associated with the registry to which
+-- you are uploading layer parts. If you do not specify a registry, the
+-- default registry is assumed.
+--
+-- 'repositoryName', 'uploadLayerPart_repositoryName' - The name of the repository to which you are uploading layer parts.
+--
+-- 'uploadId', 'uploadLayerPart_uploadId' - The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the layer part upload.
+--
+-- 'partFirstByte', 'uploadLayerPart_partFirstByte' - The position of the first byte of the layer part witin the overall image
+-- layer.
+--
+-- 'partLastByte', 'uploadLayerPart_partLastByte' - The position of the last byte of the layer part within the overall image
+-- layer.
+--
+-- 'layerPartBlob', 'uploadLayerPart_layerPartBlob' - The base64-encoded layer part payload.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+newUploadLayerPart ::
+  -- | 'repositoryName'
+  Prelude.Text ->
+  -- | 'uploadId'
+  Prelude.Text ->
+  -- | 'partFirstByte'
+  Prelude.Natural ->
+  -- | 'partLastByte'
+  Prelude.Natural ->
+  -- | 'layerPartBlob'
+  Prelude.ByteString ->
+  UploadLayerPart
+newUploadLayerPart
+  pRepositoryName_
+  pUploadId_
+  pPartFirstByte_
+  pPartLastByte_
+  pLayerPartBlob_ =
+    UploadLayerPart'
+      { registryId = Prelude.Nothing,
+        repositoryName = pRepositoryName_,
+        uploadId = pUploadId_,
+        partFirstByte = pPartFirstByte_,
+        partLastByte = pPartLastByte_,
+        layerPartBlob = Data._Base64 Lens.# pLayerPartBlob_
+      }
+
+-- | The Amazon Web Services account ID associated with the registry to which
+-- you are uploading layer parts. If you do not specify a registry, the
+-- default registry is assumed.
+uploadLayerPart_registryId :: Lens.Lens' UploadLayerPart (Prelude.Maybe Prelude.Text)
+uploadLayerPart_registryId = Lens.lens (\UploadLayerPart' {registryId} -> registryId) (\s@UploadLayerPart' {} a -> s {registryId = a} :: UploadLayerPart)
+
+-- | The name of the repository to which you are uploading layer parts.
+uploadLayerPart_repositoryName :: Lens.Lens' UploadLayerPart Prelude.Text
+uploadLayerPart_repositoryName = Lens.lens (\UploadLayerPart' {repositoryName} -> repositoryName) (\s@UploadLayerPart' {} a -> s {repositoryName = a} :: UploadLayerPart)
+
+-- | The upload ID from a previous InitiateLayerUpload operation to associate
+-- with the layer part upload.
+uploadLayerPart_uploadId :: Lens.Lens' UploadLayerPart Prelude.Text
+uploadLayerPart_uploadId = Lens.lens (\UploadLayerPart' {uploadId} -> uploadId) (\s@UploadLayerPart' {} a -> s {uploadId = a} :: UploadLayerPart)
+
+-- | The position of the first byte of the layer part witin the overall image
+-- layer.
+uploadLayerPart_partFirstByte :: Lens.Lens' UploadLayerPart Prelude.Natural
+uploadLayerPart_partFirstByte = Lens.lens (\UploadLayerPart' {partFirstByte} -> partFirstByte) (\s@UploadLayerPart' {} a -> s {partFirstByte = a} :: UploadLayerPart)
+
+-- | The position of the last byte of the layer part within the overall image
+-- layer.
+uploadLayerPart_partLastByte :: Lens.Lens' UploadLayerPart Prelude.Natural
+uploadLayerPart_partLastByte = Lens.lens (\UploadLayerPart' {partLastByte} -> partLastByte) (\s@UploadLayerPart' {} a -> s {partLastByte = a} :: UploadLayerPart)
+
+-- | The base64-encoded layer part payload.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+uploadLayerPart_layerPartBlob :: Lens.Lens' UploadLayerPart Prelude.ByteString
+uploadLayerPart_layerPartBlob = Lens.lens (\UploadLayerPart' {layerPartBlob} -> layerPartBlob) (\s@UploadLayerPart' {} a -> s {layerPartBlob = a} :: UploadLayerPart) Prelude.. Data._Base64
+
+instance Core.AWSRequest UploadLayerPart where
+  type
+    AWSResponse UploadLayerPart =
+      UploadLayerPartResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UploadLayerPartResponse'
+            Prelude.<$> (x Data..?> "lastByteReceived")
+            Prelude.<*> (x Data..?> "registryId")
+            Prelude.<*> (x Data..?> "repositoryName")
+            Prelude.<*> (x Data..?> "uploadId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UploadLayerPart where
+  hashWithSalt _salt UploadLayerPart' {..} =
+    _salt
+      `Prelude.hashWithSalt` registryId
+      `Prelude.hashWithSalt` repositoryName
+      `Prelude.hashWithSalt` uploadId
+      `Prelude.hashWithSalt` partFirstByte
+      `Prelude.hashWithSalt` partLastByte
+      `Prelude.hashWithSalt` layerPartBlob
+
+instance Prelude.NFData UploadLayerPart where
+  rnf UploadLayerPart' {..} =
+    Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf partFirstByte
+      `Prelude.seq` Prelude.rnf partLastByte
+      `Prelude.seq` Prelude.rnf layerPartBlob
+
+instance Data.ToHeaders UploadLayerPart where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonEC2ContainerRegistry_V20150921.UploadLayerPart" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UploadLayerPart where
+  toJSON UploadLayerPart' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("registryId" Data..=) Prelude.<$> registryId,
+            Prelude.Just
+              ("repositoryName" Data..= repositoryName),
+            Prelude.Just ("uploadId" Data..= uploadId),
+            Prelude.Just ("partFirstByte" Data..= partFirstByte),
+            Prelude.Just ("partLastByte" Data..= partLastByte),
+            Prelude.Just
+              ("layerPartBlob" Data..= layerPartBlob)
+          ]
+      )
+
+instance Data.ToPath UploadLayerPart where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UploadLayerPart where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUploadLayerPartResponse' smart constructor.
+data UploadLayerPartResponse = UploadLayerPartResponse'
+  { -- | The integer value of the last byte received in the request.
+    lastByteReceived :: Prelude.Maybe Prelude.Natural,
+    -- | The registry ID associated with the request.
+    registryId :: Prelude.Maybe Prelude.Text,
+    -- | The repository name associated with the request.
+    repositoryName :: Prelude.Maybe Prelude.Text,
+    -- | The upload ID associated with the request.
+    uploadId :: 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 'UploadLayerPartResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'lastByteReceived', 'uploadLayerPartResponse_lastByteReceived' - The integer value of the last byte received in the request.
+--
+-- 'registryId', 'uploadLayerPartResponse_registryId' - The registry ID associated with the request.
+--
+-- 'repositoryName', 'uploadLayerPartResponse_repositoryName' - The repository name associated with the request.
+--
+-- 'uploadId', 'uploadLayerPartResponse_uploadId' - The upload ID associated with the request.
+--
+-- 'httpStatus', 'uploadLayerPartResponse_httpStatus' - The response's http status code.
+newUploadLayerPartResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UploadLayerPartResponse
+newUploadLayerPartResponse pHttpStatus_ =
+  UploadLayerPartResponse'
+    { lastByteReceived =
+        Prelude.Nothing,
+      registryId = Prelude.Nothing,
+      repositoryName = Prelude.Nothing,
+      uploadId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The integer value of the last byte received in the request.
+uploadLayerPartResponse_lastByteReceived :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Natural)
+uploadLayerPartResponse_lastByteReceived = Lens.lens (\UploadLayerPartResponse' {lastByteReceived} -> lastByteReceived) (\s@UploadLayerPartResponse' {} a -> s {lastByteReceived = a} :: UploadLayerPartResponse)
+
+-- | The registry ID associated with the request.
+uploadLayerPartResponse_registryId :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_registryId = Lens.lens (\UploadLayerPartResponse' {registryId} -> registryId) (\s@UploadLayerPartResponse' {} a -> s {registryId = a} :: UploadLayerPartResponse)
+
+-- | The repository name associated with the request.
+uploadLayerPartResponse_repositoryName :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_repositoryName = Lens.lens (\UploadLayerPartResponse' {repositoryName} -> repositoryName) (\s@UploadLayerPartResponse' {} a -> s {repositoryName = a} :: UploadLayerPartResponse)
+
+-- | The upload ID associated with the request.
+uploadLayerPartResponse_uploadId :: Lens.Lens' UploadLayerPartResponse (Prelude.Maybe Prelude.Text)
+uploadLayerPartResponse_uploadId = Lens.lens (\UploadLayerPartResponse' {uploadId} -> uploadId) (\s@UploadLayerPartResponse' {} a -> s {uploadId = a} :: UploadLayerPartResponse)
+
+-- | The response's http status code.
+uploadLayerPartResponse_httpStatus :: Lens.Lens' UploadLayerPartResponse Prelude.Int
+uploadLayerPartResponse_httpStatus = Lens.lens (\UploadLayerPartResponse' {httpStatus} -> httpStatus) (\s@UploadLayerPartResponse' {} a -> s {httpStatus = a} :: UploadLayerPartResponse)
+
+instance Prelude.NFData UploadLayerPartResponse where
+  rnf UploadLayerPartResponse' {..} =
+    Prelude.rnf lastByteReceived
+      `Prelude.seq` Prelude.rnf registryId
+      `Prelude.seq` Prelude.rnf repositoryName
+      `Prelude.seq` Prelude.rnf uploadId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/ECR/Waiters.hs b/gen/Amazonka/ECR/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/ECR/Waiters.hs
@@ -0,0 +1,81 @@
+{-# 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.ECR.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.ECR.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.ECR.DescribeImageScanFindings
+import Amazonka.ECR.GetLifecyclePolicyPreview
+import Amazonka.ECR.Lens
+import Amazonka.ECR.Types
+import qualified Amazonka.Prelude as Prelude
+
+-- | Polls 'Amazonka.ECR.DescribeImageScanFindings' every 5 seconds until a successful state is reached. An error is returned after 60 failed checks.
+newImageScanComplete :: Core.Wait DescribeImageScanFindings
+newImageScanComplete =
+  Core.Wait
+    { Core.name = "ImageScanComplete",
+      Core.attempts = 60,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchAll
+            "COMPLETE"
+            Core.AcceptSuccess
+            ( describeImageScanFindingsResponse_imageScanStatus
+                Prelude.. Lens._Just
+                Prelude.. imageScanStatus_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "FAILED"
+            Core.AcceptFailure
+            ( describeImageScanFindingsResponse_imageScanStatus
+                Prelude.. Lens._Just
+                Prelude.. imageScanStatus_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            )
+        ]
+    }
+
+-- | Polls 'Amazonka.ECR.GetLifecyclePolicyPreview' every 5 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newLifecyclePolicyPreviewComplete :: Core.Wait GetLifecyclePolicyPreview
+newLifecyclePolicyPreviewComplete =
+  Core.Wait
+    { Core.name =
+        "LifecyclePolicyPreviewComplete",
+      Core.attempts = 20,
+      Core.delay = 5,
+      Core.acceptors =
+        [ Core.matchAll
+            "COMPLETE"
+            Core.AcceptSuccess
+            ( getLifecyclePolicyPreviewResponse_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "FAILED"
+            Core.AcceptFailure
+            ( getLifecyclePolicyPreviewResponse_status
+                Prelude.. Lens._Just
+                Prelude.. Lens.to Data.toTextCI
+            )
+        ]
+    }
diff --git a/gen/Network/AWS/ECR.hs b/gen/Network/AWS/ECR.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR.hs
+++ /dev/null
@@ -1,327 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Amazon Elastic Container Registry (Amazon ECR) is a managed Docker registry service. Customers can use the familiar Docker CLI to push, pull, and manage images. Amazon ECR provides a secure, scalable, and reliable registry. Amazon ECR supports private Docker repositories with resource-based permissions using IAM so that specific users or Amazon EC2 instances can access repositories and images. Developers can use the Docker CLI to author and manage images.
---
---
-module Network.AWS.ECR
-    (
-    -- * Service Configuration
-      ecr
-
-    -- * Errors
-    -- $errors
-
-    -- ** LayersNotFoundException
-    , _LayersNotFoundException
-
-    -- ** InvalidParameterException
-    , _InvalidParameterException
-
-    -- ** LayerAlreadyExistsException
-    , _LayerAlreadyExistsException
-
-    -- ** ServerException
-    , _ServerException
-
-    -- ** LayerInaccessibleException
-    , _LayerInaccessibleException
-
-    -- ** InvalidLayerException
-    , _InvalidLayerException
-
-    -- ** LayerPartTooSmallException
-    , _LayerPartTooSmallException
-
-    -- ** LifecyclePolicyPreviewNotFoundException
-    , _LifecyclePolicyPreviewNotFoundException
-
-    -- ** ImageNotFoundException
-    , _ImageNotFoundException
-
-    -- ** ImageAlreadyExistsException
-    , _ImageAlreadyExistsException
-
-    -- ** RepositoryNotFoundException
-    , _RepositoryNotFoundException
-
-    -- ** LifecyclePolicyPreviewInProgressException
-    , _LifecyclePolicyPreviewInProgressException
-
-    -- ** UploadNotFoundException
-    , _UploadNotFoundException
-
-    -- ** LifecyclePolicyNotFoundException
-    , _LifecyclePolicyNotFoundException
-
-    -- ** InvalidLayerPartException
-    , _InvalidLayerPartException
-
-    -- ** RepositoryNotEmptyException
-    , _RepositoryNotEmptyException
-
-    -- ** RepositoryAlreadyExistsException
-    , _RepositoryAlreadyExistsException
-
-    -- ** RepositoryPolicyNotFoundException
-    , _RepositoryPolicyNotFoundException
-
-    -- ** EmptyUploadException
-    , _EmptyUploadException
-
-    -- ** LimitExceededException
-    , _LimitExceededException
-
-    -- * Waiters
-    -- $waiters
-
-    -- * Operations
-    -- $operations
-
-    -- ** GetRepositoryPolicy
-    , module Network.AWS.ECR.GetRepositoryPolicy
-
-    -- ** PutLifecyclePolicy
-    , module Network.AWS.ECR.PutLifecyclePolicy
-
-    -- ** DeleteLifecyclePolicy
-    , module Network.AWS.ECR.DeleteLifecyclePolicy
-
-    -- ** BatchDeleteImage
-    , module Network.AWS.ECR.BatchDeleteImage
-
-    -- ** GetLifecyclePolicyPreview
-    , module Network.AWS.ECR.GetLifecyclePolicyPreview
-
-    -- ** BatchCheckLayerAvailability
-    , module Network.AWS.ECR.BatchCheckLayerAvailability
-
-    -- ** DeleteRepositoryPolicy
-    , module Network.AWS.ECR.DeleteRepositoryPolicy
-
-    -- ** CreateRepository
-    , module Network.AWS.ECR.CreateRepository
-
-    -- ** CompleteLayerUpload
-    , module Network.AWS.ECR.CompleteLayerUpload
-
-    -- ** DescribeRepositories (Paginated)
-    , module Network.AWS.ECR.DescribeRepositories
-
-    -- ** StartLifecyclePolicyPreview
-    , module Network.AWS.ECR.StartLifecyclePolicyPreview
-
-    -- ** UploadLayerPart
-    , module Network.AWS.ECR.UploadLayerPart
-
-    -- ** BatchGetImage
-    , module Network.AWS.ECR.BatchGetImage
-
-    -- ** GetLifecyclePolicy
-    , module Network.AWS.ECR.GetLifecyclePolicy
-
-    -- ** SetRepositoryPolicy
-    , module Network.AWS.ECR.SetRepositoryPolicy
-
-    -- ** InitiateLayerUpload
-    , module Network.AWS.ECR.InitiateLayerUpload
-
-    -- ** DeleteRepository
-    , module Network.AWS.ECR.DeleteRepository
-
-    -- ** PutImage
-    , module Network.AWS.ECR.PutImage
-
-    -- ** ListImages (Paginated)
-    , module Network.AWS.ECR.ListImages
-
-    -- ** GetAuthorizationToken
-    , module Network.AWS.ECR.GetAuthorizationToken
-
-    -- ** GetDownloadURLForLayer
-    , module Network.AWS.ECR.GetDownloadURLForLayer
-
-    -- ** DescribeImages (Paginated)
-    , module Network.AWS.ECR.DescribeImages
-
-    -- * Types
-
-    -- ** ImageActionType
-    , ImageActionType (..)
-
-    -- ** ImageFailureCode
-    , ImageFailureCode (..)
-
-    -- ** LayerAvailability
-    , LayerAvailability (..)
-
-    -- ** LayerFailureCode
-    , LayerFailureCode (..)
-
-    -- ** LifecyclePolicyPreviewStatus
-    , LifecyclePolicyPreviewStatus (..)
-
-    -- ** TagStatus
-    , TagStatus (..)
-
-    -- ** AuthorizationData
-    , AuthorizationData
-    , authorizationData
-    , adExpiresAt
-    , adProxyEndpoint
-    , adAuthorizationToken
-
-    -- ** DescribeImagesFilter
-    , DescribeImagesFilter
-    , describeImagesFilter
-    , difTagStatus
-
-    -- ** Image
-    , Image
-    , image
-    , iRegistryId
-    , iImageId
-    , iRepositoryName
-    , iImageManifest
-
-    -- ** ImageDetail
-    , ImageDetail
-    , imageDetail
-    , idRegistryId
-    , idImageTags
-    , idImageSizeInBytes
-    , idImageDigest
-    , idImagePushedAt
-    , idRepositoryName
-
-    -- ** ImageFailure
-    , ImageFailure
-    , imageFailure
-    , ifFailureReason
-    , ifFailureCode
-    , ifImageId
-
-    -- ** ImageIdentifier
-    , ImageIdentifier
-    , imageIdentifier
-    , iiImageDigest
-    , iiImageTag
-
-    -- ** Layer
-    , Layer
-    , layer
-    , lMediaType
-    , lLayerDigest
-    , lLayerSize
-    , lLayerAvailability
-
-    -- ** LayerFailure
-    , LayerFailure
-    , layerFailure
-    , lfFailureReason
-    , lfFailureCode
-    , lfLayerDigest
-
-    -- ** LifecyclePolicyPreviewFilter
-    , LifecyclePolicyPreviewFilter
-    , lifecyclePolicyPreviewFilter
-    , lppfTagStatus
-
-    -- ** LifecyclePolicyPreviewResult
-    , LifecyclePolicyPreviewResult
-    , lifecyclePolicyPreviewResult
-    , lpprImageTags
-    , lpprAction
-    , lpprImageDigest
-    , lpprImagePushedAt
-    , lpprAppliedRulePriority
-
-    -- ** LifecyclePolicyPreviewSummary
-    , LifecyclePolicyPreviewSummary
-    , lifecyclePolicyPreviewSummary
-    , lppsExpiringImageTotalCount
-
-    -- ** LifecyclePolicyRuleAction
-    , LifecyclePolicyRuleAction
-    , lifecyclePolicyRuleAction
-    , lpraType
-
-    -- ** ListImagesFilter
-    , ListImagesFilter
-    , listImagesFilter
-    , lifTagStatus
-
-    -- ** Repository
-    , Repository
-    , repository
-    , rRepositoryARN
-    , rCreatedAt
-    , rRegistryId
-    , rRepositoryURI
-    , rRepositoryName
-    ) where
-
-import Network.AWS.ECR.BatchCheckLayerAvailability
-import Network.AWS.ECR.BatchDeleteImage
-import Network.AWS.ECR.BatchGetImage
-import Network.AWS.ECR.CompleteLayerUpload
-import Network.AWS.ECR.CreateRepository
-import Network.AWS.ECR.DeleteLifecyclePolicy
-import Network.AWS.ECR.DeleteRepository
-import Network.AWS.ECR.DeleteRepositoryPolicy
-import Network.AWS.ECR.DescribeImages
-import Network.AWS.ECR.DescribeRepositories
-import Network.AWS.ECR.GetAuthorizationToken
-import Network.AWS.ECR.GetDownloadURLForLayer
-import Network.AWS.ECR.GetLifecyclePolicy
-import Network.AWS.ECR.GetLifecyclePolicyPreview
-import Network.AWS.ECR.GetRepositoryPolicy
-import Network.AWS.ECR.InitiateLayerUpload
-import Network.AWS.ECR.ListImages
-import Network.AWS.ECR.PutImage
-import Network.AWS.ECR.PutLifecyclePolicy
-import Network.AWS.ECR.SetRepositoryPolicy
-import Network.AWS.ECR.StartLifecyclePolicyPreview
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.UploadLayerPart
-import Network.AWS.ECR.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 'ECR'.
--}
-
-{- $operations
-Some AWS operations return results that are incomplete and require subsequent
-requests in order to obtain the entire result set. The process of sending
-subsequent requests to continue where a previous request left off is called
-pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
-1000 objects at a time, and you must send subsequent requests with the
-appropriate Marker in order to retrieve the next page of results.
-
-Operations that have an 'AWSPager' instance can transparently perform subsequent
-requests, correctly setting Markers and other request facets to iterate through
-the entire result set of a truncated API operation. Operations which support
-this have an additional note in the documentation.
-
-Many operations have the ability to filter results on the server side. See the
-individual operation parameters for details.
--}
-
-{- $waiters
-Waiters poll by repeatedly sending a request until some remote success condition
-configured by the 'Wait' specification is fulfilled. The 'Wait' specification
-determines how many attempts should be made, in addition to delay and retry strategies.
--}
diff --git a/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs b/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs
+++ /dev/null
@@ -1,172 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.BatchCheckLayerAvailability
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Check the availability of multiple image layers in a specified registry and repository.
---
---
-module Network.AWS.ECR.BatchCheckLayerAvailability
-    (
-    -- * Creating a Request
-      batchCheckLayerAvailability
-    , BatchCheckLayerAvailability
-    -- * Request Lenses
-    , bclaRegistryId
-    , bclaRepositoryName
-    , bclaLayerDigests
-
-    -- * Destructuring the Response
-    , batchCheckLayerAvailabilityResponse
-    , BatchCheckLayerAvailabilityResponse
-    -- * Response Lenses
-    , bclarsFailures
-    , bclarsLayers
-    , bclarsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'batchCheckLayerAvailability' smart constructor.
-data BatchCheckLayerAvailability = BatchCheckLayerAvailability'
-  { _bclaRegistryId     :: !(Maybe Text)
-  , _bclaRepositoryName :: !Text
-  , _bclaLayerDigests   :: !(List1 Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchCheckLayerAvailability' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bclaRegistryId' - The AWS account ID associated with the registry that contains the image layers to check. If you do not specify a registry, the default registry is assumed.
---
--- * 'bclaRepositoryName' - The name of the repository that is associated with the image layers to check.
---
--- * 'bclaLayerDigests' - The digests of the image layers to check.
-batchCheckLayerAvailability
-    :: Text -- ^ 'bclaRepositoryName'
-    -> NonEmpty Text -- ^ 'bclaLayerDigests'
-    -> BatchCheckLayerAvailability
-batchCheckLayerAvailability pRepositoryName_ pLayerDigests_ =
-  BatchCheckLayerAvailability'
-    { _bclaRegistryId = Nothing
-    , _bclaRepositoryName = pRepositoryName_
-    , _bclaLayerDigests = _List1 # pLayerDigests_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the image layers to check. If you do not specify a registry, the default registry is assumed.
-bclaRegistryId :: Lens' BatchCheckLayerAvailability (Maybe Text)
-bclaRegistryId = lens _bclaRegistryId (\ s a -> s{_bclaRegistryId = a})
-
--- | The name of the repository that is associated with the image layers to check.
-bclaRepositoryName :: Lens' BatchCheckLayerAvailability Text
-bclaRepositoryName = lens _bclaRepositoryName (\ s a -> s{_bclaRepositoryName = a})
-
--- | The digests of the image layers to check.
-bclaLayerDigests :: Lens' BatchCheckLayerAvailability (NonEmpty Text)
-bclaLayerDigests = lens _bclaLayerDigests (\ s a -> s{_bclaLayerDigests = a}) . _List1
-
-instance AWSRequest BatchCheckLayerAvailability where
-        type Rs BatchCheckLayerAvailability =
-             BatchCheckLayerAvailabilityResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 BatchCheckLayerAvailabilityResponse' <$>
-                   (x .?> "failures" .!@ mempty) <*>
-                     (x .?> "layers" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable BatchCheckLayerAvailability where
-
-instance NFData BatchCheckLayerAvailability where
-
-instance ToHeaders BatchCheckLayerAvailability where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.BatchCheckLayerAvailability"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON BatchCheckLayerAvailability where
-        toJSON BatchCheckLayerAvailability'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _bclaRegistryId,
-                  Just ("repositoryName" .= _bclaRepositoryName),
-                  Just ("layerDigests" .= _bclaLayerDigests)])
-
-instance ToPath BatchCheckLayerAvailability where
-        toPath = const "/"
-
-instance ToQuery BatchCheckLayerAvailability where
-        toQuery = const mempty
-
--- | /See:/ 'batchCheckLayerAvailabilityResponse' smart constructor.
-data BatchCheckLayerAvailabilityResponse = BatchCheckLayerAvailabilityResponse'
-  { _bclarsFailures       :: !(Maybe [LayerFailure])
-  , _bclarsLayers         :: !(Maybe [Layer])
-  , _bclarsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchCheckLayerAvailabilityResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bclarsFailures' - Any failures associated with the call.
---
--- * 'bclarsLayers' - A list of image layer objects corresponding to the image layer references in the request.
---
--- * 'bclarsResponseStatus' - -- | The response status code.
-batchCheckLayerAvailabilityResponse
-    :: Int -- ^ 'bclarsResponseStatus'
-    -> BatchCheckLayerAvailabilityResponse
-batchCheckLayerAvailabilityResponse pResponseStatus_ =
-  BatchCheckLayerAvailabilityResponse'
-    { _bclarsFailures = Nothing
-    , _bclarsLayers = Nothing
-    , _bclarsResponseStatus = pResponseStatus_
-    }
-
-
--- | Any failures associated with the call.
-bclarsFailures :: Lens' BatchCheckLayerAvailabilityResponse [LayerFailure]
-bclarsFailures = lens _bclarsFailures (\ s a -> s{_bclarsFailures = a}) . _Default . _Coerce
-
--- | A list of image layer objects corresponding to the image layer references in the request.
-bclarsLayers :: Lens' BatchCheckLayerAvailabilityResponse [Layer]
-bclarsLayers = lens _bclarsLayers (\ s a -> s{_bclarsLayers = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-bclarsResponseStatus :: Lens' BatchCheckLayerAvailabilityResponse Int
-bclarsResponseStatus = lens _bclarsResponseStatus (\ s a -> s{_bclarsResponseStatus = a})
-
-instance NFData BatchCheckLayerAvailabilityResponse
-         where
diff --git a/gen/Network/AWS/ECR/BatchDeleteImage.hs b/gen/Network/AWS/ECR/BatchDeleteImage.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/BatchDeleteImage.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.BatchDeleteImage
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes a list of specified images within a specified repository. Images are specified with either @imageTag@ or @imageDigest@ .
---
---
--- You can remove a tag from an image by specifying the image's tag in your request. When you remove the last tag from an image, the image is deleted from your repository.
---
--- You can completely delete an image (and all of its tags) by specifying the image's digest in your request.
---
-module Network.AWS.ECR.BatchDeleteImage
-    (
-    -- * Creating a Request
-      batchDeleteImage
-    , BatchDeleteImage
-    -- * Request Lenses
-    , bdiRegistryId
-    , bdiRepositoryName
-    , bdiImageIds
-
-    -- * Destructuring the Response
-    , batchDeleteImageResponse
-    , BatchDeleteImageResponse
-    -- * Response Lenses
-    , bdirsFailures
-    , bdirsImageIds
-    , bdirsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | Deletes specified images within a specified repository. Images are specified with either the @imageTag@ or @imageDigest@ .
---
---
---
--- /See:/ 'batchDeleteImage' smart constructor.
-data BatchDeleteImage = BatchDeleteImage'
-  { _bdiRegistryId     :: !(Maybe Text)
-  , _bdiRepositoryName :: !Text
-  , _bdiImageIds       :: ![ImageIdentifier]
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchDeleteImage' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bdiRegistryId' - The AWS account ID associated with the registry that contains the image to delete. If you do not specify a registry, the default registry is assumed.
---
--- * 'bdiRepositoryName' - The repository that contains the image to delete.
---
--- * 'bdiImageIds' - A list of image ID references that correspond to images to delete. The format of the @imageIds@ reference is @imageTag=tag@ or @imageDigest=digest@ .
-batchDeleteImage
-    :: Text -- ^ 'bdiRepositoryName'
-    -> BatchDeleteImage
-batchDeleteImage pRepositoryName_ =
-  BatchDeleteImage'
-    { _bdiRegistryId = Nothing
-    , _bdiRepositoryName = pRepositoryName_
-    , _bdiImageIds = mempty
-    }
-
-
--- | The AWS account ID associated with the registry that contains the image to delete. If you do not specify a registry, the default registry is assumed.
-bdiRegistryId :: Lens' BatchDeleteImage (Maybe Text)
-bdiRegistryId = lens _bdiRegistryId (\ s a -> s{_bdiRegistryId = a})
-
--- | The repository that contains the image to delete.
-bdiRepositoryName :: Lens' BatchDeleteImage Text
-bdiRepositoryName = lens _bdiRepositoryName (\ s a -> s{_bdiRepositoryName = a})
-
--- | A list of image ID references that correspond to images to delete. The format of the @imageIds@ reference is @imageTag=tag@ or @imageDigest=digest@ .
-bdiImageIds :: Lens' BatchDeleteImage [ImageIdentifier]
-bdiImageIds = lens _bdiImageIds (\ s a -> s{_bdiImageIds = a}) . _Coerce
-
-instance AWSRequest BatchDeleteImage where
-        type Rs BatchDeleteImage = BatchDeleteImageResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 BatchDeleteImageResponse' <$>
-                   (x .?> "failures" .!@ mempty) <*>
-                     (x .?> "imageIds" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable BatchDeleteImage where
-
-instance NFData BatchDeleteImage where
-
-instance ToHeaders BatchDeleteImage where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.BatchDeleteImage"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON BatchDeleteImage where
-        toJSON BatchDeleteImage'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _bdiRegistryId,
-                  Just ("repositoryName" .= _bdiRepositoryName),
-                  Just ("imageIds" .= _bdiImageIds)])
-
-instance ToPath BatchDeleteImage where
-        toPath = const "/"
-
-instance ToQuery BatchDeleteImage where
-        toQuery = const mempty
-
--- | /See:/ 'batchDeleteImageResponse' smart constructor.
-data BatchDeleteImageResponse = BatchDeleteImageResponse'
-  { _bdirsFailures       :: !(Maybe [ImageFailure])
-  , _bdirsImageIds       :: !(Maybe [ImageIdentifier])
-  , _bdirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchDeleteImageResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bdirsFailures' - Any failures associated with the call.
---
--- * 'bdirsImageIds' - The image IDs of the deleted images.
---
--- * 'bdirsResponseStatus' - -- | The response status code.
-batchDeleteImageResponse
-    :: Int -- ^ 'bdirsResponseStatus'
-    -> BatchDeleteImageResponse
-batchDeleteImageResponse pResponseStatus_ =
-  BatchDeleteImageResponse'
-    { _bdirsFailures = Nothing
-    , _bdirsImageIds = Nothing
-    , _bdirsResponseStatus = pResponseStatus_
-    }
-
-
--- | Any failures associated with the call.
-bdirsFailures :: Lens' BatchDeleteImageResponse [ImageFailure]
-bdirsFailures = lens _bdirsFailures (\ s a -> s{_bdirsFailures = a}) . _Default . _Coerce
-
--- | The image IDs of the deleted images.
-bdirsImageIds :: Lens' BatchDeleteImageResponse [ImageIdentifier]
-bdirsImageIds = lens _bdirsImageIds (\ s a -> s{_bdirsImageIds = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-bdirsResponseStatus :: Lens' BatchDeleteImageResponse Int
-bdirsResponseStatus = lens _bdirsResponseStatus (\ s a -> s{_bdirsResponseStatus = a})
-
-instance NFData BatchDeleteImageResponse where
diff --git a/gen/Network/AWS/ECR/BatchGetImage.hs b/gen/Network/AWS/ECR/BatchGetImage.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/BatchGetImage.hs
+++ /dev/null
@@ -1,179 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.BatchGetImage
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Gets detailed information for specified images within a specified repository. Images are specified with either @imageTag@ or @imageDigest@ .
---
---
-module Network.AWS.ECR.BatchGetImage
-    (
-    -- * Creating a Request
-      batchGetImage
-    , BatchGetImage
-    -- * Request Lenses
-    , bgiRegistryId
-    , bgiAcceptedMediaTypes
-    , bgiRepositoryName
-    , bgiImageIds
-
-    -- * Destructuring the Response
-    , batchGetImageResponse
-    , BatchGetImageResponse
-    -- * Response Lenses
-    , bgirsImages
-    , bgirsFailures
-    , bgirsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'batchGetImage' smart constructor.
-data BatchGetImage = BatchGetImage'
-  { _bgiRegistryId         :: !(Maybe Text)
-  , _bgiAcceptedMediaTypes :: !(Maybe (List1 Text))
-  , _bgiRepositoryName     :: !Text
-  , _bgiImageIds           :: ![ImageIdentifier]
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchGetImage' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bgiRegistryId' - The AWS account ID associated with the registry that contains the images to describe. If you do not specify a registry, the default registry is assumed.
---
--- * 'bgiAcceptedMediaTypes' - The accepted media types for the request. Valid values: @application/vnd.docker.distribution.manifest.v1+json@ | @application/vnd.docker.distribution.manifest.v2+json@ | @application/vnd.oci.image.manifest.v1+json@
---
--- * 'bgiRepositoryName' - The repository that contains the images to describe.
---
--- * 'bgiImageIds' - A list of image ID references that correspond to images to describe. The format of the @imageIds@ reference is @imageTag=tag@ or @imageDigest=digest@ .
-batchGetImage
-    :: Text -- ^ 'bgiRepositoryName'
-    -> BatchGetImage
-batchGetImage pRepositoryName_ =
-  BatchGetImage'
-    { _bgiRegistryId = Nothing
-    , _bgiAcceptedMediaTypes = Nothing
-    , _bgiRepositoryName = pRepositoryName_
-    , _bgiImageIds = mempty
-    }
-
-
--- | The AWS account ID associated with the registry that contains the images to describe. If you do not specify a registry, the default registry is assumed.
-bgiRegistryId :: Lens' BatchGetImage (Maybe Text)
-bgiRegistryId = lens _bgiRegistryId (\ s a -> s{_bgiRegistryId = a})
-
--- | The accepted media types for the request. Valid values: @application/vnd.docker.distribution.manifest.v1+json@ | @application/vnd.docker.distribution.manifest.v2+json@ | @application/vnd.oci.image.manifest.v1+json@
-bgiAcceptedMediaTypes :: Lens' BatchGetImage (Maybe (NonEmpty Text))
-bgiAcceptedMediaTypes = lens _bgiAcceptedMediaTypes (\ s a -> s{_bgiAcceptedMediaTypes = a}) . mapping _List1
-
--- | The repository that contains the images to describe.
-bgiRepositoryName :: Lens' BatchGetImage Text
-bgiRepositoryName = lens _bgiRepositoryName (\ s a -> s{_bgiRepositoryName = a})
-
--- | A list of image ID references that correspond to images to describe. The format of the @imageIds@ reference is @imageTag=tag@ or @imageDigest=digest@ .
-bgiImageIds :: Lens' BatchGetImage [ImageIdentifier]
-bgiImageIds = lens _bgiImageIds (\ s a -> s{_bgiImageIds = a}) . _Coerce
-
-instance AWSRequest BatchGetImage where
-        type Rs BatchGetImage = BatchGetImageResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 BatchGetImageResponse' <$>
-                   (x .?> "images" .!@ mempty) <*>
-                     (x .?> "failures" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable BatchGetImage where
-
-instance NFData BatchGetImage where
-
-instance ToHeaders BatchGetImage where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.BatchGetImage"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON BatchGetImage where
-        toJSON BatchGetImage'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _bgiRegistryId,
-                  ("acceptedMediaTypes" .=) <$> _bgiAcceptedMediaTypes,
-                  Just ("repositoryName" .= _bgiRepositoryName),
-                  Just ("imageIds" .= _bgiImageIds)])
-
-instance ToPath BatchGetImage where
-        toPath = const "/"
-
-instance ToQuery BatchGetImage where
-        toQuery = const mempty
-
--- | /See:/ 'batchGetImageResponse' smart constructor.
-data BatchGetImageResponse = BatchGetImageResponse'
-  { _bgirsImages         :: !(Maybe [Image])
-  , _bgirsFailures       :: !(Maybe [ImageFailure])
-  , _bgirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'BatchGetImageResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'bgirsImages' - A list of image objects corresponding to the image references in the request.
---
--- * 'bgirsFailures' - Any failures associated with the call.
---
--- * 'bgirsResponseStatus' - -- | The response status code.
-batchGetImageResponse
-    :: Int -- ^ 'bgirsResponseStatus'
-    -> BatchGetImageResponse
-batchGetImageResponse pResponseStatus_ =
-  BatchGetImageResponse'
-    { _bgirsImages = Nothing
-    , _bgirsFailures = Nothing
-    , _bgirsResponseStatus = pResponseStatus_
-    }
-
-
--- | A list of image objects corresponding to the image references in the request.
-bgirsImages :: Lens' BatchGetImageResponse [Image]
-bgirsImages = lens _bgirsImages (\ s a -> s{_bgirsImages = a}) . _Default . _Coerce
-
--- | Any failures associated with the call.
-bgirsFailures :: Lens' BatchGetImageResponse [ImageFailure]
-bgirsFailures = lens _bgirsFailures (\ s a -> s{_bgirsFailures = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-bgirsResponseStatus :: Lens' BatchGetImageResponse Int
-bgirsResponseStatus = lens _bgirsResponseStatus (\ s a -> s{_bgirsResponseStatus = a})
-
-instance NFData BatchGetImageResponse where
diff --git a/gen/Network/AWS/ECR/CompleteLayerUpload.hs b/gen/Network/AWS/ECR/CompleteLayerUpload.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/CompleteLayerUpload.hs
+++ /dev/null
@@ -1,201 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.CompleteLayerUpload
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Informs Amazon ECR that the image layer upload has completed for a specified registry, repository name, and upload ID. You can optionally provide a @sha256@ digest of the image layer for data validation purposes.
---
---
-module Network.AWS.ECR.CompleteLayerUpload
-    (
-    -- * Creating a Request
-      completeLayerUpload
-    , CompleteLayerUpload
-    -- * Request Lenses
-    , cluRegistryId
-    , cluRepositoryName
-    , cluUploadId
-    , cluLayerDigests
-
-    -- * Destructuring the Response
-    , completeLayerUploadResponse
-    , CompleteLayerUploadResponse
-    -- * Response Lenses
-    , clursRegistryId
-    , clursLayerDigest
-    , clursRepositoryName
-    , clursUploadId
-    , clursResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'completeLayerUpload' smart constructor.
-data CompleteLayerUpload = CompleteLayerUpload'
-  { _cluRegistryId     :: !(Maybe Text)
-  , _cluRepositoryName :: !Text
-  , _cluUploadId       :: !Text
-  , _cluLayerDigests   :: !(List1 Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CompleteLayerUpload' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'cluRegistryId' - The AWS account ID associated with the registry to which to upload layers. If you do not specify a registry, the default registry is assumed.
---
--- * 'cluRepositoryName' - The name of the repository to associate with the image layer.
---
--- * 'cluUploadId' - The upload ID from a previous 'InitiateLayerUpload' operation to associate with the image layer.
---
--- * 'cluLayerDigests' - The @sha256@ digest of the image layer.
-completeLayerUpload
-    :: Text -- ^ 'cluRepositoryName'
-    -> Text -- ^ 'cluUploadId'
-    -> NonEmpty Text -- ^ 'cluLayerDigests'
-    -> CompleteLayerUpload
-completeLayerUpload pRepositoryName_ pUploadId_ pLayerDigests_ =
-  CompleteLayerUpload'
-    { _cluRegistryId = Nothing
-    , _cluRepositoryName = pRepositoryName_
-    , _cluUploadId = pUploadId_
-    , _cluLayerDigests = _List1 # pLayerDigests_
-    }
-
-
--- | The AWS account ID associated with the registry to which to upload layers. If you do not specify a registry, the default registry is assumed.
-cluRegistryId :: Lens' CompleteLayerUpload (Maybe Text)
-cluRegistryId = lens _cluRegistryId (\ s a -> s{_cluRegistryId = a})
-
--- | The name of the repository to associate with the image layer.
-cluRepositoryName :: Lens' CompleteLayerUpload Text
-cluRepositoryName = lens _cluRepositoryName (\ s a -> s{_cluRepositoryName = a})
-
--- | The upload ID from a previous 'InitiateLayerUpload' operation to associate with the image layer.
-cluUploadId :: Lens' CompleteLayerUpload Text
-cluUploadId = lens _cluUploadId (\ s a -> s{_cluUploadId = a})
-
--- | The @sha256@ digest of the image layer.
-cluLayerDigests :: Lens' CompleteLayerUpload (NonEmpty Text)
-cluLayerDigests = lens _cluLayerDigests (\ s a -> s{_cluLayerDigests = a}) . _List1
-
-instance AWSRequest CompleteLayerUpload where
-        type Rs CompleteLayerUpload =
-             CompleteLayerUploadResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 CompleteLayerUploadResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "layerDigest") <*>
-                     (x .?> "repositoryName")
-                     <*> (x .?> "uploadId")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable CompleteLayerUpload where
-
-instance NFData CompleteLayerUpload where
-
-instance ToHeaders CompleteLayerUpload where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.CompleteLayerUpload"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON CompleteLayerUpload where
-        toJSON CompleteLayerUpload'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _cluRegistryId,
-                  Just ("repositoryName" .= _cluRepositoryName),
-                  Just ("uploadId" .= _cluUploadId),
-                  Just ("layerDigests" .= _cluLayerDigests)])
-
-instance ToPath CompleteLayerUpload where
-        toPath = const "/"
-
-instance ToQuery CompleteLayerUpload where
-        toQuery = const mempty
-
--- | /See:/ 'completeLayerUploadResponse' smart constructor.
-data CompleteLayerUploadResponse = CompleteLayerUploadResponse'
-  { _clursRegistryId     :: !(Maybe Text)
-  , _clursLayerDigest    :: !(Maybe Text)
-  , _clursRepositoryName :: !(Maybe Text)
-  , _clursUploadId       :: !(Maybe Text)
-  , _clursResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CompleteLayerUploadResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'clursRegistryId' - The registry ID associated with the request.
---
--- * 'clursLayerDigest' - The @sha256@ digest of the image layer.
---
--- * 'clursRepositoryName' - The repository name associated with the request.
---
--- * 'clursUploadId' - The upload ID associated with the layer.
---
--- * 'clursResponseStatus' - -- | The response status code.
-completeLayerUploadResponse
-    :: Int -- ^ 'clursResponseStatus'
-    -> CompleteLayerUploadResponse
-completeLayerUploadResponse pResponseStatus_ =
-  CompleteLayerUploadResponse'
-    { _clursRegistryId = Nothing
-    , _clursLayerDigest = Nothing
-    , _clursRepositoryName = Nothing
-    , _clursUploadId = Nothing
-    , _clursResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-clursRegistryId :: Lens' CompleteLayerUploadResponse (Maybe Text)
-clursRegistryId = lens _clursRegistryId (\ s a -> s{_clursRegistryId = a})
-
--- | The @sha256@ digest of the image layer.
-clursLayerDigest :: Lens' CompleteLayerUploadResponse (Maybe Text)
-clursLayerDigest = lens _clursLayerDigest (\ s a -> s{_clursLayerDigest = a})
-
--- | The repository name associated with the request.
-clursRepositoryName :: Lens' CompleteLayerUploadResponse (Maybe Text)
-clursRepositoryName = lens _clursRepositoryName (\ s a -> s{_clursRepositoryName = a})
-
--- | The upload ID associated with the layer.
-clursUploadId :: Lens' CompleteLayerUploadResponse (Maybe Text)
-clursUploadId = lens _clursUploadId (\ s a -> s{_clursUploadId = a})
-
--- | -- | The response status code.
-clursResponseStatus :: Lens' CompleteLayerUploadResponse Int
-clursResponseStatus = lens _clursResponseStatus (\ s a -> s{_clursResponseStatus = a})
-
-instance NFData CompleteLayerUploadResponse where
diff --git a/gen/Network/AWS/ECR/CreateRepository.hs b/gen/Network/AWS/ECR/CreateRepository.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/CreateRepository.hs
+++ /dev/null
@@ -1,134 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.CreateRepository
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Creates an image repository.
---
---
-module Network.AWS.ECR.CreateRepository
-    (
-    -- * Creating a Request
-      createRepository
-    , CreateRepository
-    -- * Request Lenses
-    , crRepositoryName
-
-    -- * Destructuring the Response
-    , createRepositoryResponse
-    , CreateRepositoryResponse
-    -- * Response Lenses
-    , crrsRepository
-    , crrsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'createRepository' smart constructor.
-newtype CreateRepository = CreateRepository'
-  { _crRepositoryName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CreateRepository' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'crRepositoryName' - The name to use for the repository. The repository name may be specified on its own (such as @nginx-web-app@ ) or it can be prepended with a namespace to group the repository into a category (such as @project-a/nginx-web-app@ ).
-createRepository
-    :: Text -- ^ 'crRepositoryName'
-    -> CreateRepository
-createRepository pRepositoryName_ =
-  CreateRepository' {_crRepositoryName = pRepositoryName_}
-
-
--- | The name to use for the repository. The repository name may be specified on its own (such as @nginx-web-app@ ) or it can be prepended with a namespace to group the repository into a category (such as @project-a/nginx-web-app@ ).
-crRepositoryName :: Lens' CreateRepository Text
-crRepositoryName = lens _crRepositoryName (\ s a -> s{_crRepositoryName = a})
-
-instance AWSRequest CreateRepository where
-        type Rs CreateRepository = CreateRepositoryResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 CreateRepositoryResponse' <$>
-                   (x .?> "repository") <*> (pure (fromEnum s)))
-
-instance Hashable CreateRepository where
-
-instance NFData CreateRepository where
-
-instance ToHeaders CreateRepository where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.CreateRepository"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON CreateRepository where
-        toJSON CreateRepository'{..}
-          = object
-              (catMaybes
-                 [Just ("repositoryName" .= _crRepositoryName)])
-
-instance ToPath CreateRepository where
-        toPath = const "/"
-
-instance ToQuery CreateRepository where
-        toQuery = const mempty
-
--- | /See:/ 'createRepositoryResponse' smart constructor.
-data CreateRepositoryResponse = CreateRepositoryResponse'
-  { _crrsRepository     :: !(Maybe Repository)
-  , _crrsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CreateRepositoryResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'crrsRepository' - The repository that was created.
---
--- * 'crrsResponseStatus' - -- | The response status code.
-createRepositoryResponse
-    :: Int -- ^ 'crrsResponseStatus'
-    -> CreateRepositoryResponse
-createRepositoryResponse pResponseStatus_ =
-  CreateRepositoryResponse'
-    {_crrsRepository = Nothing, _crrsResponseStatus = pResponseStatus_}
-
-
--- | The repository that was created.
-crrsRepository :: Lens' CreateRepositoryResponse (Maybe Repository)
-crrsRepository = lens _crrsRepository (\ s a -> s{_crrsRepository = a})
-
--- | -- | The response status code.
-crrsResponseStatus :: Lens' CreateRepositoryResponse Int
-crrsResponseStatus = lens _crrsResponseStatus (\ s a -> s{_crrsResponseStatus = a})
-
-instance NFData CreateRepositoryResponse where
diff --git a/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs b/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.DeleteLifecyclePolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes the specified lifecycle policy.
---
---
-module Network.AWS.ECR.DeleteLifecyclePolicy
-    (
-    -- * Creating a Request
-      deleteLifecyclePolicy
-    , DeleteLifecyclePolicy
-    -- * Request Lenses
-    , dlpRegistryId
-    , dlpRepositoryName
-
-    -- * Destructuring the Response
-    , deleteLifecyclePolicyResponse
-    , DeleteLifecyclePolicyResponse
-    -- * Response Lenses
-    , dlprsRegistryId
-    , dlprsLastEvaluatedAt
-    , dlprsLifecyclePolicyText
-    , dlprsRepositoryName
-    , dlprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'deleteLifecyclePolicy' smart constructor.
-data DeleteLifecyclePolicy = DeleteLifecyclePolicy'
-  { _dlpRegistryId     :: !(Maybe Text)
-  , _dlpRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteLifecyclePolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dlpRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'dlpRepositoryName' - The name of the repository.
-deleteLifecyclePolicy
-    :: Text -- ^ 'dlpRepositoryName'
-    -> DeleteLifecyclePolicy
-deleteLifecyclePolicy pRepositoryName_ =
-  DeleteLifecyclePolicy'
-    {_dlpRegistryId = Nothing, _dlpRepositoryName = pRepositoryName_}
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-dlpRegistryId :: Lens' DeleteLifecyclePolicy (Maybe Text)
-dlpRegistryId = lens _dlpRegistryId (\ s a -> s{_dlpRegistryId = a})
-
--- | The name of the repository.
-dlpRepositoryName :: Lens' DeleteLifecyclePolicy Text
-dlpRepositoryName = lens _dlpRepositoryName (\ s a -> s{_dlpRepositoryName = a})
-
-instance AWSRequest DeleteLifecyclePolicy where
-        type Rs DeleteLifecyclePolicy =
-             DeleteLifecyclePolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DeleteLifecyclePolicyResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "lastEvaluatedAt")
-                     <*> (x .?> "lifecyclePolicyText")
-                     <*> (x .?> "repositoryName")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable DeleteLifecyclePolicy where
-
-instance NFData DeleteLifecyclePolicy where
-
-instance ToHeaders DeleteLifecyclePolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.DeleteLifecyclePolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DeleteLifecyclePolicy where
-        toJSON DeleteLifecyclePolicy'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _dlpRegistryId,
-                  Just ("repositoryName" .= _dlpRepositoryName)])
-
-instance ToPath DeleteLifecyclePolicy where
-        toPath = const "/"
-
-instance ToQuery DeleteLifecyclePolicy where
-        toQuery = const mempty
-
--- | /See:/ 'deleteLifecyclePolicyResponse' smart constructor.
-data DeleteLifecyclePolicyResponse = DeleteLifecyclePolicyResponse'
-  { _dlprsRegistryId          :: !(Maybe Text)
-  , _dlprsLastEvaluatedAt     :: !(Maybe POSIX)
-  , _dlprsLifecyclePolicyText :: !(Maybe Text)
-  , _dlprsRepositoryName      :: !(Maybe Text)
-  , _dlprsResponseStatus      :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteLifecyclePolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dlprsRegistryId' - The registry ID associated with the request.
---
--- * 'dlprsLastEvaluatedAt' - The time stamp of the last time that the lifecycle policy was run.
---
--- * 'dlprsLifecyclePolicyText' - The JSON lifecycle policy text.
---
--- * 'dlprsRepositoryName' - The repository name associated with the request.
---
--- * 'dlprsResponseStatus' - -- | The response status code.
-deleteLifecyclePolicyResponse
-    :: Int -- ^ 'dlprsResponseStatus'
-    -> DeleteLifecyclePolicyResponse
-deleteLifecyclePolicyResponse pResponseStatus_ =
-  DeleteLifecyclePolicyResponse'
-    { _dlprsRegistryId = Nothing
-    , _dlprsLastEvaluatedAt = Nothing
-    , _dlprsLifecyclePolicyText = Nothing
-    , _dlprsRepositoryName = Nothing
-    , _dlprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-dlprsRegistryId :: Lens' DeleteLifecyclePolicyResponse (Maybe Text)
-dlprsRegistryId = lens _dlprsRegistryId (\ s a -> s{_dlprsRegistryId = a})
-
--- | The time stamp of the last time that the lifecycle policy was run.
-dlprsLastEvaluatedAt :: Lens' DeleteLifecyclePolicyResponse (Maybe UTCTime)
-dlprsLastEvaluatedAt = lens _dlprsLastEvaluatedAt (\ s a -> s{_dlprsLastEvaluatedAt = a}) . mapping _Time
-
--- | The JSON lifecycle policy text.
-dlprsLifecyclePolicyText :: Lens' DeleteLifecyclePolicyResponse (Maybe Text)
-dlprsLifecyclePolicyText = lens _dlprsLifecyclePolicyText (\ s a -> s{_dlprsLifecyclePolicyText = a})
-
--- | The repository name associated with the request.
-dlprsRepositoryName :: Lens' DeleteLifecyclePolicyResponse (Maybe Text)
-dlprsRepositoryName = lens _dlprsRepositoryName (\ s a -> s{_dlprsRepositoryName = a})
-
--- | -- | The response status code.
-dlprsResponseStatus :: Lens' DeleteLifecyclePolicyResponse Int
-dlprsResponseStatus = lens _dlprsResponseStatus (\ s a -> s{_dlprsResponseStatus = a})
-
-instance NFData DeleteLifecyclePolicyResponse where
diff --git a/gen/Network/AWS/ECR/DeleteRepository.hs b/gen/Network/AWS/ECR/DeleteRepository.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/DeleteRepository.hs
+++ /dev/null
@@ -1,156 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.DeleteRepository
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes an existing image repository. If a repository contains images, you must use the @force@ option to delete it.
---
---
-module Network.AWS.ECR.DeleteRepository
-    (
-    -- * Creating a Request
-      deleteRepository
-    , DeleteRepository
-    -- * Request Lenses
-    , dForce
-    , dRegistryId
-    , dRepositoryName
-
-    -- * Destructuring the Response
-    , deleteRepositoryResponse
-    , DeleteRepositoryResponse
-    -- * Response Lenses
-    , drsRepository
-    , drsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'deleteRepository' smart constructor.
-data DeleteRepository = DeleteRepository'
-  { _dForce          :: !(Maybe Bool)
-  , _dRegistryId     :: !(Maybe Text)
-  , _dRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteRepository' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dForce' - If a repository contains images, forces the deletion.
---
--- * 'dRegistryId' - The AWS account ID associated with the registry that contains the repository to delete. If you do not specify a registry, the default registry is assumed.
---
--- * 'dRepositoryName' - The name of the repository to delete.
-deleteRepository
-    :: Text -- ^ 'dRepositoryName'
-    -> DeleteRepository
-deleteRepository pRepositoryName_ =
-  DeleteRepository'
-    { _dForce = Nothing
-    , _dRegistryId = Nothing
-    , _dRepositoryName = pRepositoryName_
-    }
-
-
--- | If a repository contains images, forces the deletion.
-dForce :: Lens' DeleteRepository (Maybe Bool)
-dForce = lens _dForce (\ s a -> s{_dForce = a})
-
--- | The AWS account ID associated with the registry that contains the repository to delete. If you do not specify a registry, the default registry is assumed.
-dRegistryId :: Lens' DeleteRepository (Maybe Text)
-dRegistryId = lens _dRegistryId (\ s a -> s{_dRegistryId = a})
-
--- | The name of the repository to delete.
-dRepositoryName :: Lens' DeleteRepository Text
-dRepositoryName = lens _dRepositoryName (\ s a -> s{_dRepositoryName = a})
-
-instance AWSRequest DeleteRepository where
-        type Rs DeleteRepository = DeleteRepositoryResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DeleteRepositoryResponse' <$>
-                   (x .?> "repository") <*> (pure (fromEnum s)))
-
-instance Hashable DeleteRepository where
-
-instance NFData DeleteRepository where
-
-instance ToHeaders DeleteRepository where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.DeleteRepository"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DeleteRepository where
-        toJSON DeleteRepository'{..}
-          = object
-              (catMaybes
-                 [("force" .=) <$> _dForce,
-                  ("registryId" .=) <$> _dRegistryId,
-                  Just ("repositoryName" .= _dRepositoryName)])
-
-instance ToPath DeleteRepository where
-        toPath = const "/"
-
-instance ToQuery DeleteRepository where
-        toQuery = const mempty
-
--- | /See:/ 'deleteRepositoryResponse' smart constructor.
-data DeleteRepositoryResponse = DeleteRepositoryResponse'
-  { _drsRepository     :: !(Maybe Repository)
-  , _drsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteRepositoryResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'drsRepository' - The repository that was deleted.
---
--- * 'drsResponseStatus' - -- | The response status code.
-deleteRepositoryResponse
-    :: Int -- ^ 'drsResponseStatus'
-    -> DeleteRepositoryResponse
-deleteRepositoryResponse pResponseStatus_ =
-  DeleteRepositoryResponse'
-    {_drsRepository = Nothing, _drsResponseStatus = pResponseStatus_}
-
-
--- | The repository that was deleted.
-drsRepository :: Lens' DeleteRepositoryResponse (Maybe Repository)
-drsRepository = lens _drsRepository (\ s a -> s{_drsRepository = a})
-
--- | -- | The response status code.
-drsResponseStatus :: Lens' DeleteRepositoryResponse Int
-drsResponseStatus = lens _drsResponseStatus (\ s a -> s{_drsResponseStatus = a})
-
-instance NFData DeleteRepositoryResponse where
diff --git a/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs b/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs
+++ /dev/null
@@ -1,167 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.DeleteRepositoryPolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes the repository policy from a specified repository.
---
---
-module Network.AWS.ECR.DeleteRepositoryPolicy
-    (
-    -- * Creating a Request
-      deleteRepositoryPolicy
-    , DeleteRepositoryPolicy
-    -- * Request Lenses
-    , drpRegistryId
-    , drpRepositoryName
-
-    -- * Destructuring the Response
-    , deleteRepositoryPolicyResponse
-    , DeleteRepositoryPolicyResponse
-    -- * Response Lenses
-    , drprsRegistryId
-    , drprsRepositoryName
-    , drprsPolicyText
-    , drprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'deleteRepositoryPolicy' smart constructor.
-data DeleteRepositoryPolicy = DeleteRepositoryPolicy'
-  { _drpRegistryId     :: !(Maybe Text)
-  , _drpRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteRepositoryPolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'drpRegistryId' - The AWS account ID associated with the registry that contains the repository policy to delete. If you do not specify a registry, the default registry is assumed.
---
--- * 'drpRepositoryName' - The name of the repository that is associated with the repository policy to delete.
-deleteRepositoryPolicy
-    :: Text -- ^ 'drpRepositoryName'
-    -> DeleteRepositoryPolicy
-deleteRepositoryPolicy pRepositoryName_ =
-  DeleteRepositoryPolicy'
-    {_drpRegistryId = Nothing, _drpRepositoryName = pRepositoryName_}
-
-
--- | The AWS account ID associated with the registry that contains the repository policy to delete. If you do not specify a registry, the default registry is assumed.
-drpRegistryId :: Lens' DeleteRepositoryPolicy (Maybe Text)
-drpRegistryId = lens _drpRegistryId (\ s a -> s{_drpRegistryId = a})
-
--- | The name of the repository that is associated with the repository policy to delete.
-drpRepositoryName :: Lens' DeleteRepositoryPolicy Text
-drpRepositoryName = lens _drpRepositoryName (\ s a -> s{_drpRepositoryName = a})
-
-instance AWSRequest DeleteRepositoryPolicy where
-        type Rs DeleteRepositoryPolicy =
-             DeleteRepositoryPolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DeleteRepositoryPolicyResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "repositoryName") <*>
-                     (x .?> "policyText")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable DeleteRepositoryPolicy where
-
-instance NFData DeleteRepositoryPolicy where
-
-instance ToHeaders DeleteRepositoryPolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryPolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DeleteRepositoryPolicy where
-        toJSON DeleteRepositoryPolicy'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _drpRegistryId,
-                  Just ("repositoryName" .= _drpRepositoryName)])
-
-instance ToPath DeleteRepositoryPolicy where
-        toPath = const "/"
-
-instance ToQuery DeleteRepositoryPolicy where
-        toQuery = const mempty
-
--- | /See:/ 'deleteRepositoryPolicyResponse' smart constructor.
-data DeleteRepositoryPolicyResponse = DeleteRepositoryPolicyResponse'
-  { _drprsRegistryId     :: !(Maybe Text)
-  , _drprsRepositoryName :: !(Maybe Text)
-  , _drprsPolicyText     :: !(Maybe Text)
-  , _drprsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteRepositoryPolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'drprsRegistryId' - The registry ID associated with the request.
---
--- * 'drprsRepositoryName' - The repository name associated with the request.
---
--- * 'drprsPolicyText' - The JSON repository policy that was deleted from the repository.
---
--- * 'drprsResponseStatus' - -- | The response status code.
-deleteRepositoryPolicyResponse
-    :: Int -- ^ 'drprsResponseStatus'
-    -> DeleteRepositoryPolicyResponse
-deleteRepositoryPolicyResponse pResponseStatus_ =
-  DeleteRepositoryPolicyResponse'
-    { _drprsRegistryId = Nothing
-    , _drprsRepositoryName = Nothing
-    , _drprsPolicyText = Nothing
-    , _drprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-drprsRegistryId :: Lens' DeleteRepositoryPolicyResponse (Maybe Text)
-drprsRegistryId = lens _drprsRegistryId (\ s a -> s{_drprsRegistryId = a})
-
--- | The repository name associated with the request.
-drprsRepositoryName :: Lens' DeleteRepositoryPolicyResponse (Maybe Text)
-drprsRepositoryName = lens _drprsRepositoryName (\ s a -> s{_drprsRepositoryName = a})
-
--- | The JSON repository policy that was deleted from the repository.
-drprsPolicyText :: Lens' DeleteRepositoryPolicyResponse (Maybe Text)
-drprsPolicyText = lens _drprsPolicyText (\ s a -> s{_drprsPolicyText = a})
-
--- | -- | The response status code.
-drprsResponseStatus :: Lens' DeleteRepositoryPolicyResponse Int
-drprsResponseStatus = lens _drprsResponseStatus (\ s a -> s{_drprsResponseStatus = a})
-
-instance NFData DeleteRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/DescribeImages.hs b/gen/Network/AWS/ECR/DescribeImages.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/DescribeImages.hs
+++ /dev/null
@@ -1,209 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.DescribeImages
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns metadata about the images in a repository, including image size, image tags, and creation date.
---
---
---
--- This operation returns paginated results.
-module Network.AWS.ECR.DescribeImages
-    (
-    -- * Creating a Request
-      describeImages
-    , DescribeImages
-    -- * Request Lenses
-    , diRegistryId
-    , diImageIds
-    , diNextToken
-    , diFilter
-    , diMaxResults
-    , diRepositoryName
-
-    -- * Destructuring the Response
-    , describeImagesResponse
-    , DescribeImagesResponse
-    -- * Response Lenses
-    , dirsImageDetails
-    , dirsNextToken
-    , dirsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Pager
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'describeImages' smart constructor.
-data DescribeImages = DescribeImages'
-  { _diRegistryId     :: !(Maybe Text)
-  , _diImageIds       :: !(Maybe [ImageIdentifier])
-  , _diNextToken      :: !(Maybe Text)
-  , _diFilter         :: !(Maybe DescribeImagesFilter)
-  , _diMaxResults     :: !(Maybe Nat)
-  , _diRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeImages' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'diRegistryId' - The AWS account ID associated with the registry that contains the repository in which to describe images. If you do not specify a registry, the default registry is assumed.
---
--- * 'diImageIds' - The list of image IDs for the requested repository.
---
--- * 'diNextToken' - The @nextToken@ value returned from a previous paginated @DescribeImages@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return. This option cannot be used when you specify images with @imageIds@ .
---
--- * 'diFilter' - The filter key and value with which to filter your @DescribeImages@ results.
---
--- * 'diMaxResults' - The maximum number of repository results returned by @DescribeImages@ in paginated output. When this parameter is used, @DescribeImages@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @DescribeImages@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @DescribeImages@ returns up to 100 results and a @nextToken@ value, if applicable. This option cannot be used when you specify images with @imageIds@ .
---
--- * 'diRepositoryName' - A list of repositories to describe. If this parameter is omitted, then all repositories in a registry are described.
-describeImages
-    :: Text -- ^ 'diRepositoryName'
-    -> DescribeImages
-describeImages pRepositoryName_ =
-  DescribeImages'
-    { _diRegistryId = Nothing
-    , _diImageIds = Nothing
-    , _diNextToken = Nothing
-    , _diFilter = Nothing
-    , _diMaxResults = Nothing
-    , _diRepositoryName = pRepositoryName_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository in which to describe images. If you do not specify a registry, the default registry is assumed.
-diRegistryId :: Lens' DescribeImages (Maybe Text)
-diRegistryId = lens _diRegistryId (\ s a -> s{_diRegistryId = a})
-
--- | The list of image IDs for the requested repository.
-diImageIds :: Lens' DescribeImages [ImageIdentifier]
-diImageIds = lens _diImageIds (\ s a -> s{_diImageIds = a}) . _Default . _Coerce
-
--- | The @nextToken@ value returned from a previous paginated @DescribeImages@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return. This option cannot be used when you specify images with @imageIds@ .
-diNextToken :: Lens' DescribeImages (Maybe Text)
-diNextToken = lens _diNextToken (\ s a -> s{_diNextToken = a})
-
--- | The filter key and value with which to filter your @DescribeImages@ results.
-diFilter :: Lens' DescribeImages (Maybe DescribeImagesFilter)
-diFilter = lens _diFilter (\ s a -> s{_diFilter = a})
-
--- | The maximum number of repository results returned by @DescribeImages@ in paginated output. When this parameter is used, @DescribeImages@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @DescribeImages@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @DescribeImages@ returns up to 100 results and a @nextToken@ value, if applicable. This option cannot be used when you specify images with @imageIds@ .
-diMaxResults :: Lens' DescribeImages (Maybe Natural)
-diMaxResults = lens _diMaxResults (\ s a -> s{_diMaxResults = a}) . mapping _Nat
-
--- | A list of repositories to describe. If this parameter is omitted, then all repositories in a registry are described.
-diRepositoryName :: Lens' DescribeImages Text
-diRepositoryName = lens _diRepositoryName (\ s a -> s{_diRepositoryName = a})
-
-instance AWSPager DescribeImages where
-        page rq rs
-          | stop (rs ^. dirsNextToken) = Nothing
-          | stop (rs ^. dirsImageDetails) = Nothing
-          | otherwise =
-            Just $ rq & diNextToken .~ rs ^. dirsNextToken
-
-instance AWSRequest DescribeImages where
-        type Rs DescribeImages = DescribeImagesResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DescribeImagesResponse' <$>
-                   (x .?> "imageDetails" .!@ mempty) <*>
-                     (x .?> "nextToken")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable DescribeImages where
-
-instance NFData DescribeImages where
-
-instance ToHeaders DescribeImages where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.DescribeImages"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DescribeImages where
-        toJSON DescribeImages'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _diRegistryId,
-                  ("imageIds" .=) <$> _diImageIds,
-                  ("nextToken" .=) <$> _diNextToken,
-                  ("filter" .=) <$> _diFilter,
-                  ("maxResults" .=) <$> _diMaxResults,
-                  Just ("repositoryName" .= _diRepositoryName)])
-
-instance ToPath DescribeImages where
-        toPath = const "/"
-
-instance ToQuery DescribeImages where
-        toQuery = const mempty
-
--- | /See:/ 'describeImagesResponse' smart constructor.
-data DescribeImagesResponse = DescribeImagesResponse'
-  { _dirsImageDetails   :: !(Maybe [ImageDetail])
-  , _dirsNextToken      :: !(Maybe Text)
-  , _dirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeImagesResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dirsImageDetails' - A list of 'ImageDetail' objects that contain data about the image.
---
--- * 'dirsNextToken' - The @nextToken@ value to include in a future @DescribeImages@ request. When the results of a @DescribeImages@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
---
--- * 'dirsResponseStatus' - -- | The response status code.
-describeImagesResponse
-    :: Int -- ^ 'dirsResponseStatus'
-    -> DescribeImagesResponse
-describeImagesResponse pResponseStatus_ =
-  DescribeImagesResponse'
-    { _dirsImageDetails = Nothing
-    , _dirsNextToken = Nothing
-    , _dirsResponseStatus = pResponseStatus_
-    }
-
-
--- | A list of 'ImageDetail' objects that contain data about the image.
-dirsImageDetails :: Lens' DescribeImagesResponse [ImageDetail]
-dirsImageDetails = lens _dirsImageDetails (\ s a -> s{_dirsImageDetails = a}) . _Default . _Coerce
-
--- | The @nextToken@ value to include in a future @DescribeImages@ request. When the results of a @DescribeImages@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
-dirsNextToken :: Lens' DescribeImagesResponse (Maybe Text)
-dirsNextToken = lens _dirsNextToken (\ s a -> s{_dirsNextToken = a})
-
--- | -- | The response status code.
-dirsResponseStatus :: Lens' DescribeImagesResponse Int
-dirsResponseStatus = lens _dirsResponseStatus (\ s a -> s{_dirsResponseStatus = a})
-
-instance NFData DescribeImagesResponse where
diff --git a/gen/Network/AWS/ECR/DescribeRepositories.hs b/gen/Network/AWS/ECR/DescribeRepositories.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/DescribeRepositories.hs
+++ /dev/null
@@ -1,189 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.DescribeRepositories
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Describes image repositories in a registry.
---
---
---
--- This operation returns paginated results.
-module Network.AWS.ECR.DescribeRepositories
-    (
-    -- * Creating a Request
-      describeRepositories
-    , DescribeRepositories
-    -- * Request Lenses
-    , drRegistryId
-    , drRepositoryNames
-    , drNextToken
-    , drMaxResults
-
-    -- * Destructuring the Response
-    , describeRepositoriesResponse
-    , DescribeRepositoriesResponse
-    -- * Response Lenses
-    , drrsRepositories
-    , drrsNextToken
-    , drrsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Pager
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'describeRepositories' smart constructor.
-data DescribeRepositories = DescribeRepositories'
-  { _drRegistryId      :: !(Maybe Text)
-  , _drRepositoryNames :: !(Maybe (List1 Text))
-  , _drNextToken       :: !(Maybe Text)
-  , _drMaxResults      :: !(Maybe Nat)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeRepositories' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'drRegistryId' - The AWS account ID associated with the registry that contains the repositories to be described. If you do not specify a registry, the default registry is assumed.
---
--- * 'drRepositoryNames' - A list of repositories to describe. If this parameter is omitted, then all repositories in a registry are described.
---
--- * 'drNextToken' - The @nextToken@ value returned from a previous paginated @DescribeRepositories@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return. This option cannot be used when you specify repositories with @repositoryNames@ .
---
--- * 'drMaxResults' - The maximum number of repository results returned by @DescribeRepositories@ in paginated output. When this parameter is used, @DescribeRepositories@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @DescribeRepositories@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @DescribeRepositories@ returns up to 100 results and a @nextToken@ value, if applicable. This option cannot be used when you specify repositories with @repositoryNames@ .
-describeRepositories
-    :: DescribeRepositories
-describeRepositories =
-  DescribeRepositories'
-    { _drRegistryId = Nothing
-    , _drRepositoryNames = Nothing
-    , _drNextToken = Nothing
-    , _drMaxResults = Nothing
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repositories to be described. If you do not specify a registry, the default registry is assumed.
-drRegistryId :: Lens' DescribeRepositories (Maybe Text)
-drRegistryId = lens _drRegistryId (\ s a -> s{_drRegistryId = a})
-
--- | A list of repositories to describe. If this parameter is omitted, then all repositories in a registry are described.
-drRepositoryNames :: Lens' DescribeRepositories (Maybe (NonEmpty Text))
-drRepositoryNames = lens _drRepositoryNames (\ s a -> s{_drRepositoryNames = a}) . mapping _List1
-
--- | The @nextToken@ value returned from a previous paginated @DescribeRepositories@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return. This option cannot be used when you specify repositories with @repositoryNames@ .
-drNextToken :: Lens' DescribeRepositories (Maybe Text)
-drNextToken = lens _drNextToken (\ s a -> s{_drNextToken = a})
-
--- | The maximum number of repository results returned by @DescribeRepositories@ in paginated output. When this parameter is used, @DescribeRepositories@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @DescribeRepositories@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @DescribeRepositories@ returns up to 100 results and a @nextToken@ value, if applicable. This option cannot be used when you specify repositories with @repositoryNames@ .
-drMaxResults :: Lens' DescribeRepositories (Maybe Natural)
-drMaxResults = lens _drMaxResults (\ s a -> s{_drMaxResults = a}) . mapping _Nat
-
-instance AWSPager DescribeRepositories where
-        page rq rs
-          | stop (rs ^. drrsNextToken) = Nothing
-          | stop (rs ^. drrsRepositories) = Nothing
-          | otherwise =
-            Just $ rq & drNextToken .~ rs ^. drrsNextToken
-
-instance AWSRequest DescribeRepositories where
-        type Rs DescribeRepositories =
-             DescribeRepositoriesResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 DescribeRepositoriesResponse' <$>
-                   (x .?> "repositories" .!@ mempty) <*>
-                     (x .?> "nextToken")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable DescribeRepositories where
-
-instance NFData DescribeRepositories where
-
-instance ToHeaders DescribeRepositories where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.DescribeRepositories"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DescribeRepositories where
-        toJSON DescribeRepositories'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _drRegistryId,
-                  ("repositoryNames" .=) <$> _drRepositoryNames,
-                  ("nextToken" .=) <$> _drNextToken,
-                  ("maxResults" .=) <$> _drMaxResults])
-
-instance ToPath DescribeRepositories where
-        toPath = const "/"
-
-instance ToQuery DescribeRepositories where
-        toQuery = const mempty
-
--- | /See:/ 'describeRepositoriesResponse' smart constructor.
-data DescribeRepositoriesResponse = DescribeRepositoriesResponse'
-  { _drrsRepositories   :: !(Maybe [Repository])
-  , _drrsNextToken      :: !(Maybe Text)
-  , _drrsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeRepositoriesResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'drrsRepositories' - A list of repository objects corresponding to valid repositories.
---
--- * 'drrsNextToken' - The @nextToken@ value to include in a future @DescribeRepositories@ request. When the results of a @DescribeRepositories@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
---
--- * 'drrsResponseStatus' - -- | The response status code.
-describeRepositoriesResponse
-    :: Int -- ^ 'drrsResponseStatus'
-    -> DescribeRepositoriesResponse
-describeRepositoriesResponse pResponseStatus_ =
-  DescribeRepositoriesResponse'
-    { _drrsRepositories = Nothing
-    , _drrsNextToken = Nothing
-    , _drrsResponseStatus = pResponseStatus_
-    }
-
-
--- | A list of repository objects corresponding to valid repositories.
-drrsRepositories :: Lens' DescribeRepositoriesResponse [Repository]
-drrsRepositories = lens _drrsRepositories (\ s a -> s{_drrsRepositories = a}) . _Default . _Coerce
-
--- | The @nextToken@ value to include in a future @DescribeRepositories@ request. When the results of a @DescribeRepositories@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
-drrsNextToken :: Lens' DescribeRepositoriesResponse (Maybe Text)
-drrsNextToken = lens _drrsNextToken (\ s a -> s{_drrsNextToken = a})
-
--- | -- | The response status code.
-drrsResponseStatus :: Lens' DescribeRepositoriesResponse Int
-drrsResponseStatus = lens _drrsResponseStatus (\ s a -> s{_drrsResponseStatus = a})
-
-instance NFData DescribeRepositoriesResponse where
diff --git a/gen/Network/AWS/ECR/GetAuthorizationToken.hs b/gen/Network/AWS/ECR/GetAuthorizationToken.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/GetAuthorizationToken.hs
+++ /dev/null
@@ -1,135 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.GetAuthorizationToken
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves a token that is valid for a specified registry for 12 hours. This command allows you to use the @docker@ CLI to push and pull images with Amazon ECR. If you do not specify a registry, the default registry is assumed.
---
---
--- The @authorizationToken@ returned for each registry specified is a base64 encoded string that can be decoded and used in a @docker login@ command to authenticate to a registry. The AWS CLI offers an @aws ecr get-login@ command that simplifies the login process.
---
-module Network.AWS.ECR.GetAuthorizationToken
-    (
-    -- * Creating a Request
-      getAuthorizationToken
-    , GetAuthorizationToken
-    -- * Request Lenses
-    , gatRegistryIds
-
-    -- * Destructuring the Response
-    , getAuthorizationTokenResponse
-    , GetAuthorizationTokenResponse
-    -- * Response Lenses
-    , gatrsAuthorizationData
-    , gatrsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getAuthorizationToken' smart constructor.
-newtype GetAuthorizationToken = GetAuthorizationToken'
-  { _gatRegistryIds :: Maybe (List1 Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetAuthorizationToken' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gatRegistryIds' - A list of AWS account IDs that are associated with the registries for which to get authorization tokens. If you do not specify a registry, the default registry is assumed.
-getAuthorizationToken
-    :: GetAuthorizationToken
-getAuthorizationToken = GetAuthorizationToken' {_gatRegistryIds = Nothing}
-
-
--- | A list of AWS account IDs that are associated with the registries for which to get authorization tokens. If you do not specify a registry, the default registry is assumed.
-gatRegistryIds :: Lens' GetAuthorizationToken (Maybe (NonEmpty Text))
-gatRegistryIds = lens _gatRegistryIds (\ s a -> s{_gatRegistryIds = a}) . mapping _List1
-
-instance AWSRequest GetAuthorizationToken where
-        type Rs GetAuthorizationToken =
-             GetAuthorizationTokenResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetAuthorizationTokenResponse' <$>
-                   (x .?> "authorizationData" .!@ mempty) <*>
-                     (pure (fromEnum s)))
-
-instance Hashable GetAuthorizationToken where
-
-instance NFData GetAuthorizationToken where
-
-instance ToHeaders GetAuthorizationToken where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.GetAuthorizationToken"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetAuthorizationToken where
-        toJSON GetAuthorizationToken'{..}
-          = object
-              (catMaybes [("registryIds" .=) <$> _gatRegistryIds])
-
-instance ToPath GetAuthorizationToken where
-        toPath = const "/"
-
-instance ToQuery GetAuthorizationToken where
-        toQuery = const mempty
-
--- | /See:/ 'getAuthorizationTokenResponse' smart constructor.
-data GetAuthorizationTokenResponse = GetAuthorizationTokenResponse'
-  { _gatrsAuthorizationData :: !(Maybe [AuthorizationData])
-  , _gatrsResponseStatus    :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetAuthorizationTokenResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gatrsAuthorizationData' - A list of authorization token data objects that correspond to the @registryIds@ values in the request.
---
--- * 'gatrsResponseStatus' - -- | The response status code.
-getAuthorizationTokenResponse
-    :: Int -- ^ 'gatrsResponseStatus'
-    -> GetAuthorizationTokenResponse
-getAuthorizationTokenResponse pResponseStatus_ =
-  GetAuthorizationTokenResponse'
-    {_gatrsAuthorizationData = Nothing, _gatrsResponseStatus = pResponseStatus_}
-
-
--- | A list of authorization token data objects that correspond to the @registryIds@ values in the request.
-gatrsAuthorizationData :: Lens' GetAuthorizationTokenResponse [AuthorizationData]
-gatrsAuthorizationData = lens _gatrsAuthorizationData (\ s a -> s{_gatrsAuthorizationData = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-gatrsResponseStatus :: Lens' GetAuthorizationTokenResponse Int
-gatrsResponseStatus = lens _gatrsResponseStatus (\ s a -> s{_gatrsResponseStatus = a})
-
-instance NFData GetAuthorizationTokenResponse where
diff --git a/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs b/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs
+++ /dev/null
@@ -1,170 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.GetDownloadURLForLayer
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves the pre-signed Amazon S3 download URL corresponding to an image layer. You can only get URLs for image layers that are referenced in an image.
---
---
-module Network.AWS.ECR.GetDownloadURLForLayer
-    (
-    -- * Creating a Request
-      getDownloadURLForLayer
-    , GetDownloadURLForLayer
-    -- * Request Lenses
-    , gduflRegistryId
-    , gduflRepositoryName
-    , gduflLayerDigest
-
-    -- * Destructuring the Response
-    , getDownloadURLForLayerResponse
-    , GetDownloadURLForLayerResponse
-    -- * Response Lenses
-    , gduflrsLayerDigest
-    , gduflrsDownloadURL
-    , gduflrsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getDownloadURLForLayer' smart constructor.
-data GetDownloadURLForLayer = GetDownloadURLForLayer'
-  { _gduflRegistryId     :: !(Maybe Text)
-  , _gduflRepositoryName :: !Text
-  , _gduflLayerDigest    :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetDownloadURLForLayer' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gduflRegistryId' - The AWS account ID associated with the registry that contains the image layer to download. If you do not specify a registry, the default registry is assumed.
---
--- * 'gduflRepositoryName' - The name of the repository that is associated with the image layer to download.
---
--- * 'gduflLayerDigest' - The digest of the image layer to download.
-getDownloadURLForLayer
-    :: Text -- ^ 'gduflRepositoryName'
-    -> Text -- ^ 'gduflLayerDigest'
-    -> GetDownloadURLForLayer
-getDownloadURLForLayer pRepositoryName_ pLayerDigest_ =
-  GetDownloadURLForLayer'
-    { _gduflRegistryId = Nothing
-    , _gduflRepositoryName = pRepositoryName_
-    , _gduflLayerDigest = pLayerDigest_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the image layer to download. If you do not specify a registry, the default registry is assumed.
-gduflRegistryId :: Lens' GetDownloadURLForLayer (Maybe Text)
-gduflRegistryId = lens _gduflRegistryId (\ s a -> s{_gduflRegistryId = a})
-
--- | The name of the repository that is associated with the image layer to download.
-gduflRepositoryName :: Lens' GetDownloadURLForLayer Text
-gduflRepositoryName = lens _gduflRepositoryName (\ s a -> s{_gduflRepositoryName = a})
-
--- | The digest of the image layer to download.
-gduflLayerDigest :: Lens' GetDownloadURLForLayer Text
-gduflLayerDigest = lens _gduflLayerDigest (\ s a -> s{_gduflLayerDigest = a})
-
-instance AWSRequest GetDownloadURLForLayer where
-        type Rs GetDownloadURLForLayer =
-             GetDownloadURLForLayerResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetDownloadURLForLayerResponse' <$>
-                   (x .?> "layerDigest") <*> (x .?> "downloadUrl") <*>
-                     (pure (fromEnum s)))
-
-instance Hashable GetDownloadURLForLayer where
-
-instance NFData GetDownloadURLForLayer where
-
-instance ToHeaders GetDownloadURLForLayer where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.GetDownloadUrlForLayer"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetDownloadURLForLayer where
-        toJSON GetDownloadURLForLayer'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _gduflRegistryId,
-                  Just ("repositoryName" .= _gduflRepositoryName),
-                  Just ("layerDigest" .= _gduflLayerDigest)])
-
-instance ToPath GetDownloadURLForLayer where
-        toPath = const "/"
-
-instance ToQuery GetDownloadURLForLayer where
-        toQuery = const mempty
-
--- | /See:/ 'getDownloadURLForLayerResponse' smart constructor.
-data GetDownloadURLForLayerResponse = GetDownloadURLForLayerResponse'
-  { _gduflrsLayerDigest    :: !(Maybe Text)
-  , _gduflrsDownloadURL    :: !(Maybe Text)
-  , _gduflrsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetDownloadURLForLayerResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gduflrsLayerDigest' - The digest of the image layer to download.
---
--- * 'gduflrsDownloadURL' - The pre-signed Amazon S3 download URL for the requested layer.
---
--- * 'gduflrsResponseStatus' - -- | The response status code.
-getDownloadURLForLayerResponse
-    :: Int -- ^ 'gduflrsResponseStatus'
-    -> GetDownloadURLForLayerResponse
-getDownloadURLForLayerResponse pResponseStatus_ =
-  GetDownloadURLForLayerResponse'
-    { _gduflrsLayerDigest = Nothing
-    , _gduflrsDownloadURL = Nothing
-    , _gduflrsResponseStatus = pResponseStatus_
-    }
-
-
--- | The digest of the image layer to download.
-gduflrsLayerDigest :: Lens' GetDownloadURLForLayerResponse (Maybe Text)
-gduflrsLayerDigest = lens _gduflrsLayerDigest (\ s a -> s{_gduflrsLayerDigest = a})
-
--- | The pre-signed Amazon S3 download URL for the requested layer.
-gduflrsDownloadURL :: Lens' GetDownloadURLForLayerResponse (Maybe Text)
-gduflrsDownloadURL = lens _gduflrsDownloadURL (\ s a -> s{_gduflrsDownloadURL = a})
-
--- | -- | The response status code.
-gduflrsResponseStatus :: Lens' GetDownloadURLForLayerResponse Int
-gduflrsResponseStatus = lens _gduflrsResponseStatus (\ s a -> s{_gduflrsResponseStatus = a})
-
-instance NFData GetDownloadURLForLayerResponse where
diff --git a/gen/Network/AWS/ECR/GetLifecyclePolicy.hs b/gen/Network/AWS/ECR/GetLifecyclePolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/GetLifecyclePolicy.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.GetLifecyclePolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves the specified lifecycle policy.
---
---
-module Network.AWS.ECR.GetLifecyclePolicy
-    (
-    -- * Creating a Request
-      getLifecyclePolicy
-    , GetLifecyclePolicy
-    -- * Request Lenses
-    , glpRegistryId
-    , glpRepositoryName
-
-    -- * Destructuring the Response
-    , getLifecyclePolicyResponse
-    , GetLifecyclePolicyResponse
-    -- * Response Lenses
-    , glprsRegistryId
-    , glprsLastEvaluatedAt
-    , glprsLifecyclePolicyText
-    , glprsRepositoryName
-    , glprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getLifecyclePolicy' smart constructor.
-data GetLifecyclePolicy = GetLifecyclePolicy'
-  { _glpRegistryId     :: !(Maybe Text)
-  , _glpRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetLifecyclePolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'glpRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'glpRepositoryName' - The name of the repository.
-getLifecyclePolicy
-    :: Text -- ^ 'glpRepositoryName'
-    -> GetLifecyclePolicy
-getLifecyclePolicy pRepositoryName_ =
-  GetLifecyclePolicy'
-    {_glpRegistryId = Nothing, _glpRepositoryName = pRepositoryName_}
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-glpRegistryId :: Lens' GetLifecyclePolicy (Maybe Text)
-glpRegistryId = lens _glpRegistryId (\ s a -> s{_glpRegistryId = a})
-
--- | The name of the repository.
-glpRepositoryName :: Lens' GetLifecyclePolicy Text
-glpRepositoryName = lens _glpRepositoryName (\ s a -> s{_glpRepositoryName = a})
-
-instance AWSRequest GetLifecyclePolicy where
-        type Rs GetLifecyclePolicy =
-             GetLifecyclePolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetLifecyclePolicyResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "lastEvaluatedAt")
-                     <*> (x .?> "lifecyclePolicyText")
-                     <*> (x .?> "repositoryName")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable GetLifecyclePolicy where
-
-instance NFData GetLifecyclePolicy where
-
-instance ToHeaders GetLifecyclePolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetLifecyclePolicy where
-        toJSON GetLifecyclePolicy'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _glpRegistryId,
-                  Just ("repositoryName" .= _glpRepositoryName)])
-
-instance ToPath GetLifecyclePolicy where
-        toPath = const "/"
-
-instance ToQuery GetLifecyclePolicy where
-        toQuery = const mempty
-
--- | /See:/ 'getLifecyclePolicyResponse' smart constructor.
-data GetLifecyclePolicyResponse = GetLifecyclePolicyResponse'
-  { _glprsRegistryId          :: !(Maybe Text)
-  , _glprsLastEvaluatedAt     :: !(Maybe POSIX)
-  , _glprsLifecyclePolicyText :: !(Maybe Text)
-  , _glprsRepositoryName      :: !(Maybe Text)
-  , _glprsResponseStatus      :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetLifecyclePolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'glprsRegistryId' - The registry ID associated with the request.
---
--- * 'glprsLastEvaluatedAt' - The time stamp of the last time that the lifecycle policy was run.
---
--- * 'glprsLifecyclePolicyText' - The JSON lifecycle policy text.
---
--- * 'glprsRepositoryName' - The repository name associated with the request.
---
--- * 'glprsResponseStatus' - -- | The response status code.
-getLifecyclePolicyResponse
-    :: Int -- ^ 'glprsResponseStatus'
-    -> GetLifecyclePolicyResponse
-getLifecyclePolicyResponse pResponseStatus_ =
-  GetLifecyclePolicyResponse'
-    { _glprsRegistryId = Nothing
-    , _glprsLastEvaluatedAt = Nothing
-    , _glprsLifecyclePolicyText = Nothing
-    , _glprsRepositoryName = Nothing
-    , _glprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-glprsRegistryId :: Lens' GetLifecyclePolicyResponse (Maybe Text)
-glprsRegistryId = lens _glprsRegistryId (\ s a -> s{_glprsRegistryId = a})
-
--- | The time stamp of the last time that the lifecycle policy was run.
-glprsLastEvaluatedAt :: Lens' GetLifecyclePolicyResponse (Maybe UTCTime)
-glprsLastEvaluatedAt = lens _glprsLastEvaluatedAt (\ s a -> s{_glprsLastEvaluatedAt = a}) . mapping _Time
-
--- | The JSON lifecycle policy text.
-glprsLifecyclePolicyText :: Lens' GetLifecyclePolicyResponse (Maybe Text)
-glprsLifecyclePolicyText = lens _glprsLifecyclePolicyText (\ s a -> s{_glprsLifecyclePolicyText = a})
-
--- | The repository name associated with the request.
-glprsRepositoryName :: Lens' GetLifecyclePolicyResponse (Maybe Text)
-glprsRepositoryName = lens _glprsRepositoryName (\ s a -> s{_glprsRepositoryName = a})
-
--- | -- | The response status code.
-glprsResponseStatus :: Lens' GetLifecyclePolicyResponse Int
-glprsResponseStatus = lens _glprsResponseStatus (\ s a -> s{_glprsResponseStatus = a})
-
-instance NFData GetLifecyclePolicyResponse where
diff --git a/gen/Network/AWS/ECR/GetLifecyclePolicyPreview.hs b/gen/Network/AWS/ECR/GetLifecyclePolicyPreview.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/GetLifecyclePolicyPreview.hs
+++ /dev/null
@@ -1,250 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.GetLifecyclePolicyPreview
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves the results of the specified lifecycle policy preview request.
---
---
-module Network.AWS.ECR.GetLifecyclePolicyPreview
-    (
-    -- * Creating a Request
-      getLifecyclePolicyPreview
-    , GetLifecyclePolicyPreview
-    -- * Request Lenses
-    , glppRegistryId
-    , glppImageIds
-    , glppNextToken
-    , glppFilter
-    , glppMaxResults
-    , glppRepositoryName
-
-    -- * Destructuring the Response
-    , getLifecyclePolicyPreviewResponse
-    , GetLifecyclePolicyPreviewResponse
-    -- * Response Lenses
-    , glpprsSummary
-    , glpprsStatus
-    , glpprsRegistryId
-    , glpprsLifecyclePolicyText
-    , glpprsNextToken
-    , glpprsRepositoryName
-    , glpprsPreviewResults
-    , glpprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getLifecyclePolicyPreview' smart constructor.
-data GetLifecyclePolicyPreview = GetLifecyclePolicyPreview'
-  { _glppRegistryId     :: !(Maybe Text)
-  , _glppImageIds       :: !(Maybe [ImageIdentifier])
-  , _glppNextToken      :: !(Maybe Text)
-  , _glppFilter         :: !(Maybe LifecyclePolicyPreviewFilter)
-  , _glppMaxResults     :: !(Maybe Nat)
-  , _glppRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetLifecyclePolicyPreview' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'glppRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'glppImageIds' - The list of imageIDs to be included.
---
--- * 'glppNextToken' - The @nextToken@ value returned from a previous paginated  @GetLifecyclePolicyPreviewRequest@ request where @maxResults@ was used and the  results exceeded the value of that parameter. Pagination continues from the end of the  previous results that returned the @nextToken@ value. This value is  @null@ when there are no more results to return. This option cannot be used when you specify images with @imageIds@ .
---
--- * 'glppFilter' - An optional parameter that filters results based on image tag status and all tags, if tagged.
---
--- * 'glppMaxResults' - The maximum number of repository results returned by @GetLifecyclePolicyPreviewRequest@ in  paginated output. When this parameter is used, @GetLifecyclePolicyPreviewRequest@ only returns  @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending  another @GetLifecyclePolicyPreviewRequest@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this  parameter is not used, then @GetLifecyclePolicyPreviewRequest@ returns up to  100 results and a @nextToken@ value, if  applicable. This option cannot be used when you specify images with @imageIds@ .
---
--- * 'glppRepositoryName' - The name of the repository.
-getLifecyclePolicyPreview
-    :: Text -- ^ 'glppRepositoryName'
-    -> GetLifecyclePolicyPreview
-getLifecyclePolicyPreview pRepositoryName_ =
-  GetLifecyclePolicyPreview'
-    { _glppRegistryId = Nothing
-    , _glppImageIds = Nothing
-    , _glppNextToken = Nothing
-    , _glppFilter = Nothing
-    , _glppMaxResults = Nothing
-    , _glppRepositoryName = pRepositoryName_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-glppRegistryId :: Lens' GetLifecyclePolicyPreview (Maybe Text)
-glppRegistryId = lens _glppRegistryId (\ s a -> s{_glppRegistryId = a})
-
--- | The list of imageIDs to be included.
-glppImageIds :: Lens' GetLifecyclePolicyPreview [ImageIdentifier]
-glppImageIds = lens _glppImageIds (\ s a -> s{_glppImageIds = a}) . _Default . _Coerce
-
--- | The @nextToken@ value returned from a previous paginated  @GetLifecyclePolicyPreviewRequest@ request where @maxResults@ was used and the  results exceeded the value of that parameter. Pagination continues from the end of the  previous results that returned the @nextToken@ value. This value is  @null@ when there are no more results to return. This option cannot be used when you specify images with @imageIds@ .
-glppNextToken :: Lens' GetLifecyclePolicyPreview (Maybe Text)
-glppNextToken = lens _glppNextToken (\ s a -> s{_glppNextToken = a})
-
--- | An optional parameter that filters results based on image tag status and all tags, if tagged.
-glppFilter :: Lens' GetLifecyclePolicyPreview (Maybe LifecyclePolicyPreviewFilter)
-glppFilter = lens _glppFilter (\ s a -> s{_glppFilter = a})
-
--- | The maximum number of repository results returned by @GetLifecyclePolicyPreviewRequest@ in  paginated output. When this parameter is used, @GetLifecyclePolicyPreviewRequest@ only returns  @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending  another @GetLifecyclePolicyPreviewRequest@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this  parameter is not used, then @GetLifecyclePolicyPreviewRequest@ returns up to  100 results and a @nextToken@ value, if  applicable. This option cannot be used when you specify images with @imageIds@ .
-glppMaxResults :: Lens' GetLifecyclePolicyPreview (Maybe Natural)
-glppMaxResults = lens _glppMaxResults (\ s a -> s{_glppMaxResults = a}) . mapping _Nat
-
--- | The name of the repository.
-glppRepositoryName :: Lens' GetLifecyclePolicyPreview Text
-glppRepositoryName = lens _glppRepositoryName (\ s a -> s{_glppRepositoryName = a})
-
-instance AWSRequest GetLifecyclePolicyPreview where
-        type Rs GetLifecyclePolicyPreview =
-             GetLifecyclePolicyPreviewResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetLifecyclePolicyPreviewResponse' <$>
-                   (x .?> "summary") <*> (x .?> "status") <*>
-                     (x .?> "registryId")
-                     <*> (x .?> "lifecyclePolicyText")
-                     <*> (x .?> "nextToken")
-                     <*> (x .?> "repositoryName")
-                     <*> (x .?> "previewResults" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable GetLifecyclePolicyPreview where
-
-instance NFData GetLifecyclePolicyPreview where
-
-instance ToHeaders GetLifecyclePolicyPreview where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicyPreview"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetLifecyclePolicyPreview where
-        toJSON GetLifecyclePolicyPreview'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _glppRegistryId,
-                  ("imageIds" .=) <$> _glppImageIds,
-                  ("nextToken" .=) <$> _glppNextToken,
-                  ("filter" .=) <$> _glppFilter,
-                  ("maxResults" .=) <$> _glppMaxResults,
-                  Just ("repositoryName" .= _glppRepositoryName)])
-
-instance ToPath GetLifecyclePolicyPreview where
-        toPath = const "/"
-
-instance ToQuery GetLifecyclePolicyPreview where
-        toQuery = const mempty
-
--- | /See:/ 'getLifecyclePolicyPreviewResponse' smart constructor.
-data GetLifecyclePolicyPreviewResponse = GetLifecyclePolicyPreviewResponse'
-  { _glpprsSummary             :: !(Maybe LifecyclePolicyPreviewSummary)
-  , _glpprsStatus              :: !(Maybe LifecyclePolicyPreviewStatus)
-  , _glpprsRegistryId          :: !(Maybe Text)
-  , _glpprsLifecyclePolicyText :: !(Maybe Text)
-  , _glpprsNextToken           :: !(Maybe Text)
-  , _glpprsRepositoryName      :: !(Maybe Text)
-  , _glpprsPreviewResults      :: !(Maybe [LifecyclePolicyPreviewResult])
-  , _glpprsResponseStatus      :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetLifecyclePolicyPreviewResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'glpprsSummary' - The list of images that is returned as a result of the action.
---
--- * 'glpprsStatus' - The status of the lifecycle policy preview request.
---
--- * 'glpprsRegistryId' - The registry ID associated with the request.
---
--- * 'glpprsLifecyclePolicyText' - The JSON lifecycle policy text.
---
--- * 'glpprsNextToken' - The @nextToken@ value to include in a future @GetLifecyclePolicyPreview@ request. When the results of a @GetLifecyclePolicyPreview@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
---
--- * 'glpprsRepositoryName' - The repository name associated with the request.
---
--- * 'glpprsPreviewResults' - The results of the lifecycle policy preview request.
---
--- * 'glpprsResponseStatus' - -- | The response status code.
-getLifecyclePolicyPreviewResponse
-    :: Int -- ^ 'glpprsResponseStatus'
-    -> GetLifecyclePolicyPreviewResponse
-getLifecyclePolicyPreviewResponse pResponseStatus_ =
-  GetLifecyclePolicyPreviewResponse'
-    { _glpprsSummary = Nothing
-    , _glpprsStatus = Nothing
-    , _glpprsRegistryId = Nothing
-    , _glpprsLifecyclePolicyText = Nothing
-    , _glpprsNextToken = Nothing
-    , _glpprsRepositoryName = Nothing
-    , _glpprsPreviewResults = Nothing
-    , _glpprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The list of images that is returned as a result of the action.
-glpprsSummary :: Lens' GetLifecyclePolicyPreviewResponse (Maybe LifecyclePolicyPreviewSummary)
-glpprsSummary = lens _glpprsSummary (\ s a -> s{_glpprsSummary = a})
-
--- | The status of the lifecycle policy preview request.
-glpprsStatus :: Lens' GetLifecyclePolicyPreviewResponse (Maybe LifecyclePolicyPreviewStatus)
-glpprsStatus = lens _glpprsStatus (\ s a -> s{_glpprsStatus = a})
-
--- | The registry ID associated with the request.
-glpprsRegistryId :: Lens' GetLifecyclePolicyPreviewResponse (Maybe Text)
-glpprsRegistryId = lens _glpprsRegistryId (\ s a -> s{_glpprsRegistryId = a})
-
--- | The JSON lifecycle policy text.
-glpprsLifecyclePolicyText :: Lens' GetLifecyclePolicyPreviewResponse (Maybe Text)
-glpprsLifecyclePolicyText = lens _glpprsLifecyclePolicyText (\ s a -> s{_glpprsLifecyclePolicyText = a})
-
--- | The @nextToken@ value to include in a future @GetLifecyclePolicyPreview@ request. When the results of a @GetLifecyclePolicyPreview@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
-glpprsNextToken :: Lens' GetLifecyclePolicyPreviewResponse (Maybe Text)
-glpprsNextToken = lens _glpprsNextToken (\ s a -> s{_glpprsNextToken = a})
-
--- | The repository name associated with the request.
-glpprsRepositoryName :: Lens' GetLifecyclePolicyPreviewResponse (Maybe Text)
-glpprsRepositoryName = lens _glpprsRepositoryName (\ s a -> s{_glpprsRepositoryName = a})
-
--- | The results of the lifecycle policy preview request.
-glpprsPreviewResults :: Lens' GetLifecyclePolicyPreviewResponse [LifecyclePolicyPreviewResult]
-glpprsPreviewResults = lens _glpprsPreviewResults (\ s a -> s{_glpprsPreviewResults = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-glpprsResponseStatus :: Lens' GetLifecyclePolicyPreviewResponse Int
-glpprsResponseStatus = lens _glpprsResponseStatus (\ s a -> s{_glpprsResponseStatus = a})
-
-instance NFData GetLifecyclePolicyPreviewResponse
-         where
diff --git a/gen/Network/AWS/ECR/GetRepositoryPolicy.hs b/gen/Network/AWS/ECR/GetRepositoryPolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/GetRepositoryPolicy.hs
+++ /dev/null
@@ -1,167 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.GetRepositoryPolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Retrieves the repository policy for a specified repository.
---
---
-module Network.AWS.ECR.GetRepositoryPolicy
-    (
-    -- * Creating a Request
-      getRepositoryPolicy
-    , GetRepositoryPolicy
-    -- * Request Lenses
-    , grpRegistryId
-    , grpRepositoryName
-
-    -- * Destructuring the Response
-    , getRepositoryPolicyResponse
-    , GetRepositoryPolicyResponse
-    -- * Response Lenses
-    , grprsRegistryId
-    , grprsRepositoryName
-    , grprsPolicyText
-    , grprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'getRepositoryPolicy' smart constructor.
-data GetRepositoryPolicy = GetRepositoryPolicy'
-  { _grpRegistryId     :: !(Maybe Text)
-  , _grpRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetRepositoryPolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'grpRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'grpRepositoryName' - The name of the repository with the policy to retrieve.
-getRepositoryPolicy
-    :: Text -- ^ 'grpRepositoryName'
-    -> GetRepositoryPolicy
-getRepositoryPolicy pRepositoryName_ =
-  GetRepositoryPolicy'
-    {_grpRegistryId = Nothing, _grpRepositoryName = pRepositoryName_}
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-grpRegistryId :: Lens' GetRepositoryPolicy (Maybe Text)
-grpRegistryId = lens _grpRegistryId (\ s a -> s{_grpRegistryId = a})
-
--- | The name of the repository with the policy to retrieve.
-grpRepositoryName :: Lens' GetRepositoryPolicy Text
-grpRepositoryName = lens _grpRepositoryName (\ s a -> s{_grpRepositoryName = a})
-
-instance AWSRequest GetRepositoryPolicy where
-        type Rs GetRepositoryPolicy =
-             GetRepositoryPolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetRepositoryPolicyResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "repositoryName") <*>
-                     (x .?> "policyText")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable GetRepositoryPolicy where
-
-instance NFData GetRepositoryPolicy where
-
-instance ToHeaders GetRepositoryPolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.GetRepositoryPolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetRepositoryPolicy where
-        toJSON GetRepositoryPolicy'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _grpRegistryId,
-                  Just ("repositoryName" .= _grpRepositoryName)])
-
-instance ToPath GetRepositoryPolicy where
-        toPath = const "/"
-
-instance ToQuery GetRepositoryPolicy where
-        toQuery = const mempty
-
--- | /See:/ 'getRepositoryPolicyResponse' smart constructor.
-data GetRepositoryPolicyResponse = GetRepositoryPolicyResponse'
-  { _grprsRegistryId     :: !(Maybe Text)
-  , _grprsRepositoryName :: !(Maybe Text)
-  , _grprsPolicyText     :: !(Maybe Text)
-  , _grprsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetRepositoryPolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'grprsRegistryId' - The registry ID associated with the request.
---
--- * 'grprsRepositoryName' - The repository name associated with the request.
---
--- * 'grprsPolicyText' - The JSON repository policy text associated with the repository.
---
--- * 'grprsResponseStatus' - -- | The response status code.
-getRepositoryPolicyResponse
-    :: Int -- ^ 'grprsResponseStatus'
-    -> GetRepositoryPolicyResponse
-getRepositoryPolicyResponse pResponseStatus_ =
-  GetRepositoryPolicyResponse'
-    { _grprsRegistryId = Nothing
-    , _grprsRepositoryName = Nothing
-    , _grprsPolicyText = Nothing
-    , _grprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-grprsRegistryId :: Lens' GetRepositoryPolicyResponse (Maybe Text)
-grprsRegistryId = lens _grprsRegistryId (\ s a -> s{_grprsRegistryId = a})
-
--- | The repository name associated with the request.
-grprsRepositoryName :: Lens' GetRepositoryPolicyResponse (Maybe Text)
-grprsRepositoryName = lens _grprsRepositoryName (\ s a -> s{_grprsRepositoryName = a})
-
--- | The JSON repository policy text associated with the repository.
-grprsPolicyText :: Lens' GetRepositoryPolicyResponse (Maybe Text)
-grprsPolicyText = lens _grprsPolicyText (\ s a -> s{_grprsPolicyText = a})
-
--- | -- | The response status code.
-grprsResponseStatus :: Lens' GetRepositoryPolicyResponse Int
-grprsResponseStatus = lens _grprsResponseStatus (\ s a -> s{_grprsResponseStatus = a})
-
-instance NFData GetRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/InitiateLayerUpload.hs b/gen/Network/AWS/ECR/InitiateLayerUpload.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/InitiateLayerUpload.hs
+++ /dev/null
@@ -1,157 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.InitiateLayerUpload
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Notify Amazon ECR that you intend to upload an image layer.
---
---
-module Network.AWS.ECR.InitiateLayerUpload
-    (
-    -- * Creating a Request
-      initiateLayerUpload
-    , InitiateLayerUpload
-    -- * Request Lenses
-    , iluRegistryId
-    , iluRepositoryName
-
-    -- * Destructuring the Response
-    , initiateLayerUploadResponse
-    , InitiateLayerUploadResponse
-    -- * Response Lenses
-    , ilursPartSize
-    , ilursUploadId
-    , ilursResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'initiateLayerUpload' smart constructor.
-data InitiateLayerUpload = InitiateLayerUpload'
-  { _iluRegistryId     :: !(Maybe Text)
-  , _iluRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'InitiateLayerUpload' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'iluRegistryId' - The AWS account ID associated with the registry to which you intend to upload layers. If you do not specify a registry, the default registry is assumed.
---
--- * 'iluRepositoryName' - The name of the repository to which you intend to upload layers.
-initiateLayerUpload
-    :: Text -- ^ 'iluRepositoryName'
-    -> InitiateLayerUpload
-initiateLayerUpload pRepositoryName_ =
-  InitiateLayerUpload'
-    {_iluRegistryId = Nothing, _iluRepositoryName = pRepositoryName_}
-
-
--- | The AWS account ID associated with the registry to which you intend to upload layers. If you do not specify a registry, the default registry is assumed.
-iluRegistryId :: Lens' InitiateLayerUpload (Maybe Text)
-iluRegistryId = lens _iluRegistryId (\ s a -> s{_iluRegistryId = a})
-
--- | The name of the repository to which you intend to upload layers.
-iluRepositoryName :: Lens' InitiateLayerUpload Text
-iluRepositoryName = lens _iluRepositoryName (\ s a -> s{_iluRepositoryName = a})
-
-instance AWSRequest InitiateLayerUpload where
-        type Rs InitiateLayerUpload =
-             InitiateLayerUploadResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 InitiateLayerUploadResponse' <$>
-                   (x .?> "partSize") <*> (x .?> "uploadId") <*>
-                     (pure (fromEnum s)))
-
-instance Hashable InitiateLayerUpload where
-
-instance NFData InitiateLayerUpload where
-
-instance ToHeaders InitiateLayerUpload where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.InitiateLayerUpload"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON InitiateLayerUpload where
-        toJSON InitiateLayerUpload'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _iluRegistryId,
-                  Just ("repositoryName" .= _iluRepositoryName)])
-
-instance ToPath InitiateLayerUpload where
-        toPath = const "/"
-
-instance ToQuery InitiateLayerUpload where
-        toQuery = const mempty
-
--- | /See:/ 'initiateLayerUploadResponse' smart constructor.
-data InitiateLayerUploadResponse = InitiateLayerUploadResponse'
-  { _ilursPartSize       :: !(Maybe Nat)
-  , _ilursUploadId       :: !(Maybe Text)
-  , _ilursResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'InitiateLayerUploadResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ilursPartSize' - The size, in bytes, that Amazon ECR expects future layer part uploads to be.
---
--- * 'ilursUploadId' - The upload ID for the layer upload. This parameter is passed to further 'UploadLayerPart' and 'CompleteLayerUpload' operations.
---
--- * 'ilursResponseStatus' - -- | The response status code.
-initiateLayerUploadResponse
-    :: Int -- ^ 'ilursResponseStatus'
-    -> InitiateLayerUploadResponse
-initiateLayerUploadResponse pResponseStatus_ =
-  InitiateLayerUploadResponse'
-    { _ilursPartSize = Nothing
-    , _ilursUploadId = Nothing
-    , _ilursResponseStatus = pResponseStatus_
-    }
-
-
--- | The size, in bytes, that Amazon ECR expects future layer part uploads to be.
-ilursPartSize :: Lens' InitiateLayerUploadResponse (Maybe Natural)
-ilursPartSize = lens _ilursPartSize (\ s a -> s{_ilursPartSize = a}) . mapping _Nat
-
--- | The upload ID for the layer upload. This parameter is passed to further 'UploadLayerPart' and 'CompleteLayerUpload' operations.
-ilursUploadId :: Lens' InitiateLayerUploadResponse (Maybe Text)
-ilursUploadId = lens _ilursUploadId (\ s a -> s{_ilursUploadId = a})
-
--- | -- | The response status code.
-ilursResponseStatus :: Lens' InitiateLayerUploadResponse Int
-ilursResponseStatus = lens _ilursResponseStatus (\ s a -> s{_ilursResponseStatus = a})
-
-instance NFData InitiateLayerUploadResponse where
diff --git a/gen/Network/AWS/ECR/ListImages.hs b/gen/Network/AWS/ECR/ListImages.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/ListImages.hs
+++ /dev/null
@@ -1,200 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.ListImages
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Lists all the image IDs for a given repository.
---
---
--- You can filter images based on whether or not they are tagged by setting the @tagStatus@ parameter to @TAGGED@ or @UNTAGGED@ . For example, you can filter your results to return only @UNTAGGED@ images and then pipe that result to a 'BatchDeleteImage' operation to delete them. Or, you can filter your results to return only @TAGGED@ images to list all of the tags in your repository.
---
---
--- This operation returns paginated results.
-module Network.AWS.ECR.ListImages
-    (
-    -- * Creating a Request
-      listImages
-    , ListImages
-    -- * Request Lenses
-    , liRegistryId
-    , liNextToken
-    , liFilter
-    , liMaxResults
-    , liRepositoryName
-
-    -- * Destructuring the Response
-    , listImagesResponse
-    , ListImagesResponse
-    -- * Response Lenses
-    , lirsImageIds
-    , lirsNextToken
-    , lirsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Pager
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'listImages' smart constructor.
-data ListImages = ListImages'
-  { _liRegistryId     :: !(Maybe Text)
-  , _liNextToken      :: !(Maybe Text)
-  , _liFilter         :: !(Maybe ListImagesFilter)
-  , _liMaxResults     :: !(Maybe Nat)
-  , _liRepositoryName :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListImages' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'liRegistryId' - The AWS account ID associated with the registry that contains the repository in which to list images. If you do not specify a registry, the default registry is assumed.
---
--- * 'liNextToken' - The @nextToken@ value returned from a previous paginated @ListImages@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return.
---
--- * 'liFilter' - The filter key and value with which to filter your @ListImages@ results.
---
--- * 'liMaxResults' - The maximum number of image results returned by @ListImages@ in paginated output. When this parameter is used, @ListImages@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @ListImages@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @ListImages@ returns up to 100 results and a @nextToken@ value, if applicable.
---
--- * 'liRepositoryName' - The repository with image IDs to be listed.
-listImages
-    :: Text -- ^ 'liRepositoryName'
-    -> ListImages
-listImages pRepositoryName_ =
-  ListImages'
-    { _liRegistryId = Nothing
-    , _liNextToken = Nothing
-    , _liFilter = Nothing
-    , _liMaxResults = Nothing
-    , _liRepositoryName = pRepositoryName_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository in which to list images. If you do not specify a registry, the default registry is assumed.
-liRegistryId :: Lens' ListImages (Maybe Text)
-liRegistryId = lens _liRegistryId (\ s a -> s{_liRegistryId = a})
-
--- | The @nextToken@ value returned from a previous paginated @ListImages@ request where @maxResults@ was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the @nextToken@ value. This value is @null@ when there are no more results to return.
-liNextToken :: Lens' ListImages (Maybe Text)
-liNextToken = lens _liNextToken (\ s a -> s{_liNextToken = a})
-
--- | The filter key and value with which to filter your @ListImages@ results.
-liFilter :: Lens' ListImages (Maybe ListImagesFilter)
-liFilter = lens _liFilter (\ s a -> s{_liFilter = a})
-
--- | The maximum number of image results returned by @ListImages@ in paginated output. When this parameter is used, @ListImages@ only returns @maxResults@ results in a single page along with a @nextToken@ response element. The remaining results of the initial request can be seen by sending another @ListImages@ request with the returned @nextToken@ value. This value can be between 1 and 100. If this parameter is not used, then @ListImages@ returns up to 100 results and a @nextToken@ value, if applicable.
-liMaxResults :: Lens' ListImages (Maybe Natural)
-liMaxResults = lens _liMaxResults (\ s a -> s{_liMaxResults = a}) . mapping _Nat
-
--- | The repository with image IDs to be listed.
-liRepositoryName :: Lens' ListImages Text
-liRepositoryName = lens _liRepositoryName (\ s a -> s{_liRepositoryName = a})
-
-instance AWSPager ListImages where
-        page rq rs
-          | stop (rs ^. lirsNextToken) = Nothing
-          | stop (rs ^. lirsImageIds) = Nothing
-          | otherwise =
-            Just $ rq & liNextToken .~ rs ^. lirsNextToken
-
-instance AWSRequest ListImages where
-        type Rs ListImages = ListImagesResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 ListImagesResponse' <$>
-                   (x .?> "imageIds" .!@ mempty) <*> (x .?> "nextToken")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable ListImages where
-
-instance NFData ListImages where
-
-instance ToHeaders ListImages where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.ListImages" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON ListImages where
-        toJSON ListImages'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _liRegistryId,
-                  ("nextToken" .=) <$> _liNextToken,
-                  ("filter" .=) <$> _liFilter,
-                  ("maxResults" .=) <$> _liMaxResults,
-                  Just ("repositoryName" .= _liRepositoryName)])
-
-instance ToPath ListImages where
-        toPath = const "/"
-
-instance ToQuery ListImages where
-        toQuery = const mempty
-
--- | /See:/ 'listImagesResponse' smart constructor.
-data ListImagesResponse = ListImagesResponse'
-  { _lirsImageIds       :: !(Maybe [ImageIdentifier])
-  , _lirsNextToken      :: !(Maybe Text)
-  , _lirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListImagesResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lirsImageIds' - The list of image IDs for the requested repository.
---
--- * 'lirsNextToken' - The @nextToken@ value to include in a future @ListImages@ request. When the results of a @ListImages@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
---
--- * 'lirsResponseStatus' - -- | The response status code.
-listImagesResponse
-    :: Int -- ^ 'lirsResponseStatus'
-    -> ListImagesResponse
-listImagesResponse pResponseStatus_ =
-  ListImagesResponse'
-    { _lirsImageIds = Nothing
-    , _lirsNextToken = Nothing
-    , _lirsResponseStatus = pResponseStatus_
-    }
-
-
--- | The list of image IDs for the requested repository.
-lirsImageIds :: Lens' ListImagesResponse [ImageIdentifier]
-lirsImageIds = lens _lirsImageIds (\ s a -> s{_lirsImageIds = a}) . _Default . _Coerce
-
--- | The @nextToken@ value to include in a future @ListImages@ request. When the results of a @ListImages@ request exceed @maxResults@ , this value can be used to retrieve the next page of results. This value is @null@ when there are no more results to return.
-lirsNextToken :: Lens' ListImagesResponse (Maybe Text)
-lirsNextToken = lens _lirsNextToken (\ s a -> s{_lirsNextToken = a})
-
--- | -- | The response status code.
-lirsResponseStatus :: Lens' ListImagesResponse Int
-lirsResponseStatus = lens _lirsResponseStatus (\ s a -> s{_lirsResponseStatus = a})
-
-instance NFData ListImagesResponse where
diff --git a/gen/Network/AWS/ECR/PutImage.hs b/gen/Network/AWS/ECR/PutImage.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/PutImage.hs
+++ /dev/null
@@ -1,167 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.PutImage
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Creates or updates the image manifest and tags associated with an image.
---
---
-module Network.AWS.ECR.PutImage
-    (
-    -- * Creating a Request
-      putImage
-    , PutImage
-    -- * Request Lenses
-    , piRegistryId
-    , piImageTag
-    , piRepositoryName
-    , piImageManifest
-
-    -- * Destructuring the Response
-    , putImageResponse
-    , PutImageResponse
-    -- * Response Lenses
-    , pirsImage
-    , pirsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'putImage' smart constructor.
-data PutImage = PutImage'
-  { _piRegistryId     :: !(Maybe Text)
-  , _piImageTag       :: !(Maybe Text)
-  , _piRepositoryName :: !Text
-  , _piImageManifest  :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'PutImage' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'piRegistryId' - The AWS account ID associated with the registry that contains the repository in which to put the image. If you do not specify a registry, the default registry is assumed.
---
--- * 'piImageTag' - The tag to associate with the image. This parameter is required for images that use the Docker Image Manifest V2 Schema 2 or OCI formats.
---
--- * 'piRepositoryName' - The name of the repository in which to put the image.
---
--- * 'piImageManifest' - The image manifest corresponding to the image to be uploaded.
-putImage
-    :: Text -- ^ 'piRepositoryName'
-    -> Text -- ^ 'piImageManifest'
-    -> PutImage
-putImage pRepositoryName_ pImageManifest_ =
-  PutImage'
-    { _piRegistryId = Nothing
-    , _piImageTag = Nothing
-    , _piRepositoryName = pRepositoryName_
-    , _piImageManifest = pImageManifest_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository in which to put the image. If you do not specify a registry, the default registry is assumed.
-piRegistryId :: Lens' PutImage (Maybe Text)
-piRegistryId = lens _piRegistryId (\ s a -> s{_piRegistryId = a})
-
--- | The tag to associate with the image. This parameter is required for images that use the Docker Image Manifest V2 Schema 2 or OCI formats.
-piImageTag :: Lens' PutImage (Maybe Text)
-piImageTag = lens _piImageTag (\ s a -> s{_piImageTag = a})
-
--- | The name of the repository in which to put the image.
-piRepositoryName :: Lens' PutImage Text
-piRepositoryName = lens _piRepositoryName (\ s a -> s{_piRepositoryName = a})
-
--- | The image manifest corresponding to the image to be uploaded.
-piImageManifest :: Lens' PutImage Text
-piImageManifest = lens _piImageManifest (\ s a -> s{_piImageManifest = a})
-
-instance AWSRequest PutImage where
-        type Rs PutImage = PutImageResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 PutImageResponse' <$>
-                   (x .?> "image") <*> (pure (fromEnum s)))
-
-instance Hashable PutImage where
-
-instance NFData PutImage where
-
-instance ToHeaders PutImage where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.PutImage" ::
-                       ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON PutImage where
-        toJSON PutImage'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _piRegistryId,
-                  ("imageTag" .=) <$> _piImageTag,
-                  Just ("repositoryName" .= _piRepositoryName),
-                  Just ("imageManifest" .= _piImageManifest)])
-
-instance ToPath PutImage where
-        toPath = const "/"
-
-instance ToQuery PutImage where
-        toQuery = const mempty
-
--- | /See:/ 'putImageResponse' smart constructor.
-data PutImageResponse = PutImageResponse'
-  { _pirsImage          :: !(Maybe Image)
-  , _pirsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'PutImageResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'pirsImage' - Details of the image uploaded.
---
--- * 'pirsResponseStatus' - -- | The response status code.
-putImageResponse
-    :: Int -- ^ 'pirsResponseStatus'
-    -> PutImageResponse
-putImageResponse pResponseStatus_ =
-  PutImageResponse'
-    {_pirsImage = Nothing, _pirsResponseStatus = pResponseStatus_}
-
-
--- | Details of the image uploaded.
-pirsImage :: Lens' PutImageResponse (Maybe Image)
-pirsImage = lens _pirsImage (\ s a -> s{_pirsImage = a})
-
--- | -- | The response status code.
-pirsResponseStatus :: Lens' PutImageResponse Int
-pirsResponseStatus = lens _pirsResponseStatus (\ s a -> s{_pirsResponseStatus = a})
-
-instance NFData PutImageResponse where
diff --git a/gen/Network/AWS/ECR/PutLifecyclePolicy.hs b/gen/Network/AWS/ECR/PutLifecyclePolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/PutLifecyclePolicy.hs
+++ /dev/null
@@ -1,182 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.PutLifecyclePolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Creates or updates a lifecycle policy. For information about lifecycle policy syntax, see <http://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html Lifecycle Policy Template> .
---
---
-module Network.AWS.ECR.PutLifecyclePolicy
-    (
-    -- * Creating a Request
-      putLifecyclePolicy
-    , PutLifecyclePolicy
-    -- * Request Lenses
-    , plpRegistryId
-    , plpRepositoryName
-    , plpLifecyclePolicyText
-
-    -- * Destructuring the Response
-    , putLifecyclePolicyResponse
-    , PutLifecyclePolicyResponse
-    -- * Response Lenses
-    , plprsRegistryId
-    , plprsLifecyclePolicyText
-    , plprsRepositoryName
-    , plprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'putLifecyclePolicy' smart constructor.
-data PutLifecyclePolicy = PutLifecyclePolicy'
-  { _plpRegistryId          :: !(Maybe Text)
-  , _plpRepositoryName      :: !Text
-  , _plpLifecyclePolicyText :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'PutLifecyclePolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'plpRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do  not specify a registry, the default registry is assumed.
---
--- * 'plpRepositoryName' - The name of the repository to receive the policy.
---
--- * 'plpLifecyclePolicyText' - The JSON repository policy text to apply to the repository.
-putLifecyclePolicy
-    :: Text -- ^ 'plpRepositoryName'
-    -> Text -- ^ 'plpLifecyclePolicyText'
-    -> PutLifecyclePolicy
-putLifecyclePolicy pRepositoryName_ pLifecyclePolicyText_ =
-  PutLifecyclePolicy'
-    { _plpRegistryId = Nothing
-    , _plpRepositoryName = pRepositoryName_
-    , _plpLifecyclePolicyText = pLifecyclePolicyText_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do  not specify a registry, the default registry is assumed.
-plpRegistryId :: Lens' PutLifecyclePolicy (Maybe Text)
-plpRegistryId = lens _plpRegistryId (\ s a -> s{_plpRegistryId = a})
-
--- | The name of the repository to receive the policy.
-plpRepositoryName :: Lens' PutLifecyclePolicy Text
-plpRepositoryName = lens _plpRepositoryName (\ s a -> s{_plpRepositoryName = a})
-
--- | The JSON repository policy text to apply to the repository.
-plpLifecyclePolicyText :: Lens' PutLifecyclePolicy Text
-plpLifecyclePolicyText = lens _plpLifecyclePolicyText (\ s a -> s{_plpLifecyclePolicyText = a})
-
-instance AWSRequest PutLifecyclePolicy where
-        type Rs PutLifecyclePolicy =
-             PutLifecyclePolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 PutLifecyclePolicyResponse' <$>
-                   (x .?> "registryId") <*>
-                     (x .?> "lifecyclePolicyText")
-                     <*> (x .?> "repositoryName")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable PutLifecyclePolicy where
-
-instance NFData PutLifecyclePolicy where
-
-instance ToHeaders PutLifecyclePolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.PutLifecyclePolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON PutLifecyclePolicy where
-        toJSON PutLifecyclePolicy'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _plpRegistryId,
-                  Just ("repositoryName" .= _plpRepositoryName),
-                  Just
-                    ("lifecyclePolicyText" .= _plpLifecyclePolicyText)])
-
-instance ToPath PutLifecyclePolicy where
-        toPath = const "/"
-
-instance ToQuery PutLifecyclePolicy where
-        toQuery = const mempty
-
--- | /See:/ 'putLifecyclePolicyResponse' smart constructor.
-data PutLifecyclePolicyResponse = PutLifecyclePolicyResponse'
-  { _plprsRegistryId          :: !(Maybe Text)
-  , _plprsLifecyclePolicyText :: !(Maybe Text)
-  , _plprsRepositoryName      :: !(Maybe Text)
-  , _plprsResponseStatus      :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'PutLifecyclePolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'plprsRegistryId' - The registry ID associated with the request.
---
--- * 'plprsLifecyclePolicyText' - The JSON repository policy text.
---
--- * 'plprsRepositoryName' - The repository name associated with the request.
---
--- * 'plprsResponseStatus' - -- | The response status code.
-putLifecyclePolicyResponse
-    :: Int -- ^ 'plprsResponseStatus'
-    -> PutLifecyclePolicyResponse
-putLifecyclePolicyResponse pResponseStatus_ =
-  PutLifecyclePolicyResponse'
-    { _plprsRegistryId = Nothing
-    , _plprsLifecyclePolicyText = Nothing
-    , _plprsRepositoryName = Nothing
-    , _plprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-plprsRegistryId :: Lens' PutLifecyclePolicyResponse (Maybe Text)
-plprsRegistryId = lens _plprsRegistryId (\ s a -> s{_plprsRegistryId = a})
-
--- | The JSON repository policy text.
-plprsLifecyclePolicyText :: Lens' PutLifecyclePolicyResponse (Maybe Text)
-plprsLifecyclePolicyText = lens _plprsLifecyclePolicyText (\ s a -> s{_plprsLifecyclePolicyText = a})
-
--- | The repository name associated with the request.
-plprsRepositoryName :: Lens' PutLifecyclePolicyResponse (Maybe Text)
-plprsRepositoryName = lens _plprsRepositoryName (\ s a -> s{_plprsRepositoryName = a})
-
--- | -- | The response status code.
-plprsResponseStatus :: Lens' PutLifecyclePolicyResponse Int
-plprsResponseStatus = lens _plprsResponseStatus (\ s a -> s{_plprsResponseStatus = a})
-
-instance NFData PutLifecyclePolicyResponse where
diff --git a/gen/Network/AWS/ECR/SetRepositoryPolicy.hs b/gen/Network/AWS/ECR/SetRepositoryPolicy.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/SetRepositoryPolicy.hs
+++ /dev/null
@@ -1,190 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.SetRepositoryPolicy
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Applies a repository policy on a specified repository to control access permissions.
---
---
-module Network.AWS.ECR.SetRepositoryPolicy
-    (
-    -- * Creating a Request
-      setRepositoryPolicy
-    , SetRepositoryPolicy
-    -- * Request Lenses
-    , srpForce
-    , srpRegistryId
-    , srpRepositoryName
-    , srpPolicyText
-
-    -- * Destructuring the Response
-    , setRepositoryPolicyResponse
-    , SetRepositoryPolicyResponse
-    -- * Response Lenses
-    , srprsRegistryId
-    , srprsRepositoryName
-    , srprsPolicyText
-    , srprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'setRepositoryPolicy' smart constructor.
-data SetRepositoryPolicy = SetRepositoryPolicy'
-  { _srpForce          :: !(Maybe Bool)
-  , _srpRegistryId     :: !(Maybe Text)
-  , _srpRepositoryName :: !Text
-  , _srpPolicyText     :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'SetRepositoryPolicy' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'srpForce' - If the policy you are attempting to set on a repository policy would prevent you from setting another policy in the future, you must force the 'SetRepositoryPolicy' operation. This is intended to prevent accidental repository lock outs.
---
--- * 'srpRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'srpRepositoryName' - The name of the repository to receive the policy.
---
--- * 'srpPolicyText' - The JSON repository policy text to apply to the repository.
-setRepositoryPolicy
-    :: Text -- ^ 'srpRepositoryName'
-    -> Text -- ^ 'srpPolicyText'
-    -> SetRepositoryPolicy
-setRepositoryPolicy pRepositoryName_ pPolicyText_ =
-  SetRepositoryPolicy'
-    { _srpForce = Nothing
-    , _srpRegistryId = Nothing
-    , _srpRepositoryName = pRepositoryName_
-    , _srpPolicyText = pPolicyText_
-    }
-
-
--- | If the policy you are attempting to set on a repository policy would prevent you from setting another policy in the future, you must force the 'SetRepositoryPolicy' operation. This is intended to prevent accidental repository lock outs.
-srpForce :: Lens' SetRepositoryPolicy (Maybe Bool)
-srpForce = lens _srpForce (\ s a -> s{_srpForce = a})
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-srpRegistryId :: Lens' SetRepositoryPolicy (Maybe Text)
-srpRegistryId = lens _srpRegistryId (\ s a -> s{_srpRegistryId = a})
-
--- | The name of the repository to receive the policy.
-srpRepositoryName :: Lens' SetRepositoryPolicy Text
-srpRepositoryName = lens _srpRepositoryName (\ s a -> s{_srpRepositoryName = a})
-
--- | The JSON repository policy text to apply to the repository.
-srpPolicyText :: Lens' SetRepositoryPolicy Text
-srpPolicyText = lens _srpPolicyText (\ s a -> s{_srpPolicyText = a})
-
-instance AWSRequest SetRepositoryPolicy where
-        type Rs SetRepositoryPolicy =
-             SetRepositoryPolicyResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 SetRepositoryPolicyResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "repositoryName") <*>
-                     (x .?> "policyText")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable SetRepositoryPolicy where
-
-instance NFData SetRepositoryPolicy where
-
-instance ToHeaders SetRepositoryPolicy where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.SetRepositoryPolicy"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON SetRepositoryPolicy where
-        toJSON SetRepositoryPolicy'{..}
-          = object
-              (catMaybes
-                 [("force" .=) <$> _srpForce,
-                  ("registryId" .=) <$> _srpRegistryId,
-                  Just ("repositoryName" .= _srpRepositoryName),
-                  Just ("policyText" .= _srpPolicyText)])
-
-instance ToPath SetRepositoryPolicy where
-        toPath = const "/"
-
-instance ToQuery SetRepositoryPolicy where
-        toQuery = const mempty
-
--- | /See:/ 'setRepositoryPolicyResponse' smart constructor.
-data SetRepositoryPolicyResponse = SetRepositoryPolicyResponse'
-  { _srprsRegistryId     :: !(Maybe Text)
-  , _srprsRepositoryName :: !(Maybe Text)
-  , _srprsPolicyText     :: !(Maybe Text)
-  , _srprsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'SetRepositoryPolicyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'srprsRegistryId' - The registry ID associated with the request.
---
--- * 'srprsRepositoryName' - The repository name associated with the request.
---
--- * 'srprsPolicyText' - The JSON repository policy text applied to the repository.
---
--- * 'srprsResponseStatus' - -- | The response status code.
-setRepositoryPolicyResponse
-    :: Int -- ^ 'srprsResponseStatus'
-    -> SetRepositoryPolicyResponse
-setRepositoryPolicyResponse pResponseStatus_ =
-  SetRepositoryPolicyResponse'
-    { _srprsRegistryId = Nothing
-    , _srprsRepositoryName = Nothing
-    , _srprsPolicyText = Nothing
-    , _srprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-srprsRegistryId :: Lens' SetRepositoryPolicyResponse (Maybe Text)
-srprsRegistryId = lens _srprsRegistryId (\ s a -> s{_srprsRegistryId = a})
-
--- | The repository name associated with the request.
-srprsRepositoryName :: Lens' SetRepositoryPolicyResponse (Maybe Text)
-srprsRepositoryName = lens _srprsRepositoryName (\ s a -> s{_srprsRepositoryName = a})
-
--- | The JSON repository policy text applied to the repository.
-srprsPolicyText :: Lens' SetRepositoryPolicyResponse (Maybe Text)
-srprsPolicyText = lens _srprsPolicyText (\ s a -> s{_srprsPolicyText = a})
-
--- | -- | The response status code.
-srprsResponseStatus :: Lens' SetRepositoryPolicyResponse Int
-srprsResponseStatus = lens _srprsResponseStatus (\ s a -> s{_srprsResponseStatus = a})
-
-instance NFData SetRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs b/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs
+++ /dev/null
@@ -1,191 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.StartLifecyclePolicyPreview
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Starts a preview of the specified lifecycle policy. This allows you to see the results before creating the lifecycle policy.
---
---
-module Network.AWS.ECR.StartLifecyclePolicyPreview
-    (
-    -- * Creating a Request
-      startLifecyclePolicyPreview
-    , StartLifecyclePolicyPreview
-    -- * Request Lenses
-    , slppRegistryId
-    , slppLifecyclePolicyText
-    , slppRepositoryName
-
-    -- * Destructuring the Response
-    , startLifecyclePolicyPreviewResponse
-    , StartLifecyclePolicyPreviewResponse
-    -- * Response Lenses
-    , slpprsStatus
-    , slpprsRegistryId
-    , slpprsLifecyclePolicyText
-    , slpprsRepositoryName
-    , slpprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'startLifecyclePolicyPreview' smart constructor.
-data StartLifecyclePolicyPreview = StartLifecyclePolicyPreview'
-  { _slppRegistryId          :: !(Maybe Text)
-  , _slppLifecyclePolicyText :: !(Maybe Text)
-  , _slppRepositoryName      :: !Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StartLifecyclePolicyPreview' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'slppRegistryId' - The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
---
--- * 'slppLifecyclePolicyText' - The policy to be evaluated against. If you do not specify a policy, the current policy for the repository is used.
---
--- * 'slppRepositoryName' - The name of the repository to be evaluated.
-startLifecyclePolicyPreview
-    :: Text -- ^ 'slppRepositoryName'
-    -> StartLifecyclePolicyPreview
-startLifecyclePolicyPreview pRepositoryName_ =
-  StartLifecyclePolicyPreview'
-    { _slppRegistryId = Nothing
-    , _slppLifecyclePolicyText = Nothing
-    , _slppRepositoryName = pRepositoryName_
-    }
-
-
--- | The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed.
-slppRegistryId :: Lens' StartLifecyclePolicyPreview (Maybe Text)
-slppRegistryId = lens _slppRegistryId (\ s a -> s{_slppRegistryId = a})
-
--- | The policy to be evaluated against. If you do not specify a policy, the current policy for the repository is used.
-slppLifecyclePolicyText :: Lens' StartLifecyclePolicyPreview (Maybe Text)
-slppLifecyclePolicyText = lens _slppLifecyclePolicyText (\ s a -> s{_slppLifecyclePolicyText = a})
-
--- | The name of the repository to be evaluated.
-slppRepositoryName :: Lens' StartLifecyclePolicyPreview Text
-slppRepositoryName = lens _slppRepositoryName (\ s a -> s{_slppRepositoryName = a})
-
-instance AWSRequest StartLifecyclePolicyPreview where
-        type Rs StartLifecyclePolicyPreview =
-             StartLifecyclePolicyPreviewResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 StartLifecyclePolicyPreviewResponse' <$>
-                   (x .?> "status") <*> (x .?> "registryId") <*>
-                     (x .?> "lifecyclePolicyText")
-                     <*> (x .?> "repositoryName")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable StartLifecyclePolicyPreview where
-
-instance NFData StartLifecyclePolicyPreview where
-
-instance ToHeaders StartLifecyclePolicyPreview where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.StartLifecyclePolicyPreview"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON StartLifecyclePolicyPreview where
-        toJSON StartLifecyclePolicyPreview'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _slppRegistryId,
-                  ("lifecyclePolicyText" .=) <$>
-                    _slppLifecyclePolicyText,
-                  Just ("repositoryName" .= _slppRepositoryName)])
-
-instance ToPath StartLifecyclePolicyPreview where
-        toPath = const "/"
-
-instance ToQuery StartLifecyclePolicyPreview where
-        toQuery = const mempty
-
--- | /See:/ 'startLifecyclePolicyPreviewResponse' smart constructor.
-data StartLifecyclePolicyPreviewResponse = StartLifecyclePolicyPreviewResponse'
-  { _slpprsStatus              :: !(Maybe LifecyclePolicyPreviewStatus)
-  , _slpprsRegistryId          :: !(Maybe Text)
-  , _slpprsLifecyclePolicyText :: !(Maybe Text)
-  , _slpprsRepositoryName      :: !(Maybe Text)
-  , _slpprsResponseStatus      :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StartLifecyclePolicyPreviewResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'slpprsStatus' - The status of the lifecycle policy preview request.
---
--- * 'slpprsRegistryId' - The registry ID associated with the request.
---
--- * 'slpprsLifecyclePolicyText' - The JSON repository policy text.
---
--- * 'slpprsRepositoryName' - The repository name associated with the request.
---
--- * 'slpprsResponseStatus' - -- | The response status code.
-startLifecyclePolicyPreviewResponse
-    :: Int -- ^ 'slpprsResponseStatus'
-    -> StartLifecyclePolicyPreviewResponse
-startLifecyclePolicyPreviewResponse pResponseStatus_ =
-  StartLifecyclePolicyPreviewResponse'
-    { _slpprsStatus = Nothing
-    , _slpprsRegistryId = Nothing
-    , _slpprsLifecyclePolicyText = Nothing
-    , _slpprsRepositoryName = Nothing
-    , _slpprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The status of the lifecycle policy preview request.
-slpprsStatus :: Lens' StartLifecyclePolicyPreviewResponse (Maybe LifecyclePolicyPreviewStatus)
-slpprsStatus = lens _slpprsStatus (\ s a -> s{_slpprsStatus = a})
-
--- | The registry ID associated with the request.
-slpprsRegistryId :: Lens' StartLifecyclePolicyPreviewResponse (Maybe Text)
-slpprsRegistryId = lens _slpprsRegistryId (\ s a -> s{_slpprsRegistryId = a})
-
--- | The JSON repository policy text.
-slpprsLifecyclePolicyText :: Lens' StartLifecyclePolicyPreviewResponse (Maybe Text)
-slpprsLifecyclePolicyText = lens _slpprsLifecyclePolicyText (\ s a -> s{_slpprsLifecyclePolicyText = a})
-
--- | The repository name associated with the request.
-slpprsRepositoryName :: Lens' StartLifecyclePolicyPreviewResponse (Maybe Text)
-slpprsRepositoryName = lens _slpprsRepositoryName (\ s a -> s{_slpprsRepositoryName = a})
-
--- | -- | The response status code.
-slpprsResponseStatus :: Lens' StartLifecyclePolicyPreviewResponse Int
-slpprsResponseStatus = lens _slpprsResponseStatus (\ s a -> s{_slpprsResponseStatus = a})
-
-instance NFData StartLifecyclePolicyPreviewResponse
-         where
diff --git a/gen/Network/AWS/ECR/Types.hs b/gen/Network/AWS/ECR/Types.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/Types.hs
+++ /dev/null
@@ -1,349 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.Types
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.ECR.Types
-    (
-    -- * Service Configuration
-      ecr
-
-    -- * Errors
-    , _LayersNotFoundException
-    , _InvalidParameterException
-    , _LayerAlreadyExistsException
-    , _ServerException
-    , _LayerInaccessibleException
-    , _InvalidLayerException
-    , _LayerPartTooSmallException
-    , _LifecyclePolicyPreviewNotFoundException
-    , _ImageNotFoundException
-    , _ImageAlreadyExistsException
-    , _RepositoryNotFoundException
-    , _LifecyclePolicyPreviewInProgressException
-    , _UploadNotFoundException
-    , _LifecyclePolicyNotFoundException
-    , _InvalidLayerPartException
-    , _RepositoryNotEmptyException
-    , _RepositoryAlreadyExistsException
-    , _RepositoryPolicyNotFoundException
-    , _EmptyUploadException
-    , _LimitExceededException
-
-    -- * ImageActionType
-    , ImageActionType (..)
-
-    -- * ImageFailureCode
-    , ImageFailureCode (..)
-
-    -- * LayerAvailability
-    , LayerAvailability (..)
-
-    -- * LayerFailureCode
-    , LayerFailureCode (..)
-
-    -- * LifecyclePolicyPreviewStatus
-    , LifecyclePolicyPreviewStatus (..)
-
-    -- * TagStatus
-    , TagStatus (..)
-
-    -- * AuthorizationData
-    , AuthorizationData
-    , authorizationData
-    , adExpiresAt
-    , adProxyEndpoint
-    , adAuthorizationToken
-
-    -- * DescribeImagesFilter
-    , DescribeImagesFilter
-    , describeImagesFilter
-    , difTagStatus
-
-    -- * Image
-    , Image
-    , image
-    , iRegistryId
-    , iImageId
-    , iRepositoryName
-    , iImageManifest
-
-    -- * ImageDetail
-    , ImageDetail
-    , imageDetail
-    , idRegistryId
-    , idImageTags
-    , idImageSizeInBytes
-    , idImageDigest
-    , idImagePushedAt
-    , idRepositoryName
-
-    -- * ImageFailure
-    , ImageFailure
-    , imageFailure
-    , ifFailureReason
-    , ifFailureCode
-    , ifImageId
-
-    -- * ImageIdentifier
-    , ImageIdentifier
-    , imageIdentifier
-    , iiImageDigest
-    , iiImageTag
-
-    -- * Layer
-    , Layer
-    , layer
-    , lMediaType
-    , lLayerDigest
-    , lLayerSize
-    , lLayerAvailability
-
-    -- * LayerFailure
-    , LayerFailure
-    , layerFailure
-    , lfFailureReason
-    , lfFailureCode
-    , lfLayerDigest
-
-    -- * LifecyclePolicyPreviewFilter
-    , LifecyclePolicyPreviewFilter
-    , lifecyclePolicyPreviewFilter
-    , lppfTagStatus
-
-    -- * LifecyclePolicyPreviewResult
-    , LifecyclePolicyPreviewResult
-    , lifecyclePolicyPreviewResult
-    , lpprImageTags
-    , lpprAction
-    , lpprImageDigest
-    , lpprImagePushedAt
-    , lpprAppliedRulePriority
-
-    -- * LifecyclePolicyPreviewSummary
-    , LifecyclePolicyPreviewSummary
-    , lifecyclePolicyPreviewSummary
-    , lppsExpiringImageTotalCount
-
-    -- * LifecyclePolicyRuleAction
-    , LifecyclePolicyRuleAction
-    , lifecyclePolicyRuleAction
-    , lpraType
-
-    -- * ListImagesFilter
-    , ListImagesFilter
-    , listImagesFilter
-    , lifTagStatus
-
-    -- * Repository
-    , Repository
-    , repository
-    , rRepositoryARN
-    , rCreatedAt
-    , rRegistryId
-    , rRepositoryURI
-    , rRepositoryName
-    ) where
-
-import Network.AWS.ECR.Types.Product
-import Network.AWS.ECR.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Sign.V4
-
--- | API version @2015-09-21@ of the Amazon EC2 Container Registry SDK configuration.
-ecr :: Service
-ecr =
-  Service
-    { _svcAbbrev = "ECR"
-    , _svcSigner = v4
-    , _svcPrefix = "ecr"
-    , _svcVersion = "2015-09-21"
-    , _svcEndpoint = defaultEndpoint ecr
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "ECR"
-    , _svcRetry = retry
-    }
-  where
-    retry =
-      Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
-    check e
-      | has (hasCode "ThrottledException" . hasStatus 400) e =
-        Just "throttled_exception"
-      | has (hasStatus 429) e = Just "too_many_requests"
-      | has (hasCode "ThrottlingException" . hasStatus 400) e =
-        Just "throttling_exception"
-      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-      | has (hasStatus 504) e = Just "gateway_timeout"
-      | has (hasCode "RequestThrottledException" . hasStatus 400) e =
-        Just "request_throttled_exception"
-      | has (hasStatus 502) e = Just "bad_gateway"
-      | has (hasStatus 503) e = Just "service_unavailable"
-      | has (hasStatus 500) e = Just "general_server_error"
-      | has (hasStatus 509) e = Just "limit_exceeded"
-      | otherwise = Nothing
-
-
--- | The specified layers could not be found, or the specified layer is not valid for this repository.
---
---
-_LayersNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_LayersNotFoundException = _MatchServiceError ecr "LayersNotFoundException"
-
-
--- | The specified parameter is invalid. Review the available parameters for the API request.
---
---
-_InvalidParameterException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidParameterException = _MatchServiceError ecr "InvalidParameterException"
-
-
--- | The image layer already exists in the associated repository.
---
---
-_LayerAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
-_LayerAlreadyExistsException =
-  _MatchServiceError ecr "LayerAlreadyExistsException"
-
-
--- | These errors are usually caused by a server-side issue.
---
---
-_ServerException :: AsError a => Getting (First ServiceError) a ServiceError
-_ServerException = _MatchServiceError ecr "ServerException"
-
-
--- | The specified layer is not available because it is not associated with an image. Unassociated image layers may be cleaned up at any time.
---
---
-_LayerInaccessibleException :: AsError a => Getting (First ServiceError) a ServiceError
-_LayerInaccessibleException =
-  _MatchServiceError ecr "LayerInaccessibleException"
-
-
--- | The layer digest calculation performed by Amazon ECR upon receipt of the image layer does not match the digest specified.
---
---
-_InvalidLayerException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidLayerException = _MatchServiceError ecr "InvalidLayerException"
-
-
--- | Layer parts must be at least 5 MiB in size.
---
---
-_LayerPartTooSmallException :: AsError a => Getting (First ServiceError) a ServiceError
-_LayerPartTooSmallException =
-  _MatchServiceError ecr "LayerPartTooSmallException"
-
-
--- | There is no dry run for this repository.
---
---
-_LifecyclePolicyPreviewNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_LifecyclePolicyPreviewNotFoundException =
-  _MatchServiceError ecr "LifecyclePolicyPreviewNotFoundException"
-
-
--- | The image requested does not exist in the specified repository.
---
---
-_ImageNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_ImageNotFoundException = _MatchServiceError ecr "ImageNotFoundException"
-
-
--- | The specified image has already been pushed, and there were no changes to the manifest or image tag after the last push.
---
---
-_ImageAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
-_ImageAlreadyExistsException =
-  _MatchServiceError ecr "ImageAlreadyExistsException"
-
-
--- | The specified repository could not be found. Check the spelling of the specified repository and ensure that you are performing operations on the correct registry.
---
---
-_RepositoryNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_RepositoryNotFoundException =
-  _MatchServiceError ecr "RepositoryNotFoundException"
-
-
--- | The previous lifecycle policy preview request has not completed. Please try again later.
---
---
-_LifecyclePolicyPreviewInProgressException :: AsError a => Getting (First ServiceError) a ServiceError
-_LifecyclePolicyPreviewInProgressException =
-  _MatchServiceError ecr "LifecyclePolicyPreviewInProgressException"
-
-
--- | The upload could not be found, or the specified upload id is not valid for this repository.
---
---
-_UploadNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_UploadNotFoundException = _MatchServiceError ecr "UploadNotFoundException"
-
-
--- | The lifecycle policy could not be found, and no policy is set to the repository.
---
---
-_LifecyclePolicyNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_LifecyclePolicyNotFoundException =
-  _MatchServiceError ecr "LifecyclePolicyNotFoundException"
-
-
--- | The layer part size is not valid, or the first byte specified is not consecutive to the last byte of a previous layer part upload.
---
---
-_InvalidLayerPartException :: AsError a => Getting (First ServiceError) a ServiceError
-_InvalidLayerPartException = _MatchServiceError ecr "InvalidLayerPartException"
-
-
--- | The specified repository contains images. To delete a repository that contains images, you must force the deletion with the @force@ parameter.
---
---
-_RepositoryNotEmptyException :: AsError a => Getting (First ServiceError) a ServiceError
-_RepositoryNotEmptyException =
-  _MatchServiceError ecr "RepositoryNotEmptyException"
-
-
--- | The specified repository already exists in the specified registry.
---
---
-_RepositoryAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
-_RepositoryAlreadyExistsException =
-  _MatchServiceError ecr "RepositoryAlreadyExistsException"
-
-
--- | The specified repository and registry combination does not have an associated repository policy.
---
---
-_RepositoryPolicyNotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_RepositoryPolicyNotFoundException =
-  _MatchServiceError ecr "RepositoryPolicyNotFoundException"
-
-
--- | The specified layer upload does not contain any layer parts.
---
---
-_EmptyUploadException :: AsError a => Getting (First ServiceError) a ServiceError
-_EmptyUploadException = _MatchServiceError ecr "EmptyUploadException"
-
-
--- | The operation did not succeed because it would have exceeded a service limit for your account. For more information, see <http://docs.aws.amazon.com/AmazonECR/latest/userguide/service_limits.html Amazon ECR Default Service Limits> in the Amazon Elastic Container Registry User Guide.
---
---
-_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_LimitExceededException = _MatchServiceError ecr "LimitExceededException"
-
diff --git a/gen/Network/AWS/ECR/Types/Product.hs b/gen/Network/AWS/ECR/Types/Product.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/Types/Product.hs
+++ /dev/null
@@ -1,761 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.Types.Product
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.ECR.Types.Product where
-
-import Network.AWS.ECR.Types.Sum
-import Network.AWS.Lens
-import Network.AWS.Prelude
-
--- | An object representing authorization data for an Amazon ECR registry.
---
---
---
--- /See:/ 'authorizationData' smart constructor.
-data AuthorizationData = AuthorizationData'
-  { _adExpiresAt          :: !(Maybe POSIX)
-  , _adProxyEndpoint      :: !(Maybe Text)
-  , _adAuthorizationToken :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'AuthorizationData' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'adExpiresAt' - The Unix time in seconds and milliseconds when the authorization token expires. Authorization tokens are valid for 12 hours.
---
--- * 'adProxyEndpoint' - The registry URL to use for this authorization token in a @docker login@ command. The Amazon ECR registry URL format is @https://aws_account_id.dkr.ecr.region.amazonaws.com@ . For example, @https://012345678910.dkr.ecr.us-east-1.amazonaws.com@ ..
---
--- * 'adAuthorizationToken' - A base64-encoded string that contains authorization data for the specified Amazon ECR registry. When the string is decoded, it is presented in the format @user:password@ for private registry authentication using @docker login@ .
-authorizationData
-    :: AuthorizationData
-authorizationData =
-  AuthorizationData'
-    { _adExpiresAt = Nothing
-    , _adProxyEndpoint = Nothing
-    , _adAuthorizationToken = Nothing
-    }
-
-
--- | The Unix time in seconds and milliseconds when the authorization token expires. Authorization tokens are valid for 12 hours.
-adExpiresAt :: Lens' AuthorizationData (Maybe UTCTime)
-adExpiresAt = lens _adExpiresAt (\ s a -> s{_adExpiresAt = a}) . mapping _Time
-
--- | The registry URL to use for this authorization token in a @docker login@ command. The Amazon ECR registry URL format is @https://aws_account_id.dkr.ecr.region.amazonaws.com@ . For example, @https://012345678910.dkr.ecr.us-east-1.amazonaws.com@ ..
-adProxyEndpoint :: Lens' AuthorizationData (Maybe Text)
-adProxyEndpoint = lens _adProxyEndpoint (\ s a -> s{_adProxyEndpoint = a})
-
--- | A base64-encoded string that contains authorization data for the specified Amazon ECR registry. When the string is decoded, it is presented in the format @user:password@ for private registry authentication using @docker login@ .
-adAuthorizationToken :: Lens' AuthorizationData (Maybe Text)
-adAuthorizationToken = lens _adAuthorizationToken (\ s a -> s{_adAuthorizationToken = a})
-
-instance FromJSON AuthorizationData where
-        parseJSON
-          = withObject "AuthorizationData"
-              (\ x ->
-                 AuthorizationData' <$>
-                   (x .:? "expiresAt") <*> (x .:? "proxyEndpoint") <*>
-                     (x .:? "authorizationToken"))
-
-instance Hashable AuthorizationData where
-
-instance NFData AuthorizationData where
-
--- | An object representing a filter on a 'DescribeImages' operation.
---
---
---
--- /See:/ 'describeImagesFilter' smart constructor.
-newtype DescribeImagesFilter = DescribeImagesFilter'
-  { _difTagStatus :: Maybe TagStatus
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DescribeImagesFilter' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'difTagStatus' - The tag status with which to filter your 'DescribeImages' results. You can filter results based on whether they are @TAGGED@ or @UNTAGGED@ .
-describeImagesFilter
-    :: DescribeImagesFilter
-describeImagesFilter = DescribeImagesFilter' {_difTagStatus = Nothing}
-
-
--- | The tag status with which to filter your 'DescribeImages' results. You can filter results based on whether they are @TAGGED@ or @UNTAGGED@ .
-difTagStatus :: Lens' DescribeImagesFilter (Maybe TagStatus)
-difTagStatus = lens _difTagStatus (\ s a -> s{_difTagStatus = a})
-
-instance Hashable DescribeImagesFilter where
-
-instance NFData DescribeImagesFilter where
-
-instance ToJSON DescribeImagesFilter where
-        toJSON DescribeImagesFilter'{..}
-          = object
-              (catMaybes [("tagStatus" .=) <$> _difTagStatus])
-
--- | An object representing an Amazon ECR image.
---
---
---
--- /See:/ 'image' smart constructor.
-data Image = Image'
-  { _iRegistryId     :: !(Maybe Text)
-  , _iImageId        :: !(Maybe ImageIdentifier)
-  , _iRepositoryName :: !(Maybe Text)
-  , _iImageManifest  :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Image' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'iRegistryId' - The AWS account ID associated with the registry containing the image.
---
--- * 'iImageId' - An object containing the image tag and image digest associated with an image.
---
--- * 'iRepositoryName' - The name of the repository associated with the image.
---
--- * 'iImageManifest' - The image manifest associated with the image.
-image
-    :: Image
-image =
-  Image'
-    { _iRegistryId = Nothing
-    , _iImageId = Nothing
-    , _iRepositoryName = Nothing
-    , _iImageManifest = Nothing
-    }
-
-
--- | The AWS account ID associated with the registry containing the image.
-iRegistryId :: Lens' Image (Maybe Text)
-iRegistryId = lens _iRegistryId (\ s a -> s{_iRegistryId = a})
-
--- | An object containing the image tag and image digest associated with an image.
-iImageId :: Lens' Image (Maybe ImageIdentifier)
-iImageId = lens _iImageId (\ s a -> s{_iImageId = a})
-
--- | The name of the repository associated with the image.
-iRepositoryName :: Lens' Image (Maybe Text)
-iRepositoryName = lens _iRepositoryName (\ s a -> s{_iRepositoryName = a})
-
--- | The image manifest associated with the image.
-iImageManifest :: Lens' Image (Maybe Text)
-iImageManifest = lens _iImageManifest (\ s a -> s{_iImageManifest = a})
-
-instance FromJSON Image where
-        parseJSON
-          = withObject "Image"
-              (\ x ->
-                 Image' <$>
-                   (x .:? "registryId") <*> (x .:? "imageId") <*>
-                     (x .:? "repositoryName")
-                     <*> (x .:? "imageManifest"))
-
-instance Hashable Image where
-
-instance NFData Image where
-
--- | An object that describes an image returned by a 'DescribeImages' operation.
---
---
---
--- /See:/ 'imageDetail' smart constructor.
-data ImageDetail = ImageDetail'
-  { _idRegistryId       :: !(Maybe Text)
-  , _idImageTags        :: !(Maybe [Text])
-  , _idImageSizeInBytes :: !(Maybe Integer)
-  , _idImageDigest      :: !(Maybe Text)
-  , _idImagePushedAt    :: !(Maybe POSIX)
-  , _idRepositoryName   :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ImageDetail' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'idRegistryId' - The AWS account ID associated with the registry to which this image belongs.
---
--- * 'idImageTags' - The list of tags associated with this image.
---
--- * 'idImageSizeInBytes' - The size, in bytes, of the image in the repository.
---
--- * 'idImageDigest' - The @sha256@ digest of the image manifest.
---
--- * 'idImagePushedAt' - The date and time, expressed in standard JavaScript date format, at which the current image was pushed to the repository.
---
--- * 'idRepositoryName' - The name of the repository to which this image belongs.
-imageDetail
-    :: ImageDetail
-imageDetail =
-  ImageDetail'
-    { _idRegistryId = Nothing
-    , _idImageTags = Nothing
-    , _idImageSizeInBytes = Nothing
-    , _idImageDigest = Nothing
-    , _idImagePushedAt = Nothing
-    , _idRepositoryName = Nothing
-    }
-
-
--- | The AWS account ID associated with the registry to which this image belongs.
-idRegistryId :: Lens' ImageDetail (Maybe Text)
-idRegistryId = lens _idRegistryId (\ s a -> s{_idRegistryId = a})
-
--- | The list of tags associated with this image.
-idImageTags :: Lens' ImageDetail [Text]
-idImageTags = lens _idImageTags (\ s a -> s{_idImageTags = a}) . _Default . _Coerce
-
--- | The size, in bytes, of the image in the repository.
-idImageSizeInBytes :: Lens' ImageDetail (Maybe Integer)
-idImageSizeInBytes = lens _idImageSizeInBytes (\ s a -> s{_idImageSizeInBytes = a})
-
--- | The @sha256@ digest of the image manifest.
-idImageDigest :: Lens' ImageDetail (Maybe Text)
-idImageDigest = lens _idImageDigest (\ s a -> s{_idImageDigest = a})
-
--- | The date and time, expressed in standard JavaScript date format, at which the current image was pushed to the repository.
-idImagePushedAt :: Lens' ImageDetail (Maybe UTCTime)
-idImagePushedAt = lens _idImagePushedAt (\ s a -> s{_idImagePushedAt = a}) . mapping _Time
-
--- | The name of the repository to which this image belongs.
-idRepositoryName :: Lens' ImageDetail (Maybe Text)
-idRepositoryName = lens _idRepositoryName (\ s a -> s{_idRepositoryName = a})
-
-instance FromJSON ImageDetail where
-        parseJSON
-          = withObject "ImageDetail"
-              (\ x ->
-                 ImageDetail' <$>
-                   (x .:? "registryId") <*>
-                     (x .:? "imageTags" .!= mempty)
-                     <*> (x .:? "imageSizeInBytes")
-                     <*> (x .:? "imageDigest")
-                     <*> (x .:? "imagePushedAt")
-                     <*> (x .:? "repositoryName"))
-
-instance Hashable ImageDetail where
-
-instance NFData ImageDetail where
-
--- | An object representing an Amazon ECR image failure.
---
---
---
--- /See:/ 'imageFailure' smart constructor.
-data ImageFailure = ImageFailure'
-  { _ifFailureReason :: !(Maybe Text)
-  , _ifFailureCode   :: !(Maybe ImageFailureCode)
-  , _ifImageId       :: !(Maybe ImageIdentifier)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ImageFailure' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ifFailureReason' - The reason for the failure.
---
--- * 'ifFailureCode' - The code associated with the failure.
---
--- * 'ifImageId' - The image ID associated with the failure.
-imageFailure
-    :: ImageFailure
-imageFailure =
-  ImageFailure'
-    {_ifFailureReason = Nothing, _ifFailureCode = Nothing, _ifImageId = Nothing}
-
-
--- | The reason for the failure.
-ifFailureReason :: Lens' ImageFailure (Maybe Text)
-ifFailureReason = lens _ifFailureReason (\ s a -> s{_ifFailureReason = a})
-
--- | The code associated with the failure.
-ifFailureCode :: Lens' ImageFailure (Maybe ImageFailureCode)
-ifFailureCode = lens _ifFailureCode (\ s a -> s{_ifFailureCode = a})
-
--- | The image ID associated with the failure.
-ifImageId :: Lens' ImageFailure (Maybe ImageIdentifier)
-ifImageId = lens _ifImageId (\ s a -> s{_ifImageId = a})
-
-instance FromJSON ImageFailure where
-        parseJSON
-          = withObject "ImageFailure"
-              (\ x ->
-                 ImageFailure' <$>
-                   (x .:? "failureReason") <*> (x .:? "failureCode") <*>
-                     (x .:? "imageId"))
-
-instance Hashable ImageFailure where
-
-instance NFData ImageFailure where
-
--- | An object with identifying information for an Amazon ECR image.
---
---
---
--- /See:/ 'imageIdentifier' smart constructor.
-data ImageIdentifier = ImageIdentifier'
-  { _iiImageDigest :: !(Maybe Text)
-  , _iiImageTag    :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ImageIdentifier' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'iiImageDigest' - The @sha256@ digest of the image manifest.
---
--- * 'iiImageTag' - The tag used for the image.
-imageIdentifier
-    :: ImageIdentifier
-imageIdentifier =
-  ImageIdentifier' {_iiImageDigest = Nothing, _iiImageTag = Nothing}
-
-
--- | The @sha256@ digest of the image manifest.
-iiImageDigest :: Lens' ImageIdentifier (Maybe Text)
-iiImageDigest = lens _iiImageDigest (\ s a -> s{_iiImageDigest = a})
-
--- | The tag used for the image.
-iiImageTag :: Lens' ImageIdentifier (Maybe Text)
-iiImageTag = lens _iiImageTag (\ s a -> s{_iiImageTag = a})
-
-instance FromJSON ImageIdentifier where
-        parseJSON
-          = withObject "ImageIdentifier"
-              (\ x ->
-                 ImageIdentifier' <$>
-                   (x .:? "imageDigest") <*> (x .:? "imageTag"))
-
-instance Hashable ImageIdentifier where
-
-instance NFData ImageIdentifier where
-
-instance ToJSON ImageIdentifier where
-        toJSON ImageIdentifier'{..}
-          = object
-              (catMaybes
-                 [("imageDigest" .=) <$> _iiImageDigest,
-                  ("imageTag" .=) <$> _iiImageTag])
-
--- | An object representing an Amazon ECR image layer.
---
---
---
--- /See:/ 'layer' smart constructor.
-data Layer = Layer'
-  { _lMediaType         :: !(Maybe Text)
-  , _lLayerDigest       :: !(Maybe Text)
-  , _lLayerSize         :: !(Maybe Integer)
-  , _lLayerAvailability :: !(Maybe LayerAvailability)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Layer' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lMediaType' - The media type of the layer, such as @application/vnd.docker.image.rootfs.diff.tar.gzip@ or @application/vnd.oci.image.layer.v1.tar+gzip@ .
---
--- * 'lLayerDigest' - The @sha256@ digest of the image layer.
---
--- * 'lLayerSize' - The size, in bytes, of the image layer.
---
--- * 'lLayerAvailability' - The availability status of the image layer.
-layer
-    :: Layer
-layer =
-  Layer'
-    { _lMediaType = Nothing
-    , _lLayerDigest = Nothing
-    , _lLayerSize = Nothing
-    , _lLayerAvailability = Nothing
-    }
-
-
--- | The media type of the layer, such as @application/vnd.docker.image.rootfs.diff.tar.gzip@ or @application/vnd.oci.image.layer.v1.tar+gzip@ .
-lMediaType :: Lens' Layer (Maybe Text)
-lMediaType = lens _lMediaType (\ s a -> s{_lMediaType = a})
-
--- | The @sha256@ digest of the image layer.
-lLayerDigest :: Lens' Layer (Maybe Text)
-lLayerDigest = lens _lLayerDigest (\ s a -> s{_lLayerDigest = a})
-
--- | The size, in bytes, of the image layer.
-lLayerSize :: Lens' Layer (Maybe Integer)
-lLayerSize = lens _lLayerSize (\ s a -> s{_lLayerSize = a})
-
--- | The availability status of the image layer.
-lLayerAvailability :: Lens' Layer (Maybe LayerAvailability)
-lLayerAvailability = lens _lLayerAvailability (\ s a -> s{_lLayerAvailability = a})
-
-instance FromJSON Layer where
-        parseJSON
-          = withObject "Layer"
-              (\ x ->
-                 Layer' <$>
-                   (x .:? "mediaType") <*> (x .:? "layerDigest") <*>
-                     (x .:? "layerSize")
-                     <*> (x .:? "layerAvailability"))
-
-instance Hashable Layer where
-
-instance NFData Layer where
-
--- | An object representing an Amazon ECR image layer failure.
---
---
---
--- /See:/ 'layerFailure' smart constructor.
-data LayerFailure = LayerFailure'
-  { _lfFailureReason :: !(Maybe Text)
-  , _lfFailureCode   :: !(Maybe LayerFailureCode)
-  , _lfLayerDigest   :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'LayerFailure' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lfFailureReason' - The reason for the failure.
---
--- * 'lfFailureCode' - The failure code associated with the failure.
---
--- * 'lfLayerDigest' - The layer digest associated with the failure.
-layerFailure
-    :: LayerFailure
-layerFailure =
-  LayerFailure'
-    { _lfFailureReason = Nothing
-    , _lfFailureCode = Nothing
-    , _lfLayerDigest = Nothing
-    }
-
-
--- | The reason for the failure.
-lfFailureReason :: Lens' LayerFailure (Maybe Text)
-lfFailureReason = lens _lfFailureReason (\ s a -> s{_lfFailureReason = a})
-
--- | The failure code associated with the failure.
-lfFailureCode :: Lens' LayerFailure (Maybe LayerFailureCode)
-lfFailureCode = lens _lfFailureCode (\ s a -> s{_lfFailureCode = a})
-
--- | The layer digest associated with the failure.
-lfLayerDigest :: Lens' LayerFailure (Maybe Text)
-lfLayerDigest = lens _lfLayerDigest (\ s a -> s{_lfLayerDigest = a})
-
-instance FromJSON LayerFailure where
-        parseJSON
-          = withObject "LayerFailure"
-              (\ x ->
-                 LayerFailure' <$>
-                   (x .:? "failureReason") <*> (x .:? "failureCode") <*>
-                     (x .:? "layerDigest"))
-
-instance Hashable LayerFailure where
-
-instance NFData LayerFailure where
-
--- | The filter for the lifecycle policy preview.
---
---
---
--- /See:/ 'lifecyclePolicyPreviewFilter' smart constructor.
-newtype LifecyclePolicyPreviewFilter = LifecyclePolicyPreviewFilter'
-  { _lppfTagStatus :: Maybe TagStatus
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'LifecyclePolicyPreviewFilter' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lppfTagStatus' - The tag status of the image.
-lifecyclePolicyPreviewFilter
-    :: LifecyclePolicyPreviewFilter
-lifecyclePolicyPreviewFilter =
-  LifecyclePolicyPreviewFilter' {_lppfTagStatus = Nothing}
-
-
--- | The tag status of the image.
-lppfTagStatus :: Lens' LifecyclePolicyPreviewFilter (Maybe TagStatus)
-lppfTagStatus = lens _lppfTagStatus (\ s a -> s{_lppfTagStatus = a})
-
-instance Hashable LifecyclePolicyPreviewFilter where
-
-instance NFData LifecyclePolicyPreviewFilter where
-
-instance ToJSON LifecyclePolicyPreviewFilter where
-        toJSON LifecyclePolicyPreviewFilter'{..}
-          = object
-              (catMaybes [("tagStatus" .=) <$> _lppfTagStatus])
-
--- | The result of the lifecycle policy preview.
---
---
---
--- /See:/ 'lifecyclePolicyPreviewResult' smart constructor.
-data LifecyclePolicyPreviewResult = LifecyclePolicyPreviewResult'
-  { _lpprImageTags           :: !(Maybe [Text])
-  , _lpprAction              :: !(Maybe LifecyclePolicyRuleAction)
-  , _lpprImageDigest         :: !(Maybe Text)
-  , _lpprImagePushedAt       :: !(Maybe POSIX)
-  , _lpprAppliedRulePriority :: !(Maybe Nat)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'LifecyclePolicyPreviewResult' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lpprImageTags' - The list of tags associated with this image.
---
--- * 'lpprAction' - The type of action to be taken.
---
--- * 'lpprImageDigest' - The @sha256@ digest of the image manifest.
---
--- * 'lpprImagePushedAt' - The date and time, expressed in standard JavaScript date format, at which the current image was pushed to the repository.
---
--- * 'lpprAppliedRulePriority' - The priority of the applied rule.
-lifecyclePolicyPreviewResult
-    :: LifecyclePolicyPreviewResult
-lifecyclePolicyPreviewResult =
-  LifecyclePolicyPreviewResult'
-    { _lpprImageTags = Nothing
-    , _lpprAction = Nothing
-    , _lpprImageDigest = Nothing
-    , _lpprImagePushedAt = Nothing
-    , _lpprAppliedRulePriority = Nothing
-    }
-
-
--- | The list of tags associated with this image.
-lpprImageTags :: Lens' LifecyclePolicyPreviewResult [Text]
-lpprImageTags = lens _lpprImageTags (\ s a -> s{_lpprImageTags = a}) . _Default . _Coerce
-
--- | The type of action to be taken.
-lpprAction :: Lens' LifecyclePolicyPreviewResult (Maybe LifecyclePolicyRuleAction)
-lpprAction = lens _lpprAction (\ s a -> s{_lpprAction = a})
-
--- | The @sha256@ digest of the image manifest.
-lpprImageDigest :: Lens' LifecyclePolicyPreviewResult (Maybe Text)
-lpprImageDigest = lens _lpprImageDigest (\ s a -> s{_lpprImageDigest = a})
-
--- | The date and time, expressed in standard JavaScript date format, at which the current image was pushed to the repository.
-lpprImagePushedAt :: Lens' LifecyclePolicyPreviewResult (Maybe UTCTime)
-lpprImagePushedAt = lens _lpprImagePushedAt (\ s a -> s{_lpprImagePushedAt = a}) . mapping _Time
-
--- | The priority of the applied rule.
-lpprAppliedRulePriority :: Lens' LifecyclePolicyPreviewResult (Maybe Natural)
-lpprAppliedRulePriority = lens _lpprAppliedRulePriority (\ s a -> s{_lpprAppliedRulePriority = a}) . mapping _Nat
-
-instance FromJSON LifecyclePolicyPreviewResult where
-        parseJSON
-          = withObject "LifecyclePolicyPreviewResult"
-              (\ x ->
-                 LifecyclePolicyPreviewResult' <$>
-                   (x .:? "imageTags" .!= mempty) <*> (x .:? "action")
-                     <*> (x .:? "imageDigest")
-                     <*> (x .:? "imagePushedAt")
-                     <*> (x .:? "appliedRulePriority"))
-
-instance Hashable LifecyclePolicyPreviewResult where
-
-instance NFData LifecyclePolicyPreviewResult where
-
--- | The summary of the lifecycle policy preview request.
---
---
---
--- /See:/ 'lifecyclePolicyPreviewSummary' smart constructor.
-newtype LifecyclePolicyPreviewSummary = LifecyclePolicyPreviewSummary'
-  { _lppsExpiringImageTotalCount :: Maybe Nat
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'LifecyclePolicyPreviewSummary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lppsExpiringImageTotalCount' - The number of expiring images.
-lifecyclePolicyPreviewSummary
-    :: LifecyclePolicyPreviewSummary
-lifecyclePolicyPreviewSummary =
-  LifecyclePolicyPreviewSummary' {_lppsExpiringImageTotalCount = Nothing}
-
-
--- | The number of expiring images.
-lppsExpiringImageTotalCount :: Lens' LifecyclePolicyPreviewSummary (Maybe Natural)
-lppsExpiringImageTotalCount = lens _lppsExpiringImageTotalCount (\ s a -> s{_lppsExpiringImageTotalCount = a}) . mapping _Nat
-
-instance FromJSON LifecyclePolicyPreviewSummary where
-        parseJSON
-          = withObject "LifecyclePolicyPreviewSummary"
-              (\ x ->
-                 LifecyclePolicyPreviewSummary' <$>
-                   (x .:? "expiringImageTotalCount"))
-
-instance Hashable LifecyclePolicyPreviewSummary where
-
-instance NFData LifecyclePolicyPreviewSummary where
-
--- | The type of action to be taken.
---
---
---
--- /See:/ 'lifecyclePolicyRuleAction' smart constructor.
-newtype LifecyclePolicyRuleAction = LifecyclePolicyRuleAction'
-  { _lpraType :: Maybe ImageActionType
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'LifecyclePolicyRuleAction' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lpraType' - The type of action to be taken.
-lifecyclePolicyRuleAction
-    :: LifecyclePolicyRuleAction
-lifecyclePolicyRuleAction = LifecyclePolicyRuleAction' {_lpraType = Nothing}
-
-
--- | The type of action to be taken.
-lpraType :: Lens' LifecyclePolicyRuleAction (Maybe ImageActionType)
-lpraType = lens _lpraType (\ s a -> s{_lpraType = a})
-
-instance FromJSON LifecyclePolicyRuleAction where
-        parseJSON
-          = withObject "LifecyclePolicyRuleAction"
-              (\ x ->
-                 LifecyclePolicyRuleAction' <$> (x .:? "type"))
-
-instance Hashable LifecyclePolicyRuleAction where
-
-instance NFData LifecyclePolicyRuleAction where
-
--- | An object representing a filter on a 'ListImages' operation.
---
---
---
--- /See:/ 'listImagesFilter' smart constructor.
-newtype ListImagesFilter = ListImagesFilter'
-  { _lifTagStatus :: Maybe TagStatus
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListImagesFilter' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lifTagStatus' - The tag status with which to filter your 'ListImages' results. You can filter results based on whether they are @TAGGED@ or @UNTAGGED@ .
-listImagesFilter
-    :: ListImagesFilter
-listImagesFilter = ListImagesFilter' {_lifTagStatus = Nothing}
-
-
--- | The tag status with which to filter your 'ListImages' results. You can filter results based on whether they are @TAGGED@ or @UNTAGGED@ .
-lifTagStatus :: Lens' ListImagesFilter (Maybe TagStatus)
-lifTagStatus = lens _lifTagStatus (\ s a -> s{_lifTagStatus = a})
-
-instance Hashable ListImagesFilter where
-
-instance NFData ListImagesFilter where
-
-instance ToJSON ListImagesFilter where
-        toJSON ListImagesFilter'{..}
-          = object
-              (catMaybes [("tagStatus" .=) <$> _lifTagStatus])
-
--- | An object representing a repository.
---
---
---
--- /See:/ 'repository' smart constructor.
-data Repository = Repository'
-  { _rRepositoryARN  :: !(Maybe Text)
-  , _rCreatedAt      :: !(Maybe POSIX)
-  , _rRegistryId     :: !(Maybe Text)
-  , _rRepositoryURI  :: !(Maybe Text)
-  , _rRepositoryName :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Repository' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'rRepositoryARN' - The Amazon Resource Name (ARN) that identifies the repository. The ARN contains the @arn:aws:ecr@ namespace, followed by the region of the repository, AWS account ID of the repository owner, repository namespace, and repository name. For example, @arn:aws:ecr:region:012345678910:repository/test@ .
---
--- * 'rCreatedAt' - The date and time, in JavaScript date format, when the repository was created.
---
--- * 'rRegistryId' - The AWS account ID associated with the registry that contains the repository.
---
--- * 'rRepositoryURI' - The URI for the repository. You can use this URI for Docker @push@ or @pull@ operations.
---
--- * 'rRepositoryName' - The name of the repository.
-repository
-    :: Repository
-repository =
-  Repository'
-    { _rRepositoryARN = Nothing
-    , _rCreatedAt = Nothing
-    , _rRegistryId = Nothing
-    , _rRepositoryURI = Nothing
-    , _rRepositoryName = Nothing
-    }
-
-
--- | The Amazon Resource Name (ARN) that identifies the repository. The ARN contains the @arn:aws:ecr@ namespace, followed by the region of the repository, AWS account ID of the repository owner, repository namespace, and repository name. For example, @arn:aws:ecr:region:012345678910:repository/test@ .
-rRepositoryARN :: Lens' Repository (Maybe Text)
-rRepositoryARN = lens _rRepositoryARN (\ s a -> s{_rRepositoryARN = a})
-
--- | The date and time, in JavaScript date format, when the repository was created.
-rCreatedAt :: Lens' Repository (Maybe UTCTime)
-rCreatedAt = lens _rCreatedAt (\ s a -> s{_rCreatedAt = a}) . mapping _Time
-
--- | The AWS account ID associated with the registry that contains the repository.
-rRegistryId :: Lens' Repository (Maybe Text)
-rRegistryId = lens _rRegistryId (\ s a -> s{_rRegistryId = a})
-
--- | The URI for the repository. You can use this URI for Docker @push@ or @pull@ operations.
-rRepositoryURI :: Lens' Repository (Maybe Text)
-rRepositoryURI = lens _rRepositoryURI (\ s a -> s{_rRepositoryURI = a})
-
--- | The name of the repository.
-rRepositoryName :: Lens' Repository (Maybe Text)
-rRepositoryName = lens _rRepositoryName (\ s a -> s{_rRepositoryName = a})
-
-instance FromJSON Repository where
-        parseJSON
-          = withObject "Repository"
-              (\ x ->
-                 Repository' <$>
-                   (x .:? "repositoryArn") <*> (x .:? "createdAt") <*>
-                     (x .:? "registryId")
-                     <*> (x .:? "repositoryUri")
-                     <*> (x .:? "repositoryName"))
-
-instance Hashable Repository where
-
-instance NFData Repository where
diff --git a/gen/Network/AWS/ECR/Types/Sum.hs b/gen/Network/AWS/ECR/Types/Sum.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/Types/Sum.hs
+++ /dev/null
@@ -1,194 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.Types.Sum
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.ECR.Types.Sum where
-
-import Network.AWS.Prelude
-
-data ImageActionType =
-  Expire
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText ImageActionType where
-    parser = takeLowerText >>= \case
-        "expire" -> pure Expire
-        e -> fromTextError $ "Failure parsing ImageActionType from value: '" <> e
-           <> "'. Accepted values: expire"
-
-instance ToText ImageActionType where
-    toText = \case
-        Expire -> "EXPIRE"
-
-instance Hashable     ImageActionType
-instance NFData       ImageActionType
-instance ToByteString ImageActionType
-instance ToQuery      ImageActionType
-instance ToHeader     ImageActionType
-
-instance FromJSON ImageActionType where
-    parseJSON = parseJSONText "ImageActionType"
-
-data ImageFailureCode
-  = ImageNotFound
-  | ImageTagDoesNotMatchDigest
-  | InvalidImageDigest
-  | InvalidImageTag
-  | MissingDigestAndTag
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText ImageFailureCode where
-    parser = takeLowerText >>= \case
-        "imagenotfound" -> pure ImageNotFound
-        "imagetagdoesnotmatchdigest" -> pure ImageTagDoesNotMatchDigest
-        "invalidimagedigest" -> pure InvalidImageDigest
-        "invalidimagetag" -> pure InvalidImageTag
-        "missingdigestandtag" -> pure MissingDigestAndTag
-        e -> fromTextError $ "Failure parsing ImageFailureCode from value: '" <> e
-           <> "'. Accepted values: imagenotfound, imagetagdoesnotmatchdigest, invalidimagedigest, invalidimagetag, missingdigestandtag"
-
-instance ToText ImageFailureCode where
-    toText = \case
-        ImageNotFound -> "ImageNotFound"
-        ImageTagDoesNotMatchDigest -> "ImageTagDoesNotMatchDigest"
-        InvalidImageDigest -> "InvalidImageDigest"
-        InvalidImageTag -> "InvalidImageTag"
-        MissingDigestAndTag -> "MissingDigestAndTag"
-
-instance Hashable     ImageFailureCode
-instance NFData       ImageFailureCode
-instance ToByteString ImageFailureCode
-instance ToQuery      ImageFailureCode
-instance ToHeader     ImageFailureCode
-
-instance FromJSON ImageFailureCode where
-    parseJSON = parseJSONText "ImageFailureCode"
-
-data LayerAvailability
-  = Available
-  | Unavailable
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText LayerAvailability where
-    parser = takeLowerText >>= \case
-        "available" -> pure Available
-        "unavailable" -> pure Unavailable
-        e -> fromTextError $ "Failure parsing LayerAvailability from value: '" <> e
-           <> "'. Accepted values: available, unavailable"
-
-instance ToText LayerAvailability where
-    toText = \case
-        Available -> "AVAILABLE"
-        Unavailable -> "UNAVAILABLE"
-
-instance Hashable     LayerAvailability
-instance NFData       LayerAvailability
-instance ToByteString LayerAvailability
-instance ToQuery      LayerAvailability
-instance ToHeader     LayerAvailability
-
-instance FromJSON LayerAvailability where
-    parseJSON = parseJSONText "LayerAvailability"
-
-data LayerFailureCode
-  = InvalidLayerDigest
-  | MissingLayerDigest
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText LayerFailureCode where
-    parser = takeLowerText >>= \case
-        "invalidlayerdigest" -> pure InvalidLayerDigest
-        "missinglayerdigest" -> pure MissingLayerDigest
-        e -> fromTextError $ "Failure parsing LayerFailureCode from value: '" <> e
-           <> "'. Accepted values: invalidlayerdigest, missinglayerdigest"
-
-instance ToText LayerFailureCode where
-    toText = \case
-        InvalidLayerDigest -> "InvalidLayerDigest"
-        MissingLayerDigest -> "MissingLayerDigest"
-
-instance Hashable     LayerFailureCode
-instance NFData       LayerFailureCode
-instance ToByteString LayerFailureCode
-instance ToQuery      LayerFailureCode
-instance ToHeader     LayerFailureCode
-
-instance FromJSON LayerFailureCode where
-    parseJSON = parseJSONText "LayerFailureCode"
-
-data LifecyclePolicyPreviewStatus
-  = Complete
-  | Expired
-  | Failed
-  | InProgress
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText LifecyclePolicyPreviewStatus where
-    parser = takeLowerText >>= \case
-        "complete" -> pure Complete
-        "expired" -> pure Expired
-        "failed" -> pure Failed
-        "in_progress" -> pure InProgress
-        e -> fromTextError $ "Failure parsing LifecyclePolicyPreviewStatus from value: '" <> e
-           <> "'. Accepted values: complete, expired, failed, in_progress"
-
-instance ToText LifecyclePolicyPreviewStatus where
-    toText = \case
-        Complete -> "COMPLETE"
-        Expired -> "EXPIRED"
-        Failed -> "FAILED"
-        InProgress -> "IN_PROGRESS"
-
-instance Hashable     LifecyclePolicyPreviewStatus
-instance NFData       LifecyclePolicyPreviewStatus
-instance ToByteString LifecyclePolicyPreviewStatus
-instance ToQuery      LifecyclePolicyPreviewStatus
-instance ToHeader     LifecyclePolicyPreviewStatus
-
-instance FromJSON LifecyclePolicyPreviewStatus where
-    parseJSON = parseJSONText "LifecyclePolicyPreviewStatus"
-
-data TagStatus
-  = Tagged
-  | Untagged
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText TagStatus where
-    parser = takeLowerText >>= \case
-        "tagged" -> pure Tagged
-        "untagged" -> pure Untagged
-        e -> fromTextError $ "Failure parsing TagStatus from value: '" <> e
-           <> "'. Accepted values: tagged, untagged"
-
-instance ToText TagStatus where
-    toText = \case
-        Tagged -> "TAGGED"
-        Untagged -> "UNTAGGED"
-
-instance Hashable     TagStatus
-instance NFData       TagStatus
-instance ToByteString TagStatus
-instance ToQuery      TagStatus
-instance ToHeader     TagStatus
-
-instance ToJSON TagStatus where
-    toJSON = toJSONText
diff --git a/gen/Network/AWS/ECR/UploadLayerPart.hs b/gen/Network/AWS/ECR/UploadLayerPart.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/UploadLayerPart.hs
+++ /dev/null
@@ -1,222 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.UploadLayerPart
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Uploads an image layer part to Amazon ECR.
---
---
-module Network.AWS.ECR.UploadLayerPart
-    (
-    -- * Creating a Request
-      uploadLayerPart
-    , UploadLayerPart
-    -- * Request Lenses
-    , ulpRegistryId
-    , ulpRepositoryName
-    , ulpUploadId
-    , ulpPartFirstByte
-    , ulpPartLastByte
-    , ulpLayerPartBlob
-
-    -- * Destructuring the Response
-    , uploadLayerPartResponse
-    , UploadLayerPartResponse
-    -- * Response Lenses
-    , ulprsRegistryId
-    , ulprsLastByteReceived
-    , ulprsRepositoryName
-    , ulprsUploadId
-    , ulprsResponseStatus
-    ) where
-
-import Network.AWS.ECR.Types
-import Network.AWS.ECR.Types.Product
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-
--- | /See:/ 'uploadLayerPart' smart constructor.
-data UploadLayerPart = UploadLayerPart'
-  { _ulpRegistryId     :: !(Maybe Text)
-  , _ulpRepositoryName :: !Text
-  , _ulpUploadId       :: !Text
-  , _ulpPartFirstByte  :: !Nat
-  , _ulpPartLastByte   :: !Nat
-  , _ulpLayerPartBlob  :: !Base64
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UploadLayerPart' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ulpRegistryId' - The AWS account ID associated with the registry to which you are uploading layer parts. If you do not specify a registry, the default registry is assumed.
---
--- * 'ulpRepositoryName' - The name of the repository to which you are uploading layer parts.
---
--- * 'ulpUploadId' - The upload ID from a previous 'InitiateLayerUpload' operation to associate with the layer part upload.
---
--- * 'ulpPartFirstByte' - The integer value of the first byte of the layer part.
---
--- * 'ulpPartLastByte' - The integer value of the last byte of the layer part.
---
--- * 'ulpLayerPartBlob' - The base64-encoded layer part payload.-- /Note:/ This 'Lens' automatically encodes and decodes Base64 data. The underlying isomorphism will encode to Base64 representation during serialisation, and decode from Base64 representation during deserialisation. This 'Lens' accepts and returns only raw unencoded data.
-uploadLayerPart
-    :: Text -- ^ 'ulpRepositoryName'
-    -> Text -- ^ 'ulpUploadId'
-    -> Natural -- ^ 'ulpPartFirstByte'
-    -> Natural -- ^ 'ulpPartLastByte'
-    -> ByteString -- ^ 'ulpLayerPartBlob'
-    -> UploadLayerPart
-uploadLayerPart pRepositoryName_ pUploadId_ pPartFirstByte_ pPartLastByte_ pLayerPartBlob_ =
-  UploadLayerPart'
-    { _ulpRegistryId = Nothing
-    , _ulpRepositoryName = pRepositoryName_
-    , _ulpUploadId = pUploadId_
-    , _ulpPartFirstByte = _Nat # pPartFirstByte_
-    , _ulpPartLastByte = _Nat # pPartLastByte_
-    , _ulpLayerPartBlob = _Base64 # pLayerPartBlob_
-    }
-
-
--- | The AWS account ID associated with the registry to which you are uploading layer parts. If you do not specify a registry, the default registry is assumed.
-ulpRegistryId :: Lens' UploadLayerPart (Maybe Text)
-ulpRegistryId = lens _ulpRegistryId (\ s a -> s{_ulpRegistryId = a})
-
--- | The name of the repository to which you are uploading layer parts.
-ulpRepositoryName :: Lens' UploadLayerPart Text
-ulpRepositoryName = lens _ulpRepositoryName (\ s a -> s{_ulpRepositoryName = a})
-
--- | The upload ID from a previous 'InitiateLayerUpload' operation to associate with the layer part upload.
-ulpUploadId :: Lens' UploadLayerPart Text
-ulpUploadId = lens _ulpUploadId (\ s a -> s{_ulpUploadId = a})
-
--- | The integer value of the first byte of the layer part.
-ulpPartFirstByte :: Lens' UploadLayerPart Natural
-ulpPartFirstByte = lens _ulpPartFirstByte (\ s a -> s{_ulpPartFirstByte = a}) . _Nat
-
--- | The integer value of the last byte of the layer part.
-ulpPartLastByte :: Lens' UploadLayerPart Natural
-ulpPartLastByte = lens _ulpPartLastByte (\ s a -> s{_ulpPartLastByte = a}) . _Nat
-
--- | The base64-encoded layer part payload.-- /Note:/ This 'Lens' automatically encodes and decodes Base64 data. The underlying isomorphism will encode to Base64 representation during serialisation, and decode from Base64 representation during deserialisation. This 'Lens' accepts and returns only raw unencoded data.
-ulpLayerPartBlob :: Lens' UploadLayerPart ByteString
-ulpLayerPartBlob = lens _ulpLayerPartBlob (\ s a -> s{_ulpLayerPartBlob = a}) . _Base64
-
-instance AWSRequest UploadLayerPart where
-        type Rs UploadLayerPart = UploadLayerPartResponse
-        request = postJSON ecr
-        response
-          = receiveJSON
-              (\ s h x ->
-                 UploadLayerPartResponse' <$>
-                   (x .?> "registryId") <*> (x .?> "lastByteReceived")
-                     <*> (x .?> "repositoryName")
-                     <*> (x .?> "uploadId")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable UploadLayerPart where
-
-instance NFData UploadLayerPart where
-
-instance ToHeaders UploadLayerPart where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("AmazonEC2ContainerRegistry_V20150921.UploadLayerPart"
-                       :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON UploadLayerPart where
-        toJSON UploadLayerPart'{..}
-          = object
-              (catMaybes
-                 [("registryId" .=) <$> _ulpRegistryId,
-                  Just ("repositoryName" .= _ulpRepositoryName),
-                  Just ("uploadId" .= _ulpUploadId),
-                  Just ("partFirstByte" .= _ulpPartFirstByte),
-                  Just ("partLastByte" .= _ulpPartLastByte),
-                  Just ("layerPartBlob" .= _ulpLayerPartBlob)])
-
-instance ToPath UploadLayerPart where
-        toPath = const "/"
-
-instance ToQuery UploadLayerPart where
-        toQuery = const mempty
-
--- | /See:/ 'uploadLayerPartResponse' smart constructor.
-data UploadLayerPartResponse = UploadLayerPartResponse'
-  { _ulprsRegistryId       :: !(Maybe Text)
-  , _ulprsLastByteReceived :: !(Maybe Nat)
-  , _ulprsRepositoryName   :: !(Maybe Text)
-  , _ulprsUploadId         :: !(Maybe Text)
-  , _ulprsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UploadLayerPartResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ulprsRegistryId' - The registry ID associated with the request.
---
--- * 'ulprsLastByteReceived' - The integer value of the last byte received in the request.
---
--- * 'ulprsRepositoryName' - The repository name associated with the request.
---
--- * 'ulprsUploadId' - The upload ID associated with the request.
---
--- * 'ulprsResponseStatus' - -- | The response status code.
-uploadLayerPartResponse
-    :: Int -- ^ 'ulprsResponseStatus'
-    -> UploadLayerPartResponse
-uploadLayerPartResponse pResponseStatus_ =
-  UploadLayerPartResponse'
-    { _ulprsRegistryId = Nothing
-    , _ulprsLastByteReceived = Nothing
-    , _ulprsRepositoryName = Nothing
-    , _ulprsUploadId = Nothing
-    , _ulprsResponseStatus = pResponseStatus_
-    }
-
-
--- | The registry ID associated with the request.
-ulprsRegistryId :: Lens' UploadLayerPartResponse (Maybe Text)
-ulprsRegistryId = lens _ulprsRegistryId (\ s a -> s{_ulprsRegistryId = a})
-
--- | The integer value of the last byte received in the request.
-ulprsLastByteReceived :: Lens' UploadLayerPartResponse (Maybe Natural)
-ulprsLastByteReceived = lens _ulprsLastByteReceived (\ s a -> s{_ulprsLastByteReceived = a}) . mapping _Nat
-
--- | The repository name associated with the request.
-ulprsRepositoryName :: Lens' UploadLayerPartResponse (Maybe Text)
-ulprsRepositoryName = lens _ulprsRepositoryName (\ s a -> s{_ulprsRepositoryName = a})
-
--- | The upload ID associated with the request.
-ulprsUploadId :: Lens' UploadLayerPartResponse (Maybe Text)
-ulprsUploadId = lens _ulprsUploadId (\ s a -> s{_ulprsUploadId = a})
-
--- | -- | The response status code.
-ulprsResponseStatus :: Lens' UploadLayerPartResponse Int
-ulprsResponseStatus = lens _ulprsResponseStatus (\ s a -> s{_ulprsResponseStatus = a})
-
-instance NFData UploadLayerPartResponse where
diff --git a/gen/Network/AWS/ECR/Waiters.hs b/gen/Network/AWS/ECR/Waiters.hs
deleted file mode 100644
--- a/gen/Network/AWS/ECR/Waiters.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.ECR.Waiters
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.ECR.Waiters where
-
-import Network.AWS.ECR.Types
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,20 +2,22 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2018 Brendan Hay
+-- Copyright   : (c) 2013-2023 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Maintainer  : Brendan Hay
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
---
 module Main (main) where
 
+import Test.Amazonka.ECR
+import Test.Amazonka.ECR.Internal
 import Test.Tasty
-import Test.AWS.ECR
-import Test.AWS.ECR.Internal
 
 main :: IO ()
-main = defaultMain $ testGroup "ECR"
-    [ testGroup "tests"    tests
-    , testGroup "fixtures" fixtures
-    ]
+main =
+  defaultMain $
+    testGroup
+      "ECR"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/AWS/ECR.hs b/test/Test/AWS/ECR.hs
deleted file mode 100644
--- a/test/Test/AWS/ECR.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell   #-}
-
--- |
--- Module      : Test.AWS.ECR
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.ECR
-    ( tests
-    , fixtures
-    ) where
-
-import           Test.AWS.Prelude
-
-tests :: [TestTree]
-tests = []
-
-fixtures :: [TestTree]
-fixtures = []
diff --git a/test/Test/AWS/ECR/Internal.hs b/test/Test/AWS/ECR/Internal.hs
deleted file mode 100644
--- a/test/Test/AWS/ECR/Internal.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- |
--- Module      : Test.AWS.ECR.Internal
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
--- Stability   : experimental
--- Portability : non-portable (GHC extensions)
---
-
-module Test.AWS.ECR.Internal where
-
-import           Test.AWS.Prelude
diff --git a/test/Test/AWS/Gen/ECR.hs b/test/Test/AWS/Gen/ECR.hs
deleted file mode 100644
--- a/test/Test/AWS/Gen/ECR.hs
+++ /dev/null
@@ -1,435 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-orphans        #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Test.AWS.Gen.ECR
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Gen.ECR where
-
-import Data.Proxy
-import Network.AWS.ECR
-import Test.AWS.ECR.Internal
-import Test.AWS.Fixture
-import Test.AWS.Prelude
-import Test.Tasty
-
--- Auto-generated: the actual test selection needs to be manually placed into
--- the top-level so that real test data can be incrementally added.
---
--- This commented snippet is what the entire set should look like:
-
--- fixtures :: TestTree
--- fixtures =
---     [ testGroup "request"
---         [ requestGetRepositoryPolicy $
---             getRepositoryPolicy
---
---         , requestPutLifecyclePolicy $
---             putLifecyclePolicy
---
---         , requestDeleteLifecyclePolicy $
---             deleteLifecyclePolicy
---
---         , requestBatchDeleteImage $
---             batchDeleteImage
---
---         , requestGetLifecyclePolicyPreview $
---             getLifecyclePolicyPreview
---
---         , requestBatchCheckLayerAvailability $
---             batchCheckLayerAvailability
---
---         , requestDeleteRepositoryPolicy $
---             deleteRepositoryPolicy
---
---         , requestCreateRepository $
---             createRepository
---
---         , requestCompleteLayerUpload $
---             completeLayerUpload
---
---         , requestDescribeRepositories $
---             describeRepositories
---
---         , requestStartLifecyclePolicyPreview $
---             startLifecyclePolicyPreview
---
---         , requestUploadLayerPart $
---             uploadLayerPart
---
---         , requestBatchGetImage $
---             batchGetImage
---
---         , requestGetLifecyclePolicy $
---             getLifecyclePolicy
---
---         , requestSetRepositoryPolicy $
---             setRepositoryPolicy
---
---         , requestInitiateLayerUpload $
---             initiateLayerUpload
---
---         , requestDeleteRepository $
---             deleteRepository
---
---         , requestPutImage $
---             putImage
---
---         , requestListImages $
---             listImages
---
---         , requestGetAuthorizationToken $
---             getAuthorizationToken
---
---         , requestGetDownloadURLForLayer $
---             getDownloadURLForLayer
---
---         , requestDescribeImages $
---             describeImages
---
---           ]
-
---     , testGroup "response"
---         [ responseGetRepositoryPolicy $
---             getRepositoryPolicyResponse
---
---         , responsePutLifecyclePolicy $
---             putLifecyclePolicyResponse
---
---         , responseDeleteLifecyclePolicy $
---             deleteLifecyclePolicyResponse
---
---         , responseBatchDeleteImage $
---             batchDeleteImageResponse
---
---         , responseGetLifecyclePolicyPreview $
---             getLifecyclePolicyPreviewResponse
---
---         , responseBatchCheckLayerAvailability $
---             batchCheckLayerAvailabilityResponse
---
---         , responseDeleteRepositoryPolicy $
---             deleteRepositoryPolicyResponse
---
---         , responseCreateRepository $
---             createRepositoryResponse
---
---         , responseCompleteLayerUpload $
---             completeLayerUploadResponse
---
---         , responseDescribeRepositories $
---             describeRepositoriesResponse
---
---         , responseStartLifecyclePolicyPreview $
---             startLifecyclePolicyPreviewResponse
---
---         , responseUploadLayerPart $
---             uploadLayerPartResponse
---
---         , responseBatchGetImage $
---             batchGetImageResponse
---
---         , responseGetLifecyclePolicy $
---             getLifecyclePolicyResponse
---
---         , responseSetRepositoryPolicy $
---             setRepositoryPolicyResponse
---
---         , responseInitiateLayerUpload $
---             initiateLayerUploadResponse
---
---         , responseDeleteRepository $
---             deleteRepositoryResponse
---
---         , responsePutImage $
---             putImageResponse
---
---         , responseListImages $
---             listImagesResponse
---
---         , responseGetAuthorizationToken $
---             getAuthorizationTokenResponse
---
---         , responseGetDownloadURLForLayer $
---             getDownloadURLForLayerResponse
---
---         , responseDescribeImages $
---             describeImagesResponse
---
---           ]
---     ]
-
--- Requests
-
-requestGetRepositoryPolicy :: GetRepositoryPolicy -> TestTree
-requestGetRepositoryPolicy = req
-    "GetRepositoryPolicy"
-    "fixture/GetRepositoryPolicy.yaml"
-
-requestPutLifecyclePolicy :: PutLifecyclePolicy -> TestTree
-requestPutLifecyclePolicy = req
-    "PutLifecyclePolicy"
-    "fixture/PutLifecyclePolicy.yaml"
-
-requestDeleteLifecyclePolicy :: DeleteLifecyclePolicy -> TestTree
-requestDeleteLifecyclePolicy = req
-    "DeleteLifecyclePolicy"
-    "fixture/DeleteLifecyclePolicy.yaml"
-
-requestBatchDeleteImage :: BatchDeleteImage -> TestTree
-requestBatchDeleteImage = req
-    "BatchDeleteImage"
-    "fixture/BatchDeleteImage.yaml"
-
-requestGetLifecyclePolicyPreview :: GetLifecyclePolicyPreview -> TestTree
-requestGetLifecyclePolicyPreview = req
-    "GetLifecyclePolicyPreview"
-    "fixture/GetLifecyclePolicyPreview.yaml"
-
-requestBatchCheckLayerAvailability :: BatchCheckLayerAvailability -> TestTree
-requestBatchCheckLayerAvailability = req
-    "BatchCheckLayerAvailability"
-    "fixture/BatchCheckLayerAvailability.yaml"
-
-requestDeleteRepositoryPolicy :: DeleteRepositoryPolicy -> TestTree
-requestDeleteRepositoryPolicy = req
-    "DeleteRepositoryPolicy"
-    "fixture/DeleteRepositoryPolicy.yaml"
-
-requestCreateRepository :: CreateRepository -> TestTree
-requestCreateRepository = req
-    "CreateRepository"
-    "fixture/CreateRepository.yaml"
-
-requestCompleteLayerUpload :: CompleteLayerUpload -> TestTree
-requestCompleteLayerUpload = req
-    "CompleteLayerUpload"
-    "fixture/CompleteLayerUpload.yaml"
-
-requestDescribeRepositories :: DescribeRepositories -> TestTree
-requestDescribeRepositories = req
-    "DescribeRepositories"
-    "fixture/DescribeRepositories.yaml"
-
-requestStartLifecyclePolicyPreview :: StartLifecyclePolicyPreview -> TestTree
-requestStartLifecyclePolicyPreview = req
-    "StartLifecyclePolicyPreview"
-    "fixture/StartLifecyclePolicyPreview.yaml"
-
-requestUploadLayerPart :: UploadLayerPart -> TestTree
-requestUploadLayerPart = req
-    "UploadLayerPart"
-    "fixture/UploadLayerPart.yaml"
-
-requestBatchGetImage :: BatchGetImage -> TestTree
-requestBatchGetImage = req
-    "BatchGetImage"
-    "fixture/BatchGetImage.yaml"
-
-requestGetLifecyclePolicy :: GetLifecyclePolicy -> TestTree
-requestGetLifecyclePolicy = req
-    "GetLifecyclePolicy"
-    "fixture/GetLifecyclePolicy.yaml"
-
-requestSetRepositoryPolicy :: SetRepositoryPolicy -> TestTree
-requestSetRepositoryPolicy = req
-    "SetRepositoryPolicy"
-    "fixture/SetRepositoryPolicy.yaml"
-
-requestInitiateLayerUpload :: InitiateLayerUpload -> TestTree
-requestInitiateLayerUpload = req
-    "InitiateLayerUpload"
-    "fixture/InitiateLayerUpload.yaml"
-
-requestDeleteRepository :: DeleteRepository -> TestTree
-requestDeleteRepository = req
-    "DeleteRepository"
-    "fixture/DeleteRepository.yaml"
-
-requestPutImage :: PutImage -> TestTree
-requestPutImage = req
-    "PutImage"
-    "fixture/PutImage.yaml"
-
-requestListImages :: ListImages -> TestTree
-requestListImages = req
-    "ListImages"
-    "fixture/ListImages.yaml"
-
-requestGetAuthorizationToken :: GetAuthorizationToken -> TestTree
-requestGetAuthorizationToken = req
-    "GetAuthorizationToken"
-    "fixture/GetAuthorizationToken.yaml"
-
-requestGetDownloadURLForLayer :: GetDownloadURLForLayer -> TestTree
-requestGetDownloadURLForLayer = req
-    "GetDownloadURLForLayer"
-    "fixture/GetDownloadURLForLayer.yaml"
-
-requestDescribeImages :: DescribeImages -> TestTree
-requestDescribeImages = req
-    "DescribeImages"
-    "fixture/DescribeImages.yaml"
-
--- Responses
-
-responseGetRepositoryPolicy :: GetRepositoryPolicyResponse -> TestTree
-responseGetRepositoryPolicy = res
-    "GetRepositoryPolicyResponse"
-    "fixture/GetRepositoryPolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy GetRepositoryPolicy)
-
-responsePutLifecyclePolicy :: PutLifecyclePolicyResponse -> TestTree
-responsePutLifecyclePolicy = res
-    "PutLifecyclePolicyResponse"
-    "fixture/PutLifecyclePolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy PutLifecyclePolicy)
-
-responseDeleteLifecyclePolicy :: DeleteLifecyclePolicyResponse -> TestTree
-responseDeleteLifecyclePolicy = res
-    "DeleteLifecyclePolicyResponse"
-    "fixture/DeleteLifecyclePolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy DeleteLifecyclePolicy)
-
-responseBatchDeleteImage :: BatchDeleteImageResponse -> TestTree
-responseBatchDeleteImage = res
-    "BatchDeleteImageResponse"
-    "fixture/BatchDeleteImageResponse.proto"
-    ecr
-    (Proxy :: Proxy BatchDeleteImage)
-
-responseGetLifecyclePolicyPreview :: GetLifecyclePolicyPreviewResponse -> TestTree
-responseGetLifecyclePolicyPreview = res
-    "GetLifecyclePolicyPreviewResponse"
-    "fixture/GetLifecyclePolicyPreviewResponse.proto"
-    ecr
-    (Proxy :: Proxy GetLifecyclePolicyPreview)
-
-responseBatchCheckLayerAvailability :: BatchCheckLayerAvailabilityResponse -> TestTree
-responseBatchCheckLayerAvailability = res
-    "BatchCheckLayerAvailabilityResponse"
-    "fixture/BatchCheckLayerAvailabilityResponse.proto"
-    ecr
-    (Proxy :: Proxy BatchCheckLayerAvailability)
-
-responseDeleteRepositoryPolicy :: DeleteRepositoryPolicyResponse -> TestTree
-responseDeleteRepositoryPolicy = res
-    "DeleteRepositoryPolicyResponse"
-    "fixture/DeleteRepositoryPolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy DeleteRepositoryPolicy)
-
-responseCreateRepository :: CreateRepositoryResponse -> TestTree
-responseCreateRepository = res
-    "CreateRepositoryResponse"
-    "fixture/CreateRepositoryResponse.proto"
-    ecr
-    (Proxy :: Proxy CreateRepository)
-
-responseCompleteLayerUpload :: CompleteLayerUploadResponse -> TestTree
-responseCompleteLayerUpload = res
-    "CompleteLayerUploadResponse"
-    "fixture/CompleteLayerUploadResponse.proto"
-    ecr
-    (Proxy :: Proxy CompleteLayerUpload)
-
-responseDescribeRepositories :: DescribeRepositoriesResponse -> TestTree
-responseDescribeRepositories = res
-    "DescribeRepositoriesResponse"
-    "fixture/DescribeRepositoriesResponse.proto"
-    ecr
-    (Proxy :: Proxy DescribeRepositories)
-
-responseStartLifecyclePolicyPreview :: StartLifecyclePolicyPreviewResponse -> TestTree
-responseStartLifecyclePolicyPreview = res
-    "StartLifecyclePolicyPreviewResponse"
-    "fixture/StartLifecyclePolicyPreviewResponse.proto"
-    ecr
-    (Proxy :: Proxy StartLifecyclePolicyPreview)
-
-responseUploadLayerPart :: UploadLayerPartResponse -> TestTree
-responseUploadLayerPart = res
-    "UploadLayerPartResponse"
-    "fixture/UploadLayerPartResponse.proto"
-    ecr
-    (Proxy :: Proxy UploadLayerPart)
-
-responseBatchGetImage :: BatchGetImageResponse -> TestTree
-responseBatchGetImage = res
-    "BatchGetImageResponse"
-    "fixture/BatchGetImageResponse.proto"
-    ecr
-    (Proxy :: Proxy BatchGetImage)
-
-responseGetLifecyclePolicy :: GetLifecyclePolicyResponse -> TestTree
-responseGetLifecyclePolicy = res
-    "GetLifecyclePolicyResponse"
-    "fixture/GetLifecyclePolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy GetLifecyclePolicy)
-
-responseSetRepositoryPolicy :: SetRepositoryPolicyResponse -> TestTree
-responseSetRepositoryPolicy = res
-    "SetRepositoryPolicyResponse"
-    "fixture/SetRepositoryPolicyResponse.proto"
-    ecr
-    (Proxy :: Proxy SetRepositoryPolicy)
-
-responseInitiateLayerUpload :: InitiateLayerUploadResponse -> TestTree
-responseInitiateLayerUpload = res
-    "InitiateLayerUploadResponse"
-    "fixture/InitiateLayerUploadResponse.proto"
-    ecr
-    (Proxy :: Proxy InitiateLayerUpload)
-
-responseDeleteRepository :: DeleteRepositoryResponse -> TestTree
-responseDeleteRepository = res
-    "DeleteRepositoryResponse"
-    "fixture/DeleteRepositoryResponse.proto"
-    ecr
-    (Proxy :: Proxy DeleteRepository)
-
-responsePutImage :: PutImageResponse -> TestTree
-responsePutImage = res
-    "PutImageResponse"
-    "fixture/PutImageResponse.proto"
-    ecr
-    (Proxy :: Proxy PutImage)
-
-responseListImages :: ListImagesResponse -> TestTree
-responseListImages = res
-    "ListImagesResponse"
-    "fixture/ListImagesResponse.proto"
-    ecr
-    (Proxy :: Proxy ListImages)
-
-responseGetAuthorizationToken :: GetAuthorizationTokenResponse -> TestTree
-responseGetAuthorizationToken = res
-    "GetAuthorizationTokenResponse"
-    "fixture/GetAuthorizationTokenResponse.proto"
-    ecr
-    (Proxy :: Proxy GetAuthorizationToken)
-
-responseGetDownloadURLForLayer :: GetDownloadURLForLayerResponse -> TestTree
-responseGetDownloadURLForLayer = res
-    "GetDownloadURLForLayerResponse"
-    "fixture/GetDownloadURLForLayerResponse.proto"
-    ecr
-    (Proxy :: Proxy GetDownloadURLForLayer)
-
-responseDescribeImages :: DescribeImagesResponse -> TestTree
-responseDescribeImages = res
-    "DescribeImagesResponse"
-    "fixture/DescribeImagesResponse.proto"
-    ecr
-    (Proxy :: Proxy DescribeImages)
diff --git a/test/Test/Amazonka/ECR.hs b/test/Test/Amazonka/ECR.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/ECR.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.ECR
+-- 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.ECR
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/ECR/Internal.hs b/test/Test/Amazonka/ECR/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/ECR/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.ECR.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.ECR.Internal where
diff --git a/test/Test/Amazonka/Gen/ECR.hs b/test/Test/Amazonka/Gen/ECR.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/ECR.hs
@@ -0,0 +1,858 @@
+{-# 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.ECR
+-- 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.ECR where
+
+import Amazonka.ECR
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.ECR.Internal
+import Test.Amazonka.Fixture
+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"
+--         [ requestBatchCheckLayerAvailability $
+--             newBatchCheckLayerAvailability
+--
+--         , requestBatchDeleteImage $
+--             newBatchDeleteImage
+--
+--         , requestBatchGetImage $
+--             newBatchGetImage
+--
+--         , requestBatchGetRepositoryScanningConfiguration $
+--             newBatchGetRepositoryScanningConfiguration
+--
+--         , requestCompleteLayerUpload $
+--             newCompleteLayerUpload
+--
+--         , requestCreatePullThroughCacheRule $
+--             newCreatePullThroughCacheRule
+--
+--         , requestCreateRepository $
+--             newCreateRepository
+--
+--         , requestDeleteLifecyclePolicy $
+--             newDeleteLifecyclePolicy
+--
+--         , requestDeletePullThroughCacheRule $
+--             newDeletePullThroughCacheRule
+--
+--         , requestDeleteRegistryPolicy $
+--             newDeleteRegistryPolicy
+--
+--         , requestDeleteRepository $
+--             newDeleteRepository
+--
+--         , requestDeleteRepositoryPolicy $
+--             newDeleteRepositoryPolicy
+--
+--         , requestDescribeImageReplicationStatus $
+--             newDescribeImageReplicationStatus
+--
+--         , requestDescribeImageScanFindings $
+--             newDescribeImageScanFindings
+--
+--         , requestDescribeImages $
+--             newDescribeImages
+--
+--         , requestDescribePullThroughCacheRules $
+--             newDescribePullThroughCacheRules
+--
+--         , requestDescribeRegistry $
+--             newDescribeRegistry
+--
+--         , requestDescribeRepositories $
+--             newDescribeRepositories
+--
+--         , requestGetAuthorizationToken $
+--             newGetAuthorizationToken
+--
+--         , requestGetDownloadUrlForLayer $
+--             newGetDownloadUrlForLayer
+--
+--         , requestGetLifecyclePolicy $
+--             newGetLifecyclePolicy
+--
+--         , requestGetLifecyclePolicyPreview $
+--             newGetLifecyclePolicyPreview
+--
+--         , requestGetRegistryPolicy $
+--             newGetRegistryPolicy
+--
+--         , requestGetRegistryScanningConfiguration $
+--             newGetRegistryScanningConfiguration
+--
+--         , requestGetRepositoryPolicy $
+--             newGetRepositoryPolicy
+--
+--         , requestInitiateLayerUpload $
+--             newInitiateLayerUpload
+--
+--         , requestListImages $
+--             newListImages
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutImage $
+--             newPutImage
+--
+--         , requestPutImageScanningConfiguration $
+--             newPutImageScanningConfiguration
+--
+--         , requestPutImageTagMutability $
+--             newPutImageTagMutability
+--
+--         , requestPutLifecyclePolicy $
+--             newPutLifecyclePolicy
+--
+--         , requestPutRegistryPolicy $
+--             newPutRegistryPolicy
+--
+--         , requestPutRegistryScanningConfiguration $
+--             newPutRegistryScanningConfiguration
+--
+--         , requestPutReplicationConfiguration $
+--             newPutReplicationConfiguration
+--
+--         , requestSetRepositoryPolicy $
+--             newSetRepositoryPolicy
+--
+--         , requestStartImageScan $
+--             newStartImageScan
+--
+--         , requestStartLifecyclePolicyPreview $
+--             newStartLifecyclePolicyPreview
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUploadLayerPart $
+--             newUploadLayerPart
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchCheckLayerAvailability $
+--             newBatchCheckLayerAvailabilityResponse
+--
+--         , responseBatchDeleteImage $
+--             newBatchDeleteImageResponse
+--
+--         , responseBatchGetImage $
+--             newBatchGetImageResponse
+--
+--         , responseBatchGetRepositoryScanningConfiguration $
+--             newBatchGetRepositoryScanningConfigurationResponse
+--
+--         , responseCompleteLayerUpload $
+--             newCompleteLayerUploadResponse
+--
+--         , responseCreatePullThroughCacheRule $
+--             newCreatePullThroughCacheRuleResponse
+--
+--         , responseCreateRepository $
+--             newCreateRepositoryResponse
+--
+--         , responseDeleteLifecyclePolicy $
+--             newDeleteLifecyclePolicyResponse
+--
+--         , responseDeletePullThroughCacheRule $
+--             newDeletePullThroughCacheRuleResponse
+--
+--         , responseDeleteRegistryPolicy $
+--             newDeleteRegistryPolicyResponse
+--
+--         , responseDeleteRepository $
+--             newDeleteRepositoryResponse
+--
+--         , responseDeleteRepositoryPolicy $
+--             newDeleteRepositoryPolicyResponse
+--
+--         , responseDescribeImageReplicationStatus $
+--             newDescribeImageReplicationStatusResponse
+--
+--         , responseDescribeImageScanFindings $
+--             newDescribeImageScanFindingsResponse
+--
+--         , responseDescribeImages $
+--             newDescribeImagesResponse
+--
+--         , responseDescribePullThroughCacheRules $
+--             newDescribePullThroughCacheRulesResponse
+--
+--         , responseDescribeRegistry $
+--             newDescribeRegistryResponse
+--
+--         , responseDescribeRepositories $
+--             newDescribeRepositoriesResponse
+--
+--         , responseGetAuthorizationToken $
+--             newGetAuthorizationTokenResponse
+--
+--         , responseGetDownloadUrlForLayer $
+--             newGetDownloadUrlForLayerResponse
+--
+--         , responseGetLifecyclePolicy $
+--             newGetLifecyclePolicyResponse
+--
+--         , responseGetLifecyclePolicyPreview $
+--             newGetLifecyclePolicyPreviewResponse
+--
+--         , responseGetRegistryPolicy $
+--             newGetRegistryPolicyResponse
+--
+--         , responseGetRegistryScanningConfiguration $
+--             newGetRegistryScanningConfigurationResponse
+--
+--         , responseGetRepositoryPolicy $
+--             newGetRepositoryPolicyResponse
+--
+--         , responseInitiateLayerUpload $
+--             newInitiateLayerUploadResponse
+--
+--         , responseListImages $
+--             newListImagesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutImage $
+--             newPutImageResponse
+--
+--         , responsePutImageScanningConfiguration $
+--             newPutImageScanningConfigurationResponse
+--
+--         , responsePutImageTagMutability $
+--             newPutImageTagMutabilityResponse
+--
+--         , responsePutLifecyclePolicy $
+--             newPutLifecyclePolicyResponse
+--
+--         , responsePutRegistryPolicy $
+--             newPutRegistryPolicyResponse
+--
+--         , responsePutRegistryScanningConfiguration $
+--             newPutRegistryScanningConfigurationResponse
+--
+--         , responsePutReplicationConfiguration $
+--             newPutReplicationConfigurationResponse
+--
+--         , responseSetRepositoryPolicy $
+--             newSetRepositoryPolicyResponse
+--
+--         , responseStartImageScan $
+--             newStartImageScanResponse
+--
+--         , responseStartLifecyclePolicyPreview $
+--             newStartLifecyclePolicyPreviewResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUploadLayerPart $
+--             newUploadLayerPartResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchCheckLayerAvailability :: BatchCheckLayerAvailability -> TestTree
+requestBatchCheckLayerAvailability =
+  req
+    "BatchCheckLayerAvailability"
+    "fixture/BatchCheckLayerAvailability.yaml"
+
+requestBatchDeleteImage :: BatchDeleteImage -> TestTree
+requestBatchDeleteImage =
+  req
+    "BatchDeleteImage"
+    "fixture/BatchDeleteImage.yaml"
+
+requestBatchGetImage :: BatchGetImage -> TestTree
+requestBatchGetImage =
+  req
+    "BatchGetImage"
+    "fixture/BatchGetImage.yaml"
+
+requestBatchGetRepositoryScanningConfiguration :: BatchGetRepositoryScanningConfiguration -> TestTree
+requestBatchGetRepositoryScanningConfiguration =
+  req
+    "BatchGetRepositoryScanningConfiguration"
+    "fixture/BatchGetRepositoryScanningConfiguration.yaml"
+
+requestCompleteLayerUpload :: CompleteLayerUpload -> TestTree
+requestCompleteLayerUpload =
+  req
+    "CompleteLayerUpload"
+    "fixture/CompleteLayerUpload.yaml"
+
+requestCreatePullThroughCacheRule :: CreatePullThroughCacheRule -> TestTree
+requestCreatePullThroughCacheRule =
+  req
+    "CreatePullThroughCacheRule"
+    "fixture/CreatePullThroughCacheRule.yaml"
+
+requestCreateRepository :: CreateRepository -> TestTree
+requestCreateRepository =
+  req
+    "CreateRepository"
+    "fixture/CreateRepository.yaml"
+
+requestDeleteLifecyclePolicy :: DeleteLifecyclePolicy -> TestTree
+requestDeleteLifecyclePolicy =
+  req
+    "DeleteLifecyclePolicy"
+    "fixture/DeleteLifecyclePolicy.yaml"
+
+requestDeletePullThroughCacheRule :: DeletePullThroughCacheRule -> TestTree
+requestDeletePullThroughCacheRule =
+  req
+    "DeletePullThroughCacheRule"
+    "fixture/DeletePullThroughCacheRule.yaml"
+
+requestDeleteRegistryPolicy :: DeleteRegistryPolicy -> TestTree
+requestDeleteRegistryPolicy =
+  req
+    "DeleteRegistryPolicy"
+    "fixture/DeleteRegistryPolicy.yaml"
+
+requestDeleteRepository :: DeleteRepository -> TestTree
+requestDeleteRepository =
+  req
+    "DeleteRepository"
+    "fixture/DeleteRepository.yaml"
+
+requestDeleteRepositoryPolicy :: DeleteRepositoryPolicy -> TestTree
+requestDeleteRepositoryPolicy =
+  req
+    "DeleteRepositoryPolicy"
+    "fixture/DeleteRepositoryPolicy.yaml"
+
+requestDescribeImageReplicationStatus :: DescribeImageReplicationStatus -> TestTree
+requestDescribeImageReplicationStatus =
+  req
+    "DescribeImageReplicationStatus"
+    "fixture/DescribeImageReplicationStatus.yaml"
+
+requestDescribeImageScanFindings :: DescribeImageScanFindings -> TestTree
+requestDescribeImageScanFindings =
+  req
+    "DescribeImageScanFindings"
+    "fixture/DescribeImageScanFindings.yaml"
+
+requestDescribeImages :: DescribeImages -> TestTree
+requestDescribeImages =
+  req
+    "DescribeImages"
+    "fixture/DescribeImages.yaml"
+
+requestDescribePullThroughCacheRules :: DescribePullThroughCacheRules -> TestTree
+requestDescribePullThroughCacheRules =
+  req
+    "DescribePullThroughCacheRules"
+    "fixture/DescribePullThroughCacheRules.yaml"
+
+requestDescribeRegistry :: DescribeRegistry -> TestTree
+requestDescribeRegistry =
+  req
+    "DescribeRegistry"
+    "fixture/DescribeRegistry.yaml"
+
+requestDescribeRepositories :: DescribeRepositories -> TestTree
+requestDescribeRepositories =
+  req
+    "DescribeRepositories"
+    "fixture/DescribeRepositories.yaml"
+
+requestGetAuthorizationToken :: GetAuthorizationToken -> TestTree
+requestGetAuthorizationToken =
+  req
+    "GetAuthorizationToken"
+    "fixture/GetAuthorizationToken.yaml"
+
+requestGetDownloadUrlForLayer :: GetDownloadUrlForLayer -> TestTree
+requestGetDownloadUrlForLayer =
+  req
+    "GetDownloadUrlForLayer"
+    "fixture/GetDownloadUrlForLayer.yaml"
+
+requestGetLifecyclePolicy :: GetLifecyclePolicy -> TestTree
+requestGetLifecyclePolicy =
+  req
+    "GetLifecyclePolicy"
+    "fixture/GetLifecyclePolicy.yaml"
+
+requestGetLifecyclePolicyPreview :: GetLifecyclePolicyPreview -> TestTree
+requestGetLifecyclePolicyPreview =
+  req
+    "GetLifecyclePolicyPreview"
+    "fixture/GetLifecyclePolicyPreview.yaml"
+
+requestGetRegistryPolicy :: GetRegistryPolicy -> TestTree
+requestGetRegistryPolicy =
+  req
+    "GetRegistryPolicy"
+    "fixture/GetRegistryPolicy.yaml"
+
+requestGetRegistryScanningConfiguration :: GetRegistryScanningConfiguration -> TestTree
+requestGetRegistryScanningConfiguration =
+  req
+    "GetRegistryScanningConfiguration"
+    "fixture/GetRegistryScanningConfiguration.yaml"
+
+requestGetRepositoryPolicy :: GetRepositoryPolicy -> TestTree
+requestGetRepositoryPolicy =
+  req
+    "GetRepositoryPolicy"
+    "fixture/GetRepositoryPolicy.yaml"
+
+requestInitiateLayerUpload :: InitiateLayerUpload -> TestTree
+requestInitiateLayerUpload =
+  req
+    "InitiateLayerUpload"
+    "fixture/InitiateLayerUpload.yaml"
+
+requestListImages :: ListImages -> TestTree
+requestListImages =
+  req
+    "ListImages"
+    "fixture/ListImages.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutImage :: PutImage -> TestTree
+requestPutImage =
+  req
+    "PutImage"
+    "fixture/PutImage.yaml"
+
+requestPutImageScanningConfiguration :: PutImageScanningConfiguration -> TestTree
+requestPutImageScanningConfiguration =
+  req
+    "PutImageScanningConfiguration"
+    "fixture/PutImageScanningConfiguration.yaml"
+
+requestPutImageTagMutability :: PutImageTagMutability -> TestTree
+requestPutImageTagMutability =
+  req
+    "PutImageTagMutability"
+    "fixture/PutImageTagMutability.yaml"
+
+requestPutLifecyclePolicy :: PutLifecyclePolicy -> TestTree
+requestPutLifecyclePolicy =
+  req
+    "PutLifecyclePolicy"
+    "fixture/PutLifecyclePolicy.yaml"
+
+requestPutRegistryPolicy :: PutRegistryPolicy -> TestTree
+requestPutRegistryPolicy =
+  req
+    "PutRegistryPolicy"
+    "fixture/PutRegistryPolicy.yaml"
+
+requestPutRegistryScanningConfiguration :: PutRegistryScanningConfiguration -> TestTree
+requestPutRegistryScanningConfiguration =
+  req
+    "PutRegistryScanningConfiguration"
+    "fixture/PutRegistryScanningConfiguration.yaml"
+
+requestPutReplicationConfiguration :: PutReplicationConfiguration -> TestTree
+requestPutReplicationConfiguration =
+  req
+    "PutReplicationConfiguration"
+    "fixture/PutReplicationConfiguration.yaml"
+
+requestSetRepositoryPolicy :: SetRepositoryPolicy -> TestTree
+requestSetRepositoryPolicy =
+  req
+    "SetRepositoryPolicy"
+    "fixture/SetRepositoryPolicy.yaml"
+
+requestStartImageScan :: StartImageScan -> TestTree
+requestStartImageScan =
+  req
+    "StartImageScan"
+    "fixture/StartImageScan.yaml"
+
+requestStartLifecyclePolicyPreview :: StartLifecyclePolicyPreview -> TestTree
+requestStartLifecyclePolicyPreview =
+  req
+    "StartLifecyclePolicyPreview"
+    "fixture/StartLifecyclePolicyPreview.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUploadLayerPart :: UploadLayerPart -> TestTree
+requestUploadLayerPart =
+  req
+    "UploadLayerPart"
+    "fixture/UploadLayerPart.yaml"
+
+-- Responses
+
+responseBatchCheckLayerAvailability :: BatchCheckLayerAvailabilityResponse -> TestTree
+responseBatchCheckLayerAvailability =
+  res
+    "BatchCheckLayerAvailabilityResponse"
+    "fixture/BatchCheckLayerAvailabilityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchCheckLayerAvailability)
+
+responseBatchDeleteImage :: BatchDeleteImageResponse -> TestTree
+responseBatchDeleteImage =
+  res
+    "BatchDeleteImageResponse"
+    "fixture/BatchDeleteImageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDeleteImage)
+
+responseBatchGetImage :: BatchGetImageResponse -> TestTree
+responseBatchGetImage =
+  res
+    "BatchGetImageResponse"
+    "fixture/BatchGetImageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetImage)
+
+responseBatchGetRepositoryScanningConfiguration :: BatchGetRepositoryScanningConfigurationResponse -> TestTree
+responseBatchGetRepositoryScanningConfiguration =
+  res
+    "BatchGetRepositoryScanningConfigurationResponse"
+    "fixture/BatchGetRepositoryScanningConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetRepositoryScanningConfiguration)
+
+responseCompleteLayerUpload :: CompleteLayerUploadResponse -> TestTree
+responseCompleteLayerUpload =
+  res
+    "CompleteLayerUploadResponse"
+    "fixture/CompleteLayerUploadResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CompleteLayerUpload)
+
+responseCreatePullThroughCacheRule :: CreatePullThroughCacheRuleResponse -> TestTree
+responseCreatePullThroughCacheRule =
+  res
+    "CreatePullThroughCacheRuleResponse"
+    "fixture/CreatePullThroughCacheRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePullThroughCacheRule)
+
+responseCreateRepository :: CreateRepositoryResponse -> TestTree
+responseCreateRepository =
+  res
+    "CreateRepositoryResponse"
+    "fixture/CreateRepositoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRepository)
+
+responseDeleteLifecyclePolicy :: DeleteLifecyclePolicyResponse -> TestTree
+responseDeleteLifecyclePolicy =
+  res
+    "DeleteLifecyclePolicyResponse"
+    "fixture/DeleteLifecyclePolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteLifecyclePolicy)
+
+responseDeletePullThroughCacheRule :: DeletePullThroughCacheRuleResponse -> TestTree
+responseDeletePullThroughCacheRule =
+  res
+    "DeletePullThroughCacheRuleResponse"
+    "fixture/DeletePullThroughCacheRuleResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePullThroughCacheRule)
+
+responseDeleteRegistryPolicy :: DeleteRegistryPolicyResponse -> TestTree
+responseDeleteRegistryPolicy =
+  res
+    "DeleteRegistryPolicyResponse"
+    "fixture/DeleteRegistryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRegistryPolicy)
+
+responseDeleteRepository :: DeleteRepositoryResponse -> TestTree
+responseDeleteRepository =
+  res
+    "DeleteRepositoryResponse"
+    "fixture/DeleteRepositoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRepository)
+
+responseDeleteRepositoryPolicy :: DeleteRepositoryPolicyResponse -> TestTree
+responseDeleteRepositoryPolicy =
+  res
+    "DeleteRepositoryPolicyResponse"
+    "fixture/DeleteRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRepositoryPolicy)
+
+responseDescribeImageReplicationStatus :: DescribeImageReplicationStatusResponse -> TestTree
+responseDescribeImageReplicationStatus =
+  res
+    "DescribeImageReplicationStatusResponse"
+    "fixture/DescribeImageReplicationStatusResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeImageReplicationStatus)
+
+responseDescribeImageScanFindings :: DescribeImageScanFindingsResponse -> TestTree
+responseDescribeImageScanFindings =
+  res
+    "DescribeImageScanFindingsResponse"
+    "fixture/DescribeImageScanFindingsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeImageScanFindings)
+
+responseDescribeImages :: DescribeImagesResponse -> TestTree
+responseDescribeImages =
+  res
+    "DescribeImagesResponse"
+    "fixture/DescribeImagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeImages)
+
+responseDescribePullThroughCacheRules :: DescribePullThroughCacheRulesResponse -> TestTree
+responseDescribePullThroughCacheRules =
+  res
+    "DescribePullThroughCacheRulesResponse"
+    "fixture/DescribePullThroughCacheRulesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePullThroughCacheRules)
+
+responseDescribeRegistry :: DescribeRegistryResponse -> TestTree
+responseDescribeRegistry =
+  res
+    "DescribeRegistryResponse"
+    "fixture/DescribeRegistryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRegistry)
+
+responseDescribeRepositories :: DescribeRepositoriesResponse -> TestTree
+responseDescribeRepositories =
+  res
+    "DescribeRepositoriesResponse"
+    "fixture/DescribeRepositoriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRepositories)
+
+responseGetAuthorizationToken :: GetAuthorizationTokenResponse -> TestTree
+responseGetAuthorizationToken =
+  res
+    "GetAuthorizationTokenResponse"
+    "fixture/GetAuthorizationTokenResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAuthorizationToken)
+
+responseGetDownloadUrlForLayer :: GetDownloadUrlForLayerResponse -> TestTree
+responseGetDownloadUrlForLayer =
+  res
+    "GetDownloadUrlForLayerResponse"
+    "fixture/GetDownloadUrlForLayerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDownloadUrlForLayer)
+
+responseGetLifecyclePolicy :: GetLifecyclePolicyResponse -> TestTree
+responseGetLifecyclePolicy =
+  res
+    "GetLifecyclePolicyResponse"
+    "fixture/GetLifecyclePolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetLifecyclePolicy)
+
+responseGetLifecyclePolicyPreview :: GetLifecyclePolicyPreviewResponse -> TestTree
+responseGetLifecyclePolicyPreview =
+  res
+    "GetLifecyclePolicyPreviewResponse"
+    "fixture/GetLifecyclePolicyPreviewResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetLifecyclePolicyPreview)
+
+responseGetRegistryPolicy :: GetRegistryPolicyResponse -> TestTree
+responseGetRegistryPolicy =
+  res
+    "GetRegistryPolicyResponse"
+    "fixture/GetRegistryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRegistryPolicy)
+
+responseGetRegistryScanningConfiguration :: GetRegistryScanningConfigurationResponse -> TestTree
+responseGetRegistryScanningConfiguration =
+  res
+    "GetRegistryScanningConfigurationResponse"
+    "fixture/GetRegistryScanningConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRegistryScanningConfiguration)
+
+responseGetRepositoryPolicy :: GetRepositoryPolicyResponse -> TestTree
+responseGetRepositoryPolicy =
+  res
+    "GetRepositoryPolicyResponse"
+    "fixture/GetRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRepositoryPolicy)
+
+responseInitiateLayerUpload :: InitiateLayerUploadResponse -> TestTree
+responseInitiateLayerUpload =
+  res
+    "InitiateLayerUploadResponse"
+    "fixture/InitiateLayerUploadResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy InitiateLayerUpload)
+
+responseListImages :: ListImagesResponse -> TestTree
+responseListImages =
+  res
+    "ListImagesResponse"
+    "fixture/ListImagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListImages)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutImage :: PutImageResponse -> TestTree
+responsePutImage =
+  res
+    "PutImageResponse"
+    "fixture/PutImageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutImage)
+
+responsePutImageScanningConfiguration :: PutImageScanningConfigurationResponse -> TestTree
+responsePutImageScanningConfiguration =
+  res
+    "PutImageScanningConfigurationResponse"
+    "fixture/PutImageScanningConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutImageScanningConfiguration)
+
+responsePutImageTagMutability :: PutImageTagMutabilityResponse -> TestTree
+responsePutImageTagMutability =
+  res
+    "PutImageTagMutabilityResponse"
+    "fixture/PutImageTagMutabilityResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutImageTagMutability)
+
+responsePutLifecyclePolicy :: PutLifecyclePolicyResponse -> TestTree
+responsePutLifecyclePolicy =
+  res
+    "PutLifecyclePolicyResponse"
+    "fixture/PutLifecyclePolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutLifecyclePolicy)
+
+responsePutRegistryPolicy :: PutRegistryPolicyResponse -> TestTree
+responsePutRegistryPolicy =
+  res
+    "PutRegistryPolicyResponse"
+    "fixture/PutRegistryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRegistryPolicy)
+
+responsePutRegistryScanningConfiguration :: PutRegistryScanningConfigurationResponse -> TestTree
+responsePutRegistryScanningConfiguration =
+  res
+    "PutRegistryScanningConfigurationResponse"
+    "fixture/PutRegistryScanningConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRegistryScanningConfiguration)
+
+responsePutReplicationConfiguration :: PutReplicationConfigurationResponse -> TestTree
+responsePutReplicationConfiguration =
+  res
+    "PutReplicationConfigurationResponse"
+    "fixture/PutReplicationConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutReplicationConfiguration)
+
+responseSetRepositoryPolicy :: SetRepositoryPolicyResponse -> TestTree
+responseSetRepositoryPolicy =
+  res
+    "SetRepositoryPolicyResponse"
+    "fixture/SetRepositoryPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SetRepositoryPolicy)
+
+responseStartImageScan :: StartImageScanResponse -> TestTree
+responseStartImageScan =
+  res
+    "StartImageScanResponse"
+    "fixture/StartImageScanResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartImageScan)
+
+responseStartLifecyclePolicyPreview :: StartLifecyclePolicyPreviewResponse -> TestTree
+responseStartLifecyclePolicyPreview =
+  res
+    "StartLifecyclePolicyPreviewResponse"
+    "fixture/StartLifecyclePolicyPreviewResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartLifecyclePolicyPreview)
+
+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)
+
+responseUploadLayerPart :: UploadLayerPartResponse -> TestTree
+responseUploadLayerPart =
+  res
+    "UploadLayerPartResponse"
+    "fixture/UploadLayerPartResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UploadLayerPart)
